@pega/angular-sdk-overrides 0.24.9 → 0.25.2

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 (256) 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 +1 -2
  4. package/lib/designSystemExtension/banner/banner.component.scss +12 -2
  5. package/lib/designSystemExtension/banner/banner.component.ts +0 -1
  6. package/lib/designSystemExtension/case-create-stage/case-create-stage.component.ts +1 -2
  7. package/lib/designSystemExtension/field-group/field-group.component.ts +0 -1
  8. package/lib/designSystemExtension/material-case-summary/material-case-summary.component.html +6 -3
  9. package/lib/designSystemExtension/material-case-summary/material-case-summary.component.scss +7 -35
  10. package/lib/designSystemExtension/material-case-summary/material-case-summary.component.ts +0 -2
  11. package/lib/designSystemExtension/material-details/material-details.component.scss +0 -5
  12. package/lib/designSystemExtension/material-details/material-details.component.ts +0 -1
  13. package/lib/designSystemExtension/material-details-fields/material-details-fields.component.html +4 -4
  14. package/lib/designSystemExtension/material-details-fields/material-details-fields.component.scss +4 -3
  15. package/lib/designSystemExtension/material-details-fields/material-details-fields.component.ts +10 -2
  16. package/lib/designSystemExtension/material-summary-item/material-summary-item.component.scss +2 -17
  17. package/lib/designSystemExtension/material-summary-item/material-summary-item.component.ts +0 -1
  18. package/lib/designSystemExtension/material-summary-list/material-summary-list.component.ts +0 -1
  19. package/lib/designSystemExtension/material-utility/material-utility.component.scss +1 -2
  20. package/lib/designSystemExtension/material-vertical-tabs/material-vertical-tabs.component.scss +1 -1
  21. package/lib/designSystemExtension/material-vertical-tabs/material-vertical-tabs.component.ts +0 -1
  22. package/lib/designSystemExtension/operator/operator.component.html +2 -2
  23. package/lib/designSystemExtension/operator/operator.component.scss +13 -12
  24. package/lib/designSystemExtension/operator/operator.component.ts +5 -6
  25. package/lib/designSystemExtension/pulse/pulse.component.scss +2 -2
  26. package/lib/designSystemExtension/pulse/pulse.component.ts +7 -8
  27. package/lib/designSystemExtension/rich-text-editor/rich-text-editor.component.scss +0 -1
  28. package/lib/designSystemExtension/rich-text-editor/rich-text-editor.component.ts +0 -1
  29. package/lib/designSystemExtension/wss-quick-create/wss-quick-create.component.scss +16 -8
  30. package/lib/designSystemExtension/wss-quick-create/wss-quick-create.component.ts +0 -1
  31. package/lib/field/auto-complete/auto-complete.component.html +0 -2
  32. package/lib/field/auto-complete/auto-complete.component.ts +56 -178
  33. package/lib/field/cancel-alert/cancel-alert.component.html +8 -12
  34. package/lib/field/cancel-alert/cancel-alert.component.scss +2 -3
  35. package/lib/field/cancel-alert/cancel-alert.component.ts +24 -37
  36. package/lib/field/check-box/check-box.component.html +17 -6
  37. package/lib/field/check-box/check-box.component.scss +0 -1
  38. package/lib/field/check-box/check-box.component.ts +32 -157
  39. package/lib/field/currency/currency.component.html +4 -4
  40. package/lib/field/currency/currency.component.ts +65 -175
  41. package/lib/field/date/date.component.html +4 -8
  42. package/lib/field/date/date.component.ts +39 -177
  43. package/lib/field/date-time/date-time.component.html +3 -4
  44. package/lib/field/date-time/date-time.component.ts +46 -146
  45. package/lib/field/decimal/decimal.component.html +4 -3
  46. package/lib/field/decimal/decimal.component.ts +66 -166
  47. package/lib/field/dropdown/dropdown.component.html +1 -0
  48. package/lib/field/dropdown/dropdown.component.ts +158 -153
  49. package/lib/field/email/email.component.ts +28 -148
  50. package/lib/field/field.base.ts +149 -0
  51. package/lib/field/group/group.component.ts +9 -7
  52. package/lib/field/integer/integer.component.ts +30 -152
  53. package/lib/field/list-view-action-buttons/list-view-action-buttons.component.html +1 -1
  54. package/lib/field/list-view-action-buttons/list-view-action-buttons.component.ts +3 -3
  55. package/lib/field/location/config-ext.json +8 -0
  56. package/lib/field/location/location.component.html +45 -0
  57. package/lib/field/location/location.component.scss +18 -0
  58. package/lib/field/location/location.component.spec.ts +22 -0
  59. package/lib/field/location/location.component.ts +385 -0
  60. package/lib/field/multiselect/multiselect.component.ts +56 -151
  61. package/lib/field/multiselect/utils.ts +55 -47
  62. package/lib/field/object-reference/object-reference.component.html +17 -0
  63. package/lib/field/object-reference/object-reference.component.scss +0 -0
  64. package/lib/field/object-reference/object-reference.component.spec.ts +22 -0
  65. package/lib/field/object-reference/object-reference.component.ts +237 -0
  66. package/lib/field/percentage/percentage.component.html +3 -3
  67. package/lib/field/percentage/percentage.component.ts +68 -161
  68. package/lib/field/phone/config-ext.json +1 -1
  69. package/lib/field/phone/phone.component.html +9 -6
  70. package/lib/field/phone/phone.component.scss +9 -0
  71. package/lib/field/phone/phone.component.ts +48 -159
  72. package/lib/field/radio-buttons/radio-buttons.component.html +17 -12
  73. package/lib/field/radio-buttons/radio-buttons.component.scss +4 -2
  74. package/lib/field/radio-buttons/radio-buttons.component.ts +39 -162
  75. package/lib/field/rich-text/rich-text.component.ts +32 -93
  76. package/lib/field/scalar-list/scalar-list.component.ts +20 -77
  77. package/lib/field/selectable-card/selectable-card.component.html +70 -0
  78. package/lib/field/selectable-card/selectable-card.component.scss +11 -0
  79. package/lib/field/selectable-card/selectable-card.component.spec.ts +22 -0
  80. package/lib/field/selectable-card/selectable-card.component.ts +219 -0
  81. package/lib/field/semantic-link/semantic-link.component.html +4 -8
  82. package/lib/field/semantic-link/semantic-link.component.scss +0 -13
  83. package/lib/field/semantic-link/semantic-link.component.ts +165 -6
  84. package/lib/field/text/text.component.scss +0 -1
  85. package/lib/field/text/text.component.ts +8 -5
  86. package/lib/field/text-area/text-area.component.html +4 -1
  87. package/lib/field/text-area/text-area.component.ts +30 -148
  88. package/lib/field/text-content/text-content.component.ts +0 -1
  89. package/lib/field/text-input/text-input.component.ts +28 -150
  90. package/lib/field/time/time.component.html +2 -2
  91. package/lib/field/time/time.component.ts +39 -145
  92. package/lib/field/url/url.component.ts +28 -149
  93. package/lib/field/user-reference/user-reference.component.html +40 -46
  94. package/lib/field/user-reference/user-reference.component.scss +0 -1
  95. package/lib/field/user-reference/user-reference.component.ts +110 -21
  96. package/lib/infra/Containers/flow-container/flow-container.component.html +1 -1
  97. package/lib/infra/Containers/flow-container/flow-container.component.ts +29 -54
  98. package/lib/infra/Containers/flow-container/helpers.ts +2 -2
  99. package/lib/infra/Containers/hybrid-view-container/hybrid-view-container.component.ts +0 -1
  100. package/lib/infra/Containers/modal-view-container/modal-view-container.component.html +1 -11
  101. package/lib/infra/Containers/modal-view-container/modal-view-container.component.ts +6 -19
  102. package/lib/infra/Containers/preview-view-container/preview-view-container.component.ts +1 -1
  103. package/lib/infra/Containers/view-container/helper.ts +55 -0
  104. package/lib/infra/Containers/view-container/view-container.component.ts +6 -19
  105. package/lib/infra/action-buttons/action-buttons.component.html +13 -8
  106. package/lib/infra/action-buttons/action-buttons.component.scss +23 -0
  107. package/lib/infra/action-buttons/action-buttons.component.ts +1 -3
  108. package/lib/infra/assignment/assignment.component.html +1 -1
  109. package/lib/infra/assignment/assignment.component.ts +90 -47
  110. package/lib/infra/assignment-card/assignment-card.component.html +2 -2
  111. package/lib/infra/assignment-card/assignment-card.component.scss +0 -4
  112. package/lib/infra/assignment-card/assignment-card.component.ts +21 -5
  113. package/lib/infra/dashboard-filter/dashboard-filter.component.ts +0 -1
  114. package/lib/infra/defer-load/defer-load.component.html +6 -2
  115. package/lib/infra/defer-load/defer-load.component.ts +24 -16
  116. package/lib/infra/error-boundary/error-boundary.component.ts +0 -1
  117. package/lib/infra/multi-step/multi-step.component.scss +1 -21
  118. package/lib/infra/multi-step/multi-step.component.ts +0 -1
  119. package/lib/infra/navbar/navbar.component.html +25 -28
  120. package/lib/infra/navbar/navbar.component.scss +16 -4
  121. package/lib/infra/navbar/navbar.component.ts +11 -9
  122. package/lib/infra/reference/reference.component.ts +77 -90
  123. package/lib/infra/region/region.component.ts +0 -1
  124. package/lib/infra/root-container/root-container.component.html +2 -15
  125. package/lib/infra/root-container/root-container.component.scss +0 -1
  126. package/lib/infra/root-container/root-container.component.ts +28 -35
  127. package/lib/infra/stages/stages.component.html +2 -2
  128. package/lib/infra/stages/stages.component.scss +9 -37
  129. package/lib/infra/stages/stages.component.ts +4 -3
  130. package/lib/infra/view/view.component.html +7 -20
  131. package/lib/infra/view/view.component.ts +20 -5
  132. package/lib/template/advanced-search/advanced-search.component.html +12 -0
  133. package/lib/template/advanced-search/advanced-search.component.scss +0 -0
  134. package/lib/template/advanced-search/advanced-search.component.spec.ts +0 -0
  135. package/lib/template/advanced-search/advanced-search.component.ts +112 -0
  136. package/lib/template/advanced-search/advanced-search.service.ts +27 -0
  137. package/lib/template/advanced-search/search-group/persist-utils.ts +56 -0
  138. package/lib/template/advanced-search/search-groups/search-groups.component.html +32 -0
  139. package/lib/template/advanced-search/search-groups/search-groups.component.scss +0 -0
  140. package/lib/template/advanced-search/search-groups/search-groups.component.spec.ts +0 -0
  141. package/lib/template/advanced-search/search-groups/search-groups.component.ts +294 -0
  142. package/lib/template/advanced-search/search-groups/utils.ts +29 -0
  143. package/lib/template/app-shell/app-shell.component.html +4 -1
  144. package/lib/template/app-shell/app-shell.component.scss +0 -3
  145. package/lib/template/app-shell/app-shell.component.ts +66 -10
  146. package/lib/template/banner-page/banner-page.component.ts +0 -1
  147. package/lib/template/base/details-template-base.ts +67 -0
  148. package/lib/template/base/form-template-base.ts +16 -0
  149. package/lib/template/case-summary/case-summary.component.scss +0 -2
  150. package/lib/template/case-summary/case-summary.component.ts +7 -23
  151. package/lib/template/case-view/case-view.component.html +7 -7
  152. package/lib/template/case-view/case-view.component.scss +18 -10
  153. package/lib/template/case-view/case-view.component.ts +9 -15
  154. package/lib/template/confirmation/confirmation.component.html +1 -1
  155. package/lib/template/confirmation/confirmation.component.ts +1 -2
  156. package/lib/template/data-reference/data-reference-advanced-search.service.ts +16 -0
  157. package/lib/template/data-reference/data-reference.component.html +11 -8
  158. package/lib/template/data-reference/data-reference.component.ts +377 -148
  159. package/lib/template/data-reference/search-form/search-form.component.html +39 -0
  160. package/lib/template/data-reference/search-form/search-form.component.scss +11 -0
  161. package/lib/template/data-reference/search-form/search-form.component.spec.ts +0 -0
  162. package/lib/template/data-reference/search-form/search-form.component.ts +167 -0
  163. package/lib/template/data-reference/search-form/tabsData.ts +160 -0
  164. package/lib/template/data-reference/utils.ts +92 -0
  165. package/lib/template/default-form/default-form.component.html +0 -4
  166. package/lib/template/default-form/default-form.component.ts +50 -26
  167. package/lib/template/default-page/default-page.component.html +34 -0
  168. package/lib/template/default-page/default-page.component.scss +31 -0
  169. package/lib/template/default-page/default-page.component.spec.ts +24 -0
  170. package/lib/template/default-page/default-page.component.ts +64 -0
  171. package/lib/template/details/details.component.ts +7 -42
  172. package/lib/template/details-narrow-wide/details-narrow-wide.component.ts +6 -40
  173. package/lib/template/details-one-column/details-one-column.component.ts +7 -43
  174. package/lib/template/details-sub-tabs/details-sub-tabs.component.html +1 -2
  175. package/lib/template/details-sub-tabs/details-sub-tabs.component.ts +5 -38
  176. package/lib/template/details-three-column/details-three-column.component.ts +7 -44
  177. package/lib/template/details-two-column/details-two-column.component.ts +8 -45
  178. package/lib/template/details-wide-narrow/details-wide-narrow.component.ts +7 -43
  179. package/lib/template/dynamic-tabs/dynamic-tabs.component.html +3 -0
  180. package/lib/template/dynamic-tabs/dynamic-tabs.component.ts +8 -4
  181. package/lib/template/field-group-list/field-group-list.component.scss +0 -1
  182. package/lib/template/field-group-list/field-group-list.component.ts +0 -1
  183. package/lib/template/field-group-template/field-group-template.component.html +7 -7
  184. package/lib/template/field-group-template/field-group-template.component.scss +8 -0
  185. package/lib/template/field-group-template/field-group-template.component.ts +68 -48
  186. package/lib/template/field-value-list/field-value-list.component.html +2 -2
  187. package/lib/template/field-value-list/field-value-list.component.scss +6 -1
  188. package/lib/template/field-value-list/field-value-list.component.ts +0 -1
  189. package/lib/template/inline-dashboard/inline-dashboard.component.ts +0 -1
  190. package/lib/template/inline-dashboard-page/inline-dashboard-page.component.ts +2 -3
  191. package/lib/template/list-page/list-page.component.ts +0 -1
  192. package/lib/template/list-view/list-view.component.html +14 -4
  193. package/lib/template/list-view/list-view.component.scss +30 -19
  194. package/lib/template/list-view/list-view.component.ts +179 -95
  195. package/lib/template/list-view/listViewHelpers.ts +4 -10
  196. package/lib/template/list-view/utils.ts +27 -7
  197. package/lib/template/multi-reference-readonly/multi-reference-readonly.component.ts +0 -1
  198. package/lib/template/narrow-wide-form/narrow-wide-form.component.ts +1 -2
  199. package/lib/template/object-page/object-page.component.html +1 -0
  200. package/lib/template/object-page/object-page.component.scss +0 -0
  201. package/lib/template/object-page/object-page.component.spec.ts +22 -0
  202. package/lib/template/object-page/object-page.component.ts +14 -0
  203. package/lib/template/one-column/one-column.component.ts +4 -4
  204. package/lib/template/one-column-page/one-column-page.component.ts +0 -1
  205. package/lib/template/one-column-tab/one-column-tab.component.scss +1 -1
  206. package/lib/template/one-column-tab/one-column-tab.component.ts +1 -2
  207. package/lib/template/page/page.component.ts +1 -2
  208. package/lib/template/promoted-filters/promoted-filters.component.ts +1 -2
  209. package/lib/template/repeating-structures/repeating-structures.component.ts +1 -3
  210. package/lib/template/self-service-case-view/self-service-case-view.component.html +80 -0
  211. package/lib/template/self-service-case-view/self-service-case-view.component.scss +124 -0
  212. package/lib/template/self-service-case-view/self-service-case-view.component.spec.ts +24 -0
  213. package/lib/template/self-service-case-view/self-service-case-view.component.ts +216 -0
  214. package/lib/template/simple-table/simple-table.component.ts +0 -2
  215. package/lib/template/simple-table-manual/helpers.ts +127 -11
  216. package/lib/template/simple-table-manual/simple-table-manual.component.html +27 -8
  217. package/lib/template/simple-table-manual/simple-table-manual.component.scss +16 -17
  218. package/lib/template/simple-table-manual/simple-table-manual.component.ts +118 -58
  219. package/lib/template/simple-table-select/simple-table-select.component.ts +3 -4
  220. package/lib/template/single-reference-readonly/single-reference-readonly.component.html +4 -1
  221. package/lib/template/single-reference-readonly/single-reference-readonly.component.scss +21 -0
  222. package/lib/template/single-reference-readonly/single-reference-readonly.component.ts +104 -4
  223. package/lib/template/sub-tabs/sub-tabs.component.ts +0 -1
  224. package/lib/template/three-column/three-column.component.ts +4 -4
  225. package/lib/template/three-column-page/three-column-page.component.ts +0 -1
  226. package/lib/template/two-column/two-column.component.ts +4 -4
  227. package/lib/template/two-column-page/two-column-page.component.ts +0 -1
  228. package/lib/template/two-column-tab/two-column-tab.component.ts +1 -2
  229. package/lib/template/utils.ts +58 -0
  230. package/lib/template/wide-narrow-form/wide-narrow-form.component.ts +4 -4
  231. package/lib/template/wide-narrow-page/wide-narrow-page.component.ts +1 -2
  232. package/lib/template/wss-nav-bar/wss-nav-bar.component.html +5 -4
  233. package/lib/template/wss-nav-bar/wss-nav-bar.component.scss +2 -8
  234. package/lib/template/wss-nav-bar/wss-nav-bar.component.ts +3 -11
  235. package/lib/widget/app-announcement/app-announcement.component.html +1 -2
  236. package/lib/widget/app-announcement/app-announcement.component.scss +2 -2
  237. package/lib/widget/app-announcement/app-announcement.component.ts +0 -1
  238. package/lib/widget/attachment/Attachment.types.ts +92 -0
  239. package/lib/widget/attachment/AttachmentUtils.ts +287 -0
  240. package/lib/widget/attachment/attachment.component.html +3 -3
  241. package/lib/widget/attachment/attachment.component.scss +2 -5
  242. package/lib/widget/attachment/attachment.component.ts +256 -259
  243. package/lib/widget/case-history/case-history.component.ts +0 -1
  244. package/lib/widget/feed-container/feed-container.component.scss +3 -9
  245. package/lib/widget/feed-container/feed-container.component.ts +9 -12
  246. package/lib/widget/file-utility/file-utility.component.html +3 -3
  247. package/lib/widget/file-utility/file-utility.component.scss +5 -16
  248. package/lib/widget/file-utility/file-utility.component.ts +2 -6
  249. package/lib/widget/list-utility/list-utility.component.scss +3 -5
  250. package/lib/widget/list-utility/list-utility.component.ts +0 -1
  251. package/lib/widget/quick-create/quick-create.component.ts +0 -1
  252. package/lib/widget/todo/todo.component.html +13 -11
  253. package/lib/widget/todo/todo.component.scss +19 -11
  254. package/lib/widget/todo/todo.component.ts +101 -87
  255. package/lib/widget/utility/utility.component.ts +0 -1
  256. 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() {
@@ -120,28 +131,15 @@ export class AttachmentComponent implements OnInit, OnDestroy {
120
131
 
121
132
  updateSelf() {
122
133
  const configProps: AttachmentProps = this.pConn$.resolveConfigProps(this.pConn$.getConfigProps()) as AttachmentProps;
123
- const stateProps: any = this.pConn$.getStateProps();
124
- const { value, label, extensions, displayMode } = configProps;
125
-
126
- if (configProps.required != null) {
127
- this.bRequired$ = this.utils.getBooleanValue(configProps.required);
128
- }
129
- if (configProps.visibility != null) {
130
- this.bVisible$ = this.utils.getBooleanValue(configProps.visibility);
131
- }
132
-
133
- // disabled
134
- if (configProps.disabled != undefined) {
135
- this.bDisabled$ = this.utils.getBooleanValue(configProps.disabled);
136
- }
134
+ const stateProps = this.pConn$.getStateProps();
135
+ const { value, label, required, visibility, disabled, readOnly, extensions, displayMode, isTableFormatter, allowMultiple, editMode } =
136
+ configProps;
137
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
- }
138
+ this.bRequired$ = this.utils.getBooleanValue(required);
139
+ this.bVisible$ = this.utils.getBooleanValue(visibility);
140
+ this.bDisabled$ = this.utils.getBooleanValue(disabled);
141
+ this.bReadonly$ = this.utils.getBooleanValue(readOnly);
142
+ this.allowMultiple$ = this.utils.getBooleanValue(allowMultiple);
145
143
 
146
144
  this.label$ = label;
147
145
  this.value$ = value;
@@ -149,144 +147,104 @@ export class AttachmentComponent implements OnInit, OnDestroy {
149
147
 
150
148
  this.validateMessage = this.angularPConnectData.validateMessage;
151
149
  this.extensions$ = extensions;
152
- this.valueRef = (this.pConn$.getStateProps() as any).value;
150
+ this.valueRef = this.pConn$.getStateProps().value;
153
151
  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
152
 
159
- this.categoryName = '';
160
- if (value && value.pyCategoryName) {
161
- this.categoryName = value.pyCategoryName;
162
- }
153
+ this.pConn$.setReferenceList(`.${this.valueRef}`);
163
154
 
164
- if (value?.pxResults && +value.pyCount > 0) {
165
- this.files = value.pxResults.map(f => this.buildFilePropsFromResponse(f));
166
- }
155
+ this.displayMode = displayMode;
156
+ this.isMultiAttachmentInInlineEditTable = isTableFormatter && allowMultiple && editMode === 'tableRows';
167
157
 
158
+ // update the attachments shown in the UI
168
159
  this.updateAttachments();
169
160
  }
170
161
 
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
- }
183
-
184
162
  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);
