@intellegens/cornerstone-client 0.0.9999-alpha-41 → 0.0.9999-alpha-43

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 (233) hide show
  1. package/dist/adapters/collection-view-adapter.d.ts +123 -0
  2. package/dist/adapters/collection-view-adapter.integration.test.d.ts +1 -0
  3. package/dist/adapters/collection-view-adapter.integration.test.js +141 -0
  4. package/dist/adapters/collection-view-adapter.js +352 -0
  5. package/dist/adapters/index.d.ts +2 -2
  6. package/dist/adapters/index.js +2 -2
  7. package/dist/adapters/search-adapter.d.ts +83 -0
  8. package/dist/adapters/search-adapter.js +284 -0
  9. package/dist/data/api/dto/crud/crud-metadata-dto.js +1 -0
  10. package/dist/data/api/dto/crud/index.d.ts +1 -1
  11. package/dist/data/api/dto/crud/index.js +1 -1
  12. package/dist/data/api/dto/index.d.ts +1 -1
  13. package/dist/data/api/dto/index.js +1 -1
  14. package/dist/data/api/dto/property-path-dto.d.ts +4 -0
  15. package/dist/data/api/dto/property-path-dto.js +1 -0
  16. package/dist/data/api/dto/read/index.d.ts +10 -10
  17. package/dist/data/api/dto/read/index.js +10 -10
  18. package/dist/data/api/dto/read/read-metadata-dto.d.ts +8 -0
  19. package/dist/data/api/dto/read/read-metadata-dto.js +1 -0
  20. package/dist/data/api/dto/read/read-selected-definition-dto.d.ts +18 -0
  21. package/dist/data/api/dto/read/read-selected-definition-dto.js +1 -0
  22. package/dist/data/api/dto/read/read-selected-nested-collection-criteria-dto.d.ts +22 -0
  23. package/dist/data/api/dto/read/read-selected-nested-collection-criteria-dto.js +1 -0
  24. package/dist/data/api/dto/read/read-selected-nested-criteria-dto.d.ts +18 -0
  25. package/dist/data/api/dto/read/read-selected-nested-criteria-dto.js +1 -0
  26. package/dist/data/api/dto/read/read-selected-ordering-definition-dto.d.ts +7 -0
  27. package/dist/data/api/dto/read/read-selected-ordering-definition-dto.js +1 -0
  28. package/dist/data/api/dto/read/read-selected-ordering-property-definition-dto.d.ts +14 -0
  29. package/dist/data/api/dto/read/read-selected-ordering-property-definition-dto.js +1 -0
  30. package/dist/data/api/dto/read/read-selected-pagination-definition-dto.d.ts +13 -0
  31. package/dist/data/api/dto/read/read-selected-pagination-definition-dto.js +1 -0
  32. package/dist/data/api/dto/read/read-selected-search-definition-builder.d.ts +167 -0
  33. package/dist/data/api/dto/read/read-selected-search-definition-builder.js +267 -0
  34. package/dist/data/api/dto/read/read-selected-search-definition-dto.d.ts +33 -0
  35. package/dist/data/api/dto/read/read-selected-search-definition-dto.js +1 -0
  36. package/dist/data/api/dto/read/read-selected-search-property-definition-dto.d.ts +114 -0
  37. package/dist/data/api/dto/read/read-selected-search-property-definition-dto.js +1 -0
  38. package/dist/data/api/dto/read-options-dto.d.ts +8 -0
  39. package/dist/data/api/dto/read-options-dto.js +1 -0
  40. package/dist/data/api/dto/read-result-dto.d.ts +12 -0
  41. package/dist/data/api/dto/read-result-dto.js +1 -0
  42. package/dist/data/api/dto/read-result-metadata-dto.d.ts +8 -0
  43. package/dist/data/api/dto/read-result-metadata-dto.js +1 -0
  44. package/dist/data/api/dto/response/api-error-dto.d.ts +17 -0
  45. package/dist/data/api/dto/response/api-error-dto.js +1 -0
  46. package/dist/data/api/dto/response/api-error-response-dto.d.ts +11 -0
  47. package/dist/data/api/dto/response/api-error-response-dto.js +1 -0
  48. package/dist/data/api/dto/response/api-response-dto.d.ts +3 -0
  49. package/dist/data/api/dto/response/api-response-dto.js +1 -0
  50. package/dist/data/api/dto/response/api-success-response-dto.d.ts +13 -0
  51. package/dist/data/api/dto/response/api-success-response-dto.js +1 -0
  52. package/dist/data/api/dto/response/index.d.ts +5 -5
  53. package/dist/data/api/dto/response/index.js +5 -5
  54. package/dist/data/api/dto/response/metadata-dto.d.ts +25 -0
  55. package/dist/data/api/dto/response/metadata-dto.js +1 -0
  56. package/dist/data/api/enum/read/index.d.ts +5 -5
  57. package/dist/data/api/enum/read/index.js +5 -5
  58. package/dist/data/api/enum/read/read-selected-collection-operator.d.ts +16 -0
  59. package/dist/data/api/enum/read/read-selected-collection-operator.js +17 -0
  60. package/dist/data/api/enum/read/read-selected-comparison-operator.d.ts +69 -0
  61. package/dist/data/api/enum/read/read-selected-comparison-operator.js +76 -0
  62. package/dist/data/api/enum/read/read-selected-logical-operator.d.ts +15 -0
  63. package/dist/data/api/enum/read/read-selected-logical-operator.js +16 -0
  64. package/dist/data/api/enum/read/read-selected-ordering-direction.d.ts +13 -0
  65. package/dist/data/api/enum/read/read-selected-ordering-direction.js +14 -0
  66. package/dist/data/api/enum/read/read-selected-property-type.d.ts +66 -0
  67. package/dist/data/api/enum/read/read-selected-property-type.js +75 -0
  68. package/dist/data/api/enum/response/error-code.d.ts +14 -0
  69. package/dist/data/api/enum/response/error-code.js +15 -0
  70. package/dist/data/api/enum/response/index.d.ts +1 -1
  71. package/dist/data/api/enum/response/index.js +1 -1
  72. package/dist/data/api/interface/icommon-identifiable.d.ts +7 -0
  73. package/dist/data/api/interface/icommon-identifiable.js +1 -0
  74. package/dist/data/api/interface/iconcurrency-safe.d.ts +9 -0
  75. package/dist/data/api/interface/iconcurrency-safe.js +1 -0
  76. package/dist/data/api/interface/iidentifiable-secondary.d.ts +9 -0
  77. package/dist/data/api/interface/iidentifiable-secondary.js +1 -0
  78. package/dist/data/api/interface/iidentifiable.d.ts +11 -0
  79. package/dist/data/api/interface/iidentifiable.js +1 -0
  80. package/dist/data/api/interface/index.d.ts +4 -3
  81. package/dist/data/api/interface/index.js +4 -3
  82. package/dist/data/auth/dto/claim-dto.d.ts +4 -0
  83. package/dist/data/auth/dto/claim-dto.js +1 -0
  84. package/dist/data/auth/dto/index.d.ts +6 -5
  85. package/dist/data/auth/dto/index.js +6 -5
  86. package/dist/data/auth/dto/register-request-dto.d.ts +4 -0
  87. package/dist/data/auth/dto/register-request-dto.js +1 -0
  88. package/dist/data/auth/dto/role-dto.d.ts +5 -0
  89. package/dist/data/auth/dto/role-dto.js +1 -0
  90. package/dist/data/auth/dto/role-with-claims-dto.d.ts +5 -0
  91. package/dist/data/auth/dto/role-with-claims-dto.js +1 -0
  92. package/dist/data/auth/dto/sign-in-request-dto.d.ts +4 -0
  93. package/dist/data/auth/dto/sign-in-request-dto.js +1 -0
  94. package/dist/data/auth/dto/tokens-dto.d.ts +4 -0
  95. package/dist/data/auth/dto/tokens-dto.js +1 -0
  96. package/dist/data/auth/dto/user-dto.d.ts +16 -0
  97. package/dist/data/auth/dto/user-dto.js +1 -0
  98. package/dist/data/auth/dto/user-info-dto.d.ts +14 -0
  99. package/dist/data/auth/dto/user-info-dto.js +1 -0
  100. package/dist/services/api/api-crud-controller-client.d.ts +62 -0
  101. package/dist/services/api/api-crud-controller-client.integration.test.d.ts +1 -0
  102. package/dist/services/api/api-crud-controller-client.integration.test.js +34 -0
  103. package/dist/services/api/api-crud-controller-client.js +133 -0
  104. package/dist/services/api/api-initialization-service.d.ts +106 -0
  105. package/dist/services/api/api-initialization-service.js +207 -0
  106. package/dist/services/api/api-read-controller-client.d.ts +62 -0
  107. package/dist/services/api/api-read-controller-client.integration.test.d.ts +1 -0
  108. package/dist/services/api/api-read-controller-client.integration.test.js +59 -0
  109. package/dist/services/api/api-read-controller-client.js +129 -0
  110. package/dist/services/api/http-service/fetch-http-service.d.ts +7 -0
  111. package/dist/services/api/http-service/fetch-http-service.integration.test.d.ts +1 -0
  112. package/dist/services/api/http-service/fetch-http-service.integration.test.js +52 -0
  113. package/dist/services/api/http-service/fetch-http-service.js +29 -0
  114. package/dist/services/api/http-service/http-request-config.d.ts +10 -0
  115. package/dist/services/api/http-service/http-request-config.js +1 -0
  116. package/dist/services/api/http-service/http-response.d.ts +11 -0
  117. package/dist/services/api/http-service/http-response.js +3 -0
  118. package/dist/services/api/http-service/http-service.d.ts +5 -0
  119. package/dist/services/api/http-service/http-service.js +5 -0
  120. package/dist/services/api/http-service/ihttp-service.d.ts +13 -0
  121. package/dist/services/api/http-service/ihttp-service.js +3 -0
  122. package/dist/services/api/http-service/index.d.ts +5 -0
  123. package/dist/services/api/http-service/index.js +5 -0
  124. package/dist/services/api/index.d.ts +5 -5
  125. package/dist/services/api/index.js +5 -5
  126. package/dist/services/api/user-management-controller-client.d.ts +80 -0
  127. package/dist/services/api/user-management-controller-client.integration.test.d.ts +1 -0
  128. package/dist/services/api/user-management-controller-client.integration.test.js +60 -0
  129. package/dist/services/api/user-management-controller-client.js +291 -0
  130. package/dist/services/auth/client/auth-service.d.ts +75 -0
  131. package/dist/services/auth/client/auth-service.js +200 -0
  132. package/dist/services/auth/client/authorization-management-controller-client.d.ts +48 -0
  133. package/dist/services/auth/client/authorization-management-controller-client.integration.test.d.ts +1 -0
  134. package/dist/services/auth/client/authorization-management-controller-client.integration.test.js +89 -0
  135. package/dist/services/auth/client/authorization-management-controller-client.js +148 -0
  136. package/dist/services/auth/client/index.d.ts +2 -2
  137. package/dist/services/auth/client/index.js +2 -2
  138. package/dist/utils/authorization.d.ts +17 -0
  139. package/dist/utils/authorization.js +45 -0
  140. package/dist/utils/events.d.ts +19 -0
  141. package/dist/utils/events.js +12 -0
  142. package/dist/utils/index.d.ts +2 -0
  143. package/dist/utils/index.js +2 -0
  144. package/dist/utils/result.d.ts +21 -0
  145. package/dist/utils/result.js +16 -0
  146. package/dist/utils/search.d.ts +34 -0
  147. package/dist/utils/search.js +106 -0
  148. package/package.json +6 -6
  149. package/src/adapters/collection-view-adapter.integration.test.ts +172 -0
  150. package/src/adapters/collection-view-adapter.ts +458 -0
  151. package/src/adapters/index.ts +2 -2
  152. package/src/adapters/search-adapter.ts +374 -0
  153. package/src/data/api/dto/crud/crud-metadata-dto.ts +4 -0
  154. package/src/data/api/dto/crud/index.ts +1 -1
  155. package/src/data/api/dto/index.ts +1 -1
  156. package/src/data/api/dto/read/index.ts +10 -10
  157. package/src/data/api/dto/read/{ReadSelectedSearchDefinitionBuilder.ts → read-selected-search-definition-builder.ts} +4 -4
  158. package/src/data/api/dto/{ReadResultDto.ts → read-result-dto.ts} +1 -1
  159. package/src/data/api/dto/response/{ApiErrorDto.ts → api-error-dto.ts} +1 -1
  160. package/src/data/api/dto/response/index.ts +5 -5
  161. package/src/data/api/enum/read/index.ts +5 -5
  162. package/src/data/api/enum/response/{ErrorCode.ts → error-code.ts} +1 -0
  163. package/src/data/api/enum/response/index.ts +1 -1
  164. package/src/data/api/interface/{ICommonIdentifiable.ts → icommon-identifiable.ts} +1 -1
  165. package/src/data/api/interface/{IConcurrencySafe.ts → iconcurrency-safe.ts} +1 -1
  166. package/src/data/api/interface/{IIdentifiable.ts → iidentifiable.ts} +1 -1
  167. package/src/data/api/interface/index.ts +4 -3
  168. package/src/data/auth/dto/index.ts +6 -5
  169. package/src/data/auth/dto/role-with-claims-dto.ts +6 -0
  170. package/src/data/auth/dto/{UserDto.ts → user-dto.ts} +5 -6
  171. package/src/services/api/{ApiCrudControllerClient/index.integration.test.ts → api-crud-controller-client.integration.test.ts} +1 -1
  172. package/src/services/api/{ApiCrudControllerClient/index.ts → api-crud-controller-client.ts} +62 -7
  173. package/src/services/api/{ApiInitializationService/index.ts → api-initialization-service.ts} +2 -4
  174. package/src/services/api/{ApiReadControllerClient/index.integration.test.ts → api-read-controller-client.integration.test.ts} +1 -1
  175. package/src/services/api/{ApiReadControllerClient/index.ts → api-read-controller-client.ts} +55 -6
  176. package/src/services/api/{HttpService/FetchHttpService.integration.test.ts → http-service/fetch-http-service.integration.test.ts} +1 -1
  177. package/src/services/api/http-service/http-service.ts +6 -0
  178. package/src/services/api/http-service/index.ts +5 -0
  179. package/src/services/api/index.ts +5 -5
  180. package/src/services/api/{UserManagementControllerClient/index.integration.test.ts → user-management-controller-client.integration.test.ts} +1 -1
  181. package/src/services/api/user-management-controller-client.ts +322 -0
  182. package/src/services/auth/client/index.ts +2 -2
  183. package/src/utils/events.ts +29 -0
  184. package/src/utils/index.ts +2 -0
  185. package/demo/index.ts +0 -29
  186. package/demo/public_html/favicon.ico +0 -0
  187. package/demo/public_html/index.html +0 -105
  188. package/demo/public_html/websettings.json +0 -3
  189. package/src/adapters/CollectionViewAdapter/index.integration.test.ts +0 -197
  190. package/src/adapters/CollectionViewAdapter/index.ts +0 -477
  191. package/src/adapters/SearchAdapter/index.ts +0 -302
  192. package/src/services/api/HttpService/index.ts +0 -12
  193. package/src/services/api/UserManagementControllerClient/index.ts +0 -134
  194. /package/{src/data/api/dto/crud/CrudMetadataDto.ts → dist/data/api/dto/crud/crud-metadata-dto.d.ts} +0 -0
  195. /package/src/data/api/dto/{PropertyPathDto.ts → property-path-dto.ts} +0 -0
  196. /package/src/data/api/dto/read/{ReadMetadataDto.ts → read-metadata-dto.ts} +0 -0
  197. /package/src/data/api/dto/read/{ReadSelectedDefinitionDto.ts → read-selected-definition-dto.ts} +0 -0
  198. /package/src/data/api/dto/read/{ReadSelectedNestedCollectionCriteriaDto.ts → read-selected-nested-collection-criteria-dto.ts} +0 -0
  199. /package/src/data/api/dto/read/{ReadSelectedNestedCriteriaDto.ts → read-selected-nested-criteria-dto.ts} +0 -0
  200. /package/src/data/api/dto/read/{ReadSelectedOrderingDefinitionDto.ts → read-selected-ordering-definition-dto.ts} +0 -0
  201. /package/src/data/api/dto/read/{ReadSelectedOrderingPropertyDefinitionDto.ts → read-selected-ordering-property-definition-dto.ts} +0 -0
  202. /package/src/data/api/dto/read/{ReadSelectedPaginationDefinitionDto.ts → read-selected-pagination-definition-dto.ts} +0 -0
  203. /package/src/data/api/dto/read/{ReadSelectedSearchDefinitionDto.ts → read-selected-search-definition-dto.ts} +0 -0
  204. /package/src/data/api/dto/read/{ReadSelectedSearchPropertyDefinitionDto.ts → read-selected-search-property-definition-dto.ts} +0 -0
  205. /package/src/data/api/dto/{ReadOptionsDto.ts → read-options-dto.ts} +0 -0
  206. /package/src/data/api/dto/{ReadResultMetadataDto.ts → read-result-metadata-dto.ts} +0 -0
  207. /package/src/data/api/dto/response/{ApiErrorResponseDto.ts → api-error-response-dto.ts} +0 -0
  208. /package/src/data/api/dto/response/{ApiResponseDto.ts → api-response-dto.ts} +0 -0
  209. /package/src/data/api/dto/response/{ApiSuccessResponseDto.ts → api-success-response-dto.ts} +0 -0
  210. /package/src/data/api/dto/response/{MetadataDto.ts → metadata-dto.ts} +0 -0
  211. /package/src/data/api/enum/read/{ReadSelectedCollectionOperator.ts → read-selected-collection-operator.ts} +0 -0
  212. /package/src/data/api/enum/read/{ReadSelectedComparisonOperator.ts → read-selected-comparison-operator.ts} +0 -0
  213. /package/src/data/api/enum/read/{ReadSelectedLogicalOperator.ts → read-selected-logical-operator.ts} +0 -0
  214. /package/src/data/api/enum/read/{ReadSelectedOrderingDirection.ts → read-selected-ordering-direction.ts} +0 -0
  215. /package/src/data/api/enum/read/{ReadSelectedPropertyType.ts → read-selected-property-type.ts} +0 -0
  216. /package/src/data/api/interface/{IIdentifiableSecondary.ts → iidentifiable-secondary.ts} +0 -0
  217. /package/src/data/auth/dto/{ClaimDto.ts → claim-dto.ts} +0 -0
  218. /package/src/data/auth/dto/{RegisterRequestDto.ts → register-request-dto.ts} +0 -0
  219. /package/src/data/auth/dto/{RoleDto.ts → role-dto.ts} +0 -0
  220. /package/src/data/auth/dto/{SignInRequestDto.ts → sign-in-request-dto.ts} +0 -0
  221. /package/src/data/auth/dto/{TokensDto.ts → tokens-dto.ts} +0 -0
  222. /package/src/data/auth/dto/{UserInfoDto.ts → user-info-dto.ts} +0 -0
  223. /package/src/services/api/{HttpService → http-service}/README.md +0 -0
  224. /package/src/services/api/{HttpService/FetchHttpService.ts → http-service/fetch-http-service.ts} +0 -0
  225. /package/src/services/api/{HttpService/HttpRequestConfig.ts → http-service/http-request-config.ts} +0 -0
  226. /package/src/services/api/{HttpService/HttpResponse.ts → http-service/http-response.ts} +0 -0
  227. /package/src/services/api/{HttpService/IHttpService.ts → http-service/ihttp-service.ts} +0 -0
  228. /package/src/services/auth/client/{AuthService/index.ts → auth-service.ts} +0 -0
  229. /package/src/services/auth/client/{AuthorizationManagementControllerClient/index.integration.test.ts → authorization-management-controller-client.integration.test.ts} +0 -0
  230. /package/src/services/auth/client/{AuthorizationManagementControllerClient/index.ts → authorization-management-controller-client.ts} +0 -0
  231. /package/src/utils/{authorization/index.ts → authorization.ts} +0 -0
  232. /package/src/utils/{result/index.ts → result.ts} +0 -0
  233. /package/src/utils/{search/index.ts → search.ts} +0 -0
