@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
@@ -1,19 +1,13 @@
1
1
  import {
2
2
  IFile, HttpProject, Project, Folder, ProjectKind, FolderKind,
3
3
  EventUtils, DataNamespace, DataFile, DataFileKind,
4
- FileAddOptions, FileBreadcrumb, ContextSpaceListOptions,
5
- BroadcastEvent, BroadcastFileData,
6
- FileMetaCreatedBroadcastEvent,
7
- DeletedBroadcastEvent,
8
- FilePatchBroadcastEvent,
9
- ContextListResult,
4
+ FileAddOptions, FileBreadcrumb,
10
5
  ICapabilities,
11
6
  } from "@api-client/core/build/browser.js";
12
7
  import { html, nothing, TemplateResult } from "lit";
13
8
  import { join } from "lit/directives/join.js";
14
9
  import { map } from "lit/directives/map.js";
15
10
  import { until } from 'lit/directives/until.js';
16
- import { Patch } from "@api-client/json";
17
11
  import type ApiClientScreen from "../ApiClient.screen.js";
18
12
  import { DataTable } from "../../../ui/table/DataTable.js";
19
13
  import { NavigationEvents } from "../../../events/NavigationEvents.js";
@@ -22,9 +16,10 @@ import { DataImportProcessor } from "../../../http-client/store/DataImportProces
22
16
  import { SnackNotifications } from "../../../ui/notification/SnackNotifications.js";
23
17
  import { UiDialogClosingReason } from "../../../ui/dialog/UiDialog.js";
24
18
  import { FileBindings } from "../../../bindings/base/FileBindings.js";
25
- import { IconType } from "../../../ui/icons/Icons.js";
26
19
  import UserCache from '../../../store/UserCache.js';
27
20
  import AppInfo from '../AppInfo.js';
21
+ import { fileIcon } from "../../../elements/store/FilesLib.js";
22
+ import { FileSystem } from "../../../store/FileSystem.js";
28
23
  import '@github/relative-time-element';
29
24
  import '../../../define/ui/ui-list.js';
30
25
  import '../../../define/ui/ui-list-item.js';
@@ -35,7 +30,7 @@ import '../../../define/ui/ui-button.js';
35
30
  import '../../../define/ui/ui-divider.js';
36
31
  import '../../../define/ui/ui-text-field.js';
37
32
  import '../../../define/dialog/rename-dialog.js';
38
- import '../../../define/files/share-file.js';
33
+ import '../../../define/store/share-file.js';
39
34
 