163
+ if (this.overrideLocalState) {
164
+ const serverFiles = transformAttachments(this.attachments);
165
+ this.overrideLocalState = false;
166
+ this.attachmentCount = this.attachments.length;
167
+ this.filesWithError = [];
168
+ this.files = serverFiles;
169
+ } else {
170
+ // 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
171
+ const errorFiles = this.attachments.filter(attachment => attachment.props.error);
172
+ if (errorFiles.length === 0 && this.filesWithError.length > 0) {
173
+ // Check if local file state contains error files and push those to redux
174
+ const uniqueKey = getMappedValue('pzInsKey');
175
+ const transformedErrorFiles = this.filesWithError.map(errorFile => {
176
+ const filename = errorFile.props.name;
177
+ return {
178
+ [uniqueKey]: errorFile.props.id,
179
+ FileName: filename,
180
+ Category: '',
181
+ FileExtension: filename.split('.').pop() ?? filename,
182
+ error: errorFile.props.error || null
183
+ };
184
+ });
185
+ let key = '';
186
+ let updatedAttachments: any = [];
187
+ if (this.allowMultiple$ || this.isOldAttachment) {
188
+ key = this.isOldAttachment ? `${this.valueRef}.pxResults` : this.valueRef;
189
+ const existingAttachments = PCore.getStoreValue(`.${key}`, this.pConn$.getPageReference(), this.pConn$.getContextName()) || [];
190
+ updatedAttachments = [...existingAttachments, ...transformedErrorFiles];
191
+ } else {
192
+ key = this.valueRef;
193
+ updatedAttachments = transformedErrorFiles[0];
194
+ }
195
+ PCore.getStateUtils().updateState(this.pConn$.getContextName(), key, updatedAttachments, {
196
+ pageReference: this.pConn$.getPageReference(),
197
+ isArrayDeepMerge: false,
198
+ removePropertyFromChangedList: true
199
+ });
200
+ }
191
201
  }