@@ -0,0 +1,123 @@
1
+ import { PropertyPathDto, ReadSelectedOrderingDirection, ReadSelectedSearchDefinitionDto } from '../data';
2
+ import { IHasObservableProperty, SingularEventTarget } from '../utils';
3
+ import { IReadSelectedClient } from '../services/api';
4
+ /**
5
+ * Options for the CollectionViewAdapter
6
+ */
7
+ export type CollectionViewAdapterOptions<TDto> = {
8
+ pagination?: {
9
+ defaultPageSize?: number;
10
+ defaultPageIndex?: number;
11
+ };
12
+ ordering?: {
13
+ maxOrderingColumns?: number;
14
+ defaultOrdering?: {
15
+ path: PropertyPathDto;
16
+ direction: ReadSelectedOrderingDirection;
17
+ }[];
18
+ };
19
+ search?: {
20
+ defaultSearch?: ReadSelectedSearchDefinitionDto<TDto>;
21
+ };
22
+ } & {
23
+ primaryKey: string | ((item: TDto) => string);
24
+ selection?: {
25
+ enabled: 'single' | 'multiple' | false;
26
+ defaultSelection?: TDto[];
27
+ };
28
+ };
29
+ /**
30
+ * Adapter for managing a collection view of data
31
+ */
32
+ export interface ICollectionViewAdapter<TDto> extends IHasObservableProperty<'isLoading', boolean>, IHasObservableProperty<'pageData', readonly TDto[] | undefined>, IHasObservableProperty<'error', string | undefined>, IHasObservableProperty<'totalItemCount', number>, IHasObservableProperty<'pageIndex', number>, IHasObservableProperty<'pageSize', number>, IHasObservableProperty<'ordering', readonly {
33
+ path: PropertyPathDto;
34
+ direction: ReadSelectedOrderingDirection;
35
+ }[]>, IHasObservableProperty<'selection', readonly TDto[]>, IHasObservableProperty<'search', ReadSelectedSearchDefinitionDto<TDto>> {
36
+ setSearch(searchDefinition: ReadSelectedSearchDefinitionDto<TDto>): void;
37
+ setOrdering(propertyPath: PropertyPathDto, orderDirection: ReadSelectedOrderingDirection): void;
38
+ setPageIndex(pageNumber: number): void;
39
+ setPageSize(pageSize: number): void;
40
+ refreshData(): void;
41
+ selectionToggle(item: TDto): void;
42
+ selectionAdd(item: TDto): void;
43
+ selectionRemove(item: TDto): void;
44
+ selectionClear(): void;
45
+ isSelected(item: TDto): boolean;
46
+ selectionAddPage(): void;
47
+ selectionRemovePage(): void;
48
+ isSelectedPage(): boolean;
49
+ isSomeSelectedPage(): boolean;
50
+ destroy(): void;
51
+ }
52
+ /**
53
+ * Adapter for managing a collection view of data
54
+ */
55
+ export declare class CollectionViewAdapter<TDto> implements ICollectionViewAdapter<TDto> {
56
+ readonly isLoadingChanged: SingularEventTarget<boolean>;
57
+ readonly pageDataChanged: SingularEventTarget<readonly TDto[] | undefined>;
58
+ readonly errorChanged: SingularEventTarget<string | undefined>;
59
+ readonly totalItemCountChanged: SingularEventTarget<number>;
60
+ readonly pageIndexChanged: SingularEventTarget<number>;
61
+ readonly pageSizeChanged: SingularEventTarget<number>;
62
+ readonly selectionChanged: SingularEventTarget<readonly TDto[]>;
63
+ readonly searchChanged: SingularEventTarget<ReadSelectedSearchDefinitionDto<TDto> | undefined>;
64
+ readonly orderingChanged: SingularEventTarget<readonly {
65
+ path: PropertyPathDto;
66
+ direction: ReadSelectedOrderingDirection;
67
+ }[]>;
68
+ private _readClient;
69
+ private _isLoading;
70
+ private _pageData;
71
+ private _error;
72
+ private _totalItemCount;
73
+ private _pageIndex;
74
+ private _pageSize;
75
+ private _selection;
76
+ private _search;
77
+ private _ordering;
78
+ private _currentAbortController?;
79
+ private _fetchTimeout?;
80
+ private _defaultOptions;
81
+ private _currentOptions;
82
+ /**
83
+ * Creates a new instance of CollectionViewAdapter
84
+ * @param options Options for the adapter
85
+ * @param client The client to use for reading data. If a string is provided, it will be used as the controller name for the ApiReadControllerClient, otherwise the provided client will be used directly.
86
+ */
87
+ constructor(options: CollectionViewAdapterOptions<TDto>, client: IReadSelectedClient<any, any> | string);
88
+ get isLoading(): boolean;
89
+ get pageData(): readonly TDto[] | undefined;
90
+ get error(): string | undefined;
91
+ get totalItemCount(): number;
92
+ get pageIndex(): number;
93
+ get pageSize(): number;
94
+ get selection(): readonly TDto[];
95
+ get search(): ReadSelectedSearchDefinitionDto<TDto>;
96
+ setSearch(searchDefinition: ReadSelectedSearchDefinitionDto<TDto>): void;
97
+ get ordering(): readonly {
98
+ path: PropertyPathDto;
99
+ direction: ReadSelectedOrderingDirection;
100
+ }[];
101
+ setOrdering(propertyPath: PropertyPathDto, orderDirection: ReadSelectedOrderingDirection): void;
102
+ setPageIndex(pageIndex: number): void;
103
+ setPageSize(pageSize: number): void;
104
+ refreshData(): void;
105
+ private _getItemKey;
106
+ private get _selectionEnabled();
107
+ selectionToggle(item: TDto): void;
108
+ selectionAdd(item: TDto): void;
109
+ selectionRemove(item: TDto): void;
110
+ selectionClear(): void;
111
+ isSelected(item: TDto): boolean;
112
+ selectionAddPage(): void;
113
+ selectionRemovePage(): void;
114
+ isSelectedPage(): boolean;
115
+ isSomeSelectedPage(): boolean;
116
+ destroy(): void;
117
+ private _scheduleFetch;
118
+ private _executeFetch;
119
+ private _cancelPendingRequests;
120
+ private _parseOptionsToDefinition;
121
+ private _arePropertyPathsEqual;
122
+ private _calculateTotal;
123
+ }
@@ -0,0 +1,141 @@
1
+ import { beforeEach, describe, expect, it } from 'vitest';
2
+ import { CollectionViewAdapter } from '.';
3
+ import { ReadSelectedComparisonOperator, ReadSelectedOrderingDirection, ReadSelectedPropertyType } from '../data';
4
+ import { dateInterval, searchTerm } from '../utils';
5
+ import { ApiReadControllerClient } from '../services';
6
+ describe('CollectionViewAdapter', () => {
7
+ const options = {
8
+ primaryKey: 'id',
9
+ pagination: { defaultPageSize: 5, defaultPageIndex: 0 },
10
+ ordering: { maxOrderingColumns: 1 },
11
+ };
12
+ let adapter;
13
+ const waitForData = async (adapterInstance, timeout = 2000) => {
14
+ const start = Date.now();
15
+ while (adapterInstance.isLoading && Date.now() - start < timeout) {
16
+ await new Promise(res => setTimeout(res, 50));
17
+ }
18
+ };
19
+ beforeEach(() => {
20
+ options.pagination = { defaultPageSize: 5, defaultPageIndex: 0 };
21
+ options.ordering = { maxOrderingColumns: 1 };
22
+ });
23
+ it('returns correct loading status and collection data', async () => {
24
+ adapter = new CollectionViewAdapter(options, 'AnythingManuallyMappedRead');
25
+ await waitForData(adapter);
26
+ expect(adapter.isLoading).toBe(false);
27
+ expect(adapter.pageData).toBeDefined();
28
+ expect(adapter.pageData.length).toBeGreaterThan(0);
29
+ expect(adapter.error).toBeUndefined();
30
+ });
31
+ it('adapter options set correct ordering', async () => {
32
+ adapter = new CollectionViewAdapter(options, 'AnythingManuallyMappedRead');
33
+ await waitForData(adapter);
34
+ adapter.setOrdering(['name'], ReadSelectedOrderingDirection.Descending);
35
+ await waitForData(adapter);
36
+ expect(adapter.ordering).toEqual([
37
+ {
38
+ path: ['name'],
39
+ direction: ReadSelectedOrderingDirection.Descending,
40
+ },
41
+ ]);
42
+ });
43
+ it('text search is applied to adapter', async () => {
44
+ const searchDefinition = searchTerm('Flu', ['name'], ['id']);
45
+ if (!searchDefinition)
46
+ throw new Error('searchDefinition is undefined');
47
+ adapter = new CollectionViewAdapter(options, new ApiReadControllerClient('AnythingManuallyMappedRead'));
48
+ await waitForData(adapter);
49
+ adapter.setSearch(searchDefinition);
50
+ await waitForData(adapter);
51
+ expect(adapter.pageData).toBeDefined();
52
+ expect(adapter.pageData.length).toBeGreaterThan(0);
53
+ for (const item of adapter.pageData) {
54
+ expect(item.name).toMatch(/flu/i);
55
+ }
56
+ });
57
+ it('numeric search is applied to adapter', async () => {
58
+ const searchDefinition = searchTerm('10000001', ['id'], ['id']);
59
+ if (!searchDefinition)
60
+ throw new Error('searchDefinition is undefined');
61
+ adapter = new CollectionViewAdapter(options, new ApiReadControllerClient('AnythingManuallyMappedRead'));
62
+ await waitForData(adapter);
63
+ adapter.setSearch(searchDefinition);
64
+ await waitForData(adapter);
65
+ expect(adapter.pageData).toBeDefined();
66
+ expect(adapter.pageData.length).toBe(1);
67
+ for (const item of adapter.pageData) {
68
+ expect(item.id).toBe(10000001);
69
+ }
70
+ });
71
+ it('applies date range filter from-to on the same date type property', async () => {
72
+ adapter = new CollectionViewAdapter(options, new ApiReadControllerClient('PetsSlim'));
73
+ const from = new Date('2017-01-01T00:00:00.000Z');
74
+ const to = new Date('2017-12-31T00:00:00.000Z');
75
+ const searchDefinition = dateInterval(from, to, ReadSelectedComparisonOperator.GreaterOrEqual, ReadSelectedComparisonOperator.LessOrEqual, ReadSelectedPropertyType.DateOnly, 'dateOfBirth');
76
+ if (!searchDefinition)
77
+ throw new Error('searchDefinition is undefined');
78
+ await waitForData(adapter);
79
+ adapter.setSearch(searchDefinition);
80
+ await waitForData(adapter);
81
+ expect(adapter.pageData).toBeDefined();
82
+ });
83
+ it('applies pagination: page size and jump to page set skip/limit', async () => {
84
+ adapter = new CollectionViewAdapter(options, 'AnythingManuallyMappedRead');
85
+ await waitForData(adapter);
86
+ const firstPageData = [...adapter.pageData];
87
+ adapter.setPageIndex(3);
88
+ await waitForData(adapter);
89
+ expect(adapter.pageData).toBeDefined();
90
+ expect(adapter.pageData.length).toBe(5);
91
+ expect([...adapter.pageData]).not.toEqual(firstPageData);
92
+ });
93
+ it('calculates total when server does not return totalCount', async () => {
94
+ options.pagination = { defaultPageSize: 10, defaultPageIndex: 0 };
95
+ adapter = new CollectionViewAdapter(options, 'AnythingManuallyMappedRead');
96
+ await waitForData(adapter);
97
+ const firstPageLength = adapter.pageData.length;
98
+ adapter.setPageIndex(2);
99
+ await waitForData(adapter);
100
+ expect(adapter.totalItemCount).toBe(firstPageLength + adapter.pageData.length);
101
+ });
102
+ it('setOrdering correctly handles PropertyPathDto array comparison and limits columns', async () => {
103
+ options.ordering = { maxOrderingColumns: 2 };
104
+ adapter = new CollectionViewAdapter(options, 'AnythingManuallyMappedRead');
105
+ adapter.setOrdering(['name'], ReadSelectedOrderingDirection.Descending);
106
+ await waitForData(adapter);
107
+ expect(adapter.ordering).toEqual([
108
+ {
109
+ path: ['name'],
110
+ direction: ReadSelectedOrderingDirection.Descending,
111
+ },
112
+ ]);
113
+ // Add second ordering
114
+ adapter.setOrdering(['id'], ReadSelectedOrderingDirection.Ascending);
115
+ await waitForData(adapter);
116
+ // Should have both orderings, with 'id' first (most recent)
117
+ expect(adapter.ordering).toEqual([
118
+ {
119
+ path: ['id'],
120
+ direction: ReadSelectedOrderingDirection.Ascending,
121
+ },
122
+ {
123
+ path: ['name'],
124
+ direction: ReadSelectedOrderingDirection.Descending,
125
+ },
126
+ ]);
127
+ // Add third ordering - should remove the oldest one (name)
128
+ adapter.setOrdering(['description'], ReadSelectedOrderingDirection.Descending);
129
+ await waitForData(adapter);
130
+ expect(adapter.ordering).toEqual([
131
+ {
132
+ path: ['description'],
133
+ direction: ReadSelectedOrderingDirection.Descending,
134
+ },
135
+ {
136
+ path: ['id'],
137
+ direction: ReadSelectedOrderingDirection.Ascending,
138
+ },
139
+ ]);
140
+ });
141
+ });
@@ -0,0 +1,352 @@
1
+ import { ErrorCode, ReadSelectedLogicalOperator, } from '../data';
2
+ import { SingularEventTarget, toPascalCase } from '../utils';
3
+ import { ApiReadControllerClient } from '../services';
4
+ /**
5
+ * Adapter for managing a collection view of data
6
+ */
7
+ export class CollectionViewAdapter {
8
+ // #region Event targets
9
+ isLoadingChanged = new SingularEventTarget();
10
+ pageDataChanged = new SingularEventTarget();
11
+ errorChanged = new SingularEventTarget();
12
+ totalItemCountChanged = new SingularEventTarget();
13
+ pageIndexChanged = new SingularEventTarget();
14
+ pageSizeChanged = new SingularEventTarget();
15
+ selectionChanged = new SingularEventTarget();
16
+ searchChanged = new SingularEventTarget();
17
+ orderingChanged = new SingularEventTarget();
18
+ // #endregion
19
+ _readClient;
20
+ _isLoading = false;
21
+ _pageData = undefined;
22
+ _error = undefined;
23
+ _totalItemCount = 0;
24
+ _pageIndex = 0;
25
+ _pageSize = 0;
26
+ _selection = [];
27
+ _search = { logicalOperator: ReadSelectedLogicalOperator.And };
28
+ _ordering = [];
29
+ _currentAbortController;
30
+ _fetchTimeout;
31
+ _defaultOptions = {
32
+ pagination: {
33
+ defaultPageSize: 10,
34
+ defaultPageIndex: 0,
35
+ },
36
+ ordering: {
37
+ maxOrderingColumns: 1,
38
+ defaultOrdering: undefined,
39
+ },
40
+ search: {
41
+ defaultSearch: undefined,
42
+ },
43
+ selection: {
44
+ enabled: false,
45
+ defaultSelection: [],
46
+ },
47
+ };
48
+ _currentOptions;
49
+ /**
50
+ * Creates a new instance of CollectionViewAdapter
51
+ * @param options Options for the adapter
52
+ * @param client The client to use for reading data. If a string is provided, it will be used as the controller name for the ApiReadControllerClient, otherwise the provided client will be used directly.
53
+ */
54
+ constructor(options, client) {
55
+ this._readClient = typeof client === 'string' ? new ApiReadControllerClient(client) : client;
56
+ this._currentOptions = {
57
+ ...options,
58
+ pagination: {
59
+ ...this._defaultOptions.pagination,
60
+ ...options.pagination,
61
+ },
62
+ ordering: {
63
+ ...this._defaultOptions.ordering,
64
+ ...options.ordering,
65
+ },
66
+ search: {
67
+ ...this._defaultOptions.search,
68
+ ...options.search,
69
+ },
70
+ selection: options.selection ?? this._defaultOptions.selection,
71
+ };
72
+ this._pageIndex = this._currentOptions.pagination?.defaultPageIndex ?? this._pageIndex;
73
+ this._pageSize = this._currentOptions.pagination?.defaultPageSize ?? this._pageSize;
74
+ this._search = this._currentOptions.search?.defaultSearch ?? this._search;
75
+ this._selection = this._currentOptions.selection?.defaultSelection ?? this._selection;
76
+ this._ordering = this._currentOptions.ordering?.defaultOrdering ?? this._ordering;
77
+ this._scheduleFetch();
78
+ }
79
+ // #region Getters
80
+ get isLoading() {
81
+ return this._isLoading;
82
+ }
83
+ get pageData() {
84
+ return this._pageData;
85
+ }
86
+ get error() {
87
+ return this._error;
88
+ }
89
+ get totalItemCount() {
90
+ return this._totalItemCount;
91
+ }
92
+ get pageIndex() {
93
+ return this._pageIndex;
94
+ }
95
+ get pageSize() {
96
+ return this._pageSize;
97
+ }
98
+ get selection() {
99
+ return this._selection;
100
+ }
101
+ get search() {
102
+ return this._search;
103
+ }
104
+ // #endregion
105
+ // #region Search
106
+ setSearch(searchDefinition) {
107
+ this._search = searchDefinition;
108
+ this._pageIndex = 0;
109
+ this.searchChanged.dispatchEvent(searchDefinition);
110
+ this.pageIndexChanged.dispatchEvent(0);
111
+ this._scheduleFetch();
112
+ }
113
+ get ordering() {
114
+ return this._ordering;
115
+ }
116
+ // #endregion
117
+ // #region Ordering
118
+ setOrdering(propertyPath, orderDirection) {
119
+ this._ordering = this._ordering.filter(p => !this._arePropertyPathsEqual(p.path, propertyPath));
120
+ this._ordering = [{ path: propertyPath, direction: orderDirection }, ...this._ordering];
121
+ const maxColumns = this._currentOptions.ordering?.maxOrderingColumns ?? 1;
122
+ if (this._ordering.length > maxColumns) {
123
+ this._ordering = this._ordering.slice(0, maxColumns);
124
+ }
125
+ this._pageIndex = 0;
126
+ this.orderingChanged.dispatchEvent(this._ordering);
127
+ this.pageIndexChanged.dispatchEvent(0);
128
+ this._scheduleFetch();
129
+ }
130
+ // #endregion
131
+ // #region Pagination
132
+ setPageIndex(pageIndex) {
133
+ this._pageIndex = pageIndex;
134
+ this.pageIndexChanged.dispatchEvent(pageIndex);
135
+ this._scheduleFetch();
136
+ }
137
+ setPageSize(pageSize) {
138
+ this._pageSize = pageSize;
139
+ this._pageIndex = 0;
140
+ this.pageSizeChanged.dispatchEvent(pageSize);
141
+ this.pageIndexChanged.dispatchEvent(0);
142
+ this._scheduleFetch();
143
+ }
144
+ refreshData() {
145
+ this._scheduleFetch();
146
+ }
147
+ // #endregion
148
+ // #region Selection
149
+ _getItemKey(item) {
150
+ const pk = this._currentOptions.primaryKey;
151
+ if (typeof pk === 'function')
152
+ return pk(item);
153
+ return String(item[pk]);
154
+ }
155
+ get _selectionEnabled() {
156
+ return this._currentOptions.selection?.enabled ?? false;
157
+ }
158
+ selectionToggle(item) {
159
+ if (!this._selectionEnabled)
160
+ throw new Error('Selection is not enabled');
161
+ const key = this._getItemKey(item);
162
+ if (this._selection.find(x => this._getItemKey(x) === key)) {
163
+ this._selection = this._selection.filter(x => this._getItemKey(x) !== key);
164
+ }
165
+ else if (this._selectionEnabled === 'single') {
166
+ this._selection = [item];
167
+ }
168
+ else {
169
+ this._selection = [...this._selection, item];
170
+ }
171
+ this.selectionChanged.dispatchEvent(this._selection);
172
+ }
173
+ selectionAdd(item) {
174
+ if (!this._selectionEnabled)
175
+ throw new Error('Selection is not enabled');
176
+ const key = this._getItemKey(item);
177
+ if (this._selection.find(x => this._getItemKey(x) === key))
178
+ return;
179
+ if (this._selectionEnabled === 'single') {
180
+ this._selection = [item];
181
+ }
182
+ else {
183
+ this._selection = [...this._selection, item];
184
+ }
185
+ this.selectionChanged.dispatchEvent(this._selection);
186
+ }
187
+ selectionRemove(item) {
188
+ if (!this._selectionEnabled)
189
+ throw new Error('Selection is not enabled');
190
+ const key = this._getItemKey(item);
191
+ this._selection = this._selection.filter(x => this._getItemKey(x) !== key);
192
+ this.selectionChanged.dispatchEvent(this._selection);
193
+ }
194
+ selectionClear() {
195
+ if (!this._selectionEnabled)
196
+ throw new Error('Selection is not enabled');
197
+ this._selection = [];
198
+ this.selectionChanged.dispatchEvent(this._selection);
199
+ }
200
+ isSelected(item) {
201
+ if (!this._selectionEnabled)
202
+ throw new Error('Selection is not enabled');
203
+ const key = this._getItemKey(item);
204
+ return this._selection.some(x => this._getItemKey(x) === key);
205
+ }
206
+ selectionAddPage() {
207
+ if (!this._selectionEnabled)
208
+ throw new Error('Selection is not enabled');
209
+ if (this._selectionEnabled !== 'multiple' || !this._pageData)
210
+ return;
211
+ const newItems = this._pageData.filter(item => !this.isSelected(item));
212
+ if (newItems.length > 0) {
213
+ this._selection = [...this._selection, ...newItems];
214
+ this.selectionChanged.dispatchEvent(this._selection);
215
+ }
216
+ }
217
+ selectionRemovePage() {
218
+ if (!this._selectionEnabled)
219
+ throw new Error('Selection is not enabled');
220
+ if (!this._pageData)
221
+ return;
222
+ const pageItemKeys = new Set(this._pageData.map(item => this._getItemKey(item)));
223
+ this._selection = this._selection.filter(item => !pageItemKeys.has(this._getItemKey(item)));
224
+ this.selectionChanged.dispatchEvent(this._selection);
225
+ }
226
+ isSelectedPage() {
227
+ if (!this._selectionEnabled)
228
+ throw new Error('Selection is not enabled');
229
+ if (!this._pageData || this._pageData.length === 0)
230
+ return false;
231
+ return this._pageData.every(item => this.isSelected(item));
232
+ }
233
+ isSomeSelectedPage() {
234
+ if (!this._selectionEnabled)
235
+ throw new Error('Selection is not enabled');
236
+ if (!this._pageData || this._pageData.length === 0)
237
+ return false;
238
+ const selectedCount = this._pageData.filter(item => this.isSelected(item)).length;
239
+ return selectedCount > 0 && selectedCount < this._pageData.length;
240
+ }
241
+ // #endregion
242
+ // #region Lifecycle
243
+ destroy() {
244
+ this._cancelPendingRequests();
245
+ }
246
+ // #endregion
247
+ // #region Private
248
+ _scheduleFetch() {
249
+ this._isLoading = true;
250
+ this.isLoadingChanged.dispatchEvent(true);
251
+ if (this._fetchTimeout !== undefined) {
252
+ clearTimeout(this._fetchTimeout);
253
+ }
254
+ this._fetchTimeout = setTimeout(() => this._executeFetch(), 50);
255
+ }
256
+ async _executeFetch() {
257
+ let abortController;
258
+ try {
259
+ if (this._currentAbortController) {
260
+ try {
261
+ this._currentAbortController.abort();
262
+ }
263
+ catch {
264
+ // Ignore abort errors
265
+ }
266
+ }
267
+ abortController = new AbortController();
268
+ this._currentAbortController = abortController;
269
+ const definition = this._parseOptionsToDefinition();
270
+ const response = await this._readClient.readSelected(definition, abortController.signal);
271
+ if (!response.ok) {
272
+ if (response.error.code === ErrorCode.Aborted)
273
+ return;
274
+ this._error = response.error.details ?? response.error.message ?? 'Unknown error';
275
+ this._pageData = [];
276
+ }
277
+ else {
278
+ this._error = undefined;
279
+ this._pageData = response.result;
280
+ if (response.metadata.totalCount !== undefined) {
281
+ this._totalItemCount = response.metadata.totalCount;
282
+ }
283
+ else {
284
+ this._totalItemCount = this._calculateTotal(this._pageSize, this._pageIndex, this._pageData.length, this._totalItemCount);
285
+ }
286
+ }
287
+ }
288
+ catch (error) {
289
+ console.error('Error fetching data:', error);
290
+ this._error = error instanceof Error ? error.message : 'Unknown error';
291
+ }
292
+ finally {
293
+ if (abortController && this._currentAbortController === abortController) {
294
+ this._isLoading = false;
295
+ this._currentAbortController = undefined;
296
+ this.isLoadingChanged.dispatchEvent(false);
297
+ this.pageDataChanged.dispatchEvent(this._pageData);
298
+ this.errorChanged.dispatchEvent(this._error);
299
+ this.totalItemCountChanged.dispatchEvent(this._totalItemCount);
300
+ }
301
+ }
302
+ }
303
+ _cancelPendingRequests() {
304
+ if (this._fetchTimeout !== undefined) {
305
+ clearTimeout(this._fetchTimeout);
306
+ this._fetchTimeout = undefined;
307
+ }
308
+ if (this._currentAbortController) {
309
+ try {
310
+ this._currentAbortController.abort();
311
+ }
312
+ catch {
313
+ // Ignore abort errors
314
+ }
315
+ this._currentAbortController = undefined;
316
+ }
317
+ }
318
+ _parseOptionsToDefinition() {
319
+ const definition = {
320
+ paginationDefinition: {
321
+ skip: this._pageIndex * this._pageSize,
322
+ limit: this._pageSize,
323
+ },
324
+ };
325
+ if (this._ordering.length > 0) {
326
+ definition.orderingDefinition = {
327
+ order: this._ordering.map(o => ({
328
+ propertyPath: o.path.map(x => toPascalCase(x)),
329
+ direction: o.direction,
330
+ })),
331
+ };
332
+ }
333
+ definition.searchDefinition = this._search;
334
+ return definition;
335
+ }
336
+ _arePropertyPathsEqual(path1, path2) {
337
+ if (path1.length !== path2.length)
338
+ return false;
339
+ return path1.every((segment, index) => segment === path2[index]);
340
+ }
341
+ _calculateTotal(pageSize, pageIndex, itemsOnCurrentPageCount, previousTotal) {
342
+ if (itemsOnCurrentPageCount === 0) {
343
+ if (pageSize === 0)
344
+ return 0;
345
+ return pageSize * pageIndex;
346
+ }
347
+ if (itemsOnCurrentPageCount < pageSize) {
348
+ return pageSize * pageIndex + itemsOnCurrentPageCount;
349
+ }
350
+ return previousTotal;
351
+ }
352
+ }
@@ -1,2 +1,2 @@
1
- export * from './CollectionViewAdapter';
2
- export * from './SearchAdapter';
1
+ export * from './collection-view-adapter';
2
+ export * from './search-adapter';
@@ -1,2 +1,2 @@
1
- export * from './CollectionViewAdapter';
2
- export * from './SearchAdapter';
1
+ export * from './collection-view-adapter';
2
+ export * from './search-adapter';