@api-client/ui 0.0.11 → 0.0.13

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 (242) hide show
  1. package/.eslintrc +8 -0
  2. package/demo/elements/authorization/cc.ts +56 -27
  3. package/demo/elements/index.html +3 -0
  4. package/demo/elements/store/file-picker.html +15 -0
  5. package/demo/elements/store/file-picker.ts +134 -0
  6. package/demo/elements/store/index.html +19 -0
  7. package/demo/store/StorePlugin.js +1 -0
  8. package/dist/bindings/base/FileBindings.d.ts +4 -0
  9. package/dist/bindings/base/FileBindings.d.ts.map +1 -1
  10. package/dist/bindings/base/FileBindings.js +21 -1
  11. package/dist/bindings/base/FileBindings.js.map +1 -1
  12. package/dist/bindings/base/StoreBindings.d.ts +6 -17
  13. package/dist/bindings/base/StoreBindings.d.ts.map +1 -1
  14. package/dist/bindings/base/StoreBindings.js +15 -60
  15. package/dist/bindings/base/StoreBindings.js.map +1 -1
  16. package/dist/bindings/web/WebFileBindings.js +1 -1
  17. package/dist/bindings/web/WebFileBindings.js.map +1 -1
  18. package/dist/define/http/certificate-add.d.ts +9 -0
  19. package/dist/define/http/certificate-add.d.ts.map +1 -0
  20. package/dist/define/http/certificate-add.js +10 -0
  21. package/dist/define/http/certificate-add.js.map +1 -0
  22. package/dist/define/store/file-picker.d.ts +9 -0
  23. package/dist/define/store/file-picker.d.ts.map +1 -0
  24. package/dist/define/store/file-picker.js +10 -0
  25. package/dist/define/store/file-picker.js.map +1 -0
  26. package/dist/define/{files → store}/share-file.d.ts +1 -1
  27. package/dist/define/store/share-file.d.ts.map +1 -0
  28. package/dist/define/{files → store}/share-file.js +2 -2
  29. package/dist/define/store/share-file.js.map +1 -0
  30. package/dist/define/ui/ui-segmented-button-set.d.ts +1 -1
  31. package/dist/define/ui/ui-segmented-button-set.d.ts.map +1 -1
  32. package/dist/define/ui/ui-segmented-button-set.js.map +1 -1
  33. package/dist/elements/authorization/ui/CC.styles.d.ts.map +1 -1
  34. package/dist/elements/authorization/ui/CC.styles.js +4 -9
  35. package/dist/elements/authorization/ui/CC.styles.js.map +1 -1
  36. package/dist/elements/authorization/ui/CcAuthorization.d.ts +14 -29
  37. package/dist/elements/authorization/ui/CcAuthorization.d.ts.map +1 -1
  38. package/dist/elements/authorization/ui/CcAuthorization.js +67 -158
  39. package/dist/elements/authorization/ui/CcAuthorization.js.map +1 -1
  40. package/dist/elements/http/CertificateAdd.element.d.ts +91 -0
  41. package/dist/elements/http/CertificateAdd.element.d.ts.map +1 -0
  42. package/dist/elements/http/CertificateAdd.element.js +389 -0
  43. package/dist/elements/http/CertificateAdd.element.js.map +1 -0
  44. package/dist/elements/http/CertificateAdd.styles.d.ts +3 -0
  45. package/dist/elements/http/CertificateAdd.styles.d.ts.map +1 -0
  46. package/dist/elements/http/CertificateAdd.styles.js +61 -0
  47. package/dist/elements/http/CertificateAdd.styles.js.map +1 -0
  48. package/dist/elements/project/ProjectRunReport.d.ts +2 -1
  49. package/dist/elements/project/ProjectRunReport.d.ts.map +1 -1
  50. package/dist/elements/project/ProjectRunReport.js.map +1 -1
  51. package/dist/elements/store/FilePicker.element.d.ts +87 -0
  52. package/dist/elements/store/FilePicker.element.d.ts.map +1 -0
  53. package/dist/elements/store/FilePicker.element.js +263 -0
  54. package/dist/elements/store/FilePicker.element.js.map +1 -0
  55. package/dist/elements/store/FilePicker.styles.d.ts +3 -0
  56. package/dist/elements/store/FilePicker.styles.d.ts.map +1 -0
  57. package/dist/elements/store/FilePicker.styles.js +73 -0
  58. package/dist/elements/store/FilePicker.styles.js.map +1 -0
  59. package/dist/elements/store/FilesLib.d.ts +10 -0
  60. package/dist/elements/store/FilesLib.d.ts.map +1 -0
  61. package/dist/elements/store/FilesLib.js +38 -0
  62. package/dist/elements/store/FilesLib.js.map +1 -0
  63. package/dist/elements/{files/ShareFile.d.ts → store/ShareFile.element.d.ts} +1 -1
  64. package/dist/elements/store/ShareFile.element.d.ts.map +1 -0
  65. package/dist/elements/{files/ShareFile.js → store/ShareFile.element.js} +1 -1
  66. package/dist/elements/store/ShareFile.element.js.map +1 -0
  67. package/dist/elements/store/ShareFile.styles.d.ts.map +1 -0
  68. package/dist/elements/{files → store}/ShareFile.styles.js.map +1 -1
  69. package/dist/events/EventTypes.d.ts +7 -7
  70. package/dist/events/EventTypes.d.ts.map +1 -1
  71. package/dist/events/EventTypes.js +8 -7
  72. package/dist/events/EventTypes.js.map +1 -1
  73. package/dist/events/Events.d.ts +7 -1
  74. package/dist/events/Events.d.ts.map +1 -1
  75. package/dist/events/Events.js +2 -0
  76. package/dist/events/Events.js.map +1 -1
  77. package/dist/events/FilesystemEvents.d.ts +8 -0
  78. package/dist/events/FilesystemEvents.d.ts.map +1 -0
  79. package/dist/events/FilesystemEvents.js +59 -0
  80. package/dist/events/FilesystemEvents.js.map +1 -0
  81. package/dist/events/HttpClientEvents.d.ts +0 -2
  82. package/dist/events/HttpClientEvents.d.ts.map +1 -1
  83. package/dist/events/HttpClientEvents.js +0 -2
  84. package/dist/events/HttpClientEvents.js.map +1 -1
  85. package/dist/events/StoreEvents.d.ts +8 -1
  86. package/dist/events/StoreEvents.d.ts.map +1 -1
  87. package/dist/events/StoreEvents.js +19 -0
  88. package/dist/events/StoreEvents.js.map +1 -1
  89. package/dist/http-client/idb/Arc18DataUpgrade.d.ts +0 -8
  90. package/dist/http-client/idb/Arc18DataUpgrade.d.ts.map +1 -1
  91. package/dist/http-client/idb/Arc18DataUpgrade.js +11 -206
  92. package/dist/http-client/idb/Arc18DataUpgrade.js.map +1 -1
  93. package/dist/http-client/store/StoreBroadcast.d.ts +0 -5
  94. package/dist/http-client/store/StoreBroadcast.d.ts.map +1 -1
  95. package/dist/http-client/store/StoreBroadcast.js +0 -7
  96. package/dist/http-client/store/StoreBroadcast.js.map +1 -1
  97. package/dist/lib/files/FileUtils.d.ts +9 -0
  98. package/dist/lib/files/FileUtils.d.ts.map +1 -0
  99. package/dist/lib/files/FileUtils.js +13 -0
  100. package/dist/lib/files/FileUtils.js.map +1 -0
  101. package/dist/mixins/RouteMixin.d.ts +4 -0
  102. package/dist/mixins/RouteMixin.d.ts.map +1 -1
  103. package/dist/mixins/RouteMixin.js +1 -0
  104. package/dist/mixins/RouteMixin.js.map +1 -1
  105. package/dist/pages/ApplicationScreen.d.ts +1 -1
  106. package/dist/pages/ApplicationScreen.d.ts.map +1 -1
  107. package/dist/pages/ApplicationScreen.js +4 -2
  108. package/dist/pages/ApplicationScreen.js.map +1 -1
  109. package/dist/pages/api-client/ApiClient.screen.d.ts +4 -6
  110. package/dist/pages/api-client/ApiClient.screen.d.ts.map +1 -1
  111. package/dist/pages/api-client/ApiClient.screen.js +39 -31
  112. package/dist/pages/api-client/ApiClient.screen.js.map +1 -1
  113. package/dist/pages/api-client/ApiClient.styles.d.ts.map +1 -1
  114. package/dist/pages/api-client/ApiClient.styles.js +0 -12
  115. package/dist/pages/api-client/ApiClient.styles.js.map +1 -1
  116. package/dist/pages/api-client/Authenticate.screen.d.ts +1 -1
  117. package/dist/pages/api-client/Authenticate.screen.d.ts.map +1 -1
  118. package/dist/pages/api-client/Authenticate.screen.js +2 -2
  119. package/dist/pages/api-client/Authenticate.screen.js.map +1 -1
  120. package/dist/pages/api-client/pages/Files.page.d.ts +6 -35
  121. package/dist/pages/api-client/pages/Files.page.d.ts.map +1 -1
  122. package/dist/pages/api-client/pages/Files.page.js +45 -141
  123. package/dist/pages/api-client/pages/Files.page.js.map +1 -1
  124. package/dist/pages/api-client/pages/Shared.page.d.ts +1 -5
  125. package/dist/pages/api-client/pages/Shared.page.d.ts.map +1 -1
  126. package/dist/pages/api-client/pages/Shared.page.js +1 -40
  127. package/dist/pages/api-client/pages/Shared.page.js.map +1 -1
  128. package/dist/pages/demo/DemoPage.d.ts +7 -0
  129. package/dist/pages/demo/DemoPage.d.ts.map +1 -1
  130. package/dist/pages/demo/DemoPage.js +14 -0
  131. package/dist/pages/demo/DemoPage.js.map +1 -1
  132. package/dist/store/FileSystem.d.ts +90 -0
  133. package/dist/store/FileSystem.d.ts.map +1 -0
  134. package/dist/store/FileSystem.js +260 -0
  135. package/dist/store/FileSystem.js.map +1 -0
  136. package/dist/styles/global-styles.d.ts.map +1 -1
  137. package/dist/styles/global-styles.js +7 -0
  138. package/dist/styles/global-styles.js.map +1 -1
  139. package/dist/ui/button/SegmentedButtonsSet.d.ts +14 -0
  140. package/dist/ui/button/SegmentedButtonsSet.d.ts.map +1 -1
  141. package/dist/ui/button/SegmentedButtonsSet.js.map +1 -1
  142. package/dist/ui/icons/Icons.d.ts +2 -1
  143. package/dist/ui/icons/Icons.d.ts.map +1 -1
  144. package/dist/ui/icons/Icons.js +1 -0
  145. package/dist/ui/icons/Icons.js.map +1 -1
  146. package/dist/ui/list/UiDropdownList.d.ts +9 -1
  147. package/dist/ui/list/UiDropdownList.d.ts.map +1 -1
  148. package/dist/ui/list/UiDropdownList.js +39 -17
  149. package/dist/ui/list/UiDropdownList.js.map +1 -1
  150. package/dist/ui/list/UiList.d.ts +6 -1
  151. package/dist/ui/list/UiList.d.ts.map +1 -1
  152. package/dist/ui/list/UiList.js +24 -9
  153. package/dist/ui/list/UiList.js.map +1 -1
  154. package/dist/ui/notification/SnackNotifications.d.ts +1 -0
  155. package/dist/ui/notification/SnackNotifications.d.ts.map +1 -1
  156. package/dist/ui/notification/SnackNotifications.js +7 -0
  157. package/dist/ui/notification/SnackNotifications.js.map +1 -1
  158. package/dist/ui/table/DataTable.d.ts +4 -0
  159. package/dist/ui/table/DataTable.d.ts.map +1 -1
  160. package/dist/ui/table/DataTable.js +23 -1
  161. package/dist/ui/table/DataTable.js.map +1 -1
  162. package/package.json +1 -1
  163. package/src/bindings/base/FileBindings.ts +25 -1
  164. package/src/bindings/base/StoreBindings.ts +16 -73
  165. package/src/bindings/web/WebFileBindings.ts +1 -1
  166. package/src/define/http/certificate-add.ts +12 -0
  167. package/src/define/store/file-picker.ts +12 -0
  168. package/src/define/{files → store}/share-file.ts +2 -2
  169. package/src/define/ui/ui-segmented-button-set.ts +1 -1
  170. package/src/elements/authorization/ui/CC.styles.ts +4 -9
  171. package/src/elements/authorization/ui/CcAuthorization.ts +67 -167
  172. package/src/elements/http/CertificateAdd.element.ts +443 -0
  173. package/src/elements/http/CertificateAdd.styles.ts +61 -0
  174. package/src/elements/project/ProjectRunReport.ts +2 -1
  175. package/src/elements/store/FilePicker.element.ts +297 -0
  176. package/src/elements/store/FilePicker.styles.ts +73 -0
  177. package/src/elements/store/FilesLib.ts +32 -0
  178. package/src/events/EventTypes.ts +8 -7
  179. package/src/events/Events.ts +2 -0
  180. package/src/events/FilesystemEvents.ts +63 -0
  181. package/src/events/HttpClientEvents.ts +0 -2
  182. package/src/events/StoreEvents.ts +21 -1
  183. package/src/http-client/idb/Arc18DataUpgrade.ts +84 -84
  184. package/src/http-client/store/StoreBroadcast.ts +0 -8
  185. package/src/lib/files/FileUtils.ts +12 -0
  186. package/src/mixins/RouteMixin.ts +8 -1
  187. package/src/pages/ApplicationScreen.ts +5 -3
  188. package/src/pages/api-client/ApiClient.screen.ts +42 -33
  189. package/src/pages/api-client/ApiClient.styles.ts +0 -12
  190. package/src/pages/api-client/Authenticate.screen.ts +2 -2
  191. package/src/pages/api-client/pages/Files.page.ts +48 -164
  192. package/src/pages/api-client/pages/Shared.page.ts +2 -40
  193. package/src/pages/demo/DemoPage.ts +17 -0
  194. package/src/store/FileSystem.ts +325 -0
  195. package/src/styles/global-styles.ts +7 -0
  196. package/src/ui/button/SegmentedButtonsSet.ts +16 -1
  197. package/src/ui/icons/Icons.ts +2 -1
  198. package/src/ui/list/UiDropdownList.ts +44 -17
  199. package/src/ui/list/UiList.ts +26 -10
  200. package/src/ui/notification/SnackNotifications.ts +8 -0
  201. package/src/ui/table/DataTable.ts +29 -3
  202. package/test/elements/http/BodyFormdataEditorElement.test.ts +458 -454
  203. package/test/elements/http/BodyMultipartEditorElement.test.ts +609 -605
  204. package/test/elements/http/BodyRawEditorElement.test.ts +60 -56
  205. package/test/elements/http/CertificateAdd.test.ts +430 -0
  206. package/test/elements/store/FilePicker.test.ts +241 -0
  207. package/test/env.js +3 -0
  208. package/test/events/EventTypes.test.ts +0 -22
  209. package/test/helpers/StoreHelper.ts +390 -0
  210. package/test/helpers/UiMock.ts +19 -2
  211. package/tsconfig.eslint.json +3 -1
  212. package/web-test-runner.config.mjs +50 -3
  213. package/dist/define/files/share-file.d.ts.map +0 -1
  214. package/dist/define/files/share-file.js.map +0 -1
  215. package/dist/elements/files/ShareFile.d.ts.map +0 -1
  216. package/dist/elements/files/ShareFile.js.map +0 -1
  217. package/dist/elements/files/ShareFile.styles.d.ts.map +0 -1
  218. package/dist/events/http-client/models/CertificatesEvents.d.ts +0 -12
  219. package/dist/events/http-client/models/CertificatesEvents.d.ts.map +0 -1
  220. package/dist/events/http-client/models/CertificatesEvents.js +0 -18
  221. package/dist/events/http-client/models/CertificatesEvents.js.map +0 -1
  222. package/dist/http-client/idb/AuthDataModel.d.ts +0 -60
  223. package/dist/http-client/idb/AuthDataModel.d.ts.map +0 -1
  224. package/dist/http-client/idb/AuthDataModel.js +0 -150
  225. package/dist/http-client/idb/AuthDataModel.js.map +0 -1
  226. package/dist/http-client/idb/HostsModel.d.ts +0 -25
  227. package/dist/http-client/idb/HostsModel.d.ts.map +0 -1
  228. package/dist/http-client/idb/HostsModel.js +0 -82
  229. package/dist/http-client/idb/HostsModel.js.map +0 -1
  230. package/dist/http-client/idb/LegacyMockedStore.d.ts +0 -214
  231. package/dist/http-client/idb/LegacyMockedStore.d.ts.map +0 -1
  232. package/dist/http-client/idb/LegacyMockedStore.js +0 -486
  233. package/dist/http-client/idb/LegacyMockedStore.js.map +0 -1
  234. package/src/events/http-client/models/CertificatesEvents.ts +0 -23
  235. package/src/http-client/idb/AuthDataModel.ts +0 -175
  236. package/src/http-client/idb/HostsModel.ts +0 -125
  237. package/src/http-client/idb/LegacyMockedStore.ts +0 -544
  238. package/test/apic-ui.test.ts +0 -31
  239. /package/dist/elements/{files → store}/ShareFile.styles.d.ts +0 -0
  240. /package/dist/elements/{files → store}/ShareFile.styles.js +0 -0
  241. /package/src/elements/{files/ShareFile.ts → store/ShareFile.element.ts} +0 -0
  242. /package/src/elements/{files → store}/ShareFile.styles.ts +0 -0