192
202
  }
193
203
 
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
204
  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) || [];
205
+ onFileDownload(fileObj, this.contextName);
223
206
  }
224
207
 
225
- validateMaxSize(fileObj, maxSizeInMB): boolean {
226
- const fileSize = (fileObj.size / 1048576).toFixed(2);
227
- return parseFloat(fileSize) < parseFloat(maxSizeInMB);
228
- }
229
-
230
- validateFileExtension = (fileObj, allowedExtensions) => {
231
- if (!allowedExtensions) {
232
- return true;
208
+ deleteFile(file, fileIndex: number) {
209
+ if (this.filesWithError.length > 0) {
210
+ this.filesWithError = this.filesWithError.filter(fileWithError => fileWithError.props.id !== file.props.id);
211
+ if (this.filesWithError.length === 0) {
212
+ clearFieldErrorMessages(this.pConn$);
213
+ }
233
214
  }
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
215
 
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 };
216
+ if (file.inProgress) {
217
+ // @ts-ignore - Expected 1 arguments, but got 2.ts(2554)
218
+ PCore.getAttachmentUtils().cancelRequest(file.props.id, this.contextName);
219
+ this.actionSequencer.deRegisterBlockingAction(this.contextName).catch(() => {});
220
+ this.files = this.files.filter(localFile => localFile.props.id !== file.props.id);
221
+ } else {
222
+ deleteAttachments([file], this.pConn$, this.multiAttachmentsInInlineEdit, {
223
+ allowMultiple: this.allowMultiple$,
224
+ isOldAttachment: this.isOldAttachment,
225
+ isMultiAttachmentInInlineEditTable: this.isMultiAttachmentInInlineEditTable,
226
+ attachmentCount: this.attachmentCount,
227
+ deleteIndex: fileIndex
228
+ } as any);
229
+
230
+ // Filter out without deleted file and reset the file indexes
231
+ let tempLocalFiles = [...this.files];
232
+ tempLocalFiles = tempLocalFiles.filter(localFile => localFile.props.id !== file.props.id);
233
+ tempLocalFiles.forEach(localFile => {
234
+ if (!localFile.props.error && !file.props.error) {
235
+ const updatedDeleteIndex =
236
+ localFile.responseProps.deleteIndex > fileIndex ? localFile.responseProps.deleteIndex - 1 : localFile.responseProps.deleteIndex;
237
+
238
+ localFile.responseProps.deleteIndex = updatedDeleteIndex;
260
239
  }
261
- return f;
262
240
  });
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, pConn.getContextName());
241
+ this.files = tempLocalFiles;
242
+ if (!file.props.error) {
243
+ this.attachmentCount -= 1;
281
244
  }
282
245
  }
283
246
 
284
- this.filesWithError = this.filesWithError?.filter(f => f.ID !== file.ID);
285
- if (this.filesWithError.length === 0) {
286
- this.clearFieldErrorMessages();
287
- }
288
- // eslint-disable-next-line @typescript-eslint/no-unused-expressions
289
- this.fileInput && this.fileInput.nativeElement.value ? null : '';
247
+ this.fileInput.nativeElement.value = '';
290
248
  }
