@pega/angular-sdk-overrides 24.2.10 → 25.1.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (257) hide show
  1. package/lib/designSystemExtension/alert/alert.component.scss +3 -3
  2. package/lib/designSystemExtension/alert/alert.component.ts +0 -1
  3. package/lib/designSystemExtension/alert-banner/alert-banner.component.ts +0 -1
  4. package/lib/designSystemExtension/banner/banner.component.html +1 -1
  5. package/lib/designSystemExtension/banner/banner.component.scss +17 -3
  6. package/lib/designSystemExtension/banner/banner.component.ts +0 -1
  7. package/lib/designSystemExtension/case-create-stage/case-create-stage.component.ts +0 -1
  8. package/lib/designSystemExtension/field-group/field-group.component.ts +0 -1
  9. package/lib/designSystemExtension/material-case-summary/material-case-summary.component.html +6 -3
  10. package/lib/designSystemExtension/material-case-summary/material-case-summary.component.scss +5 -34
  11. package/lib/designSystemExtension/material-case-summary/material-case-summary.component.ts +0 -2
  12. package/lib/designSystemExtension/material-details/material-details.component.scss +0 -5
  13. package/lib/designSystemExtension/material-details/material-details.component.ts +0 -1
  14. package/lib/designSystemExtension/material-details-fields/material-details-fields.component.html +3 -3
  15. package/lib/designSystemExtension/material-details-fields/material-details-fields.component.scss +4 -3
  16. package/lib/designSystemExtension/material-details-fields/material-details-fields.component.ts +6 -1
  17. package/lib/designSystemExtension/material-summary-item/material-summary-item.component.scss +4 -17
  18. package/lib/designSystemExtension/material-summary-item/material-summary-item.component.ts +0 -1
  19. package/lib/designSystemExtension/material-summary-list/material-summary-list.component.ts +0 -1
  20. package/lib/designSystemExtension/material-utility/material-utility.component.scss +1 -2
  21. package/lib/designSystemExtension/material-vertical-tabs/material-vertical-tabs.component.scss +1 -1
  22. package/lib/designSystemExtension/material-vertical-tabs/material-vertical-tabs.component.ts +0 -1
  23. package/lib/designSystemExtension/operator/operator.component.html +2 -2
  24. package/lib/designSystemExtension/operator/operator.component.scss +13 -12
  25. package/lib/designSystemExtension/operator/operator.component.ts +4 -5
  26. package/lib/designSystemExtension/pulse/pulse.component.scss +2 -2
  27. package/lib/designSystemExtension/pulse/pulse.component.ts +0 -1
  28. package/lib/designSystemExtension/rich-text-editor/rich-text-editor.component.html +4 -17
  29. package/lib/designSystemExtension/rich-text-editor/rich-text-editor.component.scss +0 -1
  30. package/lib/designSystemExtension/rich-text-editor/rich-text-editor.component.ts +30 -1
  31. package/lib/designSystemExtension/wss-quick-create/wss-quick-create.component.scss +16 -9
  32. package/lib/designSystemExtension/wss-quick-create/wss-quick-create.component.ts +0 -1
  33. package/lib/field/auto-complete/auto-complete.component.html +0 -2
  34. package/lib/field/auto-complete/auto-complete.component.ts +48 -173
  35. package/lib/field/cancel-alert/cancel-alert.component.html +8 -12
  36. package/lib/field/cancel-alert/cancel-alert.component.scss +2 -3
  37. package/lib/field/cancel-alert/cancel-alert.component.ts +24 -37
  38. package/lib/field/check-box/check-box.component.html +17 -6
  39. package/lib/field/check-box/check-box.component.scss +0 -1
  40. package/lib/field/check-box/check-box.component.ts +25 -151
  41. package/lib/field/currency/currency.component.ts +54 -181
  42. package/lib/field/date/date.component.html +4 -3
  43. package/lib/field/date/date.component.ts +30 -151
  44. package/lib/field/date-time/date-time.component.html +2 -2
  45. package/lib/field/date-time/date-time.component.ts +47 -148
  46. package/lib/field/decimal/decimal.component.html +1 -0
  47. package/lib/field/decimal/decimal.component.ts +61 -164
  48. package/lib/field/dropdown/dropdown.component.html +1 -0
  49. package/lib/field/dropdown/dropdown.component.ts +43 -152
  50. package/lib/field/email/email.component.ts +28 -158
  51. package/lib/field/field.base.ts +149 -0
  52. package/lib/field/group/group.component.ts +7 -5
  53. package/lib/field/integer/integer.component.html +1 -1
  54. package/lib/field/integer/integer.component.ts +30 -160
  55. package/lib/field/list-view-action-buttons/list-view-action-buttons.component.html +1 -1
  56. package/lib/field/list-view-action-buttons/list-view-action-buttons.component.ts +3 -3
  57. package/lib/field/location/config-ext.json +8 -0
  58. package/lib/field/location/location.component.html +45 -0
  59. package/lib/field/location/location.component.scss +18 -0
  60. package/lib/field/location/location.component.spec.ts +22 -0
  61. package/lib/field/location/location.component.ts +280 -0
  62. package/lib/field/multiselect/multiselect.component.ts +47 -152
  63. package/lib/field/multiselect/utils.ts +55 -47
  64. package/lib/field/object-reference/object-reference.component.html +17 -0
  65. package/lib/field/object-reference/object-reference.component.scss +0 -0
  66. package/lib/field/object-reference/object-reference.component.spec.ts +22 -0
  67. package/lib/field/object-reference/object-reference.component.ts +237 -0
  68. package/lib/field/percentage/percentage.component.html +1 -1
  69. package/lib/field/percentage/percentage.component.ts +62 -170
  70. package/lib/field/phone/config-ext.json +1 -1
  71. package/lib/field/phone/phone.component.html +18 -17
  72. package/lib/field/phone/phone.component.scss +4 -0
  73. package/lib/field/phone/phone.component.ts +47 -156
  74. package/lib/field/radio-buttons/radio-buttons.component.html +17 -12
  75. package/lib/field/radio-buttons/radio-buttons.component.scss +4 -2
  76. package/lib/field/radio-buttons/radio-buttons.component.ts +37 -160
  77. package/lib/field/rich-text/rich-text.component.html +2 -0
  78. package/lib/field/rich-text/rich-text.component.scss +172 -0
  79. package/lib/field/rich-text/rich-text.component.ts +32 -93
  80. package/lib/field/scalar-list/scalar-list.component.ts +17 -73
  81. package/lib/field/selectable-card/selectable-card.component.html +70 -0
  82. package/lib/field/selectable-card/selectable-card.component.scss +11 -0
  83. package/lib/field/selectable-card/selectable-card.component.spec.ts +22 -0
  84. package/lib/field/selectable-card/selectable-card.component.ts +219 -0
  85. package/lib/field/semantic-link/semantic-link.component.html +4 -8
  86. package/lib/field/semantic-link/semantic-link.component.scss +0 -13
  87. package/lib/field/semantic-link/semantic-link.component.ts +165 -6
  88. package/lib/field/text/text.component.scss +0 -1
  89. package/lib/field/text/text.component.ts +6 -5
  90. package/lib/field/text-area/text-area.component.html +4 -2
  91. package/lib/field/text-area/text-area.component.ts +30 -155
  92. package/lib/field/text-content/text-content.component.ts +0 -1
  93. package/lib/field/text-input/text-input.component.html +1 -1
  94. package/lib/field/text-input/text-input.component.ts +28 -158
  95. package/lib/field/time/time.component.html +2 -2
  96. package/lib/field/time/time.component.ts +34 -154
  97. package/lib/field/url/url.component.html +1 -1
  98. package/lib/field/url/url.component.ts +28 -157
  99. package/lib/field/user-reference/user-reference.component.html +40 -38
  100. package/lib/field/user-reference/user-reference.component.scss +0 -1
  101. package/lib/field/user-reference/user-reference.component.ts +70 -9
  102. package/lib/infra/Containers/flow-container/flow-container.component.html +2 -2
  103. package/lib/infra/Containers/flow-container/flow-container.component.ts +24 -51
  104. package/lib/infra/Containers/flow-container/helpers.ts +2 -2
  105. package/lib/infra/Containers/hybrid-view-container/hybrid-view-container.component.ts +0 -1
  106. package/lib/infra/Containers/modal-view-container/modal-view-container.component.html +1 -11
  107. package/lib/infra/Containers/modal-view-container/modal-view-container.component.ts +5 -18
  108. package/lib/infra/Containers/view-container/helper.ts +35 -2
  109. package/lib/infra/Containers/view-container/view-container.component.ts +1 -2
  110. package/lib/infra/action-buttons/action-buttons.component.html +13 -8
  111. package/lib/infra/action-buttons/action-buttons.component.scss +23 -0
  112. package/lib/infra/action-buttons/action-buttons.component.ts +1 -3
  113. package/lib/infra/assignment/assignment.component.html +1 -1
  114. package/lib/infra/assignment/assignment.component.ts +100 -46
  115. package/lib/infra/assignment-card/assignment-card.component.html +2 -2
  116. package/lib/infra/assignment-card/assignment-card.component.scss +0 -4
  117. package/lib/infra/assignment-card/assignment-card.component.ts +21 -5
  118. package/lib/infra/dashboard-filter/dashboard-filter.component.ts +0 -1
  119. package/lib/infra/defer-load/defer-load.component.html +6 -2
  120. package/lib/infra/defer-load/defer-load.component.ts +25 -12
  121. package/lib/infra/error-boundary/error-boundary.component.ts +0 -1
  122. package/lib/infra/multi-step/multi-step.component.html +22 -38
  123. package/lib/infra/multi-step/multi-step.component.scss +14 -27
  124. package/lib/infra/multi-step/multi-step.component.ts +0 -1
  125. package/lib/infra/navbar/navbar.component.html +36 -41
  126. package/lib/infra/navbar/navbar.component.scss +22 -4
  127. package/lib/infra/navbar/navbar.component.ts +8 -6
  128. package/lib/infra/reference/reference.component.ts +82 -90
  129. package/lib/infra/region/region.component.ts +0 -1
  130. package/lib/infra/root-container/root-container.component.html +2 -15
  131. package/lib/infra/root-container/root-container.component.scss +0 -1
  132. package/lib/infra/root-container/root-container.component.ts +25 -32
  133. package/lib/infra/stages/stages.component.html +4 -3
  134. package/lib/infra/stages/stages.component.scss +12 -36
  135. package/lib/infra/stages/stages.component.ts +4 -3
  136. package/lib/infra/view/view.component.html +1 -1
  137. package/lib/infra/view/view.component.ts +3 -7
  138. package/lib/template/advanced-search/advanced-search.component.html +12 -0
  139. package/lib/template/advanced-search/advanced-search.component.scss +0 -0
  140. package/lib/template/advanced-search/advanced-search.component.spec.ts +0 -0
  141. package/lib/template/advanced-search/advanced-search.component.ts +112 -0
  142. package/lib/template/advanced-search/advanced-search.service.ts +27 -0
  143. package/lib/template/advanced-search/search-group/persist-utils.ts +56 -0
  144. package/lib/template/advanced-search/search-groups/search-groups.component.html +32 -0
  145. package/lib/template/advanced-search/search-groups/search-groups.component.scss +0 -0
  146. package/lib/template/advanced-search/search-groups/search-groups.component.spec.ts +0 -0
  147. package/lib/template/advanced-search/search-groups/search-groups.component.ts +294 -0
  148. package/lib/template/advanced-search/search-groups/utils.ts +29 -0
  149. package/lib/template/app-shell/app-shell.component.html +4 -1
  150. package/lib/template/app-shell/app-shell.component.scss +0 -3
  151. package/lib/template/app-shell/app-shell.component.ts +46 -8
  152. package/lib/template/banner-page/banner-page.component.ts +0 -1
  153. package/lib/template/base/form-template-base.ts +6 -0
  154. package/lib/template/case-summary/case-summary.component.scss +0 -2
  155. package/lib/template/case-summary/case-summary.component.ts +6 -22
  156. package/lib/template/case-view/case-view.component.html +4 -4
  157. package/lib/template/case-view/case-view.component.scss +18 -10
  158. package/lib/template/case-view/case-view.component.ts +1 -11
  159. package/lib/template/confirmation/confirmation.component.html +2 -2
  160. package/lib/template/confirmation/confirmation.component.ts +0 -1
  161. package/lib/template/data-reference/data-reference.component.html +11 -8
  162. package/lib/template/data-reference/data-reference.component.ts +346 -113
  163. package/lib/template/data-reference/search-form/search-form.component.html +39 -0
  164. package/lib/template/data-reference/search-form/search-form.component.scss +11 -0
  165. package/lib/template/data-reference/search-form/search-form.component.spec.ts +0 -0
  166. package/lib/template/data-reference/search-form/search-form.component.ts +167 -0
  167. package/lib/template/data-reference/search-form/tabsData.ts +160 -0
  168. package/lib/template/data-reference/utils.ts +92 -0
  169. package/lib/template/default-form/default-form.component.ts +45 -5
  170. package/lib/template/default-page/default-page.component.html +34 -0
  171. package/lib/template/default-page/default-page.component.scss +31 -0
  172. package/lib/template/default-page/default-page.component.spec.ts +24 -0
  173. package/lib/template/default-page/default-page.component.ts +64 -0
  174. package/lib/template/details/details.component.ts +0 -1
  175. package/lib/template/details-narrow-wide/details-narrow-wide.component.ts +0 -1
  176. package/lib/template/details-one-column/details-one-column.component.ts +0 -1
  177. package/lib/template/details-sub-tabs/details-sub-tabs.component.ts +0 -1
  178. package/lib/template/details-three-column/details-three-column.component.ts +0 -1
  179. package/lib/template/details-two-column/details-two-column.component.ts +0 -1
  180. package/lib/template/details-wide-narrow/details-wide-narrow.component.ts +0 -1
  181. package/lib/template/dynamic-tabs/dynamic-tabs.component.ts +0 -1
  182. package/lib/template/field-group-list/field-group-list.component.scss +0 -1
  183. package/lib/template/field-group-list/field-group-list.component.ts +0 -1
  184. package/lib/template/field-group-template/field-group-template.component.html +7 -7
  185. package/lib/template/field-group-template/field-group-template.component.scss +8 -0
  186. package/lib/template/field-group-template/field-group-template.component.ts +64 -55
  187. package/lib/template/field-value-list/field-value-list.component.html +2 -2
  188. package/lib/template/field-value-list/field-value-list.component.scss +4 -0
  189. package/lib/template/field-value-list/field-value-list.component.ts +0 -1
  190. package/lib/template/inline-dashboard/inline-dashboard.component.ts +0 -1
  191. package/lib/template/inline-dashboard-page/inline-dashboard-page.component.ts +1 -2
  192. package/lib/template/list-page/list-page.component.ts +0 -1
  193. package/lib/template/list-view/list-view.component.html +170 -160
  194. package/lib/template/list-view/list-view.component.scss +25 -21
  195. package/lib/template/list-view/list-view.component.ts +208 -122
  196. package/lib/template/list-view/listViewHelpers.ts +3 -9
  197. package/lib/template/list-view/utils.ts +27 -7
  198. package/lib/template/multi-reference-readonly/multi-reference-readonly.component.ts +0 -1
  199. package/lib/template/narrow-wide-form/narrow-wide-form.component.ts +0 -1
  200. package/lib/template/object-page/object-page.component.html +1 -0
  201. package/lib/template/object-page/object-page.component.scss +0 -0
  202. package/lib/template/object-page/object-page.component.spec.ts +22 -0
  203. package/lib/template/object-page/object-page.component.ts +14 -0
  204. package/lib/template/one-column/one-column.component.ts +0 -1
  205. package/lib/template/one-column-page/one-column-page.component.ts +0 -1
  206. package/lib/template/one-column-tab/one-column-tab.component.scss +1 -1
  207. package/lib/template/one-column-tab/one-column-tab.component.ts +0 -1
  208. package/lib/template/page/page.component.ts +0 -1
  209. package/lib/template/promoted-filters/promoted-filters.component.ts +0 -1
  210. package/lib/template/repeating-structures/repeating-structures.component.ts +0 -2
  211. package/lib/template/self-service-case-view/self-service-case-view.component.html +78 -0
  212. package/lib/template/self-service-case-view/self-service-case-view.component.scss +132 -0
  213. package/lib/template/self-service-case-view/self-service-case-view.component.spec.ts +24 -0
  214. package/lib/template/self-service-case-view/self-service-case-view.component.ts +207 -0
  215. package/lib/template/simple-table/simple-table.component.ts +0 -2
  216. package/lib/template/simple-table-manual/helpers.ts +126 -10
  217. package/lib/template/simple-table-manual/simple-table-manual.component.html +27 -8
  218. package/lib/template/simple-table-manual/simple-table-manual.component.scss +15 -17
  219. package/lib/template/simple-table-manual/simple-table-manual.component.ts +103 -45
  220. package/lib/template/simple-table-select/simple-table-select.component.ts +0 -1
  221. package/lib/template/single-reference-readonly/single-reference-readonly.component.html +4 -1
  222. package/lib/template/single-reference-readonly/single-reference-readonly.component.scss +21 -0
  223. package/lib/template/single-reference-readonly/single-reference-readonly.component.ts +104 -4
  224. package/lib/template/sub-tabs/sub-tabs.component.ts +0 -1
  225. package/lib/template/three-column/three-column.component.ts +0 -1
  226. package/lib/template/three-column-page/three-column-page.component.ts +0 -1
  227. package/lib/template/two-column/two-column.component.ts +0 -1
  228. package/lib/template/two-column-page/two-column-page.component.ts +0 -1
  229. package/lib/template/two-column-tab/two-column-tab.component.ts +0 -1
  230. package/lib/template/utils.ts +58 -0
  231. package/lib/template/wide-narrow-form/wide-narrow-form.component.ts +0 -1
  232. package/lib/template/wide-narrow-page/wide-narrow-page.component.ts +0 -1
  233. package/lib/template/wss-nav-bar/wss-nav-bar.component.html +6 -5
  234. package/lib/template/wss-nav-bar/wss-nav-bar.component.scss +8 -17
  235. package/lib/template/wss-nav-bar/wss-nav-bar.component.ts +1 -9
  236. package/lib/widget/app-announcement/app-announcement.component.html +1 -2
  237. package/lib/widget/app-announcement/app-announcement.component.scss +2 -2
  238. package/lib/widget/app-announcement/app-announcement.component.ts +0 -1
  239. package/lib/widget/attachment/Attachment.types.ts +92 -0
  240. package/lib/widget/attachment/AttachmentUtils.ts +287 -0
  241. package/lib/widget/attachment/attachment.component.html +3 -3
  242. package/lib/widget/attachment/attachment.component.scss +9 -12
  243. package/lib/widget/attachment/attachment.component.ts +267 -254
  244. package/lib/widget/case-history/case-history.component.ts +0 -1
  245. package/lib/widget/feed-container/feed-container.component.scss +3 -9
  246. package/lib/widget/feed-container/feed-container.component.ts +2 -5
  247. package/lib/widget/file-utility/file-utility.component.html +3 -3
  248. package/lib/widget/file-utility/file-utility.component.scss +6 -17
  249. package/lib/widget/file-utility/file-utility.component.ts +24 -9
  250. package/lib/widget/list-utility/list-utility.component.scss +4 -5
  251. package/lib/widget/list-utility/list-utility.component.ts +0 -1
  252. package/lib/widget/quick-create/quick-create.component.ts +41 -23
  253. package/lib/widget/todo/todo.component.html +12 -10
  254. package/lib/widget/todo/todo.component.scss +20 -10
  255. package/lib/widget/todo/todo.component.ts +11 -7
  256. package/lib/widget/utility/utility.component.ts +0 -1
  257. package/package.json +1 -1
