http-request-manager 18.7.20 → 18.7.21

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 (197) hide show
  1. package/ARCHITECTURE.md +483 -0
  2. package/DATABASE_README.md +1176 -0
  3. package/HTTP_MANAGER_README.md +579 -0
  4. package/HTTP_SINGNALS_MANAGER_README.md +654 -0
  5. package/HTTP_STATE_MANAGER_README.md +948 -0
  6. package/INTERCEPTOR_README.md +549 -0
  7. package/LOCAL_STORAGE_README.md +1056 -0
  8. package/STORE_STATE_MANAGER_README.md +1322 -0
  9. package/UTILS_README.md +1186 -0
  10. package/WS_MANAGER_README.md +613 -0
  11. package/ng-package.json +8 -0
  12. package/package.json +1 -12
  13. package/src/lib/http-request-manager.module.ts +132 -0
  14. package/src/lib/http-request-services-demo/database-data-demo/database-data-demo.component.html +65 -0
  15. package/src/lib/http-request-services-demo/database-data-demo/database-data-demo.component.scss +0 -0
  16. package/src/lib/http-request-services-demo/database-data-demo/database-data-demo.component.ts +224 -0
  17. package/src/lib/http-request-services-demo/http-request-services-demo.component.html +114 -0
  18. package/src/lib/http-request-services-demo/http-request-services-demo.component.scss +6 -0
  19. package/src/lib/http-request-services-demo/http-request-services-demo.component.ts +52 -0
  20. package/src/lib/http-request-services-demo/local-storage-demo/local-storage-demo.component.html +195 -0
  21. package/src/lib/http-request-services-demo/local-storage-demo/local-storage-demo.component.scss +17 -0
  22. package/src/lib/http-request-services-demo/local-storage-demo/local-storage-demo.component.ts +206 -0
  23. package/src/lib/http-request-services-demo/local-storage-signals-demo/local-storage-signals-demo.component.html +200 -0
  24. package/src/lib/http-request-services-demo/local-storage-signals-demo/local-storage-signals-demo.component.scss +17 -0
  25. package/src/lib/http-request-services-demo/local-storage-signals-demo/local-storage-signals-demo.component.ts +212 -0
  26. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/download-file/download-file.component.html +53 -0
  27. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/download-file/download-file.component.scss +60 -0
  28. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/download-file/download-file.component.ts +72 -0
  29. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/file-download.module.ts +28 -0
  30. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/file-downloader.component.html +10 -0
  31. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/file-downloader.component.scss +29 -0
  32. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/file-downloader.component.ts +100 -0
  33. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/models/download-labels-model.ts +22 -0
  34. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/spinner/spinner.component.html +8 -0
  35. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/spinner/spinner.component.scss +19 -0
  36. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/spinner/spinner.component.ts +26 -0
  37. package/src/lib/http-request-services-demo/request-manager-demo/models/app-session.model.ts +30 -0
  38. package/src/lib/http-request-services-demo/request-manager-demo/models/app.model.ts +19 -0
  39. package/src/lib/http-request-services-demo/request-manager-demo/models/get-sample.model.ts +25 -0
  40. package/src/lib/http-request-services-demo/request-manager-demo/models/sample-ai-prompt.ts +19 -0
  41. package/src/lib/http-request-services-demo/request-manager-demo/models/sample-client-details.ts +24 -0
  42. package/src/lib/http-request-services-demo/request-manager-demo/models/sample-client-info.ts +30 -0
  43. package/src/lib/http-request-services-demo/request-manager-demo/models/sample-client.model.ts +49 -0
  44. package/src/lib/http-request-services-demo/request-manager-demo/models/sample-mapper-client-info.ts +33 -0
  45. package/src/lib/http-request-services-demo/request-manager-demo/request-manager-demo.component.html +392 -0
  46. package/src/lib/http-request-services-demo/request-manager-demo/request-manager-demo.component.scss +24 -0
  47. package/src/lib/http-request-services-demo/request-manager-demo/request-manager-demo.component.ts +461 -0
  48. package/src/lib/http-request-services-demo/request-manager-state-demo/request-manager-state-demo.component.html +393 -0
  49. package/src/lib/http-request-services-demo/request-manager-state-demo/request-manager-state-demo.component.scss +24 -0
  50. package/src/lib/http-request-services-demo/request-manager-state-demo/request-manager-state-demo.component.ts +421 -0
  51. package/src/lib/http-request-services-demo/request-manager-state-demo/services/state-manager-demo.service.ts +87 -0
  52. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/services/state-data-request.service.ts +120 -0
  53. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-ai-messaging/ws-ai-messaging.component.css +0 -0
  54. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-ai-messaging/ws-ai-messaging.component.html +3 -0
  55. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-ai-messaging/ws-ai-messaging.component.ts +16 -0
  56. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-chats/ws-chats.component.css +0 -0
  57. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-chats/ws-chats.component.html +3 -0
  58. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-chats/ws-chats.component.ts +16 -0
  59. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-data-control/ws-data-control.component.css +31 -0
  60. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-data-control/ws-data-control.component.html +72 -0
  61. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-data-control/ws-data-control.component.scss +41 -0
  62. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-data-control/ws-data-control.component.spec.ts +205 -0
  63. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-data-control/ws-data-control.component.ts +77 -0
  64. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-messaging/ws-messaging.component.css +11 -0
  65. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-messaging/ws-messaging.component.html +96 -0
  66. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-messaging/ws-messaging.component.spec.ts +31 -0
  67. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-messaging/ws-messaging.component.ts +229 -0
  68. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-notifications/ws-notifications.component.css +30 -0
  69. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-notifications/ws-notifications.component.html +172 -0
  70. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-notifications/ws-notifications.component.spec.ts +31 -0
  71. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-notifications/ws-notifications.component.ts +239 -0
  72. package/src/lib/http-request-services-demo/request-manager-ws-demo/models/oidc-client.model.ts +31 -0
  73. package/src/lib/http-request-services-demo/request-manager-ws-demo/models/user-data.model.ts +32 -0
  74. package/src/lib/http-request-services-demo/request-manager-ws-demo/request-manager-ws-demo.component.css +0 -0
  75. package/src/lib/http-request-services-demo/request-manager-ws-demo/request-manager-ws-demo.component.html +84 -0
  76. package/src/lib/http-request-services-demo/request-manager-ws-demo/request-manager-ws-demo.component.ts +41 -0
  77. package/src/lib/http-request-services-demo/request-manager-ws-demo/services/index.ts +3 -0
  78. package/src/lib/http-request-services-demo/request-manager-ws-demo/services/message-service-demo.service.ts +83 -0
  79. package/src/lib/http-request-services-demo/request-manager-ws-demo/services/notification-service-demo.service.ts +147 -0
  80. package/src/lib/http-request-services-demo/request-manager-ws-demo/services/state-service-demo.service.ts +158 -0
  81. package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/download-file/download-file.component.html +53 -0
  82. package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/download-file/download-file.component.scss +60 -0
  83. package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/download-file/download-file.component.ts +72 -0
  84. package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/file-download.module.ts +28 -0
  85. package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/file-downloader.component.html +10 -0
  86. package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/file-downloader.component.scss +29 -0
  87. package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/file-downloader.component.ts +100 -0
  88. package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/models/download-labels-model.ts +22 -0
  89. package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/spinner/spinner.component.html +8 -0
  90. package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/spinner/spinner.component.scss +19 -0
  91. package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/spinner/spinner.component.ts +26 -0
  92. package/src/lib/http-request-services-demo/request-signals-manager-demo/models/app-session.model.ts +30 -0
  93. package/src/lib/http-request-services-demo/request-signals-manager-demo/models/app.model.ts +19 -0
  94. package/src/lib/http-request-services-demo/request-signals-manager-demo/models/get-sample.model.ts +25 -0
  95. package/src/lib/http-request-services-demo/request-signals-manager-demo/models/sample-ai-prompt.ts +19 -0
  96. package/src/lib/http-request-services-demo/request-signals-manager-demo/models/sample-client-details.ts +24 -0
  97. package/src/lib/http-request-services-demo/request-signals-manager-demo/models/sample-client-info.ts +30 -0
  98. package/src/lib/http-request-services-demo/request-signals-manager-demo/models/sample-client.model.ts +49 -0
  99. package/src/lib/http-request-services-demo/request-signals-manager-demo/models/sample-mapper-client-info.ts +33 -0
  100. package/src/lib/http-request-services-demo/request-signals-manager-demo/request-signals-manager-demo.component.html +380 -0
  101. package/src/lib/http-request-services-demo/request-signals-manager-demo/request-signals-manager-demo.component.scss +24 -0
  102. package/src/lib/http-request-services-demo/request-signals-manager-demo/request-signals-manager-demo.component.ts +410 -0
  103. package/src/lib/http-request-services-demo/store-state-manager-demo/models/settings.model.ts +28 -0
  104. package/src/lib/http-request-services-demo/store-state-manager-demo/services/settings-state.service.ts +48 -0
  105. package/src/lib/http-request-services-demo/store-state-manager-demo/store-state-manager-demo.component.css +0 -0
  106. package/src/lib/http-request-services-demo/store-state-manager-demo/store-state-manager-demo.component.html +23 -0
  107. package/src/lib/http-request-services-demo/store-state-manager-demo/store-state-manager-demo.component.ts +36 -0
  108. package/src/lib/index.ts +3 -0
  109. package/src/lib/interceptors/credentials.interceptor.ts +16 -0
  110. package/src/lib/interceptors/index.ts +6 -0
  111. package/src/lib/interceptors/models/error-settings.model.ts +22 -0
  112. package/src/lib/interceptors/models/index.ts +2 -0
  113. package/src/lib/interceptors/proxy-debugger.interceptor.ts +46 -0
  114. package/src/lib/interceptors/request-error.interceptor.ts +65 -0
  115. package/src/lib/interceptors/request-header.interceptor.ts +53 -0
  116. package/src/lib/models/config-http-options.model.ts +42 -0
  117. package/src/lib/models/config-local-storage-options.model.ts +27 -0
  118. package/src/lib/models/config-options.model.ts +27 -0
  119. package/src/lib/models/config-token.model.ts +9 -0
  120. package/src/lib/models/data-type.enum.ts +5 -0
  121. package/src/lib/models/database-storage.model.ts +24 -0
  122. package/src/lib/models/index.ts +12 -0
  123. package/src/lib/models/retry-options.model.ts +22 -0
  124. package/src/lib/services/database-manager-service/database.manager.service.ts +262 -0
  125. package/src/lib/services/database-manager-service/db.storage.service.ts +207 -0
  126. package/src/lib/services/database-manager-service/index.ts +4 -0
  127. package/src/lib/services/database-manager-service/models/index.ts +2 -0
  128. package/src/lib/services/database-manager-service/models/table-schema.ts +33 -0
  129. package/src/lib/services/index.ts +12 -0
  130. package/src/lib/services/local-storage-manager-service/index.ts +4 -0
  131. package/src/lib/services/local-storage-manager-service/local-storage-manager.service.spec.ts +71 -0
  132. package/src/lib/services/local-storage-manager-service/local-storage-manager.service.ts +426 -0
  133. package/src/lib/services/local-storage-manager-service/local-storage-signals-manager.service.spec.ts +67 -0
  134. package/src/lib/services/local-storage-manager-service/local-storage-signals-manager.service.ts +345 -0
  135. package/src/lib/services/local-storage-manager-service/models/global-store-options.model.ts +30 -0
  136. package/src/lib/services/local-storage-manager-service/models/index.ts +6 -0
  137. package/src/lib/services/local-storage-manager-service/models/setting-options.model.ts +35 -0
  138. package/src/lib/services/local-storage-manager-service/models/storage-data.model.ts +24 -0
  139. package/src/lib/services/local-storage-manager-service/models/storage-option.model.ts +32 -0
  140. package/src/lib/services/local-storage-manager-service/models/storage-type.enum.ts +5 -0
  141. package/src/lib/services/request-manager-services/README.md +268 -0
  142. package/src/lib/services/request-manager-services/http-manager-signals.service.ts +246 -0
  143. package/src/lib/services/request-manager-services/http-manager.service.spec.ts +232 -0
  144. package/src/lib/services/request-manager-services/http-manager.service.ts +274 -0
  145. package/src/lib/services/request-manager-services/index.ts +8 -0
  146. package/src/lib/services/request-manager-services/request-signals.service.ts +214 -0
  147. package/src/lib/services/request-manager-services/request.service.ts +309 -0
  148. package/src/lib/services/request-manager-services/rxjs-operators/countdown.ts +17 -0
  149. package/src/lib/services/request-manager-services/rxjs-operators/delay-retry.ts +16 -0
  150. package/src/lib/services/request-manager-services/rxjs-operators/index.ts +4 -0
  151. package/src/lib/services/request-manager-services/rxjs-operators/request-polling.ts +35 -0
  152. package/src/lib/services/request-manager-services/rxjs-operators/request-streaming.ts +436 -0
  153. package/src/lib/services/request-manager-state-service/http-manager-state.store.ts +1321 -0
  154. package/src/lib/services/request-manager-state-service/index.ts +3 -0
  155. package/src/lib/services/request-manager-state-service/models/api-request.model.ts +61 -0
  156. package/src/lib/services/request-manager-state-service/models/index.ts +6 -0
  157. package/src/lib/services/request-manager-state-service/models/request-options.model.ts +22 -0
  158. package/src/lib/services/request-manager-state-service/models/stream-type.enum.ts +13 -0
  159. package/src/lib/services/request-manager-state-service/models/ws-options.model.ts +39 -0
  160. package/src/lib/services/store-state-manager-service/index.ts +3 -0
  161. package/src/lib/services/store-state-manager-service/models/index.ts +2 -0
  162. package/src/lib/services/store-state-manager-service/models/state-storage-options.model.ts +24 -0
  163. package/src/lib/services/store-state-manager-service/store-state-manager.service.ts +88 -0
  164. package/src/lib/services/utils/app.service.spec.ts +25 -0
  165. package/src/lib/services/utils/app.service.ts +21 -0
  166. package/src/lib/services/utils/encryption/README.md +79 -0
  167. package/src/lib/services/utils/encryption/asymmetrical-encryption.service.ts +282 -0
  168. package/src/lib/services/utils/encryption/encryption-test.service.ts +39 -0
  169. package/src/lib/services/utils/encryption/index.ts +5 -0
  170. package/src/lib/services/utils/encryption/random.ts +81 -0
  171. package/src/lib/services/utils/encryption/symmetrical-encryption.service.ts +93 -0
  172. package/src/lib/services/utils/headers.service.spec.ts +80 -0
  173. package/src/lib/services/utils/headers.service.ts +18 -0
  174. package/src/lib/services/utils/index.ts +7 -0
  175. package/src/lib/services/utils/object-merger.service.spec.ts +18 -0
  176. package/src/lib/services/utils/object-merger.service.ts +78 -0
  177. package/src/lib/services/utils/path-query.service.spec.ts +117 -0
  178. package/src/lib/services/utils/path-query.service.ts +69 -0
  179. package/src/lib/services/utils/random-color.utils.ts +83 -0
  180. package/src/lib/services/utils/utils.service.spec.ts +165 -0
  181. package/src/lib/services/utils/utils.service.ts +192 -0
  182. package/src/lib/services/ws-manager-service/index.ts +4 -0
  183. package/src/lib/services/ws-manager-service/models/channel-info.model.ts +24 -0
  184. package/src/lib/services/ws-manager-service/models/channel-message-data.model.ts +24 -0
  185. package/src/lib/services/ws-manager-service/models/channel-message.model.ts +24 -0
  186. package/src/lib/services/ws-manager-service/models/communication-type.enum.ts +5 -0
  187. package/src/lib/services/ws-manager-service/models/index.ts +5 -0
  188. package/src/lib/services/ws-manager-service/models/ws-user.model.ts +38 -0
  189. package/src/lib/services/ws-manager-service/services/index.ts +3 -0
  190. package/src/lib/services/ws-manager-service/services/websocket.service.ts +392 -0
  191. package/src/public-api.ts +14 -0
  192. package/tsconfig.lib.json +32 -0
  193. package/tsconfig.lib.prod.json +10 -0
  194. package/tsconfig.spec.json +14 -0
  195. package/fesm2022/http-request-manager.mjs +0 -7633
  196. package/fesm2022/http-request-manager.mjs.map +0 -1
  197. package/types/http-request-manager.d.ts +0 -2277