291
249
 
292
250
  onFileAdded(event) {
@@ -296,104 +254,121 @@ export class AttachmentComponent implements OnInit, OnDestroy {
296
254
  this.tempFilesToBeUploaded = [
297
255
  ...addedFiles.map((f: any, index) => {
298
256
  f.ID = `${new Date().getTime()}I${index}`;
299
- f.inProgress = true;
300
257
  f.props = {
301
258
  type: f.type,
302
259
  name: f.name,
260
+ id: f.ID,
261
+ format: f.name.split('.').pop(),
303
262
  icon: this.utils.getIconFromFileType(f.type),
304
- onDelete: () => this.deleteFile(f)
263
+ thumbnail: window.URL.createObjectURL(f)
305
264
  };
306
- if (!this.validateMaxSize(f, maxAttachmentSize)) {
265
+
266
+ if (!validateMaxSize(f, maxAttachmentSize)) {
307
267
  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$)) {
268
+ f.props.meta = this.localizationService.getLocalizedText(`File is too big. Max allowed size is ${maxAttachmentSize}MB.`);
269
+ } else if (!validateFileExtension(f, this.extensions$)) {
311
270
  f.props.error = true;
312
- f.inProgress = false;
313
- f.props.meta = `${this.pConn$.getLocalizedValue(
314
- 'File has invalid extension. Allowed extensions are:',
315
- '',
271
+ f.props.meta = `${this.localizationService.getLocalizedText('File has invalid extension. Allowed extensions are:')} ${this.extensions$.replaceAll(
272
+ '.',
316
273
  ''
317
- )} ${this.extensions$.replaceAll('.', '')}`;
274
+ )}`;
318
275
  }
276
+
319
277
  if (f.props.error) {
320
278
  const fieldName = (this.pConn$.getStateProps() as any).value;
321
- const context = this.pConn$.getContextName();
322
279
  PCore.getMessageManager().addMessages({
323
280
  messages: [
324
281
  {
325
282
  type: 'error',
326
- // @ts-ignore - Type '{ type: string; message: string; }' is not assignable to type 'MessagesConfigObject'.
327
- message: pConn.getLocalizedValue('Error with one or more files', '', '')
283
+ message: this.localizationService.getLocalizedText('Error with one or more files')
328
284
  }
329
285
  ],
330
286
  property: fieldName,
331
287
  pageReference: this.pConn$.getPageReference(),
332
- context
288
+ context: this.contextName
333
289
  });
334
290
  }
335
291
  return f;
336
292
  })
337
293
  ];
294
+
338
295
  const tempFilesWithError = this.tempFilesToBeUploaded.filter(f => f.props.error);
339
296
  if (tempFilesWithError.length > 0) {
340
- this.filesWithError = tempFilesWithError;
297
+ this.filesWithError = [...this.filesWithError, ...tempFilesWithError];
298
+
299
+ insertAttachments(tempFilesWithError, this.pConn$, this.multiAttachmentsInInlineEdit, {
300
+ allowMultiple: this.allowMultiple$,
301
+ isOldAttachment: this.isOldAttachment,
302
+ isMultiAttachmentInInlineEditTable: this.isMultiAttachmentInInlineEditTable,
303
+ attachmentCount: this.attachmentCount
304
+ } as PageInstructionOptions);
341
305
  }
306
+
342
307
  if (!this.allowMultiple$) {
343
308
  this.files = [...this.tempFilesToBeUploaded];
344
309
  } else {
345
310
  this.files = [...this.files, ...this.tempFilesToBeUploaded];
346
311
  }
347
- this.uploadFiles();
312
+
313
+ this.actionSequencer.registerBlockingAction(this.contextName).then(() => {
314
+ this.uploadFiles();
315
+ });
316
+ }
317
+
318
+ onUploadProgress(id, ev) {
319
+ const progress = Math.floor((ev.loaded / ev.total) * 100);
320
+ this.files = this.files.map(localFile => {
321
+ if (localFile.props?.id === id) {
322
+ localFile.inProgress = true;
323
+ localFile.props.progress = progress;
324
+ }
325
+ return localFile;
326
+ });
348
327
  }
349
328
 
350
- clearFieldErrorMessages() {
329
+ populateErrorAndUpdateRedux(file) {
351
330
  const fieldName = (this.pConn$.getStateProps() as any).value;
352
- const context = this.pConn$.getContextName();
353
- PCore.getMessageManager().clearMessages({
354
- type: PCore.getConstants().MESSAGES.MESSAGES_TYPE_ERROR,
331
+ // set errors to property to block submit even on errors in file upload
332
+ PCore.getMessageManager().addMessages({
333
+ messages: [
334
+ {
335
+ type: 'error',
336
+ message: this.localizationService.getLocalizedText('Error with one or more files')
337
+ }
338
+ ],
355
339
  property: fieldName,
356
340
  pageReference: this.pConn$.getPageReference(),
357
- context
341
+ context: this.contextName
358
342
  });
343
+ insertAttachments([file], this.pConn$, this.multiAttachmentsInInlineEdit, {
344
+ allowMultiple: this.allowMultiple$,
345
+ isOldAttachment: this.isOldAttachment,
346
+ isMultiAttachmentInInlineEditTable: this.isMultiAttachmentInInlineEditTable,
347
+ attachmentCount: this.attachmentCount
348
+ } as any);
359
349
  }
360
350
 
361
- onUploadProgress() {}
362
-
363
- errorHandler(isFetchCanceled, attachedFile) {
351
+ errorHandler(isFetchCanceled, file) {
364
352
  return error => {
365
353
  if (!isFetchCanceled(error)) {
366
- let uploadFailMsg = this.pConn$.getLocalizedValue('Something went wrong', '', '');
354
+ let uploadFailMsg = this.localizationService.getLocalizedText('Something went wrong');
367
355
  if (error.response && error.response.data && error.response.data.errorDetails) {
368
- uploadFailMsg = this.pConn$.getLocalizedValue(error.response.data.errorDetails[0].localizedValue, '', '');
356
+ uploadFailMsg = this.localizationService.getLocalizedText(error.response.data.errorDetails[0].localizedValue);
369
357
  }
370
358
 
371
- this.files.map(f => {
372
- if (f.ID === attachedFile.ID) {
373
- f.props.meta = uploadFailMsg;
374
- f.props.error = true;
375
- f.props.onDelete = () => this.deleteFile(f);
376
- f.props.icon = this.utils.getIconFromFileType(f.type);
377
- f.props.name = this.pConn$.getLocalizedValue('Unable to upload file', '', '');
378
- f.inProgress = false;
379
- const fieldName = (this.pConn$.getStateProps() as any).value;
380
- const context = this.pConn$.getContextName();
381
- // set errors to property to block submit even on errors in file upload
382
- PCore.getMessageManager().addMessages({
383
- messages: [
384
- {
385
- type: 'error',
386
- // @ts-ignore - Type '{ type: string; message: string; }' is not assignable to type 'MessagesConfigObject'.
387
- message: this.pConn$.getLocalizedValue('Error with one or more files', '', '')
388
- }
389
- ],
390
- property: fieldName,
391
- pageReference: this.pConn$.getPageReference(),
392
- context
393
- });
394
- delete f.props.progress;
359
+ this.files = this.files.map(localFile => {
360
+ if (localFile.props.id === file.props.id) {
361
+ localFile.props.meta = uploadFailMsg;
362
+ localFile.props.error = true;
363
+ localFile.props.icon = this.utils.getIconFromFileType(localFile.type);
364
+ localFile.props.name = this.localizationService.getLocalizedText('Unable to upload file');
365
+ localFile.inProgress = false;
366
+ delete localFile.props.progress;
367
+ this.filesWithError.push(localFile);
368
+
369
+ this.populateErrorAndUpdateRedux(localFile);
395
370
  }
396
- return f;
371
+ return localFile;
397
372
  });
398
373
  }
399
374
  throw error;
@@ -405,44 +380,64 @@ export class AttachmentComponent implements OnInit, OnDestroy {
405
380
  .filter(e => {
406
381
  const isFileUploaded = e.props && e.props.progress === 100;
407
382
  const fileHasError = e.props && e.props.error;
408
- const isFileUploadedinLastStep = e.responseProps && e.responseProps.pzInsKey;
409
- return !isFileUploaded && !fileHasError && !isFileUploadedinLastStep;
383
+ const isFileUploadedInLastStep = e.responseProps && e.responseProps.ID !== 'temp';
384
+ const isFileUploadInProgress = e.inProgress;
385
+ return !isFileUploadInProgress && !isFileUploaded && !fileHasError && !isFileUploadedInLastStep;
410
386
  })
411
- .map(f =>
412
- window.PCore.getAttachmentUtils().uploadAttachment(
413
- f,
414
- () => {
415
- this.onUploadProgress();
387
+ .map(file =>
388
+ PCore.getAttachmentUtils().uploadAttachment(
389
+ file,
390
+ ev => {
391
+ this.onUploadProgress(file.props.id, ev);
416
392
  },
417
393
  isFetchCanceled => {
418
- return this.errorHandler(isFetchCanceled, f);
394
+ return this.errorHandler(isFetchCanceled, file);
419
395
  },
420
- this.pConn$.getContextName()
396
+ this.contextName
421
397
  )
422
398
  );
399
+
423
400
  Promise.allSettled(filesToBeUploaded)
424
401
  .then((fileResponses: any) => {
425
402
  fileResponses = fileResponses.filter(fr => fr.status !== 'rejected'); // in case of deleting an in progress file, promise gets cancelled but still enters then block
426
403
  if (fileResponses.length > 0) {
427
- this.files.forEach(f => {
428
- const index = fileResponses.findIndex((fr: any) => fr.value.clientFileID === f.ID);
404
+ this.files = this.files.map(localFile => {
405
+ // if attach field has multiple files & in bw any error files are present
406
+ // Example : files = [properFile1, errFile, errFile, properFile2]
407
+ // indexes for delete & preview should be for files [properFile1, properFile2] which is [1,2]
408
+ const index = fileResponses.findIndex(fileResponse => fileResponse.value.clientFileID === localFile.props.id);
429
409
  if (index >= 0) {
430
- f.props.meta = this.pConn$.getLocalizedValue('Uploaded successfully', '', '');
431
- f.props.progress = 100;
432
- f.inProgress = false;
433
- f.handle = fileResponses[index].value.ID;
434
- f.label = this.valueRef;
435
- f.category = this.categoryName;
436
- f.responseProps = {
410
+ fileResponses[index].value.thumbnail = localFile.props.thumbnail;
411
+ localFile.inProgress = false;
412
+ localFile.ID = fileResponses[index].value.ID;
413
+ localFile.props.meta = this.localizationService.getLocalizedText('Uploaded successfully');
414
+ localFile.props.progress = 100;
415
+ localFile.handle = fileResponses[index].value.ID;
416
+ localFile.label = this.valueRef;
417
+ localFile.responseProps = {
437
418
  pzInsKey: 'temp',
438
- pyAttachName: f.props.name
419
+ pyAttachName: localFile.props.name
439
420
  };
440
421
  }
422
+
423
+ return localFile;
441
424
  });
442
- this.updateAttachments();
425
+
426
+ insertAttachments(fileResponses, this.pConn$, this.multiAttachmentsInInlineEdit, {
427
+ allowMultiple: this.allowMultiple$,
428
+ isOldAttachment: this.isOldAttachment,
429
+ isMultiAttachmentInInlineEditTable: this.isMultiAttachmentInInlineEditTable,
430
+ attachmentCount: this.attachmentCount,
431
+ insert: true
432
+ } as any);
433
+
434
+ this.attachmentCount += fileResponses.length;
435
+
443
436
  if (this.filesWithError?.length === 0) {
444
- this.clearFieldErrorMessages();
437
+ clearFieldErrorMessages(this.pConn$);
445
438
  }
439
+
440
+ this.actionSequencer.deRegisterBlockingAction(this.contextName).catch(() => {});
446
441
  }
447
442
  })
448
443
  .catch(error => {
@@ -455,6 +450,8 @@ export class AttachmentComponent implements OnInit, OnDestroy {
455
450
  this.angularPConnectData.unsubscribeFn();
456
451
  }
457
452
 
458
- PCore.getPubSubUtils().unsubscribe(PCore.getConstants().PUB_SUB_EVENTS.CASE_EVENTS.ASSIGNMENT_SUBMISSION, this.caseID);
453
+ if (this.displayMode !== 'DISPLAY_ONLY') {
454
+ PCore.getPubSubUtils().unsubscribe(PCore.getConstants().PUB_SUB_EVENTS.CASE_EVENTS.ASSIGNMENT_SUBMISSION, this.caseID);
455
+ }
459
456
  }
460
457
  }