@@ -1,29 +1,39 @@
1
- import { Component, OnInit, Input, NgZone, forwardRef, OnDestroy, ViewChild, ElementRef } from '@angular/core';
1
+ import { Component, OnInit, Input, OnDestroy, ViewChild, ElementRef } from '@angular/core';
2
2
  import { FormGroup } from '@angular/forms';
3
3
  import { CommonModule } from '@angular/common';
4
4
  import { MatButtonModule } from '@angular/material/button';
5
5
  import { MatMenuModule } from '@angular/material/menu';
6
6
  import { MatIconModule } from '@angular/material/icon';
7
7
  import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
8
- import download from 'downloadjs';
9
8
  import { AngularPConnectData, AngularPConnectService } from '@pega/angular-sdk-components';
10
9
  import { Utils } from '@pega/angular-sdk-components';
11
- import { ComponentMapperComponent } from '@pega/angular-sdk-components';
12
10
  import { PConnFieldProps } from '@pega/angular-sdk-components';
11
+ import {
12
+ clearFieldErrorMessages,
13
+ deleteAttachments,
14
+ getMappedValue,
15
+ insertAttachments,
16
+ onFileDownload,
17
+ transformAttachments,
18
+ validateFileExtension,
19
+ validateMaxSize
20
+ } from './AttachmentUtils';
21
+ import { PageInstructionOptions } from './Attachment.types';
13
22
 