@@ -0,0 +1,158 @@
1
+ import { Injectable } from '@angular/core';
2
+
3
+ import { DatabaseStorage, DataType, RetryOptions } from '../../../models';
4
+ import { HTTPManagerStateService, ApiRequest } from '../../../services';
5
+ import { OIDCClient } from '../models/oidc-client.model';
6
+
7
+ /**
8
+ * StateServiceDemo - Core state management and WebSocket connection service
9
+ *
10
+ * Handles:
11
+ * - WebSocket connection setup
12
+ * - Base HTTP state management
13
+ * - Connection status and retry logic
14
+ */
15
+ @Injectable({
16
+ providedIn: 'root'
17
+ })
18
+ export class StateServiceDemo extends HTTPManagerStateService<any> {
19
+
20
+ attempts$ = this.wsRetryAttempts$;
21
+ nextRetry$ = this.wsNextRetry$;
22
+
23
+ constructor() {
24
+ super(
25
+ ApiRequest.adapt({
26
+ server: '',
27
+ retry: RetryOptions.adapt({
28
+ times: 3,
29
+ delay: 1,
30
+ }),
31
+ adapter: OIDCClient.adapt,
32
+ }),
33
+ DataType.ARRAY,
34
+ DatabaseStorage.adapt({
35
+ table: 'ws_demo_data',
36
+ expiresIn: '5mn',
37
+ })
38
+ );
39
+ }
40
+
41
+ /**
42
+ * Initialize WebSocket connection with server configuration
43
+ */
44
+ updateConnection(server: string, wsServer: string, jwtToken: string, user: any) {
45
+ this.setApiRequestOptions({
46
+ server,
47
+ retry: RetryOptions.adapt({
48
+ times: 3,
49
+ delay: 1,
50
+ }),
51
+ adapter: OIDCClient.adapt,
52
+ ws: {
53
+ id: 'USERS123',
54
+ wsServer,
55
+ jwtToken,
56
+ user,
57
+ retry: RetryOptions.adapt({
58
+ times: 10,
59
+ delay: 5,
60
+ }),
61
+ }
62
+ });
63
+
64
+ this.userAction$.subscribe(user => {
65
+ console.log('User Action:', user);
66
+ });
67
+ }
68
+
69
+ /**
70
+ * Get all available channels
71
+ */
72
+ override getAllChannels() {
73
+ this.httpManagerService.getAllChannels();
74
+ }
75
+
76
+ /**
77
+ * Subscribe to a channel
78
+ */
79
+ override subscribeToChannel(channel: string) {
80
+ super.subscribeToChannel(channel);
81
+ }
82
+
83
+ /**
84
+ * Unsubscribe from a channel
85
+ */
86
+ override unsubscribeFromChannel(channel: string) {
87
+ super.unsubscribeFromChannel(channel);
88
+ }
89
+
90
+ // =====================
91
+ // Notification Channel Methods (MES- prefix)
92
+ // These override methods from HTTPManagerStateService
93
+ // =====================
94
+
95
+ /**
96
+ * Create a notification channel (MES- prefix)
97
+ */
98
+ override createNotificationChannel(channel: string) {
99
+ super.createNotificationChannel(channel);
100
+ }
101
+
102
+ /**
103
+ * Get all notification channels list (in-memory)
104
+ */
105
+ override getNotificationChannels() {
106
+ super.getNotificationChannels();
107
+ }
108
+
109
+ /**
110
+ * Get today's notification channels from database
111
+ * Returns unique channels that have notifications posted today
112
+ */
113
+ override getTodaysNotificationChannels() {
114
+ super.getTodaysNotificationChannels();
115
+ }
116
+
117
+ /**
118
+ * Define and load previous day's notification channels from database
119
+ * Creates channels in memory and broadcasts updated list
120
+ */
121
+ definePreviousNotificationChannels() {
122
+ const options = ApiRequest.adapt({
123
+ path: ['notifications', 'channels', 'define-previous']
124
+ });
125
+
126
+ this.httpManagerService.postRequest({}, options).subscribe({
127
+ next: (response: any) => {
128
+ console.log('📋 Previous day channels loaded:', response);
129
+ // The server will broadcast updated channel list to all WebSocket clients
130
+ },
131
+ error: (error) => {
132
+ console.error('❌ Failed to load previous day channels:', error);
133
+ }
134
+ });
135
+ }
136
+
137
+ /**
138
+ * Subscribe to notification channel with optional date filters
139
+ */
140
+ override subscribeToNotificationChannel(channel: string, options?: { startEpoch?: number; endEpoch?: number }, user?: any) {
141
+ super.subscribeToNotificationChannel(channel, options, user);
142
+ }
143
+
144
+ /**
145
+ * Unsubscribe from notification channel
146
+ */
147
+ override unsubscribeFromNotificationChannel(channel: string) {
148
+ super.unsubscribeFromNotificationChannel(channel);
149
+ }
150
+
151
+ /**
152
+ * Send a notification to a channel
153
+ */
154
+ override sendNotification(channel: string, content: any) {
155
+ super.sendNotification(channel, content);
156
+ }
157
+
158
+ }
@@ -0,0 +1,53 @@
1
+ @if (!isPending) {
2
+ @if (hasError) {
3
+ <div class="width center-txt" style="margin-bottom: 4px;">
4
+ <mat-icon color="warn" class="warn-icon">warning</mat-icon>
5
+ </div>
6
+ } @else {
7
+ @if (active) {
8
+ <div class="container-obj">
9
+ <div class="centered-obj-div">
10
+ <mat-progress-spinner
11
+ color="primary"
12
+ mode="indeterminate"
13
+ [diameter]="44"
14
+ ></mat-progress-spinner>
15
+ </div>
16
+ </div>
17
+ } @else {
18
+ <button data-tracking="export-btn" mat-icon-button (click)="onAction()" class="icon-button" [disabled]="disabled">
19
+ <mat-icon class="custom-icon">file_download</mat-icon>
20
+ </button>
21
+ }
22
+ }
23
+ } @else {
24
+ @if ((progress > 0 && progress < 100)) {
25
+ <div
26
+ class="spinner-container"
27
+ >
28
+ <div class="spinner-background">
29
+ {{progress}}%
30
+ </div>
31
+ <mat-progress-spinner
32
+ color="primary"
33
+ [mode]="mode"
34
+ [value]="progress"
35
+ [diameter]="44"
36
+ ></mat-progress-spinner>
37
+ </div>
38
+ } @else {
39
+ <div class="container-obj">
40
+ <div class="centered-obj-div">
41
+ <mat-progress-spinner
42
+ color="primary"
43
+ mode="indeterminate"
44
+ [diameter]="44"
45
+ ></mat-progress-spinner>
46
+ </div>
47
+ </div>
48
+ }
49
+ }
50
+
51
+
52
+
53
+
@@ -0,0 +1,60 @@
1
+ :not(spinner-container).spinner-container {
2
+ position: relative;
3
+
4
+ .spinner-background {
5
+ position: absolute;
6
+ width: 44px;
7
+ height: 44px;
8
+ font-size: 12px;
9
+ line-height: 32px;
10
+ text-align: center;
11
+ overflow: hidden;
12
+ border-radius: 50%;
13
+ border: solid 5px whitesmoke;
14
+ }
15
+
16
+ }
17
+
18
+ .center-txt {
19
+ align-content: center;
20
+ text-align: -webkit-center;
21
+ }
22
+
23
+ .width {
24
+ width: 48px;
25
+ height: 48px;
26
+ }
27
+
28
+ .icon-button {
29
+ display: flex;
30
+ align-items: center;
31
+ justify-content: center;
32
+ width: 48px;
33
+ height: 48px;
34
+ padding: 0;
35
+ }
36
+
37
+ // .custom-icon {
38
+ // font-size: 32px;
39
+ // line-height: 1;
40
+ // position: relative;
41
+ // left: -4px;
42
+ // }
43
+
44
+ .container-obj {
45
+ display: flex;
46
+ justify-content: center;
47
+ align-items: center;
48
+ width: 48px;
49
+ height: 48px;
50
+ }
51
+
52
+ .centered-obj-div {
53
+ text-align: center
54
+ }
55
+
56
+ // .warn-icon {
57
+ // position: relative;
58
+ // top: 6px;
59
+ // width: 48px;
60
+ // }
@@ -0,0 +1,72 @@
1
+ import { Component, EventEmitter, Input, OnInit, Output, ViewEncapsulation } from '@angular/core';
2
+ import { ProgressSpinnerMode } from '@angular/material/progress-spinner';
3
+ import { Subscription, timer } from 'rxjs';
4
+
5
+ @Component({
6
+ selector: 'app-download-file',
7
+ templateUrl: './download-file.component.html',
8
+ styleUrls: ['./download-file.component.scss'],
9
+ encapsulation: ViewEncapsulation.None,
10
+ standalone: false
11
+ })
12
+ export class DownloadFileComponent implements OnInit {
13
+
14
+ private subscriptions = new Subscription();
15
+
16
+ @Input() event?: Function;
17
+ @Input() displayError = 3; // seconds
18
+ @Input() diameter = 32;
19
+ @Input() mode: ProgressSpinnerMode = 'determinate';
20
+ @Input() isPending = false;
21
+
22
+ @Input() active = false;
23
+ @Input() disabled = false;
24
+
25
+ @Output() error = new EventEmitter<void>();
26
+
27
+ private _progress = 0;
28
+ @Input() set progress(value: any) {
29
+ this._progress = value ?? 0;
30
+ }
31
+
32
+ get progress() {
33
+ return this._progress;
34
+ }
35
+
36
+ private _hasError = false;
37
+ private errorTimerActive = false;
38
+
39
+ @Input() set hasError(value: boolean | any) {
40
+
41
+ this._hasError = !!value;
42
+
43
+ if (this._hasError && !this.errorTimerActive) {
44
+ this.errorTimerActive = true;
45
+ this.active = false;
46
+ this.error.emit()
47
+ this.subscriptions.add(
48
+ timer(this.displayError * 1000)
49
+ .subscribe((err) => {
50
+ this._hasError = false;
51
+ this.errorTimerActive = false;
52
+ })
53
+ );
54
+ }
55
+
56
+ }
57
+
58
+ get hasError() {
59
+ return this._hasError;
60
+ }
61
+
62
+ ngOnInit() {}
63
+
64
+ onAction() {
65
+ this.isPending = false
66
+ if (this.event) this.event()
67
+ }
68
+
69
+ ngOnDestroy() {
70
+ this.subscriptions.unsubscribe()
71
+ }
72
+ }
@@ -0,0 +1,28 @@
1
+ import { NgModule } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+
4
+ import { DownloadFileComponent } from './download-file/download-file.component';
5
+ import { FileDownloaderComponent } from './file-downloader.component';
6
+
7
+ import { SpinnerComponent } from './spinner/spinner.component';
8
+ import { MatIconModule } from '@angular/material/icon';
9
+ import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
10
+ import { MatButtonModule } from '@angular/material/button';
11
+
12
+ @NgModule({
13
+ imports: [
14
+ CommonModule,
15
+ MatIconModule,
16
+ MatProgressSpinnerModule,
17
+ MatButtonModule,
18
+ ],
19
+ declarations: [
20
+ SpinnerComponent,
21
+ DownloadFileComponent,
22
+ FileDownloaderComponent,
23
+ ],
24
+ exports: [
25
+ FileDownloaderComponent
26
+ ]
27
+ })
28
+ export class FileDownloaderModule { }
@@ -0,0 +1,10 @@
1
+ <app-download-file
2
+ [disabled]="disabled"
3
+ [displayError]="3"
4
+ [event]="onDownloadStreaming.bind(this)"
5
+ [isPending]="(isPending$ | async) || false"
6
+ [progress]="(progress$ | async)"
7
+ [hasError]="(error$ | async)"
8
+ (error)="onError(labels.error)"
9
+ [active]="active"
10
+ ></app-download-file>
@@ -0,0 +1,29 @@
1
+
2
+ $snackBarTextColor: white;
3
+ $snackBarBackgroundNormal: #F44336;
4
+ $snackBarActionColor: white;
5
+
6
+ .snackBarInfo {
7
+ background-color: $snackBarBackgroundNormal;
8
+ color: $snackBarTextColor;
9
+ }
10
+ .mat-simple-snackbar > span {
11
+ font-weight: bold;
12
+ }
13
+ .mat-simple-snackbar-action {
14
+ .mat-button {
15
+ .mat-button-wrapper {
16
+ color: $snackBarActionColor;
17
+ }
18
+ }
19
+ }
20
+
21
+ .cdk-overlay-pane > .mat-snack-bar-container {
22
+ width: 100%;
23
+ }
24
+
25
+
26
+ .mat-snack-bar-container {
27
+ max-width: 100% !important;
28
+ width: 100%;
29
+ }
@@ -0,0 +1,100 @@
1
+ import { Component, EventEmitter, Input, OnInit, Output, ViewEncapsulation } from '@angular/core';
2
+ import { catchError, distinctUntilChanged, finalize } from 'rxjs/operators';
3
+
4
+ import { ToastColors, ToastDisplay } from 'toast-message-display';
5
+
6
+ import { DownloadLabels } from './models/download-labels-model';
7
+ import { HTTPManagerService } from '../../../services/request-manager-services';
8
+ import { ApiRequest } from '../../../services';
9
+ import { Subscription, throwError } from 'rxjs';
10
+
11
+ @Component({
12
+ selector: 'app-file-downloader',
13
+ templateUrl: './file-downloader.component.html',
14
+ styleUrls: ['./file-downloader.component.scss'],
15
+ encapsulation: ViewEncapsulation.None,
16
+ standalone: false
17
+ })
18
+ export class FileDownloaderComponent extends HTTPManagerService<any> implements OnInit {
19
+
20
+ @Input() delayError = 3
21
+ @Input() apiRequest: ApiRequest = ApiRequest.adapt()
22
+ @Input() displayErrorMessage = false
23
+
24
+ @Input() saveFileAs?: string
25
+
26
+ _labels = DownloadLabels.adapt()
27
+ @Input() set labels(value: DownloadLabels) {
28
+ this._labels = (value) ? DownloadLabels.adapt(value) : DownloadLabels.adapt()
29
+ }
30
+
31
+ active = false
32
+
33
+ subscription = new Subscription()
34
+
35
+ get labels() {
36
+ return this._labels
37
+ }
38
+
39
+ @Output() completed = new EventEmitter<void>()
40
+ @Output() failed = new EventEmitter<string>()
41
+
42
+ @Input() disabled = false
43
+
44
+ constructor() {
45
+ super()
46
+ }
47
+
48
+ ngOnInit() {
49
+
50
+ }
51
+
52
+ onDownloadStreaming() {
53
+
54
+ if (this.active) return;
55
+ this.active = true;
56
+
57
+ return this.downloadRequest(this.apiRequest, [])
58
+ .pipe(
59
+ distinctUntilChanged(),
60
+ catchError((err) => {
61
+
62
+ this.onError(err.message)
63
+ this.active = false
64
+ this.failed.emit(err)
65
+
66
+ return throwError(() => err)
67
+
68
+ }),
69
+ finalize(() => {
70
+ if (!this.active) return
71
+ this.active = false
72
+ this.completed.emit()
73
+ })
74
+ )
75
+ .subscribe()
76
+ }
77
+
78
+
79
+ onError(message: string) {
80
+
81
+ if(!message || !this.displayErrorMessage) return
82
+
83
+ const display = ToastDisplay.adapt({
84
+ message,
85
+ action: 'Ok',
86
+ color: ToastColors.ERROR,
87
+ icon: 'error',
88
+ });
89
+
90
+ this.active = false
91
+
92
+ this.toastMessage.toastMessage(display);
93
+
94
+ }
95
+
96
+ OnDestroy() {
97
+ this.subscription.unsubscribe()
98
+ }
99
+
100
+ }
@@ -0,0 +1,22 @@
1
+ export interface DownloadLabelsInterface {
2
+ error: string;
3
+ action: string;
4
+ icon: string;
5
+ }
6
+
7
+ export class DownloadLabels implements DownloadLabelsInterface {
8
+ constructor(
9
+ public error = '',
10
+ public action = '',
11
+ public icon = 'error',
12
+ ) {}
13
+
14
+ static adapt(item?: any): DownloadLabelsInterface {
15
+ return new DownloadLabels(
16
+ item?.error,
17
+ item?.action,
18
+ item?.icon,
19
+ )
20
+
21
+ }
22
+ }
@@ -0,0 +1,8 @@
1
+ <div class="spinner-background">{{display}}</div>
2
+ <mat-progress-spinner
3
+ [color]="color"
4
+ [diameter]="diameter"
5
+ [mode]="mode || 'indeterminate'"
6
+ [strokeWidth]="strokeWidth"
7
+ [value]="value">
8
+ </mat-progress-spinner>
@@ -0,0 +1,19 @@
1
+ .example-h2 {
2
+ margin: 24px 0;
3
+ }
4
+ :not(spinner-container).spinner-container {
5
+ position: relative;
6
+
7
+ .spinner-background {
8
+ position: absolute;
9
+ width: 80px;
10
+ height: 80px;
11
+ line-height: 80px;
12
+ text-align: center;
13
+ overflow: hidden;
14
+ border-color: rgba(103, 58, 183, 0.12);
15
+ border-radius: 50%;
16
+ border-style: solid;
17
+ border-width: 10px;
18
+ }
19
+ }
@@ -0,0 +1,26 @@
1
+ import { Component, Input, OnInit } from '@angular/core';
2
+ import { ThemePalette } from '@angular/material/core';
3
+ import { ProgressSpinnerMode } from '@angular/material/progress-spinner';
4
+
5
+ @Component({
6
+ selector: 'app-spinner',
7
+ templateUrl: './spinner.component.html',
8
+ styleUrls: ['./spinner.component.scss'],
9
+ standalone: false
10
+ })
11
+ export class SpinnerComponent implements OnInit {
12
+
13
+ @Input() color: ThemePalette;
14
+
15
+ @Input() diameter?: number;
16
+ @Input() display?: string | number;
17
+ @Input() mode?: ProgressSpinnerMode;
18
+ @Input() strokeWidth?: number;
19
+ @Input() value = 0
20
+
21
+ constructor() { }
22
+
23
+ ngOnInit() {
24
+ }
25
+
26
+ }
@@ -0,0 +1,30 @@
1
+ import { App } from "./app.model"
2
+
3
+ export interface AppSessionInterface {
4
+ cfid: string,
5
+ sessionid: string,
6
+ urltoken: string,
7
+ cftoken: string,
8
+ }
9
+
10
+ export class AppSession implements AppSessionInterface {
11
+
12
+ constructor(
13
+ public cfid = '',
14
+ public sessionid = '',
15
+ public urltoken = '',
16
+ public cftoken = '',
17
+ ) {}
18
+
19
+ static adapt(item?: any): AppSession {
20
+
21
+ return new AppSession(
22
+ item?.cfid,
23
+ item?.sessionid,
24
+ item?.urltoken,
25
+ item?.cftoken,
26
+ )
27
+
28
+ }
29
+
30
+ }
@@ -0,0 +1,19 @@
1
+ export interface AppInterface {
2
+ applicationName: string
3
+ }
4
+
5
+ export class App implements AppInterface {
6
+
7
+ constructor(
8
+ public applicationName = ''
9
+ ) {}
10
+
11
+ static adapt(item?: any): App {
12
+
13
+ return new App(
14
+ item?.applicationName,
15
+ )
16
+
17
+ }
18
+
19
+ }
@@ -0,0 +1,25 @@
1
+ import { App } from "./app.model"
2
+ import { AppSession } from "./app-session.model"
3
+
4
+ export interface GetSampleInterface {
5
+ application: App,
6
+ session: AppSession
7
+ }
8
+
9
+ export class GetSample implements GetSampleInterface {
10
+
11
+ constructor(
12
+ public application = App.adapt(),
13
+ public session = AppSession.adapt(),
14
+ ) {}
15
+
16
+ static adapt(item?: any) {
17
+
18
+ return new GetSample(
19
+ (item?.application) ? App.adapt(item.application) : App.adapt(),
20
+ (item?.session) ? AppSession.adapt(item.session) : AppSession.adapt(),
21
+ )
22
+
23
+ }
24
+
25
+ }
@@ -0,0 +1,19 @@
1
+ export interface AIPromptInterface {
2
+ response: string
3
+ }
4
+
5
+ export class AIPrompt implements AIPromptInterface {
6
+
7
+ constructor(
8
+ public response = '',
9
+ ) {}
10
+
11
+ static adapt(item?: any): AIPrompt {
12
+
13
+ return new AIPrompt(
14
+ item?.response,
15
+ )
16
+
17
+ }
18
+
19
+ }