@@ -15,16 +15,11 @@ import {
15
15
  SpaceKind,
16
16
  Space,
17
17
  PermissionRole,
18
- HttpCertificate,
19
18
  ContextSpaceListOptions,
20
19
  IRevision,
21
20
  TrashEntry,
22
21
  TrashEntryCreate,
23
22
  ContextDeleteBulkEvent,
24
- ICertificate,
25
- ContextListEvent,
26
- ContextReadEvent,
27
- ContextUpdateEvent,
28
23
  FileAddOptions,
29
24
  FileBreadcrumb,
30
25
  IBackendObserveCommand,
@@ -127,13 +122,17 @@ export abstract class StoreBindings extends PlatformBindings {
127
122
 
128
123
  projectExeChannel = new BroadcastChannel(StoreBroadcast.projectRuns);
129
124
 
130
- certificatesChannel = new BroadcastChannel(StoreBroadcast.certificates);
125
+ initialized = false;
131
126
 
132
127
  async initializeStore(): Promise<void> {
133
128
  // ...
134
129
  }
135
130
 
136
131
  async initialize(): Promise<void> {
132
+ if (this.initialized) {
133
+ return;
134
+ }
135
+ this.initialized = true;
137
136
  const target = document.body;
138
137
 
139
138
  window.addEventListener(EventTypes.Store.initEnvironment, this.handleInitializeEnvironment.bind(this));
@@ -156,6 +155,7 @@ export abstract class StoreBindings extends PlatformBindings {
156
155
  window.addEventListener(EventTypes.Store.File.delete, this.handleFileDelete.bind(this) as EventListener);
157
156
  window.addEventListener(EventTypes.Store.File.patchUsers, this.handleFilePatchUser.bind(this) as EventListener);
158
157
  window.addEventListener(EventTypes.Store.File.listUsers, this.handleListFileUsers.bind(this) as EventListener);
158
+ window.addEventListener(EventTypes.Store.File.breadcrumbs, this.handleFileBreadcrumbs.bind(this) as EventListener);
159
159
 
160
160
  // User
161
161
  window.addEventListener(EventTypes.Store.User.me, this.handlerMe.bind(this));
@@ -182,12 +182,6 @@ export abstract class StoreBindings extends PlatformBindings {
182
182
  target.addEventListener(EventTypes.Store.ProjectRuns.clearSpace, this.handleProjectExecutionClearSpace.bind(this) as EventListener);
183
183
  target.addEventListener(EventTypes.Store.ProjectRuns.clearProject, this.handleProjectExecutionClearProject.bind(this) as EventListener);
184
184
  target.addEventListener(EventTypes.Store.ProjectRuns.clearParent, this.handleProjectExecutionClearFolder.bind(this) as EventListener);
185
-
186
- // certificates
187
- target.addEventListener(EventTypes.Store.Certificate.list, this.handleCertificateList.bind(this) as EventListener);
188
- target.addEventListener(EventTypes.Store.Certificate.read, this.handleCertificateRead.bind(this) as EventListener);
189
- target.addEventListener(EventTypes.Store.Certificate.delete, this.handleCertificateDelete.bind(this) as EventListener);
190
- target.addEventListener(EventTypes.Store.Certificate.insert, this.handleCertificateInsert.bind(this) as EventListener);
191
185
  }
192
186
 
193
187
  abstract environment: EnvironmentSettings;
@@ -372,6 +366,11 @@ export abstract class StoreBindings extends PlatformBindings {
372
366
  event.detail.result = this.getStore().sdk.file.listUsers(this.space, event.detail.key);
373
367
  }
374
368
 
369
+ protected handleFileBreadcrumbs(event: CustomEvent<{ key: string, result: Promise<ContextListResult<FileBreadcrumb>> }>): void {
370
+ event.preventDefault();
371
+ event.detail.result = this.files.breadcrumbs(event.detail.key)
372
+ // this.getStore().sdk.file.breadcrumbs(this.space, event.detail.key);
373
+ }
375
374
 
376
375
  protected handlerMe(input: Event): void {
377
376
  const e = input as CustomEvent<{ result: Promise<IUser> }>;
@@ -613,27 +612,6 @@ export abstract class StoreBindings extends PlatformBindings {
613
612
  patchUsers: (space: string, value: IAccessPatchInfo): Promise<void> => this.getStore().sdk.spaces.patchUsers(this.space || space, value),
614
613
  }
615
614
 
616
- certificates = {
617
- add: (value: HttpCertificate, space: string): Promise<ContextChangeRecord<HttpCertificate>> => this.getStore().sdk.certificates.add(value, this.space || space),
618
- addBulk: (values: HttpCertificate[], space: string): Promise<IBulkOperationResult<ContextChangeRecord<HttpCertificate>>> => this.getStore().sdk.certificates.addBulk(values, this.space || space),
619
- read: (key: string): Promise<HttpCertificate> => this.getStore().sdk.certificates.read(key),
620
- list: (options?: ContextSpaceListOptions): Promise<ContextListResult<HttpCertificate>> => {
621
- const cp = { ...options } as ContextSpaceListOptions;
622
- if (!cp.space) {
623
- cp.space = this.space;
624
- }
625
- return this.getStore().sdk.certificates.list(cp);
626
- },
627
- delete: async (key: string): Promise<ContextDeleteRecord> => {
628
- await this.getStore().sdk.certificates.delete(key);
629
- return {
630
- key,
631
- };
632
- },
633
- deleteBulk: (keys: string[]): Promise<IBulkOperationResult<ContextDeleteRecord>> => this.getStore().sdk.certificates.deleteBulk(keys),
634
- empty: (space: string): Promise<void> => this.getStore().sdk.certificates.empty(this.space || space),
635
- }
636
-
637
615
  trash = {
638
616
  add: (entry: TrashEntryCreate, space: string): Promise<ContextChangeRecord<TrashEntry>> => this.getStore().sdk.trash.add(entry, this.space || space),
639
617
  list: (options: ContextSpaceListOptions): Promise<ContextListResult<TrashEntry>> => {
@@ -682,43 +660,7 @@ export abstract class StoreBindings extends PlatformBindings {
682
660
  me: (): Promise<IUser> => this.getStore().sdk.user.me(),
683
661
  read: (key: string): Promise<IUser> => this.getStore().sdk.user.read(key),
684
662
  }
685
-
686
- protected handleCertificateList(event: Event): void {
687
- const e = event as ContextListEvent<ICertificate>;
688
- e.preventDefault();
689
- const options: ContextSpaceListOptions = {
690
- ...e.detail,
691
- space: this.space,
692
- }
693
- e.detail.result = this.certificates.list(options);
694
- }
695
-
696
- protected handleCertificateRead(event: Event): void {
697
- const e = event as ContextReadEvent<ICertificate>;
698
- e.preventDefault();
699
- e.detail.result = this.certificates.read(e.detail.key);
700
- }
701
-
702
- protected handleCertificateDelete(event: Event): void {
703
- const e = event as ContextDeleteEvent;
704
- e.preventDefault();
705
- e.detail.result = this.certificates.delete(e.detail.key);
706
- }
707
-
708
- protected handleCertificateInsert(event: Event): void {
709
- const e = event as ContextUpdateEvent<HttpCertificate, HttpCertificate>;
710
- e.preventDefault();
711
- e.detail.result = this.certificates.add(e.detail.item, this.space);
712
- }
713
-
714
- async observeCertificates(): Promise<void> {
715
- await this.observePath(RouteBuilder.certificates());
716
- }
717
-
718
- async unobserveCertificates(): Promise<void> {
719
- await this.unobservePath(RouteBuilder.certificates());
720
- }
721
-
663
+
722
664
  async observeSpaces(): Promise<void> {
723
665
  await this.observePath(RouteBuilder.spaces());
724
666
  }
@@ -822,10 +764,13 @@ export abstract class StoreBindings extends PlatformBindings {
822
764
  protected storeEventHandler(e: MessageEvent): void {
823
765
  const event = JSON.parse(e.data) as BroadcastEvent | BackendErrorEvent;
824
766
  if (event.type === 'error') {
825
- // TODO: Report an error somehow
826
767
  throw new Error(event.cause);
827
768
  }
828
769
  if (event.space && event.space !== this.space) {
770
+ // we allow files here to support shared files.
771
+ if (event.path === RouteBuilder.files()) {
772
+ this.filesChannel.postMessage(event);
773
+ }
829
774
  return;
830
775
  }
831
776
  if (event.path === RouteBuilder.spaces()) {
@@ -845,8 +790,6 @@ export abstract class StoreBindings extends PlatformBindings {
845
790
  this.historyChannel.postMessage(event);
846
791
  } else if (event.path === RouteBuilder.projectExecutions()) {
847
792
  this.projectExeChannel.postMessage(event);
848
- } else if (event.path === RouteBuilder.certificates()) {
849
- this.certificatesChannel.postMessage(event);
850
793
  } else {
851
794
  // eslint-disable-next-line no-console
852
795
  console.warn(`Broadcast path not handled`, event.path, event)
@@ -46,7 +46,7 @@ export class WebFileBindings extends FileBindings {
46
46
  const handles = await window.showOpenFilePicker(dialogOptions);
47
47
  const result: string[] = [];
48
48
  handles.forEach((handle) => {
49
- const path = uuidV4();
49
+ const path = `${uuidV4()}/${handle.name}`;
50
50
  result.push(path);
51
51
  this.handles.set(path, handle);
52
52
  });
@@ -0,0 +1,12 @@
1
+ import { customElement } from 'lit/decorators.js';
2
+ import Element from '../../elements/http/CertificateAdd.element.js';
3
+
4
+ @customElement('certificate-add')
5
+ export class CertificateAddElement extends Element {
6
+ }
7
+
8
+ declare global {
9
+ interface HTMLElementTagNameMap {
10
+ 'certificate-add': Element;
11
+ }
12
+ }
@@ -0,0 +1,12 @@
1
+ import { customElement } from "lit/decorators.js";
2
+ import Element from "../../elements/store/FilePicker.element.js";
3
+
4
+ @customElement('file-picker')
5
+ export class FilePickerElement extends Element {
6
+ }
7
+
8
+ declare global {
9
+ interface HTMLElementTagNameMap {
10
+ 'file-picker': Element;
11
+ }
12
+ }
@@ -1,6 +1,6 @@
1
1
  import { customElement } from 'lit/decorators.js';
2
- import Element from "../../elements/files/ShareFile.js";
3
- import styles from "../../elements/files/ShareFile.styles.js";
2
+ import Element from "../../elements/store/ShareFile.element.js";
3
+ import styles from "../../elements/store/ShareFile.styles.js";
4
4
  import dialogStyles from '../../ui/dialog/UiDialog.styles.js';
5
5
 
6
6
  @customElement('share-file')
@@ -9,6 +9,6 @@ export class UiSegmentedButtonSetElement extends Element {
9
9
 
10
10
  declare global {
11
11
  interface HTMLElementTagNameMap {
12
- 'ui-segmented-button-set': UiSegmentedButtonSetElement;
12
+ 'ui-segmented-button-set': Element;
13
13
  }
14
14
  }
@@ -1,19 +1,14 @@
1
1
  import { css } from 'lit';
2
2
 
3
3
  export default css`
4
- .cert-meta {
5
- display: inline-flex;
6
- align-items: center;
7
- }
8
-
9
4
  :host {
10
- max-height: 300px;
11
5
  display: flex;
12
6
  flex-direction: column;
13
7
  }
14
8
 
15
- form {
16
- overflow: auto;
17
- flex: 1;
9
+ .certificate-info {
10
+ display: flex;
11
+ align-items: center;
12
+ margin-top: 20px;
18
13
  }
19
14
  `;
@@ -1,129 +1,69 @@
1
1
  import { html, nothing, TemplateResult } from "lit";
2
- import { state } from "lit/decorators.js";
3
2
  import {
4
- ICCAuthorization, HttpCertificate, Events as CoreEvents,
5
- ICertificate,
6
- BroadcastEvent,
7
- BroadcastCreatedEvent,
8
- DeletedBroadcastEvent,
3
+ ICCAuthorization, HttpCertificate, Events as CoreEvents, CertificateFileKind, ICertificate, IFile,
9
4
  } from '@api-client/core/build/browser.js';
10
- import '@github/relative-time-element';
5
+ import { state } from "lit/decorators.js";
11
6
  import { Authorization } from "./Authorization.js";
7
+ import type { FilePickerClosingReason } from "../../store/FilePicker.element.js";
12
8
  import { Events } from "../../../events/Events.js";
13
- import type RadioElement from "../../../ui/input/RadioElement.js";
14
- import { StoreBroadcast } from "../../../http-client/store/StoreBroadcast.js";
9
+ import '../../../define/ui/ui-dropdown-list.js';
15
10
  import '../../../define/ui/ui-button.js';
16
- import '../../../define/ui/ui-radio.js';
11
+ import '../../../define/ui/ui-icon-button.js';
12
+ import '../../../define/ui/ui-icon.js';
13
+ import '../../../define/store/file-picker.js';
17
14
 
18
15
  export default class CcAuthorization extends Authorization {
19
- @state() items?: ICertificate[];
20
-
21
- @state() querying = false;
22
-
23
- @state() loadingError?: string;
24
-
25
- channel = new BroadcastChannel(StoreBroadcast.certificates);
26
-
27
- constructor() {
28
- super();
29
-
30
- this.handleBroadcast = this.handleBroadcast.bind(this);
31
- }
32
-
33
- override connectedCallback(): void {
34
- super.connectedCallback();
35
- this.channel.addEventListener('message', this.handleBroadcast);
36
- this.queryCertificates();
37
- }
38
-
39
- override disconnectedCallback(): void {
40
- super.disconnectedCallback();
41
- this.channel.removeEventListener('message', this.handleBroadcast);
42
- }
43
-
44
- protected handleBroadcast(e: MessageEvent): void {
45
- const event = e.data as BroadcastEvent;
46
- switch (event.operation) {
47
- case 'created': this.handleCreated(event as BroadcastCreatedEvent); break;
48
- case 'deleted': this.handleDeleted(event as DeletedBroadcastEvent); break;
49
- default:
50
- }
51
- }
16
+ @state() selectorRendered = false;
52
17
 
53
- protected handleCreated(event: BroadcastCreatedEvent): void {
54
- const cert = event.data as ICertificate;
55
- if (!this.items) {
56
- this.items = [];
18
+ get config(): ICCAuthorization {
19
+ const { authorization } = this;
20
+ if (!authorization) {
21
+ return { };
57
22
  }
58
- const index = this.items.findIndex(i => i.key === cert.key);
59
- if (index >= 0) {
60
- this.items[index] = cert;
61
- } else {
62
- this.items.push(cert);
23
+ if (!authorization.config) {
24
+ authorization.config = {} as ICCAuthorization;
63
25
  }
64
- this.requestUpdate();
26
+ return authorization.config as ICCAuthorization;
65
27
  }
66
28
 
67
- protected handleDeleted(event: DeletedBroadcastEvent): void {
68
- if (!this.items) {
29
+ protected handleClose(e: CustomEvent<FilePickerClosingReason>): void {
30
+ const { canceled, file } = e.detail;
31
+ if (canceled) {
69
32
  return;
70
33
  }
71
- const { key } = event;
72
- const index = this.items.findIndex(i => i.key === key);
73
- if (index >= 0) {
74
- this.items.splice(index, 1);
75
- this.requestUpdate();
76
- }
34
+ this.setCertificate((file as IFile).key);
35
+ CoreEvents.Telemetry.event({
36
+ category: 'Certificates',
37
+ action: 'Authorization',
38
+ label: 'selected-certificate'
39
+ }, this);
77
40
  }
78
41
 
79
- protected async queryCertificates(): Promise<void> {
80
- if (this.querying) {
81
- return;
82
- }
83
- this.querying = true;
42
+ async setCertificate(key: string): Promise<void> {
43
+ let result: unknown;
84
44
  try {
85
- const data = await Events.HttpClient.Model.Certificate.list({ limit: 100, space: "" }); // the space should be filled by the bindings / hosting app
86
- if (!data) {
87
- this.items = undefined;
88
- throw new Error(`Certificates query not handled by the store.`);
89
- return;
90
- }
91
- this.items = data.items;
92
- } catch (cause) {
93
- this.loadingError = (cause as Error).message;
94
- } finally {
95
- this.querying = false;
45
+ result = await Events.Store.File.read(key, true, this);
46
+ } catch (_) {
47
+ return;
96
48
  }
49
+ const { config } = this;
50
+ config.certificate = result as ICertificate;
51
+ this.requestUpdate();
52
+ this.notifyChange();
97
53
  }
98
54
 
99
- protected handleSelected(e: Event): void {
100
- const { authorization } = this;
101
- if (!authorization) {
102
- return;
55
+ protected handleDropDownOpen(): void {
56
+ this.selectorRendered = true;
57
+ if (this.isUpdatePending) {
58
+ this.scheduleUpdate();
103
59
  }
60
+ }
104
61
 
105
- const radio = e.target as RadioElement;
106
- const { checked, value } = radio;
107
- if (!checked) {
108
- return;
109
- }
110
- const config = authorization.config as ICCAuthorization || {} as ICCAuthorization;
111
- if (value === '') {
112
- delete config.certificate;
113
- } else {
114
- const cert = this.items?.find(i => i.key === value);
115
- if (!cert) {
116
- return;
117
- }
118
- config.certificate = cert;
119
- }
62
+ protected handleClearCertificate(): void {
63
+ const { config } = this;
64
+ delete config.certificate;
65
+ this.requestUpdate();
120
66
  this.notifyChange();
121
-
122
- CoreEvents.Telemetry.event({
123
- category: 'Certificates',
124
- action: 'Authorization',
125
- label: 'selected-certificate'
126
- }, this);
127
67
  }
128
68
 
129
69
  override render(): TemplateResult {
@@ -134,81 +74,41 @@ export default class CcAuthorization extends Authorization {
134
74
  }
135
75
 
136
76
  protected renderEditor(): TemplateResult | typeof nothing {
137
- const { authorization, loadingError, items } = this;
138
- if (!authorization) {
139
- return nothing;
140
- }
141
- const hasItems = !!items && !!items.length;
142
- if (!loadingError && !hasItems) {
143
- return html`
144
- ${this.renderEmptyState()}
145
- `;
146
- }
147
- const config = authorization.config as ICCAuthorization || {} as ICCAuthorization;
77
+ const { config } = this;
78
+ const { certificate } = config;
79
+ // Note, the <form> element is required by the Authorization class for validation.
148
80
  return html`
149
- ${loadingError ? this.renderErrorState(loadingError) : ''}
150
- ${hasItems ? html`
151
- <form autocomplete="on" class="auth-form basic-auth">
152
- ${this.renderList(items, config.certificate)}
153
- </form>
154
- ` : ''}
81
+ <form autocomplete="on" class="auth-form cc-auth"></form>
82
+ ${this.renderSelector()}
83
+ ${certificate ? this.renderSelection(certificate) : nothing}
155
84
  `;
156
85
  }
157
86
 
158
- protected renderErrorState(error: string): TemplateResult {
159
- return html`<p class="error-message">Unable to load certificates: ${error}.</p>`;
160
- }
161
-
162
- protected renderEmptyState(): TemplateResult {
163
- return html`<p class="empty-screen body-large">There are no certificates installed in this application.</p>`;
164
- }
165
-
166
- protected renderList(items: HttpCertificate[], current?: ICertificate): TemplateResult {
167
- const currentKey = current && current.key;
87
+ protected renderSelector(): TemplateResult {
88
+ const { selectorRendered } = this;
89
+ const kinds: typeof CertificateFileKind[] = [CertificateFileKind];
168
90
  return html`
169
- ${this.renderNoneItem(currentKey)}
170
- ${items.map((item) => this.renderCertItem(item, currentKey))}
171
- `;
172
- }
173
-
174
- protected renderNoneItem(selectedKey?: string): TemplateResult {
175
- return html`
176
- <label class="label-medium">
177
- <ui-radio name="certificate" value="" .checked="${!selectedKey}" @change="${this.handleSelected}"></ui-radio>
178
- None
179
- </label>
180
- `;
181
- }
182
-
183
- /**
184
- * @param item The item to render
185
- * @returns The template for the dropdown item.
186
- */
187
- protected renderCertItem(item: HttpCertificate, selectedKey?: string): TemplateResult {
188
- return html`
189
- <div class="cert-item">
190
- <label>
191
- <ui-radio name="certificate" value="${item.key}" .checked="${item.key === selectedKey}" @change="${this.handleSelected}"></ui-radio>
192
- <div class="cert-meta">
193
- <span class="label-medium">${item.name}</span>
194
- <span class="body-small">Added: ${this.renderDateTime(item.created)}</span>
195
- </div>
196
- </label>
91
+ <div class="selector">
92
+ <ui-dropdown-list @open="${this.handleDropDownOpen}">
93
+ <ui-button class="dropdown-trigger" type="tonal">Select a certificate</ui-button>
94
+ ${selectorRendered ? html`<file-picker slot="dropdown" .kinds="${kinds}" @close="${this.handleClose}"></file-picker>` : nothing}
95
+ </ui-dropdown-list>
197
96
  </div>
198
97
  `;
199
98
  }
200
99
 
201
- /**
202
- * @param created The certificate created time.
203
- * @returns The template for the cert time element.
204
- */
205
- protected renderDateTime(created?: number): TemplateResult {
206
- if (!created) {
207
- return html`<span>Unknown</span>`;
208
- }
209
- const d = new Date(created);
100
+ protected renderSelection(certificate: HttpCertificate): TemplateResult {
210
101
  return html`
211
- <relative-time datetime="${d.toISOString()}"></relative-time>
102
+ <div class="certificate-info body-medium">
103
+ Current certificate: ${certificate.name}
104
+ <ui-icon-button
105
+ aria-label="Remove certificate from authorization"
106
+ title="Remove certificate from authorization"
107
+ @click="${this.handleClearCertificate}"
108
+ >
109
+ <ui-icon role="presentation" icon="deleteOutline"></ui-icon>
110
+ </ui-icon-button>
111
+ </div>
212
112
  `;
213
113
  }
214
114
  }