14
23
  interface AttachmentProps extends Omit<PConnFieldProps, 'value'> {
15
24
  // If any, enter additional props that only exist on this component
16
25
  value: any;
17
26
  extensions: any;
18
27
  allowMultiple: boolean;
28
+ isTableFormatter: boolean;
29
+ editMode: string;
19
30
  }
20
31
 
21
32
  @Component({
22
33
  selector: 'app-attachment',
23
34
  templateUrl: './attachment.component.html',
24
35
  styleUrls: ['./attachment.component.scss'],
25
- standalone: true,
26
- imports: [CommonModule, MatProgressSpinnerModule, MatMenuModule, MatIconModule, MatButtonModule, forwardRef(() => ComponentMapperComponent)]
36
+ imports: [CommonModule, MatProgressSpinnerModule, MatMenuModule, MatIconModule, MatButtonModule]
27
37
  })
28
38
  export class AttachmentComponent implements OnInit, OnDestroy {
29
39
  @Input() pConn$: typeof PConnect;
@@ -33,73 +43,74 @@ export class AttachmentComponent implements OnInit, OnDestroy {
33
43
  angularPConnectData: AngularPConnectData = {};
34
44
  @ViewChild('uploader', { static: false }) fileInput: ElementRef;
35
45
 
46
+ localizationService: any;
47
+ contextName: string;
48
+ actionSequencer: any;
49
+ caseID: any;
36
50
  label$ = '';
37
51
  value$: any;
38
52
  bRequired$ = false;
39
53
  bReadonly$ = false;
40
54
  bDisabled$ = false;
41
55
  bVisible$ = true;
42
- bLoading$ = false;
43
- bShowSelector$ = true;
44
- att_categoryName: string;
45
- fileTemp: any = {};
46
- caseID: any;
47
56
  allowMultiple$ = false;
48
57
  extensions$ = '';
58
+ displayMode: string | undefined;
49
59
  status = '';
50
60
  validateMessage: string | undefined = '';
51
61
  valueRef: string;
52
- imagePath$: string;
53
62
  localizedVal = PCore.getLocaleUtils().getLocaleValue;
54
- localeCategory = 'CosmosFields';
55
- uploadMultipleFilesLabel = this.localizedVal('file_upload_text_multiple', this.localeCategory);
56
- uploadSingleFileLabel = this.localizedVal('file_upload_text_one', this.localeCategory);
63
+ uploadMultipleFilesLabel = this.localizedVal('file_upload_text_multiple', 'CosmosFields');
64
+ uploadSingleFileLabel = this.localizedVal('file_upload_text_one', 'CosmosFields');
57
65
  filesWithError: any = [];
58
66
  files: any = [];
59
- categoryName: string;
60
- displayMode: string | undefined;
61
67
  srcImg: any;
62
68
  deleteIcon: string;
63
69
  tempFilesToBeUploaded: any[];
70
+ attachments: any;
71
+ attachmentCount: number = 0;
72
+ isOldAttachment = false;
73
+ multiAttachmentsInInlineEdit: any = [];
74
+ isMultiAttachmentInInlineEditTable;
75
+ overrideLocalState = false;
76
+
64
77
  constructor(
65
78
  private angularPConnect: AngularPConnectService,
66
- private utils: Utils,
67
- private ngZone: NgZone
79
+ private utils: Utils
68
80
  ) {}
69
81
 
70
82
  ngOnInit(): void {
71
- // // First thing in initialization is registering and subscribing to the AngularPConnect service
72
- this.angularPConnectData = this.angularPConnect.registerAndSubscribeComponent(this, this.onStateChange);
73
- this.caseID = PCore.getStoreValue('.pyID', 'caseInfo.content', this.pConn$.getContextName());
74
83
  this.srcImg = this.utils.getImageSrc('document-doc', this.utils.getSDKStaticContentUrl());
75
84
  this.deleteIcon = this.utils.getImageSrc('trash', this.utils.getSDKStaticContentUrl());
76
- this.checkAndUpdate();
77
- this.getAttachments();
78
- }
79
85
 
80
- getAttachments() {
81
- let tempUploadedFiles = this.getCurrentAttachmentsList(this.getAttachmentKey(this.valueRef), this.pConn$.getContextName());
82
- tempUploadedFiles = tempUploadedFiles.filter(f => f.label === this.valueRef && f.delete !== true);
83
- this.files?.map(f => {
84
- return f.responseProps?.pzInsKey && !f.responseProps.pzInsKey.includes('temp')
85
- ? {
86
- ...f,
87
- props: {
88
- ...f.props,
89
- onDelete: () => this.deleteFile(f)
90
- }
91
- }
92
- : { ...f };
93
- });
94
- this.files = [...this.files, ...tempUploadedFiles];
95
- PCore.getPubSubUtils().subscribe(
96
- PCore.getConstants().PUB_SUB_EVENTS.CASE_EVENTS.ASSIGNMENT_SUBMISSION,
97
- this.resetAttachmentStoredState.bind(this),
98
- this.caseID
99
- );
100
- return () => {
101
- PCore.getPubSubUtils().unsubscribe(PCore.getConstants().PUB_SUB_EVENTS.CASE_EVENTS.ASSIGNMENT_SUBMISSION, this.caseID);
102
- };
86
+ this.localizationService = this.pConn$.getLocalizationService();
87
+ this.contextName = this.pConn$.getContextName();
88
+ this.actionSequencer = PCore.getActionsSequencer();
89
+
90
+ this.caseID = PCore.getStoreValue(`.${getMappedValue('pyID')}`, PCore.getResolvedConstantValue('caseInfo.content'), this.contextName);
91
+
92
+ this.displayMode = this.pConn$.getConfigProps().displayMode;
93
+
94
+ if (this.displayMode !== 'DISPLAY_ONLY') {
95
+ PCore.getPubSubUtils().subscribe(
96
+ PCore.getConstants().PUB_SUB_EVENTS.CASE_EVENTS.ASSIGNMENT_SUBMISSION,
97
+ () => {
98
+ this.overrideLocalState = true;
99
+ },
100
+ this.caseID
101
+ );
102
+ }
103
+
104
+ const { value } = this.pConn$.getConfigProps();
105
+ const rawValue = this.pConn$.getComponentConfig().value;
106
+ const isAttachmentAnnotationPresent = typeof rawValue === 'object' ? false : rawValue?.includes('@ATTACHMENT');
107
+ const { attachments, isOldAttachment } = isAttachmentAnnotationPresent ? value : PCore.getAttachmentUtils().prepareAttachmentData(value);
108
+ this.isOldAttachment = isOldAttachment;
109
+ this.attachments = attachments;
110
+ this.files = transformAttachments(attachments);
111
+
112
+ this.angularPConnectData = this.angularPConnect.registerAndSubscribeComponent(this, this.onStateChange);
113
+ this.checkAndUpdate();
103
114
  }
104
115
 
105
116
  checkAndUpdate() {
@@ -121,27 +132,15 @@ export class AttachmentComponent implements OnInit, OnDestroy {
121
132
  updateSelf() {
122
133
  const configProps: AttachmentProps = this.pConn$.resolveConfigProps(this.pConn$.getConfigProps()) as AttachmentProps;
123
134
  const stateProps = this.pConn$.getStateProps();
124
- const { value, label, extensions, displayMode } = configProps;
135
+ const { value, label, required, disabled, readOnly, extensions, displayMode, isTableFormatter, allowMultiple, editMode } = configProps;
125
136
 
126
- if (configProps.required != null) {
127
- this.bRequired$ = this.utils.getBooleanValue(configProps.required);
128
- }
137
+ this.bRequired$ = this.utils.getBooleanValue(required);
129
138
  if (configProps.visibility != null) {
130
139
  this.bVisible$ = this.utils.getBooleanValue(configProps.visibility);
131
140
  }
132
-
133
- // disabled
134
- if (configProps.disabled != undefined) {
135
- this.bDisabled$ = this.utils.getBooleanValue(configProps.disabled);
136
- }
137
-
138
- if (configProps.readOnly != null) {
139
- this.bReadonly$ = this.utils.getBooleanValue(configProps.readOnly);
140
- }
141
-
142
- if (configProps.allowMultiple != null) {
143
- this.allowMultiple$ = this.utils.getBooleanValue(configProps.allowMultiple);
144
- }
141
+ this.bDisabled$ = this.utils.getBooleanValue(disabled);
142
+ this.bReadonly$ = this.utils.getBooleanValue(readOnly);
143
+ this.allowMultiple$ = this.utils.getBooleanValue(allowMultiple);
145
144
 
146
145
  this.label$ = label;
147
146
  this.value$ = value;
@@ -151,142 +150,113 @@ export class AttachmentComponent implements OnInit, OnDestroy {
151
150
  this.extensions$ = extensions;
152
151
  this.valueRef = this.pConn$.getStateProps().value;
153
152
  this.valueRef = this.valueRef.startsWith('.') ? this.valueRef.substring(1) : this.valueRef;
154
- this.displayMode = displayMode;
155
- /* this is a temporary fix because required is supposed to be passed as a boolean and NOT as a string */
156
- let { required, disabled } = configProps;
157
- [required, disabled] = [required, disabled].map(prop => prop === true || (typeof prop === 'string' && prop === 'true'));
158
153
 
159
- this.categoryName = '';
160
- if (value && value.pyCategoryName) {
161
- this.categoryName = value.pyCategoryName;
162
- }
154
+ this.pConn$.setReferenceList(`.${this.valueRef}`);
163
155
 
164
- if (value?.pxResults && +value.pyCount > 0) {
165
- this.files = value.pxResults.map(f => this.buildFilePropsFromResponse(f));
156
+ this.displayMode = displayMode;
157
+ this.isMultiAttachmentInInlineEditTable = isTableFormatter && allowMultiple && editMode === 'tableRows';
158
+
159
+ const rawValue = this.pConn$.getComponentConfig().value;
160
+ const isAttachmentAnnotationPresent = typeof rawValue === 'object' ? false : rawValue?.includes('@ATTACHMENT');
161
+ const { attachments, isOldAttachment } = isAttachmentAnnotationPresent ? value : PCore.getAttachmentUtils().prepareAttachmentData(value);
162
+ const isAttachmentsChanged = !PCore.isDeepEqual(this.attachments, attachments);
163
+ this.isOldAttachment = isOldAttachment;
164
+ this.attachments = attachments;
165
+
166
+ // update the attachments shown in the UI
167
+ if (isAttachmentsChanged) {
168
+ this.updateAttachments();
166
169
  }
167
-
168
- this.updateAttachments();
169
- }
170
-
171
- buildFilePropsFromResponse(respObj) {
172
- return {
173
- props: {
174
- meta: `${respObj.pyCategoryName}, ${respObj.pxCreateOperator}`,
175
- name: respObj.pyAttachName,
176
- icon: this.utils.getIconFromFileType(respObj.pyMimeFileExtension)
177
- },
178
- responseProps: {
179
- ...respObj
180
- }
181
- };
182
170
  }
183
171
 
184
172
  updateAttachments() {
185
- if (this.files.length > 0 && this.displayMode !== 'DISPLAY_ONLY') {
186
- const currentAttachmentList = this.getCurrentAttachmentsList(this.getAttachmentKey(this.valueRef), this.pConn$.getContextName());
187
- // block duplicate files to redux store when added 1 after another to prevent multiple duplicates being added to the case on submit
188
- const tempFiles = this.files.filter(f => currentAttachmentList.findIndex(fr => fr.ID === f.ID) === -1 && !f.inProgress && f.responseProps);
189
- const updatedAttList = [...currentAttachmentList, ...tempFiles];
190
- this.updateAttachmentState(this.pConn$, this.getAttachmentKey(this.valueRef), updatedAttList);
173
+ if (this.overrideLocalState) {
174
+ const serverFiles = transformAttachments(this.attachments);
175
+ this.overrideLocalState = false;
176
+ this.attachmentCount = this.attachments.length;
177
+ this.filesWithError = [];
178
+ this.files = serverFiles;
179
+ } else {
180
+ // Determine whether refresh call has overridden any error files in redux, push error files back to redux from local state to perform client side validation during assignment submit
181
+ const errorFiles = this.attachments.filter(attachment => attachment.props.error);
182
+ if (errorFiles.length === 0 && this.filesWithError.length > 0) {
183
+ // Check if local file state contains error files and push those to redux
184
+ const uniqueKey = getMappedValue('pzInsKey');
185
+ const transformedErrorFiles = this.filesWithError.map(errorFile => {
186
+ const filename = errorFile.props.name;
187
+ return {
188
+ [uniqueKey]: errorFile.props.id,
189
+ FileName: filename,
190
+ Category: '',
191
+ FileExtension: filename.split('.').pop() ?? filename,
192
+ error: errorFile.props.error || null
193
+ };
194
+ });
195
+ let key = '';
196
+ let updatedAttachments: any = [];
197
+ if (this.allowMultiple$ || this.isOldAttachment) {
198
+ key = this.isOldAttachment ? `${this.valueRef}.pxResults` : this.valueRef;
199
+ const existingAttachments = PCore.getStoreValue(`.${key}`, this.pConn$.getPageReference(), this.pConn$.getContextName()) || [];
200
+ updatedAttachments = [...existingAttachments, ...transformedErrorFiles];
201
+ } else {
202
+ key = this.valueRef;
203
+ updatedAttachments = transformedErrorFiles[0];
204
+ }
205
+ PCore.getStateUtils().updateState(this.pConn$.getContextName(), key, updatedAttachments, {
206
+ pageReference: this.pConn$.getPageReference(),
207
+ isArrayDeepMerge: false,
208
+ removePropertyFromChangedList: true
209
+ });
210
+ }
191
211
  }
192
212
  }
193
213
 
194
- resetAttachmentStoredState() {
195
- PCore.getStateUtils().updateState(this.pConn$?.getContextName(), this.getAttachmentKey(this.valueRef), undefined, {
196
- pageReference: 'context_data',
197
- isArrayDeepMerge: false
198
- });
199
- }
200
-
201
214
  downloadFile(fileObj: any) {
202
- PCore.getAttachmentUtils()
203
- // @ts-ignore - 3rd parameter "responseEncoding" should be optional
204
- .downloadAttachment(fileObj.pzInsKey, this.pConn$.getContextName())
205
- .then((content: any) => {
206
- const extension = fileObj.pyAttachName.split('.').pop();
207
- this.fileDownload(content.data, fileObj.pyFileName, extension);
208
- })
209
- .catch(e => {
210
- console.log(e);
211
- });
212
- }
213
-
214
- fileDownload = (data, fileName, ext) => {
215
- const file = ext ? `${fileName}.${ext}` : fileName;
216
- download(atob(data), file);
217
- };
218
-
219
- getAttachmentKey = (name = '') => (name ? `attachmentsList.${name}` : 'attachmentsList');
220
-
221
- getCurrentAttachmentsList(key, context) {
222
- return PCore.getStoreValue(`.${key}`, 'context_data', context) || [];
223
- }
224
-
225
- validateMaxSize(fileObj, maxSizeInMB): boolean {
226
- const fileSize = (fileObj.size / 1048576).toFixed(2);
227
- return parseFloat(fileSize) < parseFloat(maxSizeInMB);
215
+ onFileDownload(fileObj, this.contextName);
228
216
  }
229
217
 
230
- validateFileExtension = (fileObj, allowedExtensions) => {
231
- if (!allowedExtensions) {
232
- return true;
218
+ deleteFile(file, fileIndex: number) {
219
+ if (this.filesWithError.length > 0) {
220
+ this.filesWithError = this.filesWithError.filter(fileWithError => fileWithError.props.id !== file.props.id);
221
+ if (this.filesWithError.length === 0) {
222
+ clearFieldErrorMessages(this.pConn$);
223
+ }
233
224
  }
234
- const allowedExtensionList = allowedExtensions
235
- .toLowerCase()
236
- .split(',')
237
- .map(item => item.replaceAll('.', '').trim());
238
- const extension = fileObj.name.split('.').pop().toLowerCase();
239
- return allowedExtensionList.includes(extension);
240
- };
241
-
242
- updateAttachmentState(pConn, key, attachments) {
243
- PCore.getStateUtils().updateState(this.pConn$.getContextName(), key, attachments, {
244
- pageReference: 'context_data',
245
- isArrayDeepMerge: false
246
- });
247
- }
248
225
 
249
- deleteFile(file) {
250
- const attachmentsList: any[] = [];
251
- let currentAttachmentList = this.getCurrentAttachmentsList(this.getAttachmentKey(this.valueRef), this.pConn$.getContextName());
252
-
253
- // If file to be deleted is the one added in previous stage i.e. for which a file instance is created in server
254
- // no need to filter currentAttachmentList as we will get another entry of file in redux with delete & label
255
- // eslint-disable-next-line no-unsafe-optional-chaining
256
- if (this.value$ && this.value$?.pxResults && +this.value$?.pyCount > 0 && file.responseProps && file?.responseProps?.pzInsKey !== 'temp') {
257
- const updatedAttachments = this.files.map(f => {
258
- if (f.responseProps && f.responseProps.pzInsKey === file.responseProps.pzInsKey) {
259
- return { ...f, delete: true, label: this.valueRef };
226
+ if (file.inProgress) {
227
+ // @ts-ignore - Expected 1 arguments, but got 2.ts(2554)
228
+ PCore.getAttachmentUtils().cancelRequest(file.props.id, this.contextName);
229
+ this.actionSequencer.deRegisterBlockingAction(this.contextName).catch(() => {});
230
+ this.files = this.files.filter(localFile => localFile.props.id !== file.props.id);
231
+ } else {
232
+ deleteAttachments([file], this.pConn$, this.multiAttachmentsInInlineEdit, {
233
+ allowMultiple: this.allowMultiple$,
234
+ isOldAttachment: this.isOldAttachment,
235
+ isMultiAttachmentInInlineEditTable: this.isMultiAttachmentInInlineEditTable,
236
+ attachmentCount: this.attachmentCount,
237
+ deleteIndex: fileIndex
238
+ } as any);
239
+
240
+ // Filter out without deleted file and reset the file indexes
241
+ let tempLocalFiles = [...this.files];
242
+ tempLocalFiles = tempLocalFiles.filter(localFile => localFile.props.id !== file.props.id);
243
+ tempLocalFiles.forEach(localFile => {
244
+ if (!localFile.props.error && !file.props.error) {
245
+ const updatedDeleteIndex =
246
+ localFile.responseProps.deleteIndex > fileIndex ? localFile.responseProps.deleteIndex - 1 : localFile.responseProps.deleteIndex;
247
+
248
+ localFile.responseProps.deleteIndex = updatedDeleteIndex;
260
249
  }
261
- return f;
262
250
  });
263
-
264
- // updating the redux store to help form-handler in passing the data to delete the file from server
265
- this.updateAttachmentState(this.pConn$, this.getAttachmentKey(this.valueRef), [...updatedAttachments]);
266
- const newlyAddedFiles = this.files.filter(f => !!f.ID);
267
- const filesPostDelete = this.files.filter(
268
- f => f.responseProps?.pzInsKey !== 'temp' && f.responseProps?.pzInsKey !== file.responseProps?.pzInsKey
269
- );
270
- this.files = [...filesPostDelete, ...newlyAddedFiles];
271
- } // if the file being deleted is the added in this stage i.e. whose data is not yet created in server
272
- else {
273
- // filter newly added files in this stage, later the updated current stage files will be added to redux once files state is updated
274
- currentAttachmentList = currentAttachmentList.filter(f => f.ID !== file.ID);
275
- this.files = this.files.filter(f => f.ID !== file.ID);
276
-
277
- this.updateAttachmentState(this.pConn$, this.getAttachmentKey(this.valueRef), [...currentAttachmentList, ...attachmentsList]);
278
- if (file.inProgress) {
279
- // @ts-ignore - 3rd parameter "responseEncoding" should be optional
280
- PCore.getAttachmentUtils().cancelRequest(file.ID, this.pConn$.getContextName());
251
+ this.files = tempLocalFiles;
252
+ if (!file.props.error) {
253
+ this.attachmentCount -= 1;
281
254
  }
282
255
  }
283
256
 
284
- this.filesWithError = this.filesWithError?.filter(f => f.ID !== file.ID);
285
- if (this.filesWithError.length === 0) {
286
- this.clearFieldErrorMessages();
257
+ if (this.fileInput?.nativeElement) {
258
+ this.fileInput.nativeElement.value = '';
287
259
  }
288
- // eslint-disable-next-line @typescript-eslint/no-unused-expressions
289
- this.fileInput && this.fileInput.nativeElement.value ? null : '';
290
260
  }
291
261
 
292
262
  onFileAdded(event) {
@@ -296,102 +266,121 @@ export class AttachmentComponent implements OnInit, OnDestroy {
296
266
  this.tempFilesToBeUploaded = [
297
267
  ...addedFiles.map((f: any, index) => {
298
268
  f.ID = `${new Date().getTime()}I${index}`;
299
- f.inProgress = true;
300
269
  f.props = {
301
270
  type: f.type,
302
271
  name: f.name,
272
+ id: f.ID,
273
+ format: f.name.split('.').pop(),
303
274
  icon: this.utils.getIconFromFileType(f.type),
304
- onDelete: () => this.deleteFile(f)
275
+ thumbnail: window.URL.createObjectURL(f)
305
276
  };
306
- if (!this.validateMaxSize(f, maxAttachmentSize)) {
277
+
278
+ if (!validateMaxSize(f, maxAttachmentSize)) {
307
279
  f.props.error = true;
308
- f.inProgress = false;
309
- f.props.meta = this.pConn$.getLocalizedValue(`File is too big. Max allowed size is ${maxAttachmentSize}MB.`, '', '');
310
- } else if (!this.validateFileExtension(f, this.extensions$)) {
280
+ f.props.meta = this.localizationService.getLocalizedText(`File is too big. Max allowed size is ${maxAttachmentSize}MB.`);
281
+ } else if (!validateFileExtension(f, this.extensions$)) {
311
282
  f.props.error = true;
312
- f.inProgress = false;
313
- f.props.meta = `${this.pConn$.getLocalizedValue(
314
- 'File has invalid extension. Allowed extensions are:',
315
- '',
283
+ f.props.meta = `${this.localizationService.getLocalizedText('File has invalid extension. Allowed extensions are:')} ${this.extensions$.replaceAll(
284
+ '.',
316
285
  ''
317
- )} ${this.extensions$.replaceAll('.', '')}`;
286
+ )}`;
318
287
  }
288
+
319
289
  if (f.props.error) {
320
- const fieldName = this.pConn$.getStateProps().value;
321
- const context = this.pConn$.getContextName();
290
+ const fieldName = (this.pConn$.getStateProps() as any).value;
322
291
  PCore.getMessageManager().addMessages({
323
292
  messages: [
324
293
  {
325
294
  type: 'error',
326
- message: this.pConn$.getLocalizedValue('Error with one or more files', '', '')
295
+ message: this.localizationService.getLocalizedText('Error with one or more files')
327
296
  }
328
297
  ],
329
298
  property: fieldName,
330
299
  pageReference: this.pConn$.getPageReference(),
331
- context
300
+ context: this.contextName
332
301
  });
333
302
  }
334
303
  return f;
335
304
  })
336
305
  ];
306
+
337
307
  const tempFilesWithError = this.tempFilesToBeUploaded.filter(f => f.props.error);
338
308
  if (tempFilesWithError.length > 0) {
339
- this.filesWithError = tempFilesWithError;
309
+ this.filesWithError = [...this.filesWithError, ...tempFilesWithError];
310
+
311
+ insertAttachments(tempFilesWithError, this.pConn$, this.multiAttachmentsInInlineEdit, {
312
+ allowMultiple: this.allowMultiple$,
313
+ isOldAttachment: this.isOldAttachment,
314
+ isMultiAttachmentInInlineEditTable: this.isMultiAttachmentInInlineEditTable,
315
+ attachmentCount: this.attachmentCount
316
+ } as PageInstructionOptions);
340
317
  }
318
+
341
319
  if (!this.allowMultiple$) {
342
320
  this.files = [...this.tempFilesToBeUploaded];
343
321
  } else {
344
322
  this.files = [...this.files, ...this.tempFilesToBeUploaded];
345
323
  }
346
- this.uploadFiles();
324
+
325
+ this.actionSequencer.registerBlockingAction(this.contextName).then(() => {
326
+ this.uploadFiles();
327
+ });
328
+ }
329
+
330
+ onUploadProgress(id, ev) {
331
+ const progress = Math.floor((ev.loaded / ev.total) * 100);
332
+ this.files = this.files.map(localFile => {
333
+ if (localFile.props?.id === id) {
334
+ localFile.inProgress = true;
335
+ localFile.props.progress = progress;
336
+ }
337
+ return localFile;
338
+ });
347
339
  }
348
340
 
349
- clearFieldErrorMessages() {
350
- const fieldName = this.pConn$.getStateProps().value;
351
- const context = this.pConn$.getContextName();
352
- PCore.getMessageManager().clearMessages({
353
- type: PCore.getConstants().MESSAGES.MESSAGES_TYPE_ERROR,
341
+ populateErrorAndUpdateRedux(file) {
342
+ const fieldName = (this.pConn$.getStateProps() as any).value;
343
+ // set errors to property to block submit even on errors in file upload
344
+ PCore.getMessageManager().addMessages({
345
+ messages: [
346
+ {
347
+ type: 'error',
348
+ message: this.localizationService.getLocalizedText('Error with one or more files')
349
+ }
350
+ ],
354
351
  property: fieldName,
355
352
  pageReference: this.pConn$.getPageReference(),
356
- context
353
+ context: this.contextName
357
354
  });
355
+ insertAttachments([file], this.pConn$, this.multiAttachmentsInInlineEdit, {
356
+ allowMultiple: this.allowMultiple$,
357
+ isOldAttachment: this.isOldAttachment,
358
+ isMultiAttachmentInInlineEditTable: this.isMultiAttachmentInInlineEditTable,
359
+ attachmentCount: this.attachmentCount
360
+ } as any);
358
361
  }
359
362
 
360
- onUploadProgress() {}
361
-
362
- errorHandler(isFetchCanceled, attachedFile) {
363
+ errorHandler(isFetchCanceled, file) {
363
364
  return error => {
364
365
  if (!isFetchCanceled(error)) {
365
- let uploadFailMsg = this.pConn$.getLocalizedValue('Something went wrong', '', '');
366
+ let uploadFailMsg = this.localizationService.getLocalizedText('Something went wrong');
366
367
  if (error.response && error.response.data && error.response.data.errorDetails) {
367
- uploadFailMsg = this.pConn$.getLocalizedValue(error.response.data.errorDetails[0].localizedValue, '', '');
368
+ uploadFailMsg = this.localizationService.getLocalizedText(error.response.data.errorDetails[0].localizedValue);
368
369
  }
369
370
 
370
- this.files.map(f => {
371
- if (f.ID === attachedFile.ID) {
372
- f.props.meta = uploadFailMsg;
373
- f.props.error = true;
374
- f.props.onDelete = () => this.deleteFile(f);
375
- f.props.icon = this.utils.getIconFromFileType(f.type);
376
- f.props.name = this.pConn$.getLocalizedValue('Unable to upload file', '', '');
377
- f.inProgress = false;
378
- const fieldName = this.pConn$.getStateProps().value;
379
- const context = this.pConn$.getContextName();
380
- // set errors to property to block submit even on errors in file upload
381
- PCore.getMessageManager().addMessages({
382
- messages: [
383
- {
384
- type: 'error',
385
- message: this.pConn$.getLocalizedValue('Error with one or more files', '', '')
386
- }
387
- ],
388
- property: fieldName,
389
- pageReference: this.pConn$.getPageReference(),
390
- context
391
- });
392
- delete f.props.progress;
371
+ this.files = this.files.map(localFile => {
372
+ if (localFile.props.id === file.props.id) {
373
+ localFile.props.meta = uploadFailMsg;
374
+ localFile.props.error = true;
375
+ localFile.props.icon = this.utils.getIconFromFileType(localFile.type);
376
+ localFile.props.name = this.localizationService.getLocalizedText('Unable to upload file');
377
+ localFile.inProgress = false;
378
+ delete localFile.props.progress;
379
+ this.filesWithError.push(localFile);
380
+
381
+ this.populateErrorAndUpdateRedux(localFile);
393
382
  }
394
- return f;
383
+ return localFile;
395
384
  });
396
385
  }
397
386
  throw error;
@@ -403,48 +392,70 @@ export class AttachmentComponent implements OnInit, OnDestroy {
403
392
  .filter(e => {
404
393
  const isFileUploaded = e.props && e.props.progress === 100;
405
394
  const fileHasError = e.props && e.props.error;
406
- const isFileUploadedinLastStep = e.responseProps && e.responseProps.pzInsKey;
407
- return !isFileUploaded && !fileHasError && !isFileUploadedinLastStep;
395
+ const isFileUploadedInLastStep = e.responseProps && e.responseProps.ID !== 'temp';
396
+ const isFileUploadInProgress = e.inProgress;
397
+ return !isFileUploadInProgress && !isFileUploaded && !fileHasError && !isFileUploadedInLastStep;
408
398
  })
409
- .map(f =>
410
- window.PCore.getAttachmentUtils().uploadAttachment(
411
- f,
412
- () => {
413
- this.onUploadProgress();
399
+ .map(file =>
400
+ PCore.getAttachmentUtils().uploadAttachment(
401
+ file,
402
+ ev => {
403
+ this.onUploadProgress(file.props.id, ev);
414
404
  },
415
405
  isFetchCanceled => {
416
- return this.errorHandler(isFetchCanceled, f);
406
+ return this.errorHandler(isFetchCanceled, file);
417
407
  },
418
- this.pConn$.getContextName()
408
+ this.contextName
419
409
  )
420
410
  );
411
+
421
412
  Promise.allSettled(filesToBeUploaded)
422
413
  .then((fileResponses: any) => {
423
414
  fileResponses = fileResponses.filter(fr => fr.status !== 'rejected'); // in case of deleting an in progress file, promise gets cancelled but still enters then block
424
415
  if (fileResponses.length > 0) {
425
- this.files.forEach(f => {
426
- const index = fileResponses.findIndex((fr: any) => fr.value.clientFileID === f.ID);
416
+ this.files = this.files.map(localFile => {
417
+ // if attach field has multiple files & in bw any error files are present
418
+ // Example : files = [properFile1, errFile, errFile, properFile2]
419
+ // indexes for delete & preview should be for files [properFile1, properFile2] which is [1,2]
420
+ const index = fileResponses.findIndex(fileResponse => fileResponse.value.clientFileID === localFile.props.id);
427
421
  if (index >= 0) {
428
- f.props.meta = this.pConn$.getLocalizedValue('Uploaded successfully', '', '');
429
- f.props.progress = 100;
430
- f.inProgress = false;
431
- f.handle = fileResponses[index].value.ID;
432
- f.label = this.valueRef;
433
- f.category = this.categoryName;
434
- f.responseProps = {
422
+ fileResponses[index].value.thumbnail = localFile.props.thumbnail;
423
+ localFile.inProgress = false;
424
+ localFile.ID = fileResponses[index].value.ID;
425
+ localFile.props.id = fileResponses[index].value.ID;
426
+ localFile.props.meta = this.localizationService.getLocalizedText('Uploaded successfully');
427
+ localFile.props.progress = 100;
428
+ localFile.handle = fileResponses[index].value.ID;
429
+ localFile.label = this.valueRef;
430
+ localFile.responseProps = {
435
431
  pzInsKey: 'temp',
436
- pyAttachName: f.props.name
432
+ pyAttachName: localFile.props.name
437
433
  };
438
434
  }
435
+
436
+ return localFile;
439
437
  });
440
- this.updateAttachments();
438
+
439
+ insertAttachments(fileResponses, this.pConn$, this.multiAttachmentsInInlineEdit, {
440
+ allowMultiple: this.allowMultiple$,
441
+ isOldAttachment: this.isOldAttachment,
442
+ isMultiAttachmentInInlineEditTable: this.isMultiAttachmentInInlineEditTable,
443
+ attachmentCount: this.attachmentCount,
444
+ insert: true
445
+ } as any);
446
+
447
+ this.attachmentCount += fileResponses.length;
448
+
441
449
  if (this.filesWithError?.length === 0) {
442
- this.clearFieldErrorMessages();
450
+ clearFieldErrorMessages(this.pConn$);
443
451
  }
444
452
  }
453
+
454
+ this.actionSequencer.deRegisterBlockingAction(this.contextName).catch(() => {});
445
455
  })
446
456
  .catch(error => {
447
457
  console.log(error);
458
+ this.actionSequencer.cancelDeferredActionsOnError(this.contextName);
448
459
  });
449
460
  }
450
461
 
@@ -453,6 +464,8 @@ export class AttachmentComponent implements OnInit, OnDestroy {
453
464
  this.angularPConnectData.unsubscribeFn();
454
465
  }
455
466
 
456
- PCore.getPubSubUtils().unsubscribe(PCore.getConstants().PUB_SUB_EVENTS.CASE_EVENTS.ASSIGNMENT_SUBMISSION, this.caseID);
467
+ if (this.displayMode !== 'DISPLAY_ONLY') {
468
+ PCore.getPubSubUtils().unsubscribe(PCore.getConstants().PUB_SUB_EVENTS.CASE_EVENTS.ASSIGNMENT_SUBMISSION, this.caseID);
469
+ }
457
470
  }
458
471
  }