40
35
  enum ImportState {
41
36
  Analyzing,
@@ -49,41 +44,20 @@ enum ImportState {
49
44
  * A class that specializes in rendering the list of files in HTTP Client.
50
45
  */
51
46
  export class FilesPage {
47
+ fs = new FileSystem();
52
48
 
53
- /**
54
- * The list of files to render.
55
- * Do not overwrite this property or when you must then update the DataTable's `items` as well.
56
- */
57
- files: IFile[] = [];
58
-
59
- /**
60
- * The pagination cursor for files.
61
- * As long there's a cursor, there are more files to request.
62
- */
63
- cursor?: string;
64
-
65
- /**
66
- * The key of the currently rendered folder.
67
- */
68
- folder?: string;
69
-
70
- breadcrumbs?: FileBreadcrumb[];
71
-
72
- dt = new DataTable(() => this.files, { ariaLabel: 'Your files', active: true, selection: 'single' });
49
+ dt = new DataTable(() => this.fs.files, { ariaLabel: 'Your files', active: true, selection: 'single' });
73
50
 
74
51
  importProcessor?: DataImportProcessor;
75
52
 
76
53
  importState?: ImportState;
77
54
 
78
- /**
79
- * Whether the UI is reading files
80
- */
81
- readingFiles?: boolean;
82
-
83
55
  /**
84
56
  * A selected in the table item.
85
57
  */
86
58
  selectedItem?: string;
59
+
60
+ errorMessage?: string;
87
61
 
88
62
  constructor(protected screen: ApiClientScreen) {
89
63
  this.createProjectHandler = this.createProjectHandler.bind(this);
@@ -105,122 +79,24 @@ export class FilesPage {
105
79
  this.dt.addEventListener('activate', this.itemActivateHandler.bind(this));
106
80
  this.dt.addEventListener('render', this.handleTableRender.bind(this));
107
81
  this.dt.addEventListener('select', this.handleTableSelect.bind(this));
108
- }
109
-
110
- async refresh(): Promise<void> {
111
- this.resetList();
112
- this.screen.render();
113
- await this.readFiles();
114
- }
115
-
116
- resetList(): void {
117
- this.files = [];
118
- this.cursor = undefined;
119
- this.breadcrumbs = undefined;
120
- }
121
-
122
- async readFiles(): Promise<void> {
123
- const { selectedSpace } = this.screen;
124
- if (!selectedSpace) {
125
- return;
126
- }
127
- if (this.readingFiles) {
128
- return;
129
- }
130
- this.readingFiles = true;
131
- const { cursor: filesCursor, folder } = this;
132
- const opts: ContextSpaceListOptions = {
133
- space: selectedSpace,
134
- descending: true,
135
- };
136
- if (filesCursor) {
137
- opts.cursor = filesCursor;
138
- }
139
- if (folder) {
140
- opts.parent = folder;
141
- }
142
- try {
143
- const result = await this.listFiles(opts);
144
- const { items, cursor } = result;
145
- this.files = this.files.concat(items).sort(this.filesSortFunction.bind(this));
146
- this.cursor = cursor;
147
- if (folder) {
148
- const br = await this.screen.bindings.store.files.breadcrumbs(folder);
149
- this.breadcrumbs = br.items.reverse();
150
- }
151
- } finally {
152
- this.readingFiles = false;
153
- }
154
- this.screen.render();
155
- }
82
+ this.dt.addEventListener('scrollend', this.handleTableScrollEnd.bind(this));
156
83
 
157
- protected async listFiles(opts: ContextSpaceListOptions): Promise<ContextListResult<IFile>> {
158
- return this.screen.bindings.store.files.list(opts);
159
- }
160
-
161
- /**
162
- * Sorts files on the list.
163
- *
164
- * Folders are always on top.
165
- */
166
- filesSortFunction(a: IFile, b:IFile): number {
167
- if (a.kind !== b.kind) {
168
- if (a.kind === FolderKind) {
169
- return -1;
170
- }
171
- return 1;
172
- }
173
- if (a.kind === b.kind && a.kind === FolderKind) {
174
- return (a.info.name || '').localeCompare(b.info.name || '');
175
- }
176
- return b.lastModified.time - a.lastModified.time;
177
- }
178
-
179
- handleFileEvent(event: BroadcastEvent): void {
180
- const typed = event as BroadcastEvent & BroadcastFileData;
181
- if (typed.parent && typed.parent !== this.folder) {
182
- return;
183
- }
184
- if (typed.alt !== 'meta') {
185
- return;
186
- }
187
- switch (event.operation) {
188
- case 'created': this.handleFileCreated((typed as FileMetaCreatedBroadcastEvent).data); break;
189
- case 'deleted': this.handleFileDeleted(typed as DeletedBroadcastEvent); break;
190
- case 'patch': this.handleFilePatch(typed as FilePatchBroadcastEvent); break;
191
- default:
192
- }
193
- }
194
-
195
- handleFileCreated(file: IFile): void {
196
- this.files.push(file);
197
- this.files.sort(this.filesSortFunction.bind(this));
198
- this.screen.render();
199
- }
200
-
201
- handleFileDeleted(event: DeletedBroadcastEvent): void {
202
- this.removeFileFromList(event.key);
203
- }
204
-
205
- removeFileFromList(key: string): void {
206
- const index = this.files.findIndex(i => i.key === key);
207
- if (index === -1) {
208
- return;
209
- }
210
- this.files.splice(index, 1);
211
- this.screen.render();
84
+ this.fs.observe();
85
+ this.fs.addEventListener('change', () => this.screen.render());
86
+ this.fs.addEventListener('error', (e: Event) => {
87
+ const event = e as CustomEvent<string>;
88
+ this.errorMessage = event.detail;
89
+ });
90
+ this.fs.addEventListener('querycomplete', () => {
91
+ document.body.dispatchEvent(new Event('querycomplete', { bubbles: true }));
92
+ });
212
93
  }
213
94
 
214
- handleFilePatch(event: FilePatchBroadcastEvent): void {
215
- const { data, key } = event;
216
- const index = this.files.findIndex(i => i.key === key);
217
- if (index === -1) {
218
- return;
219
- }
220
- const file = this.files[index];
221
- const result = Patch.apply(file, data.patch);
222
- this.files[index] = result.doc as IFile;
95
+ async refresh(): Promise<void> {
96
+ this.fs.resetList();
223
97
  this.screen.render();
98
+ await this.fs.queryPage();
99
+ await this.fs.queryBreadcrumbs();
224
100
  }
225
101
 
226
102
  protected cancelCreateProjectDialog(): void {
@@ -331,8 +207,8 @@ export class FilesPage {
331
207
  throw new Error('You need to select a space first');
332
208
  }
333
209
  const opts: FileAddOptions = {};
334
- if (this.folder) {
335
- opts.parent = this.folder;
210
+ if (this.fs.parent) {
211
+ opts.parent = this.fs.parent;
336
212
  }
337
213
  const result = await this.screen.bindings.store.files.add(file, opts);
338
214
  if (media) {
@@ -365,6 +241,13 @@ export class FilesPage {
365
241
  this.screen.openDialog('createProjectDialog');
366
242
  } else if (option === 'schema') {
367
243
  this.screen.openDialog('createSchemaDialog');
244
+ } else if (option === 'certificate') {
245
+ const { parent } = this.fs;
246
+ if (parent) {
247
+ navigate('certificates', 'add', parent);
248
+ } else {
249
+ navigate('certificates', 'add');
250
+ }
368
251
  }
369
252
  }
370
253
 
@@ -422,7 +305,7 @@ export class FilesPage {
422
305
  this.importState = ImportState.Importing;
423
306
  this.screen.render();
424
307
  try {
425
- await importProcessor.importProject(this.screen.bindings.store, selectedSpace, this.folder);
308
+ await importProcessor.importProject(this.screen.bindings.store, selectedSpace, this.fs.parent);
426
309
  this.importState = ImportState.Done;
427
310
  this.screen.render();
428
311
  } catch (e) {
@@ -465,8 +348,12 @@ export class FilesPage {
465
348
  this.screen.render();
466
349
  }
467
350
 
351
+ protected handleTableScrollEnd(): void {
352
+ this.fs.debounceQuery();
353
+ }
354
+
468
355
  openProject(key: string): void {
469
- const file = this.files.find(i => i.key === key);
356
+ const file = this.fs.files.find(i => i.key === key);
470
357
  if (!file) {
471
358
  throw new Error(`Invalid state: file not found`);
472
359
  }
@@ -550,7 +437,7 @@ export class FilesPage {
550
437
  }
551
438
 
552
439
  protected renameFile(key: string): void {
553
- const file = this.files.find(i => i.key === key);
440
+ const file = this.fs.files.find(i => i.key === key);
554
441
  if (!file) {
555
442
  return;
556
443
  }
@@ -571,7 +458,7 @@ export class FilesPage {
571
458
  }
572
459
 
573
460
  protected shareFile(key: string): void {
574
- const file = this.files.find(i => i.key === key);
461
+ const file = this.fs.files.find(i => i.key === key);
575
462
  if (!file) {
576
463
  return;
577
464
  }
@@ -582,7 +469,7 @@ export class FilesPage {
582
469
  dialog.modal = true;
583
470
  document.body.appendChild(dialog);
584
471
  dialog.open = true;
585
- dialog.addEventListener('closed', () => {
472
+ dialog.addEventListener('close', () => {
586
473
  document.body.removeChild(dialog);
587
474
  });
588
475
  }
@@ -626,7 +513,7 @@ export class FilesPage {
626
513
  if (!selectedItem) {
627
514
  return nothing
628
515
  }
629
- const file = this.files.find(i => i.key === selectedItem);
516
+ const file = this.fs.files.find(i => i.key === selectedItem);
630
517
  if (!file) {
631
518
  return nothing;
632
519
  }
@@ -693,6 +580,10 @@ export class FilesPage {
693
580
  <ui-icon icon="schema" slot="start"></ui-icon>
694
581
  Data schema
695
582
  </ui-list-item>
583
+ <ui-list-item image="icon" data-option="certificate" role="menuitem">
584
+ <ui-icon icon="certificate" slot="start"></ui-icon>
585
+ Certificate
586
+ </ui-list-item>
696
587
  <ui-divider></ui-divider>
697
588
  <ui-list-item image="icon" data-option="folder" role="menuitem">
698
589
  <ui-icon icon="folder" slot="start"></ui-icon>
@@ -726,7 +617,7 @@ export class FilesPage {
726
617
  }
727
618
 
728
619
  protected renderBreadcrumbs(): TemplateResult {
729
- const { breadcrumbs=[] } = this;
620
+ const { breadcrumbs = [] } = this.fs;
730
621
  if (!breadcrumbs.length) {
731
622
  return html``;
732
623
  }
@@ -868,17 +759,10 @@ export class FilesPage {
868
759
  }
869
760
 
870
761
  protected nameCell(item: IFile): TemplateResult {
871
- let icon: IconType | undefined;
872
- switch (item.kind) {
873
- case DataFileKind: icon = 'schema'; break;
874
- case FolderKind: icon = 'folder'; break;
875
- case ProjectKind: icon = 'collectionsBookmark'; break;
876
- default:
877
- }
878
-
762
+ const icon = fileIcon(item);
879
763
  return this.dt.cell(html`
880
764
  ${icon ? html`<ui-icon icon="${icon}" class="cell-icon"></ui-icon>` : nothing}
881
- ${item.info.name || 'Unnamed project'}
765
+ ${item.info.name || 'Unnamed file'}
882
766
  `, { class: 'name-cell', data: { kind: item.kind } });
883
767
  }
884
768
 
@@ -1,4 +1,4 @@
1
- import { BroadcastEvent, BroadcastFileData, ContextListResult, ContextSpaceListOptions, FileAccessBroadcastEvent, IFile } from "@api-client/core/build/browser.js";
1
+ import { IFile } from "@api-client/core/build/browser.js";
2
2
  import { html, TemplateResult } from "lit";
3
3
  import type ApiClientScreen from "../ApiClient.screen.js";
4
4
  import { FilesPage } from "./Files.page.js";
@@ -7,45 +7,7 @@ export class SharedPage extends FilesPage {
7
7
  constructor(screen: ApiClientScreen) {
8
8
  super(screen);
9
9
  this.dt.options.ariaLabel = 'Shared with you';
10
- }
11
-
12
- protected override async listFiles(opts: ContextSpaceListOptions): Promise<ContextListResult<IFile>> {
13
- return this.screen.bindings.store.shared.list(opts);
14
- }
15
-
16
- override handleFileEvent(event: BroadcastEvent): void {
17
- const typed = event as BroadcastEvent & BroadcastFileData;
18
- if (typed.parent && typed.parent !== this.folder) {
19
- return;
20
- }
21
- // if (typed.alt !== 'meta') {
22
- // return;
23
- // }
24
- switch (event.operation) {
25
- case 'access-granted': this.handleFileAccessGranted(typed as FileAccessBroadcastEvent); break;
26
- case 'access-removed': this.handleFileAccessRemoved(typed as FileAccessBroadcastEvent); break;
27
- default: super.handleFileEvent(event);
28
- }
29
- }
30
-
31
- async handleFileAccessGranted(event: FileAccessBroadcastEvent): Promise<void> {
32
- const { key } = event;
33
- try {
34
- const file = await this.screen.bindings.store.files.read(key);
35
- const index = this.files.findIndex(i => i.key === key);
36
- if (index >= 0) {
37
- this.files.splice(index, 1);
38
- }
39
- this.handleFileCreated(file);
40
- } catch (e) {
41
- // eslint-disable-next-line no-console
42
- console.warn(e);
43
- }
44
- }
45
-
46
- handleFileAccessRemoved(event: FileAccessBroadcastEvent): void {
47
- const { key } = event;
48
- this.removeFileFromList(key);
10
+ this.fs.source = 'shared';
49
11
  }
50
12
 
51
13
  override render(): TemplateResult {
@@ -8,6 +8,7 @@ import CheckboxElement from '../../ui/input/CheckboxElement.js';
8
8
  import typography from "../../styles/m3/typography.module.js";
9
9
  import surface from "../../styles/m3/surface.module.js";
10
10
  import '../../define/ui/ui-icon.js';
11
+ import '../../define/ui/ui-button.js';
11
12
 
12
13
  /**
13
14
  * A base class for demo pages in the API Client ecosystem.
@@ -33,6 +34,11 @@ export abstract class DemoPage extends RouteMixin(RenderableMixin(EventTarget))
33
34
  */
34
35
  @reactive() darkThemeActive = false;
35
36
 
37
+ /**
38
+ * For some demo pages, whether the user is authenticated in the store.
39
+ */
40
+ authenticated = false;
41
+
36
42
  constructor() {
37
43
  super();
38
44
  this.handleMediaQuery = this.handleMediaQuery.bind(this);
@@ -151,4 +157,15 @@ export abstract class DemoPage extends RouteMixin(RenderableMixin(EventTarget))
151
157
  * ```
152
158
  */
153
159
  abstract contentTemplate(): TemplateResult;
160
+
161
+ handleAuthenticate(): void {
162
+ // ...
163
+ }
164
+
165
+ authenticateTemplate(): TemplateResult {
166
+ return html`
167
+ <p>Store authorization required.</p>
168
+ <ui-button @click="${this.handleAuthenticate}">Authenticate</ui-button>
169
+ `;
170
+ }
154
171
  }