@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.
- package/.eslintrc +8 -0
- package/demo/elements/authorization/cc.ts +56 -27
- package/demo/elements/index.html +3 -0
- package/demo/elements/store/file-picker.html +15 -0
- package/demo/elements/store/file-picker.ts +134 -0
- package/demo/elements/store/index.html +19 -0
- package/demo/store/StorePlugin.js +1 -0
- package/dist/bindings/base/FileBindings.d.ts +4 -0
- package/dist/bindings/base/FileBindings.d.ts.map +1 -1
- package/dist/bindings/base/FileBindings.js +21 -1
- package/dist/bindings/base/FileBindings.js.map +1 -1
- package/dist/bindings/base/StoreBindings.d.ts +6 -17
- package/dist/bindings/base/StoreBindings.d.ts.map +1 -1
- package/dist/bindings/base/StoreBindings.js +15 -60
- package/dist/bindings/base/StoreBindings.js.map +1 -1
- package/dist/bindings/web/WebFileBindings.js +1 -1
- package/dist/bindings/web/WebFileBindings.js.map +1 -1
- package/dist/define/http/certificate-add.d.ts +9 -0
- package/dist/define/http/certificate-add.d.ts.map +1 -0
- package/dist/define/http/certificate-add.js +10 -0
- package/dist/define/http/certificate-add.js.map +1 -0
- package/dist/define/store/file-picker.d.ts +9 -0
- package/dist/define/store/file-picker.d.ts.map +1 -0
- package/dist/define/store/file-picker.js +10 -0
- package/dist/define/store/file-picker.js.map +1 -0
- package/dist/define/{files → store}/share-file.d.ts +1 -1
- package/dist/define/store/share-file.d.ts.map +1 -0
- package/dist/define/{files → store}/share-file.js +2 -2
- package/dist/define/store/share-file.js.map +1 -0
- package/dist/define/ui/ui-segmented-button-set.d.ts +1 -1
- package/dist/define/ui/ui-segmented-button-set.d.ts.map +1 -1
- package/dist/define/ui/ui-segmented-button-set.js.map +1 -1
- package/dist/elements/authorization/ui/CC.styles.d.ts.map +1 -1
- package/dist/elements/authorization/ui/CC.styles.js +4 -9
- package/dist/elements/authorization/ui/CC.styles.js.map +1 -1
- package/dist/elements/authorization/ui/CcAuthorization.d.ts +14 -29
- package/dist/elements/authorization/ui/CcAuthorization.d.ts.map +1 -1
- package/dist/elements/authorization/ui/CcAuthorization.js +67 -158
- package/dist/elements/authorization/ui/CcAuthorization.js.map +1 -1
- package/dist/elements/http/CertificateAdd.element.d.ts +91 -0
- package/dist/elements/http/CertificateAdd.element.d.ts.map +1 -0
- package/dist/elements/http/CertificateAdd.element.js +389 -0
- package/dist/elements/http/CertificateAdd.element.js.map +1 -0
- package/dist/elements/http/CertificateAdd.styles.d.ts +3 -0
- package/dist/elements/http/CertificateAdd.styles.d.ts.map +1 -0
- package/dist/elements/http/CertificateAdd.styles.js +61 -0
- package/dist/elements/http/CertificateAdd.styles.js.map +1 -0
- package/dist/elements/project/ProjectRunReport.d.ts +2 -1
- package/dist/elements/project/ProjectRunReport.d.ts.map +1 -1
- package/dist/elements/project/ProjectRunReport.js.map +1 -1
- package/dist/elements/store/FilePicker.element.d.ts +87 -0
- package/dist/elements/store/FilePicker.element.d.ts.map +1 -0
- package/dist/elements/store/FilePicker.element.js +263 -0
- package/dist/elements/store/FilePicker.element.js.map +1 -0
- package/dist/elements/store/FilePicker.styles.d.ts +3 -0
- package/dist/elements/store/FilePicker.styles.d.ts.map +1 -0
- package/dist/elements/store/FilePicker.styles.js +73 -0
- package/dist/elements/store/FilePicker.styles.js.map +1 -0
- package/dist/elements/store/FilesLib.d.ts +10 -0
- package/dist/elements/store/FilesLib.d.ts.map +1 -0
- package/dist/elements/store/FilesLib.js +38 -0
- package/dist/elements/store/FilesLib.js.map +1 -0
- package/dist/elements/{files/ShareFile.d.ts → store/ShareFile.element.d.ts} +1 -1
- package/dist/elements/store/ShareFile.element.d.ts.map +1 -0
- package/dist/elements/{files/ShareFile.js → store/ShareFile.element.js} +1 -1
- package/dist/elements/store/ShareFile.element.js.map +1 -0
- package/dist/elements/store/ShareFile.styles.d.ts.map +1 -0
- package/dist/elements/{files → store}/ShareFile.styles.js.map +1 -1
- package/dist/events/EventTypes.d.ts +7 -7
- package/dist/events/EventTypes.d.ts.map +1 -1
- package/dist/events/EventTypes.js +8 -7
- package/dist/events/EventTypes.js.map +1 -1
- package/dist/events/Events.d.ts +7 -1
- package/dist/events/Events.d.ts.map +1 -1
- package/dist/events/Events.js +2 -0
- package/dist/events/Events.js.map +1 -1
- package/dist/events/FilesystemEvents.d.ts +8 -0
- package/dist/events/FilesystemEvents.d.ts.map +1 -0
- package/dist/events/FilesystemEvents.js +59 -0
- package/dist/events/FilesystemEvents.js.map +1 -0
- package/dist/events/HttpClientEvents.d.ts +0 -2
- package/dist/events/HttpClientEvents.d.ts.map +1 -1
- package/dist/events/HttpClientEvents.js +0 -2
- package/dist/events/HttpClientEvents.js.map +1 -1
- package/dist/events/StoreEvents.d.ts +8 -1
- package/dist/events/StoreEvents.d.ts.map +1 -1
- package/dist/events/StoreEvents.js +19 -0
- package/dist/events/StoreEvents.js.map +1 -1
- package/dist/http-client/idb/Arc18DataUpgrade.d.ts +0 -8
- package/dist/http-client/idb/Arc18DataUpgrade.d.ts.map +1 -1
- package/dist/http-client/idb/Arc18DataUpgrade.js +11 -206
- package/dist/http-client/idb/Arc18DataUpgrade.js.map +1 -1
- package/dist/http-client/store/StoreBroadcast.d.ts +0 -5
- package/dist/http-client/store/StoreBroadcast.d.ts.map +1 -1
- package/dist/http-client/store/StoreBroadcast.js +0 -7
- package/dist/http-client/store/StoreBroadcast.js.map +1 -1
- package/dist/lib/files/FileUtils.d.ts +9 -0
- package/dist/lib/files/FileUtils.d.ts.map +1 -0
- package/dist/lib/files/FileUtils.js +13 -0
- package/dist/lib/files/FileUtils.js.map +1 -0
- package/dist/mixins/RouteMixin.d.ts +4 -0
- package/dist/mixins/RouteMixin.d.ts.map +1 -1
- package/dist/mixins/RouteMixin.js +1 -0
- package/dist/mixins/RouteMixin.js.map +1 -1
- package/dist/pages/ApplicationScreen.d.ts +1 -1
- package/dist/pages/ApplicationScreen.d.ts.map +1 -1
- package/dist/pages/ApplicationScreen.js +4 -2
- package/dist/pages/ApplicationScreen.js.map +1 -1
- package/dist/pages/api-client/ApiClient.screen.d.ts +4 -6
- package/dist/pages/api-client/ApiClient.screen.d.ts.map +1 -1
- package/dist/pages/api-client/ApiClient.screen.js +39 -31
- package/dist/pages/api-client/ApiClient.screen.js.map +1 -1
- package/dist/pages/api-client/ApiClient.styles.d.ts.map +1 -1
- package/dist/pages/api-client/ApiClient.styles.js +0 -12
- package/dist/pages/api-client/ApiClient.styles.js.map +1 -1
- package/dist/pages/api-client/Authenticate.screen.d.ts +1 -1
- package/dist/pages/api-client/Authenticate.screen.d.ts.map +1 -1
- package/dist/pages/api-client/Authenticate.screen.js +2 -2
- package/dist/pages/api-client/Authenticate.screen.js.map +1 -1
- package/dist/pages/api-client/pages/Files.page.d.ts +6 -35
- package/dist/pages/api-client/pages/Files.page.d.ts.map +1 -1
- package/dist/pages/api-client/pages/Files.page.js +45 -141
- package/dist/pages/api-client/pages/Files.page.js.map +1 -1
- package/dist/pages/api-client/pages/Shared.page.d.ts +1 -5
- package/dist/pages/api-client/pages/Shared.page.d.ts.map +1 -1
- package/dist/pages/api-client/pages/Shared.page.js +1 -40
- package/dist/pages/api-client/pages/Shared.page.js.map +1 -1
- package/dist/pages/demo/DemoPage.d.ts +7 -0
- package/dist/pages/demo/DemoPage.d.ts.map +1 -1
- package/dist/pages/demo/DemoPage.js +14 -0
- package/dist/pages/demo/DemoPage.js.map +1 -1
- package/dist/store/FileSystem.d.ts +90 -0
- package/dist/store/FileSystem.d.ts.map +1 -0
- package/dist/store/FileSystem.js +260 -0
- package/dist/store/FileSystem.js.map +1 -0
- package/dist/styles/global-styles.d.ts.map +1 -1
- package/dist/styles/global-styles.js +7 -0
- package/dist/styles/global-styles.js.map +1 -1
- package/dist/ui/button/SegmentedButtonsSet.d.ts +14 -0
- package/dist/ui/button/SegmentedButtonsSet.d.ts.map +1 -1
- package/dist/ui/button/SegmentedButtonsSet.js.map +1 -1
- package/dist/ui/icons/Icons.d.ts +2 -1
- package/dist/ui/icons/Icons.d.ts.map +1 -1
- package/dist/ui/icons/Icons.js +1 -0
- package/dist/ui/icons/Icons.js.map +1 -1
- package/dist/ui/list/UiDropdownList.d.ts +9 -1
- package/dist/ui/list/UiDropdownList.d.ts.map +1 -1
- package/dist/ui/list/UiDropdownList.js +39 -17
- package/dist/ui/list/UiDropdownList.js.map +1 -1
- package/dist/ui/list/UiList.d.ts +6 -1
- package/dist/ui/list/UiList.d.ts.map +1 -1
- package/dist/ui/list/UiList.js +24 -9
- package/dist/ui/list/UiList.js.map +1 -1
- package/dist/ui/notification/SnackNotifications.d.ts +1 -0
- package/dist/ui/notification/SnackNotifications.d.ts.map +1 -1
- package/dist/ui/notification/SnackNotifications.js +7 -0
- package/dist/ui/notification/SnackNotifications.js.map +1 -1
- package/dist/ui/table/DataTable.d.ts +4 -0
- package/dist/ui/table/DataTable.d.ts.map +1 -1
- package/dist/ui/table/DataTable.js +23 -1
- package/dist/ui/table/DataTable.js.map +1 -1
- package/package.json +1 -1
- package/src/bindings/base/FileBindings.ts +25 -1
- package/src/bindings/base/StoreBindings.ts +16 -73
- package/src/bindings/web/WebFileBindings.ts +1 -1
- package/src/define/http/certificate-add.ts +12 -0
- package/src/define/store/file-picker.ts +12 -0
- package/src/define/{files → store}/share-file.ts +2 -2
- package/src/define/ui/ui-segmented-button-set.ts +1 -1
- package/src/elements/authorization/ui/CC.styles.ts +4 -9
- package/src/elements/authorization/ui/CcAuthorization.ts +67 -167
- package/src/elements/http/CertificateAdd.element.ts +443 -0
- package/src/elements/http/CertificateAdd.styles.ts +61 -0
- package/src/elements/project/ProjectRunReport.ts +2 -1
- package/src/elements/store/FilePicker.element.ts +297 -0
- package/src/elements/store/FilePicker.styles.ts +73 -0
- package/src/elements/store/FilesLib.ts +32 -0
- package/src/events/EventTypes.ts +8 -7
- package/src/events/Events.ts +2 -0
- package/src/events/FilesystemEvents.ts +63 -0
- package/src/events/HttpClientEvents.ts +0 -2
- package/src/events/StoreEvents.ts +21 -1
- package/src/http-client/idb/Arc18DataUpgrade.ts +84 -84
- package/src/http-client/store/StoreBroadcast.ts +0 -8
- package/src/lib/files/FileUtils.ts +12 -0
- package/src/mixins/RouteMixin.ts +8 -1
- package/src/pages/ApplicationScreen.ts +5 -3
- package/src/pages/api-client/ApiClient.screen.ts +42 -33
- package/src/pages/api-client/ApiClient.styles.ts +0 -12
- package/src/pages/api-client/Authenticate.screen.ts +2 -2
- package/src/pages/api-client/pages/Files.page.ts +48 -164
- package/src/pages/api-client/pages/Shared.page.ts +2 -40
- package/src/pages/demo/DemoPage.ts +17 -0
- package/src/store/FileSystem.ts +325 -0
- package/src/styles/global-styles.ts +7 -0
- package/src/ui/button/SegmentedButtonsSet.ts +16 -1
- package/src/ui/icons/Icons.ts +2 -1
- package/src/ui/list/UiDropdownList.ts +44 -17
- package/src/ui/list/UiList.ts +26 -10
- package/src/ui/notification/SnackNotifications.ts +8 -0
- package/src/ui/table/DataTable.ts +29 -3
- package/test/elements/http/BodyFormdataEditorElement.test.ts +458 -454
- package/test/elements/http/BodyMultipartEditorElement.test.ts +609 -605
- package/test/elements/http/BodyRawEditorElement.test.ts +60 -56
- package/test/elements/http/CertificateAdd.test.ts +430 -0
- package/test/elements/store/FilePicker.test.ts +241 -0
- package/test/env.js +3 -0
- package/test/events/EventTypes.test.ts +0 -22
- package/test/helpers/StoreHelper.ts +390 -0
- package/test/helpers/UiMock.ts +19 -2
- package/tsconfig.eslint.json +3 -1
- package/web-test-runner.config.mjs +50 -3
- package/dist/define/files/share-file.d.ts.map +0 -1
- package/dist/define/files/share-file.js.map +0 -1
- package/dist/elements/files/ShareFile.d.ts.map +0 -1
- package/dist/elements/files/ShareFile.js.map +0 -1
- package/dist/elements/files/ShareFile.styles.d.ts.map +0 -1
- package/dist/events/http-client/models/CertificatesEvents.d.ts +0 -12
- package/dist/events/http-client/models/CertificatesEvents.d.ts.map +0 -1
- package/dist/events/http-client/models/CertificatesEvents.js +0 -18
- package/dist/events/http-client/models/CertificatesEvents.js.map +0 -1
- package/dist/http-client/idb/AuthDataModel.d.ts +0 -60
- package/dist/http-client/idb/AuthDataModel.d.ts.map +0 -1
- package/dist/http-client/idb/AuthDataModel.js +0 -150
- package/dist/http-client/idb/AuthDataModel.js.map +0 -1
- package/dist/http-client/idb/HostsModel.d.ts +0 -25
- package/dist/http-client/idb/HostsModel.d.ts.map +0 -1
- package/dist/http-client/idb/HostsModel.js +0 -82
- package/dist/http-client/idb/HostsModel.js.map +0 -1
- package/dist/http-client/idb/LegacyMockedStore.d.ts +0 -214
- package/dist/http-client/idb/LegacyMockedStore.d.ts.map +0 -1
- package/dist/http-client/idb/LegacyMockedStore.js +0 -486
- package/dist/http-client/idb/LegacyMockedStore.js.map +0 -1
- package/src/events/http-client/models/CertificatesEvents.ts +0 -23
- package/src/http-client/idb/AuthDataModel.ts +0 -175
- package/src/http-client/idb/HostsModel.ts +0 -125
- package/src/http-client/idb/LegacyMockedStore.ts +0 -544
- package/test/apic-ui.test.ts +0 -31
- /package/dist/elements/{files → store}/ShareFile.styles.d.ts +0 -0
- /package/dist/elements/{files → store}/ShareFile.styles.js +0 -0
- /package/src/elements/{files/ShareFile.ts → store/ShareFile.element.ts} +0 -0
- /package/src/elements/{files → store}/ShareFile.styles.ts +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProjectRunReport.js","sourceRoot":"","sources":["../../../src/elements/project/ProjectRunReport.ts"],"names":[],"mappings":"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","sourcesContent":["import { LitElement, TemplateResult, html, PropertyValues, nothing } from 'lit';\nimport { property, state } from 'lit/decorators.js';\nimport { classMap } from 'lit/directives/class-map.js';\nimport { \n ErrorResponse, IProjectExecutionIteration, IProjectExecutionLog, \n IRequestLog, IResponse \n} from '@api-client/core/build/browser.js';\nimport { statusTemplate } from '../http/HttpStatus.js';\nimport SegmentedButton from '../../ui/button/SegmentedButton.js';\nimport { RequestLogView } from '../http/RequestLog.js';\nimport '@github/relative-time-element';\nimport '../../define/http/http-request-log.js';\nimport '../../define/ui/ui-icon.js';\nimport '../../define/ui/ui-button.js';\nimport '../../define/ui/ui-dropdown-list.js';\nimport '../../define/ui/ui-list.js';\nimport '../../define/ui/ui-list-item.js';\nimport '../../define/ui/ui-segmented-button.js';\nimport '../../define/ui/ui-segmented-button-set.js';\n\nexport enum ProjectRunReportView {\n summary = 'summary',\n details = 'details',\n}\n\n/**\n * An element that renders the execution log of the project runner with the IProjectExecutionLog.\n */\nexport default class ProjectRunReport extends LitElement {\n @property({ type: Object }) report?: IProjectExecutionLog;\n\n /**\n * The index of the selected iteration, if any.\n */\n @state() protected selectedIteration?: number;\n\n /**\n * The index of the selected request, if any\n */\n @state() protected selectedRequest?: number;\n\n /**\n * The currently rendered iteration.\n */\n @state() protected currentIteration?: IProjectExecutionIteration;\n\n @state() protected currentLog?: IRequestLog;\n\n @state() protected view: ProjectRunReportView = ProjectRunReportView.summary;\n\n protected override willUpdate(cp: PropertyValues<this>): void {\n super.updated(cp);\n if (cp.has('report')) {\n this.processReport();\n }\n }\n\n protected processReport(): void {\n const { report } = this;\n if (!report) {\n this.selectedIteration = undefined\n this.selectedRequest = undefined\n this.currentIteration = undefined\n this.currentLog = undefined\n return;\n }\n this.selectedIteration = 0;\n this.selectedRequest = 0;\n const [ iteration ] = report.iterations;\n this.currentIteration = iteration;\n this.currentLog = iteration && iteration.executed && iteration.executed[0];\n }\n\n protected handleIterationSelection(e: CustomEvent): void {\n const element = e.detail.item as HTMLElement;\n const { index } = element.dataset;\n if (!index) {\n return;\n }\n const typed = Number(index);\n if (Number.isNaN(typed)) {\n return;\n }\n this.selectIteration(typed);\n }\n\n selectIteration(index: number): void {\n const { report } = this;\n if (!report) {\n return;\n }\n const item = report.iterations[index];\n if (!item) {\n return;\n }\n this.selectedIteration = index;\n this.currentIteration = item;\n this.selectedRequest = 0\n this.currentLog = item.executed && item.executed[0];\n }\n\n protected handleRequestSelection(e: CustomEvent): void {\n const element = e.detail.item as HTMLElement;\n const { index } = element.dataset;\n if (!index) {\n return;\n }\n const typed = Number(index);\n if (Number.isNaN(typed)) {\n return;\n }\n this.selectRequest(typed);\n }\n\n selectRequest(index: number): void {\n const { currentIteration } = this;\n if (!currentIteration) {\n return;\n }\n const item = currentIteration.executed[index];\n if (!item) {\n return;\n }\n this.selectedRequest = index;\n this.currentLog = item;\n }\n\n protected handleViewSelection(e: CustomEvent): void {\n if (!e.detail.selected) {\n return;\n }\n const button = e.detail.button as SegmentedButton;\n const view = button.dataset.value as ProjectRunReportView | undefined;\n if (view) {\n this.view = view;\n }\n }\n\n protected handleLinkClick(e: Event): void {\n const node = e.target as HTMLElement;\n const { iterationIndex, requestIndex, target } = node.dataset;\n if (!requestIndex || !iterationIndex) {\n return;\n }\n const iteration = Number(iterationIndex);\n const request = Number(requestIndex);\n if (Number.isNaN(request) || Number.isNaN(iteration)) {\n return;\n }\n this.selectIteration(iteration);\n this.selectRequest(request);\n this.view = ProjectRunReportView.details;\n if (target) {\n this.selectLogView(target as RequestLogView);\n }\n }\n\n protected handleLinkKeyDown(e: KeyboardEvent): void {\n if (['Enter', 'Space'].includes(e.code)) {\n this.handleLinkClick(e);\n }\n }\n\n protected async selectLogView(view: RequestLogView): Promise<void> {\n await this.updateComplete;\n const node = this.shadowRoot?.querySelector('http-request-log');\n if (!node) {\n return;\n }\n node.view = view;\n }\n\n protected override render(): TemplateResult {\n const { report } = this;\n if (!report) {\n return html``;\n }\n return html`\n ${this.renderHeader(report)}\n ${this.renderView()}\n `;\n }\n\n protected renderHeader(report: IProjectExecutionLog): TemplateResult {\n return html`\n <div class=\"header\">\n ${this.renderCurrentSelectors(report)}\n ${this.renderViewToggle()}\n </div>\n `;\n }\n\n protected renderCurrentSelectors(report: IProjectExecutionLog): TemplateResult | typeof nothing {\n if (this.view === ProjectRunReportView.summary) {\n return nothing;\n }\n const hasIterations = report.iterations.length > 1;\n return html`\n ${hasIterations ? this.renderInteractionsList(report.iterations) : nothing}\n ${this.renderRequestsList()}\n `;\n }\n\n protected renderViewToggle(): TemplateResult {\n const { view } = this;\n return html`\n <div class=\"view-toggle\">\n <ui-segmented-button-set @select=\"${this.handleViewSelection}\">\n <ui-segmented-button \n .selected=\"${view === ProjectRunReportView.summary}\" \n title=\"Shows summary of the run report\" \n data-value=\"summary\"\n >Summary</ui-segmented-button>\n <ui-segmented-button \n .selected=\"${view === ProjectRunReportView.details}\" \n title=\"Shows detailed response information for each request\" \n data-value=\"details\"\n >Details</ui-segmented-button>\n </ui-segmented-button-set>\n </div>\n `;\n }\n\n protected renderInteractionsList(iterations: IProjectExecutionIteration[]): TemplateResult {\n const { selectedIteration = 0 } = this;\n const iteration = iterations[selectedIteration];\n const index = iteration ? iteration.index + 1 : 1;\n\n return html`\n <ui-dropdown-list\n verticalAlign=\"top\"\n class=\"iterations-dropdown\"\n closeOnOutsideClick\n @select=\"${this.handleIterationSelection}\"\n >\n <ui-button type=\"tonal\">\n <ui-icon slot=\"icon\" icon=\"arrowDropDown\"></ui-icon>\n Iteration #${index}\n </ui-button>\n <ui-list slot=\"dropdown\" role=\"menu\" aria-label=\"Iterations list\">\n ${iterations.map(current => this.renderIterationOption(current.index))}\n </ui-list>\n </ui-dropdown-list>\n `;\n }\n\n protected renderIterationOption(index: number): TemplateResult {\n const classes = {\n 'iteration-option': true,\n highlight: this.selectedIteration === index,\n };\n return html`\n <ui-list-item role=\"menuitem\" data-index=\"${index}\" class=\"${classMap(classes)}\">\n Iteration #${index + 1}\n </ui-list-item>\n `;\n }\n\n protected renderRequestsList(): TemplateResult {\n const { currentIteration, selectedRequest = 0 } = this;\n if (!currentIteration) {\n return this.renderEmptyRequestsList();\n }\n if (!currentIteration.executed || !currentIteration.executed.length) {\n return this.renderEmptyRequestsList();\n }\n const options = currentIteration.executed.map((item, index) => this.renderRequestsOption(item, index));\n const item = currentIteration.executed[selectedRequest];\n const title = item.request && item.request.url || `Request #${selectedRequest}`;\n return html`\n <ui-dropdown-list\n verticalAlign=\"top\"\n class=\"history-dropdown\"\n closeOnOutsideClick\n @select=\"${this.handleRequestSelection}\"\n >\n <ui-button type=\"tonal\" title=\"${title}\">\n <ui-icon slot=\"icon\" icon=\"arrowDropDown\"></ui-icon>\n <span class=\"request-title-dropdown\">${title}</span>\n </ui-button>\n <ui-list slot=\"dropdown\" role=\"menu\" aria-label=\"History list\">\n ${options}\n </ui-list>\n </ui-dropdown-list>\n `;\n }\n\n protected renderEmptyRequestsList(): TemplateResult {\n return html`\n <ui-button type=\"tonal\" disabled>\n <ui-icon slot=\"icon\" icon=\"arrowDropDown\"></ui-icon>\n No requests\n </ui-button>\n `;\n }\n\n protected renderRequestsOption(item: IRequestLog, index: number): TemplateResult {\n const title = item.request && item.request.url || `Request #${index}`;\n const error = !item.response || ErrorResponse.isErrorResponse(item.response);\n const classes = {\n 'history-option': true,\n error,\n highlight: this.selectedRequest === index,\n };\n let status = 0;\n let statusText: string | undefined;\n let duration = 0;\n if (!error) {\n const typed = item.response as IResponse;\n status = typed.status;\n statusText = typed.statusText;\n duration = typed.loadingTime;\n }\n return html`\n <ui-list-item lines=\"two\" role=\"menuitem\" data-index=\"${index}\" class=\"${classMap(classes)}\">\n <div class=\"history-label\">\n <span class=\"label-value\">${statusTemplate(status, statusText)} ${duration} ms</span>\n </div>\n <span slot=\"supporting-text\">${title}</span>\n </ui-list-item>\n `;\n }\n\n protected renderView(): TemplateResult {\n switch (this.view) {\n case ProjectRunReportView.details: return this.renderLog();\n case ProjectRunReportView.summary: return this.renderSummary();\n default: return html`<p>Invalid view selection.</p>`;\n }\n }\n\n protected renderLog(): TemplateResult {\n const { currentLog } = this;\n return html`\n <div class=\"response\">\n ${currentLog ? html`<http-request-log .httpLog=\"${currentLog}\"></http-request-log>` : ''}\n </div>\n `;\n }\n\n protected renderSummary(): TemplateResult {\n const { report } = this;\n if (!report) {\n return html`<p>Report is not set.</p>`;\n }\n const { iterations, ended } = report;\n const de = new Date(ended);\n return html`\n <div class=\"summary-header\">\n Run ended <relative-time slot=\"supporting-text\" datetime=\"${de.toISOString()}\"></relative-time>\n </div>\n ${iterations.map(iteration => this.renderIterationSummary(iteration))}\n `;\n }\n\n protected renderIterationSummary(iteration: IProjectExecutionIteration): TemplateResult {\n const { error, executed, index } = iteration;\n return html`\n ${error ? this.renderIterationError() : this.renderIterationSummaryTable(index, executed)}\n `;\n }\n\n protected renderIterationError(): TemplateResult {\n return html`\n <p class=\"iteration-error\">The iteration was not executed due to an error.</p>\n `;\n }\n\n protected renderIterationSummaryTable(iterationIndex: number, executed: IRequestLog[]): TemplateResult {\n const failedIndex: string[] = [];\n executed.forEach((item, index) => {\n const { assertions=[] } = item;\n const hasFailed = assertions.find(i => !i.ok);\n if (hasFailed) {\n failedIndex.push(`#${index + 1}`);\n }\n });\n const formatter = new Intl.ListFormat(undefined, { style: 'long', type: 'conjunction' });\n return html`\n <table class=\"execution-table\">\n <caption>Iteration #${iterationIndex + 1}. Failed requests: ${failedIndex.length ? formatter.format(failedIndex) : 'none'}.</caption>\n <thead>\n <tr>\n <th scope=\"col\" class=\"request\">HTTP request</th>\n <th scope=\"col\" class=\"status\">Status</th>\n <th scope=\"col\" class=\"time\">Time</th>\n <th scope=\"col\" class=\"assertions\">Assertions</th>\n </tr>\n </thead>\n <tbody>\n ${executed.map((item, requestIndex) => this.renderSummaryTableRow(item, iterationIndex, requestIndex))}\n </tbody>\n </table>\n `;\n }\n\n renderSummaryTableRow(item: IRequestLog, iterationIndex: number, requestIndex: number): TemplateResult {\n const { assertions = [], request, response } = item;\n if (!request) {\n return html`\n <tr>\n <td colspan=\"3\">The request was not executed (missing request info)</td>\n </tr>\n `;\n }\n const error = !item.response || ErrorResponse.isErrorResponse(item.response);\n let status: TemplateResult;\n let duration = 0;\n if (error) {\n status = html`Errored`;\n } else if (response) {\n status = statusTemplate(response.status, response.statusText);\n duration = (response as IResponse).loadingTime;\n } else {\n status = html`Unknown`;\n }\n const successAssertions = (item.assertions || []).filter(i => i.ok);\n const hasFailed = assertions.length - successAssertions.length !== 0;\n return html`\n <tr>\n <td class=\"request\">\n <span class=\"http-label pill\" data-method=\"${(request.method || 'get').toLowerCase()}\">${request.method}</span>\n <span \n class=\"link\" \n title=\"Open details\" \n data-iteration-index=\"${iterationIndex}\" \n data-request-index=\"${requestIndex}\"\n @click=\"${this.handleLinkClick}\"\n @keydown=\"${this.handleLinkKeyDown}\"\n tabindex=\"0\"\n >${request.url}</span>\n </td>\n <td class=\"status\">${status}</td>\n <td class=\"time\">${duration}ms</td>\n <td class=\"assertions\">\n <span\n class=\"link\"\n title=\"Open assertion details\"\n data-iteration-index=\"${iterationIndex}\" \n data-request-index=\"${requestIndex}\"\n data-target=\"${RequestLogView.assertions}\"\n @click=\"${this.handleLinkClick}\"\n @keydown=\"${this.handleLinkKeyDown}\"\n tabindex=\"0\"\n >${successAssertions.length}/${assertions.length}</span>\n ${hasFailed ? html`<div class=\"badge small\"></div>` : ''}\n </td>\n </tr>\n `;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"ProjectRunReport.js","sourceRoot":"","sources":["../../../src/elements/project/ProjectRunReport.ts"],"names":[],"mappings":"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","sourcesContent":["import { LitElement, TemplateResult, html, PropertyValues, nothing } from 'lit';\nimport { property, state } from 'lit/decorators.js';\nimport { classMap } from 'lit/directives/class-map.js';\nimport { \n ErrorResponse, IProjectExecutionIteration, IProjectExecutionLog, \n IRequestLog, IResponse \n} from '@api-client/core/build/browser.js';\nimport { statusTemplate } from '../http/HttpStatus.js';\nimport SegmentedButton from '../../ui/button/SegmentedButton.js';\nimport { RequestLogView } from '../http/RequestLog.js';\nimport type { ISegmentedButtonSelectionDetail } from '../../ui/button/SegmentedButtonsSet.js';\nimport '@github/relative-time-element';\nimport '../../define/http/http-request-log.js';\nimport '../../define/ui/ui-icon.js';\nimport '../../define/ui/ui-button.js';\nimport '../../define/ui/ui-dropdown-list.js';\nimport '../../define/ui/ui-list.js';\nimport '../../define/ui/ui-list-item.js';\nimport '../../define/ui/ui-segmented-button.js';\nimport '../../define/ui/ui-segmented-button-set.js';\n\nexport enum ProjectRunReportView {\n summary = 'summary',\n details = 'details',\n}\n\n/**\n * An element that renders the execution log of the project runner with the IProjectExecutionLog.\n */\nexport default class ProjectRunReport extends LitElement {\n @property({ type: Object }) report?: IProjectExecutionLog;\n\n /**\n * The index of the selected iteration, if any.\n */\n @state() protected selectedIteration?: number;\n\n /**\n * The index of the selected request, if any\n */\n @state() protected selectedRequest?: number;\n\n /**\n * The currently rendered iteration.\n */\n @state() protected currentIteration?: IProjectExecutionIteration;\n\n @state() protected currentLog?: IRequestLog;\n\n @state() protected view: ProjectRunReportView = ProjectRunReportView.summary;\n\n protected override willUpdate(cp: PropertyValues<this>): void {\n super.updated(cp);\n if (cp.has('report')) {\n this.processReport();\n }\n }\n\n protected processReport(): void {\n const { report } = this;\n if (!report) {\n this.selectedIteration = undefined\n this.selectedRequest = undefined\n this.currentIteration = undefined\n this.currentLog = undefined\n return;\n }\n this.selectedIteration = 0;\n this.selectedRequest = 0;\n const [ iteration ] = report.iterations;\n this.currentIteration = iteration;\n this.currentLog = iteration && iteration.executed && iteration.executed[0];\n }\n\n protected handleIterationSelection(e: CustomEvent): void {\n const element = e.detail.item as HTMLElement;\n const { index } = element.dataset;\n if (!index) {\n return;\n }\n const typed = Number(index);\n if (Number.isNaN(typed)) {\n return;\n }\n this.selectIteration(typed);\n }\n\n selectIteration(index: number): void {\n const { report } = this;\n if (!report) {\n return;\n }\n const item = report.iterations[index];\n if (!item) {\n return;\n }\n this.selectedIteration = index;\n this.currentIteration = item;\n this.selectedRequest = 0\n this.currentLog = item.executed && item.executed[0];\n }\n\n protected handleRequestSelection(e: CustomEvent): void {\n const element = e.detail.item as HTMLElement;\n const { index } = element.dataset;\n if (!index) {\n return;\n }\n const typed = Number(index);\n if (Number.isNaN(typed)) {\n return;\n }\n this.selectRequest(typed);\n }\n\n selectRequest(index: number): void {\n const { currentIteration } = this;\n if (!currentIteration) {\n return;\n }\n const item = currentIteration.executed[index];\n if (!item) {\n return;\n }\n this.selectedRequest = index;\n this.currentLog = item;\n }\n\n protected handleViewSelection(e: CustomEvent<ISegmentedButtonSelectionDetail>): void {\n if (!e.detail.selected) {\n return;\n }\n const button = e.detail.button as SegmentedButton;\n const view = button.dataset.value as ProjectRunReportView | undefined;\n if (view) {\n this.view = view;\n }\n }\n\n protected handleLinkClick(e: Event): void {\n const node = e.target as HTMLElement;\n const { iterationIndex, requestIndex, target } = node.dataset;\n if (!requestIndex || !iterationIndex) {\n return;\n }\n const iteration = Number(iterationIndex);\n const request = Number(requestIndex);\n if (Number.isNaN(request) || Number.isNaN(iteration)) {\n return;\n }\n this.selectIteration(iteration);\n this.selectRequest(request);\n this.view = ProjectRunReportView.details;\n if (target) {\n this.selectLogView(target as RequestLogView);\n }\n }\n\n protected handleLinkKeyDown(e: KeyboardEvent): void {\n if (['Enter', 'Space'].includes(e.code)) {\n this.handleLinkClick(e);\n }\n }\n\n protected async selectLogView(view: RequestLogView): Promise<void> {\n await this.updateComplete;\n const node = this.shadowRoot?.querySelector('http-request-log');\n if (!node) {\n return;\n }\n node.view = view;\n }\n\n protected override render(): TemplateResult {\n const { report } = this;\n if (!report) {\n return html``;\n }\n return html`\n ${this.renderHeader(report)}\n ${this.renderView()}\n `;\n }\n\n protected renderHeader(report: IProjectExecutionLog): TemplateResult {\n return html`\n <div class=\"header\">\n ${this.renderCurrentSelectors(report)}\n ${this.renderViewToggle()}\n </div>\n `;\n }\n\n protected renderCurrentSelectors(report: IProjectExecutionLog): TemplateResult | typeof nothing {\n if (this.view === ProjectRunReportView.summary) {\n return nothing;\n }\n const hasIterations = report.iterations.length > 1;\n return html`\n ${hasIterations ? this.renderInteractionsList(report.iterations) : nothing}\n ${this.renderRequestsList()}\n `;\n }\n\n protected renderViewToggle(): TemplateResult {\n const { view } = this;\n return html`\n <div class=\"view-toggle\">\n <ui-segmented-button-set @select=\"${this.handleViewSelection}\">\n <ui-segmented-button \n .selected=\"${view === ProjectRunReportView.summary}\" \n title=\"Shows summary of the run report\" \n data-value=\"summary\"\n >Summary</ui-segmented-button>\n <ui-segmented-button \n .selected=\"${view === ProjectRunReportView.details}\" \n title=\"Shows detailed response information for each request\" \n data-value=\"details\"\n >Details</ui-segmented-button>\n </ui-segmented-button-set>\n </div>\n `;\n }\n\n protected renderInteractionsList(iterations: IProjectExecutionIteration[]): TemplateResult {\n const { selectedIteration = 0 } = this;\n const iteration = iterations[selectedIteration];\n const index = iteration ? iteration.index + 1 : 1;\n\n return html`\n <ui-dropdown-list\n verticalAlign=\"top\"\n class=\"iterations-dropdown\"\n closeOnOutsideClick\n @select=\"${this.handleIterationSelection}\"\n >\n <ui-button type=\"tonal\">\n <ui-icon slot=\"icon\" icon=\"arrowDropDown\"></ui-icon>\n Iteration #${index}\n </ui-button>\n <ui-list slot=\"dropdown\" role=\"menu\" aria-label=\"Iterations list\">\n ${iterations.map(current => this.renderIterationOption(current.index))}\n </ui-list>\n </ui-dropdown-list>\n `;\n }\n\n protected renderIterationOption(index: number): TemplateResult {\n const classes = {\n 'iteration-option': true,\n highlight: this.selectedIteration === index,\n };\n return html`\n <ui-list-item role=\"menuitem\" data-index=\"${index}\" class=\"${classMap(classes)}\">\n Iteration #${index + 1}\n </ui-list-item>\n `;\n }\n\n protected renderRequestsList(): TemplateResult {\n const { currentIteration, selectedRequest = 0 } = this;\n if (!currentIteration) {\n return this.renderEmptyRequestsList();\n }\n if (!currentIteration.executed || !currentIteration.executed.length) {\n return this.renderEmptyRequestsList();\n }\n const options = currentIteration.executed.map((item, index) => this.renderRequestsOption(item, index));\n const item = currentIteration.executed[selectedRequest];\n const title = item.request && item.request.url || `Request #${selectedRequest}`;\n return html`\n <ui-dropdown-list\n verticalAlign=\"top\"\n class=\"history-dropdown\"\n closeOnOutsideClick\n @select=\"${this.handleRequestSelection}\"\n >\n <ui-button type=\"tonal\" title=\"${title}\">\n <ui-icon slot=\"icon\" icon=\"arrowDropDown\"></ui-icon>\n <span class=\"request-title-dropdown\">${title}</span>\n </ui-button>\n <ui-list slot=\"dropdown\" role=\"menu\" aria-label=\"History list\">\n ${options}\n </ui-list>\n </ui-dropdown-list>\n `;\n }\n\n protected renderEmptyRequestsList(): TemplateResult {\n return html`\n <ui-button type=\"tonal\" disabled>\n <ui-icon slot=\"icon\" icon=\"arrowDropDown\"></ui-icon>\n No requests\n </ui-button>\n `;\n }\n\n protected renderRequestsOption(item: IRequestLog, index: number): TemplateResult {\n const title = item.request && item.request.url || `Request #${index}`;\n const error = !item.response || ErrorResponse.isErrorResponse(item.response);\n const classes = {\n 'history-option': true,\n error,\n highlight: this.selectedRequest === index,\n };\n let status = 0;\n let statusText: string | undefined;\n let duration = 0;\n if (!error) {\n const typed = item.response as IResponse;\n status = typed.status;\n statusText = typed.statusText;\n duration = typed.loadingTime;\n }\n return html`\n <ui-list-item lines=\"two\" role=\"menuitem\" data-index=\"${index}\" class=\"${classMap(classes)}\">\n <div class=\"history-label\">\n <span class=\"label-value\">${statusTemplate(status, statusText)} ${duration} ms</span>\n </div>\n <span slot=\"supporting-text\">${title}</span>\n </ui-list-item>\n `;\n }\n\n protected renderView(): TemplateResult {\n switch (this.view) {\n case ProjectRunReportView.details: return this.renderLog();\n case ProjectRunReportView.summary: return this.renderSummary();\n default: return html`<p>Invalid view selection.</p>`;\n }\n }\n\n protected renderLog(): TemplateResult {\n const { currentLog } = this;\n return html`\n <div class=\"response\">\n ${currentLog ? html`<http-request-log .httpLog=\"${currentLog}\"></http-request-log>` : ''}\n </div>\n `;\n }\n\n protected renderSummary(): TemplateResult {\n const { report } = this;\n if (!report) {\n return html`<p>Report is not set.</p>`;\n }\n const { iterations, ended } = report;\n const de = new Date(ended);\n return html`\n <div class=\"summary-header\">\n Run ended <relative-time slot=\"supporting-text\" datetime=\"${de.toISOString()}\"></relative-time>\n </div>\n ${iterations.map(iteration => this.renderIterationSummary(iteration))}\n `;\n }\n\n protected renderIterationSummary(iteration: IProjectExecutionIteration): TemplateResult {\n const { error, executed, index } = iteration;\n return html`\n ${error ? this.renderIterationError() : this.renderIterationSummaryTable(index, executed)}\n `;\n }\n\n protected renderIterationError(): TemplateResult {\n return html`\n <p class=\"iteration-error\">The iteration was not executed due to an error.</p>\n `;\n }\n\n protected renderIterationSummaryTable(iterationIndex: number, executed: IRequestLog[]): TemplateResult {\n const failedIndex: string[] = [];\n executed.forEach((item, index) => {\n const { assertions=[] } = item;\n const hasFailed = assertions.find(i => !i.ok);\n if (hasFailed) {\n failedIndex.push(`#${index + 1}`);\n }\n });\n const formatter = new Intl.ListFormat(undefined, { style: 'long', type: 'conjunction' });\n return html`\n <table class=\"execution-table\">\n <caption>Iteration #${iterationIndex + 1}. Failed requests: ${failedIndex.length ? formatter.format(failedIndex) : 'none'}.</caption>\n <thead>\n <tr>\n <th scope=\"col\" class=\"request\">HTTP request</th>\n <th scope=\"col\" class=\"status\">Status</th>\n <th scope=\"col\" class=\"time\">Time</th>\n <th scope=\"col\" class=\"assertions\">Assertions</th>\n </tr>\n </thead>\n <tbody>\n ${executed.map((item, requestIndex) => this.renderSummaryTableRow(item, iterationIndex, requestIndex))}\n </tbody>\n </table>\n `;\n }\n\n renderSummaryTableRow(item: IRequestLog, iterationIndex: number, requestIndex: number): TemplateResult {\n const { assertions = [], request, response } = item;\n if (!request) {\n return html`\n <tr>\n <td colspan=\"3\">The request was not executed (missing request info)</td>\n </tr>\n `;\n }\n const error = !item.response || ErrorResponse.isErrorResponse(item.response);\n let status: TemplateResult;\n let duration = 0;\n if (error) {\n status = html`Errored`;\n } else if (response) {\n status = statusTemplate(response.status, response.statusText);\n duration = (response as IResponse).loadingTime;\n } else {\n status = html`Unknown`;\n }\n const successAssertions = (item.assertions || []).filter(i => i.ok);\n const hasFailed = assertions.length - successAssertions.length !== 0;\n return html`\n <tr>\n <td class=\"request\">\n <span class=\"http-label pill\" data-method=\"${(request.method || 'get').toLowerCase()}\">${request.method}</span>\n <span \n class=\"link\" \n title=\"Open details\" \n data-iteration-index=\"${iterationIndex}\" \n data-request-index=\"${requestIndex}\"\n @click=\"${this.handleLinkClick}\"\n @keydown=\"${this.handleLinkKeyDown}\"\n tabindex=\"0\"\n >${request.url}</span>\n </td>\n <td class=\"status\">${status}</td>\n <td class=\"time\">${duration}ms</td>\n <td class=\"assertions\">\n <span\n class=\"link\"\n title=\"Open assertion details\"\n data-iteration-index=\"${iterationIndex}\" \n data-request-index=\"${requestIndex}\"\n data-target=\"${RequestLogView.assertions}\"\n @click=\"${this.handleLinkClick}\"\n @keydown=\"${this.handleLinkKeyDown}\"\n tabindex=\"0\"\n >${successAssertions.length}/${assertions.length}</span>\n ${hasFailed ? html`<div class=\"badge small\"></div>` : ''}\n </td>\n </tr>\n `;\n }\n}\n"]}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { IFile, ListFileKind } from "@api-client/core/build/browser.js";
|
|
2
|
+
import { CSSResult, TemplateResult } from "lit";
|
|
3
|
+
import ApiElement from "../ApiElement.js";
|
|
4
|
+
import type UiList from "../../ui/list/UiList.js";
|
|
5
|
+
import type { UiListSelection } from "../../ui/list/UiList.js";
|
|
6
|
+
import { FileSystem } from "../../store/FileSystem.js";
|
|
7
|
+
import '../../define/ui/ui-divider.js';
|
|
8
|
+
import '../../define/ui/ui-button.js';
|
|
9
|
+
import '../../define/ui/ui-icon-button.js';
|
|
10
|
+
import '../../define/ui/ui-icon.js';
|
|
11
|
+
import '../../define/ui/ui-list.js';
|
|
12
|
+
import '../../define/ui/ui-list-item.js';
|
|
13
|
+
import '../../define/ui/ui-progress.js';
|
|
14
|
+
export interface FilePickerClosingReason {
|
|
15
|
+
/**
|
|
16
|
+
* Whether the picker was canceled.
|
|
17
|
+
*/
|
|
18
|
+
canceled: boolean;
|
|
19
|
+
/**
|
|
20
|
+
* The file selected by the user. This is always and only selected when the `canceled` is false.
|
|
21
|
+
*/
|
|
22
|
+
file?: IFile;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* A portable element that allow to pick a file from the Store.
|
|
26
|
+
*
|
|
27
|
+
* @fires close - When a file is selected or the user cancelled the dialog. The detail object is the picked file object. Note, this event bubbles.
|
|
28
|
+
* @fires querycomplete - When the page of results was loaded.
|
|
29
|
+
*/
|
|
30
|
+
export default class FilePicker extends ApiElement {
|
|
31
|
+
static get styles(): CSSResult[];
|
|
32
|
+
/**
|
|
33
|
+
* The key of the parent folder to query for files.
|
|
34
|
+
* @attribute
|
|
35
|
+
*/
|
|
36
|
+
get folder(): string | undefined;
|
|
37
|
+
set folder(value: string | undefined);
|
|
38
|
+
/**
|
|
39
|
+
* The page limit. Defaults to the store defaults.
|
|
40
|
+
* @attribute
|
|
41
|
+
*/
|
|
42
|
+
set limit(value: number | undefined);
|
|
43
|
+
get limit(): number | undefined;
|
|
44
|
+
/**
|
|
45
|
+
* The timeout for the page query debouncer.
|
|
46
|
+
* @attribute
|
|
47
|
+
*/
|
|
48
|
+
get debounceTimeout(): number;
|
|
49
|
+
set debounceTimeout(value: number);
|
|
50
|
+
/**
|
|
51
|
+
* The list of file kinds to list.
|
|
52
|
+
* Folders are always included.
|
|
53
|
+
*/
|
|
54
|
+
get kinds(): ListFileKind[] | undefined;
|
|
55
|
+
set kinds(value: ListFileKind[] | undefined);
|
|
56
|
+
protected list?: UiList;
|
|
57
|
+
/**
|
|
58
|
+
* The currently selected in the picker file.
|
|
59
|
+
*/
|
|
60
|
+
protected selectedFile?: IFile;
|
|
61
|
+
errorMessage?: string;
|
|
62
|
+
/**
|
|
63
|
+
* When set it does not query for files when attached to the DOM.
|
|
64
|
+
* It will still query for files when attributes change. This is primarily used in tests.
|
|
65
|
+
* @attribute
|
|
66
|
+
*/
|
|
67
|
+
manualQuery?: boolean;
|
|
68
|
+
get selectedKey(): string | undefined;
|
|
69
|
+
fs: FileSystem;
|
|
70
|
+
constructor();
|
|
71
|
+
connectedCallback(): void;
|
|
72
|
+
disconnectedCallback(): void;
|
|
73
|
+
focus(options?: FocusOptions | undefined): void;
|
|
74
|
+
protected handleFileSelect(e: CustomEvent<UiListSelection>): void;
|
|
75
|
+
protected handleParentUp(): void;
|
|
76
|
+
protected notifyClose(canceled: boolean): void;
|
|
77
|
+
protected handleSelect(): void;
|
|
78
|
+
protected handleCancel(): void;
|
|
79
|
+
protected handleListScroll(e: Event): void;
|
|
80
|
+
protected render(): TemplateResult;
|
|
81
|
+
protected renderHeader(): TemplateResult;
|
|
82
|
+
protected renderFiles(): TemplateResult;
|
|
83
|
+
protected renderEmptyList(): TemplateResult;
|
|
84
|
+
protected renderFileItem(item: IFile): TemplateResult;
|
|
85
|
+
protected renderActions(): TemplateResult;
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=FilePicker.element.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FilePicker.element.d.ts","sourceRoot":"","sources":["../../../src/elements/store/FilePicker.element.ts"],"names":[],"mappings":"AAAA,OAAO,EACO,KAAK,EACjB,YAAY,EACb,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAiB,cAAc,EAAE,MAAM,KAAK,CAAC;AAG/D,OAAO,UAAU,MAAM,kBAAkB,CAAC;AAG1C,OAAO,KAAK,MAAM,MAAM,yBAAyB,CAAC;AAClD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,+BAA+B,CAAC;AACvC,OAAO,8BAA8B,CAAC;AACtC,OAAO,mCAAmC,CAAC;AAC3C,OAAO,4BAA4B,CAAC;AACpC,OAAO,4BAA4B,CAAC;AACpC,OAAO,iCAAiC,CAAC;AACzC,OAAO,gCAAgC,CAAC;AAExC,MAAM,WAAW,uBAAuB;IACtC;;OAEG;IACH,QAAQ,EAAE,OAAO,CAAC;IAClB;;OAEG;IACH,IAAI,CAAC,EAAE,KAAK,CAAC;CACd;AAED;;;;;GAKG;AACH,MAAM,CAAC,OAAO,OAAO,UAAW,SAAQ,UAAU;IAChD,WAAoB,MAAM,IAAI,SAAS,EAAE,CAExC;IAED;;;OAGG;IACH,IACI,MAAM,IAAI,MAAM,GAAG,SAAS,CAE/B;IAED,IAAI,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAEnC;IAED;;;OAGG;IACH,IACI,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAElC;IAED,IAAI,KAAK,IAAI,MAAM,GAAG,SAAS,CAE9B;IAED;;;OAGG;IACH,IACI,eAAe,IAAI,MAAM,CAE5B;IAED,IAAI,eAAe,CAAC,KAAK,EAAE,MAAM,EAEhC;IAED;;;OAGG;IACH,IACI,KAAK,IAAI,YAAY,EAAE,GAAG,SAAS,CAEtC;IAED,IAAI,KAAK,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,SAAS,EAI1C;IAEiB,SAAS,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAE1C;;OAEG;IACM,SAAS,CAAC,YAAY,CAAC,EAAE,KAAK,CAAC;IAE/B,YAAY,CAAC,EAAE,MAAM,CAAC;IAE/B;;;;OAIG;IAC0B,WAAW,CAAC,EAAE,OAAO,CAAC;IAEnD,IAAI,WAAW,IAAI,MAAM,GAAG,SAAS,CAEpC;IAED,EAAE,aAAoB;;IAqBb,iBAAiB,IAAI,IAAI;IAWzB,oBAAoB,IAAI,IAAI;IAK5B,KAAK,CAAC,OAAO,CAAC,EAAE,YAAY,GAAG,SAAS,GAAG,IAAI;IAOxD,SAAS,CAAC,gBAAgB,CAAC,CAAC,EAAE,WAAW,CAAC,eAAe,CAAC,GAAG,IAAI;IAejE,SAAS,CAAC,cAAc,IAAI,IAAI;IAKhC,SAAS,CAAC,WAAW,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI;IAoB9C,SAAS,CAAC,YAAY,IAAI,IAAI;IAI9B,SAAS,CAAC,YAAY,IAAI,IAAI;IAK9B,SAAS,CAAC,gBAAgB,CAAC,CAAC,EAAE,KAAK,GAAG,IAAI;cAOvB,MAAM,IAAI,cAAc;IAa3C,SAAS,CAAC,YAAY,IAAI,cAAc;IA4BxC,SAAS,CAAC,WAAW,IAAI,cAAc;IAYvC,SAAS,CAAC,eAAe,IAAI,cAAc;IAM3C,SAAS,CAAC,cAAc,CAAC,IAAI,EAAE,KAAK,GAAG,cAAc;IAUrD,SAAS,CAAC,aAAa,IAAI,cAAc;CAU1C"}
|
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
import { __decorate } from "tslib";
|
|
2
|
+
import { FolderKind } from "@api-client/core/build/browser.js";
|
|
3
|
+
import { html, nothing } from "lit";
|
|
4
|
+
import { eventOptions, property, query, state } from "lit/decorators.js";
|
|
5
|
+
import { classMap } from "lit/directives/class-map.js";
|
|
6
|
+
import ApiElement from "../ApiElement.js";
|
|
7
|
+
import styles from './FilePicker.styles.js';
|
|
8
|
+
import { fileIcon } from "./FilesLib.js";
|
|
9
|
+
import { FileSystem } from "../../store/FileSystem.js";
|
|
10
|
+
import '../../define/ui/ui-divider.js';
|
|
11
|
+
import '../../define/ui/ui-button.js';
|
|
12
|
+
import '../../define/ui/ui-icon-button.js';
|
|
13
|
+
import '../../define/ui/ui-icon.js';
|
|
14
|
+
import '../../define/ui/ui-list.js';
|
|
15
|
+
import '../../define/ui/ui-list-item.js';
|
|
16
|
+
import '../../define/ui/ui-progress.js';
|
|
17
|
+
/**
|
|
18
|
+
* A portable element that allow to pick a file from the Store.
|
|
19
|
+
*
|
|
20
|
+
* @fires close - When a file is selected or the user cancelled the dialog. The detail object is the picked file object. Note, this event bubbles.
|
|
21
|
+
* @fires querycomplete - When the page of results was loaded.
|
|
22
|
+
*/
|
|
23
|
+
export default class FilePicker extends ApiElement {
|
|
24
|
+
static get styles() {
|
|
25
|
+
return styles;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* The key of the parent folder to query for files.
|
|
29
|
+
* @attribute
|
|
30
|
+
*/
|
|
31
|
+
get folder() {
|
|
32
|
+
return this.fs.parent;
|
|
33
|
+
}
|
|
34
|
+
set folder(value) {
|
|
35
|
+
this.fs.selectFolder(value);
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* The page limit. Defaults to the store defaults.
|
|
39
|
+
* @attribute
|
|
40
|
+
*/
|
|
41
|
+
set limit(value) {
|
|
42
|
+
this.fs.limit = value;
|
|
43
|
+
}
|
|
44
|
+
get limit() {
|
|
45
|
+
return this.fs.limit;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* The timeout for the page query debouncer.
|
|
49
|
+
* @attribute
|
|
50
|
+
*/
|
|
51
|
+
get debounceTimeout() {
|
|
52
|
+
return this.fs.debounceTimeout;
|
|
53
|
+
}
|
|
54
|
+
set debounceTimeout(value) {
|
|
55
|
+
this.fs.debounceTimeout = value || 0;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* The list of file kinds to list.
|
|
59
|
+
* Folders are always included.
|
|
60
|
+
*/
|
|
61
|
+
get kinds() {
|
|
62
|
+
return this.fs.kinds;
|
|
63
|
+
}
|
|
64
|
+
set kinds(value) {
|
|
65
|
+
this.fs.kinds = value;
|
|
66
|
+
this.fs.resetList();
|
|
67
|
+
this.fs.debounceQuery();
|
|
68
|
+
}
|
|
69
|
+
get selectedKey() {
|
|
70
|
+
return this.selectedFile?.key;
|
|
71
|
+
}
|
|
72
|
+
constructor() {
|
|
73
|
+
super();
|
|
74
|
+
this.fs = new FileSystem();
|
|
75
|
+
this.fs.eventsTarget = this;
|
|
76
|
+
this.fs.addEventListener('change', () => this.requestUpdate());
|
|
77
|
+
this.fs.addEventListener('error', (e) => {
|
|
78
|
+
const event = e;
|
|
79
|
+
this.errorMessage = event.detail;
|
|
80
|
+
});
|
|
81
|
+
this.fs.addEventListener('querycomplete', () => {
|
|
82
|
+
this.dispatchEvent(new Event('querycomplete'));
|
|
83
|
+
});
|
|
84
|
+
this.fs.addEventListener('delete', (e) => {
|
|
85
|
+
const event = e;
|
|
86
|
+
if (this.selectedFile && this.selectedFile.key === event.detail) {
|
|
87
|
+
this.selectedFile = undefined;
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
connectedCallback() {
|
|
92
|
+
super.connectedCallback();
|
|
93
|
+
this.fs.observe();
|
|
94
|
+
if (!this.manualQuery) {
|
|
95
|
+
this.fs.debounceQuery();
|
|
96
|
+
}
|
|
97
|
+
if (!this.hasAttribute('tabindex')) {
|
|
98
|
+
this.setAttribute('tabindex', '0');
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
disconnectedCallback() {
|
|
102
|
+
super.disconnectedCallback();
|
|
103
|
+
this.fs.unobserve();
|
|
104
|
+
}
|
|
105
|
+
focus(options) {
|
|
106
|
+
const { list } = this;
|
|
107
|
+
if (list) {
|
|
108
|
+
list.focus(options);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
handleFileSelect(e) {
|
|
112
|
+
// this prevents the dropdown list to close the UI.
|
|
113
|
+
e.preventDefault();
|
|
114
|
+
const file = this.fs.files[e.detail.index];
|
|
115
|
+
if (!file) {
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
if (file.kind === FolderKind) {
|
|
119
|
+
this.fs.selectFolder(file.key);
|
|
120
|
+
this.selectedFile = undefined;
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
this.selectedFile = file;
|
|
124
|
+
}
|
|
125
|
+
handleParentUp() {
|
|
126
|
+
this.fs.parentUp();
|
|
127
|
+
this.selectedFile = undefined;
|
|
128
|
+
}
|
|
129
|
+
notifyClose(canceled) {
|
|
130
|
+
if (!canceled && !this.selectedFile) {
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
const detail = {
|
|
134
|
+
canceled,
|
|
135
|
+
};
|
|
136
|
+
if (!canceled) {
|
|
137
|
+
detail.file = this.selectedFile;
|
|
138
|
+
}
|
|
139
|
+
// this event bubbles so any dropdown on the way can close itself.
|
|
140
|
+
const e = new CustomEvent('close', {
|
|
141
|
+
bubbles: true,
|
|
142
|
+
cancelable: true,
|
|
143
|
+
composed: true,
|
|
144
|
+
detail,
|
|
145
|
+
});
|
|
146
|
+
this.dispatchEvent(e);
|
|
147
|
+
}
|
|
148
|
+
handleSelect() {
|
|
149
|
+
this.notifyClose(false);
|
|
150
|
+
}
|
|
151
|
+
handleCancel() {
|
|
152
|
+
this.notifyClose(true);
|
|
153
|
+
}
|
|
154
|
+
handleListScroll(e) {
|
|
155
|
+
const list = e.target;
|
|
156
|
+
if (this.fs.isListEnd(list)) {
|
|
157
|
+
this.fs.debounceQuery();
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
render() {
|
|
161
|
+
return html `
|
|
162
|
+
<div class="content">
|
|
163
|
+
${this.renderHeader()}
|
|
164
|
+
<ui-divider></ui-divider>
|
|
165
|
+
${this.renderFiles()}
|
|
166
|
+
${this.errorMessage ? html `<p class="error">${this.errorMessage}</p>` : nothing}
|
|
167
|
+
<ui-divider></ui-divider>
|
|
168
|
+
${this.renderActions()}
|
|
169
|
+
</div>
|
|
170
|
+
`;
|
|
171
|
+
}
|
|
172
|
+
renderHeader() {
|
|
173
|
+
const { breadcrumbs = [], reading } = this.fs;
|
|
174
|
+
let content;
|
|
175
|
+
let withIcon = false;
|
|
176
|
+
if (!breadcrumbs.length) {
|
|
177
|
+
content = html `<span class="title-large label">My files</span>`;
|
|
178
|
+
}
|
|
179
|
+
else {
|
|
180
|
+
withIcon = true;
|
|
181
|
+
const [parent] = breadcrumbs;
|
|
182
|
+
content = html `
|
|
183
|
+
<ui-icon-button aria-label="Open parent folder" @click="${this.handleParentUp}" class="back-button">
|
|
184
|
+
<ui-icon role="presentation" icon="arrowBack"></ui-icon>
|
|
185
|
+
</ui-icon-button>
|
|
186
|
+
<span class="title-large label">${parent.name}</span>
|
|
187
|
+
`;
|
|
188
|
+
}
|
|
189
|
+
const classes = {
|
|
190
|
+
header: true,
|
|
191
|
+
withIcon,
|
|
192
|
+
};
|
|
193
|
+
return html `
|
|
194
|
+
<div class="${classMap(classes)}">
|
|
195
|
+
${content}
|
|
196
|
+
${reading ? html `<ui-progress indeterminate class="progress"></ui-progress>` : nothing}
|
|
197
|
+
</div>
|
|
198
|
+
`;
|
|
199
|
+
}
|
|
200
|
+
renderFiles() {
|
|
201
|
+
const { files } = this.fs;
|
|
202
|
+
if (!files || !files.length) {
|
|
203
|
+
return this.renderEmptyList();
|
|
204
|
+
}
|
|
205
|
+
return html `
|
|
206
|
+
<ui-list class="list" role="menu" @select="${this.handleFileSelect}" selectActive @scroll="${this.handleListScroll}">
|
|
207
|
+
${files.map(item => this.renderFileItem(item))}
|
|
208
|
+
</ui-list>
|
|
209
|
+
`;
|
|
210
|
+
}
|
|
211
|
+
renderEmptyList() {
|
|
212
|
+
return html `
|
|
213
|
+
<p class="no-files body-large">No files in this view.</p>
|
|
214
|
+
`;
|
|
215
|
+
}
|
|
216
|
+
renderFileItem(item) {
|
|
217
|
+
const icon = fileIcon(item);
|
|
218
|
+
return html `
|
|
219
|
+
<ui-list-item role="menuitem" data-key="${item.key}" data-kind="${item.kind}">
|
|
220
|
+
${icon ? html `<ui-icon icon="${icon}" class="file-icon"></ui-icon>` : nothing}
|
|
221
|
+
${item.info.name || 'Unnamed file'}
|
|
222
|
+
</ui-list-item>
|
|
223
|
+
`;
|
|
224
|
+
}
|
|
225
|
+
renderActions() {
|
|
226
|
+
const { selectedFile } = this;
|
|
227
|
+
const disableSelect = !selectedFile;
|
|
228
|
+
return html `
|
|
229
|
+
<div class="actions">
|
|
230
|
+
<ui-button type="text" @click="${this.handleCancel}" value="cancel">Cancel</ui-button>
|
|
231
|
+
<ui-button type="tonal" ?disabled="${disableSelect}" @click="${this.handleSelect}" value="select">Select</ui-button>
|
|
232
|
+
</div>
|
|
233
|
+
`;
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
__decorate([
|
|
237
|
+
property({ type: String, hasChanged: () => false })
|
|
238
|
+
], FilePicker.prototype, "folder", null);
|
|
239
|
+
__decorate([
|
|
240
|
+
property({ type: Number, hasChanged: () => false })
|
|
241
|
+
], FilePicker.prototype, "limit", null);
|
|
242
|
+
__decorate([
|
|
243
|
+
property({ type: Number, hasChanged: () => false })
|
|
244
|
+
], FilePicker.prototype, "debounceTimeout", null);
|
|
245
|
+
__decorate([
|
|
246
|
+
property({ type: Array, hasChanged: () => false })
|
|
247
|
+
], FilePicker.prototype, "kinds", null);
|
|
248
|
+
__decorate([
|
|
249
|
+
query('ui-list')
|
|
250
|
+
], FilePicker.prototype, "list", void 0);
|
|
251
|
+
__decorate([
|
|
252
|
+
state()
|
|
253
|
+
], FilePicker.prototype, "selectedFile", void 0);
|
|
254
|
+
__decorate([
|
|
255
|
+
state()
|
|
256
|
+
], FilePicker.prototype, "errorMessage", void 0);
|
|
257
|
+
__decorate([
|
|
258
|
+
property({ type: Boolean })
|
|
259
|
+
], FilePicker.prototype, "manualQuery", void 0);
|
|
260
|
+
__decorate([
|
|
261
|
+
eventOptions({ passive: true })
|
|
262
|
+
], FilePicker.prototype, "handleListScroll", null);
|
|
263
|
+
//# sourceMappingURL=FilePicker.element.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FilePicker.element.js","sourceRoot":"","sources":["../../../src/elements/store/FilePicker.element.ts"],"names":[],"mappings":"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","sourcesContent":["import { \n FolderKind, IFile, \n ListFileKind \n} from \"@api-client/core/build/browser.js\";\nimport { CSSResult, html, nothing, TemplateResult } from \"lit\";\nimport { eventOptions, property, query, state } from \"lit/decorators.js\";\nimport { classMap } from \"lit/directives/class-map.js\";\nimport ApiElement from \"../ApiElement.js\";\nimport styles from './FilePicker.styles.js';\nimport { fileIcon } from \"./FilesLib.js\";\nimport type UiList from \"../../ui/list/UiList.js\";\nimport type { UiListSelection } from \"../../ui/list/UiList.js\";\nimport { FileSystem } from \"../../store/FileSystem.js\";\nimport '../../define/ui/ui-divider.js';\nimport '../../define/ui/ui-button.js';\nimport '../../define/ui/ui-icon-button.js';\nimport '../../define/ui/ui-icon.js';\nimport '../../define/ui/ui-list.js';\nimport '../../define/ui/ui-list-item.js';\nimport '../../define/ui/ui-progress.js';\n\nexport interface FilePickerClosingReason {\n /**\n * Whether the picker was canceled.\n */\n canceled: boolean;\n /**\n * The file selected by the user. This is always and only selected when the `canceled` is false.\n */\n file?: IFile;\n}\n\n/**\n * A portable element that allow to pick a file from the Store.\n * \n * @fires close - When a file is selected or the user cancelled the dialog. The detail object is the picked file object. Note, this event bubbles.\n * @fires querycomplete - When the page of results was loaded.\n */\nexport default class FilePicker extends ApiElement {\n static override get styles(): CSSResult[] {\n return styles;\n }\n\n /**\n * The key of the parent folder to query for files.\n * @attribute\n */\n @property({ type: String, hasChanged: () => false }) \n get folder(): string | undefined {\n return this.fs.parent;\n }\n\n set folder(value: string | undefined) {\n this.fs.selectFolder(value);\n }\n\n /**\n * The page limit. Defaults to the store defaults.\n * @attribute\n */\n @property({ type: Number, hasChanged: () => false }) \n set limit(value: number | undefined) {\n this.fs.limit = value;\n }\n\n get limit(): number | undefined {\n return this.fs.limit;\n }\n\n /**\n * The timeout for the page query debouncer.\n * @attribute\n */\n @property({ type: Number, hasChanged: () => false }) \n get debounceTimeout(): number {\n return this.fs.debounceTimeout;\n }\n\n set debounceTimeout(value: number) {\n this.fs.debounceTimeout = value || 0;\n }\n\n /**\n * The list of file kinds to list.\n * Folders are always included.\n */\n @property({ type: Array, hasChanged: () => false }) \n get kinds(): ListFileKind[] | undefined {\n return this.fs.kinds;\n }\n\n set kinds(value: ListFileKind[] | undefined) {\n this.fs.kinds = value;\n this.fs.resetList();\n this.fs.debounceQuery();\n }\n\n @query('ui-list') protected list?: UiList;\n\n /**\n * The currently selected in the picker file.\n */\n @state() protected selectedFile?: IFile;\n\n @state() errorMessage?: string;\n\n /**\n * When set it does not query for files when attached to the DOM. \n * It will still query for files when attributes change. This is primarily used in tests.\n * @attribute\n */\n @property({ type: Boolean }) manualQuery?: boolean;\n\n get selectedKey(): string | undefined {\n return this.selectedFile?.key;\n }\n\n fs = new FileSystem();\n\n constructor() {\n super();\n this.fs.eventsTarget = this;\n this.fs.addEventListener('change', () => this.requestUpdate());\n this.fs.addEventListener('error', (e: Event) => {\n const event = e as CustomEvent<string>;\n this.errorMessage = event.detail;\n });\n this.fs.addEventListener('querycomplete', () => {\n this.dispatchEvent(new Event('querycomplete'));\n });\n this.fs.addEventListener('delete', (e: Event) => {\n const event = e as CustomEvent<string>;\n if (this.selectedFile && this.selectedFile.key === event.detail) {\n this.selectedFile = undefined;\n }\n });\n }\n \n override connectedCallback(): void {\n super.connectedCallback();\n this.fs.observe();\n if (!this.manualQuery) {\n this.fs.debounceQuery();\n }\n if (!this.hasAttribute('tabindex')) {\n this.setAttribute('tabindex', '0');\n }\n }\n \n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.fs.unobserve();\n }\n\n override focus(options?: FocusOptions | undefined): void {\n const { list } = this;\n if (list) {\n list.focus(options);\n }\n }\n\n protected handleFileSelect(e: CustomEvent<UiListSelection>): void {\n // this prevents the dropdown list to close the UI.\n e.preventDefault();\n const file = this.fs.files[e.detail.index];\n if (!file) {\n return;\n }\n if (file.kind === FolderKind) {\n this.fs.selectFolder(file.key);\n this.selectedFile = undefined;\n return;\n }\n this.selectedFile = file;\n }\n\n protected handleParentUp(): void {\n this.fs.parentUp();\n this.selectedFile = undefined;\n }\n\n protected notifyClose(canceled: boolean): void {\n if (!canceled && !this.selectedFile) {\n return;\n }\n const detail: FilePickerClosingReason = {\n canceled,\n };\n if (!canceled) {\n detail.file = this.selectedFile;\n }\n // this event bubbles so any dropdown on the way can close itself.\n const e = new CustomEvent<FilePickerClosingReason>('close', {\n bubbles: true,\n cancelable: true,\n composed: true,\n detail,\n });\n this.dispatchEvent(e);\n }\n\n protected handleSelect(): void {\n this.notifyClose(false);\n }\n\n protected handleCancel(): void {\n this.notifyClose(true);\n }\n\n @eventOptions({ passive: true })\n protected handleListScroll(e: Event): void {\n const list = e.target as UiList;\n if (this.fs.isListEnd(list)) {\n this.fs.debounceQuery();\n }\n }\n\n protected override render(): TemplateResult {\n return html`\n <div class=\"content\">\n ${this.renderHeader()}\n <ui-divider></ui-divider>\n ${this.renderFiles()}\n ${this.errorMessage ? html`<p class=\"error\">${this.errorMessage}</p>` : nothing}\n <ui-divider></ui-divider>\n ${this.renderActions()}\n </div>\n `;\n }\n\n protected renderHeader(): TemplateResult {\n const { breadcrumbs = [], reading } = this.fs;\n let content: TemplateResult;\n let withIcon = false;\n if (!breadcrumbs.length) {\n content = html`<span class=\"title-large label\">My files</span>`;\n } else {\n withIcon = true;\n const [parent] = breadcrumbs;\n content = html`\n <ui-icon-button aria-label=\"Open parent folder\" @click=\"${this.handleParentUp}\" class=\"back-button\">\n <ui-icon role=\"presentation\" icon=\"arrowBack\"></ui-icon>\n </ui-icon-button>\n <span class=\"title-large label\">${parent.name}</span>\n `;\n }\n const classes = {\n header: true,\n withIcon,\n }\n return html`\n <div class=\"${classMap(classes)}\">\n ${content}\n ${reading ? html`<ui-progress indeterminate class=\"progress\"></ui-progress>` : nothing}\n </div>\n `;\n }\n\n protected renderFiles(): TemplateResult {\n const { files } = this.fs;\n if (!files || !files.length) {\n return this.renderEmptyList();\n }\n return html`\n <ui-list class=\"list\" role=\"menu\" @select=\"${this.handleFileSelect}\" selectActive @scroll=\"${this.handleListScroll}\">\n ${files.map(item => this.renderFileItem(item))}\n </ui-list>\n `;\n }\n\n protected renderEmptyList(): TemplateResult {\n return html`\n <p class=\"no-files body-large\">No files in this view.</p>\n `;\n }\n\n protected renderFileItem(item: IFile): TemplateResult {\n const icon = fileIcon(item);\n return html`\n <ui-list-item role=\"menuitem\" data-key=\"${item.key}\" data-kind=\"${item.kind}\">\n ${icon ? html`<ui-icon icon=\"${icon}\" class=\"file-icon\"></ui-icon>` : nothing}\n ${item.info.name || 'Unnamed file'}\n </ui-list-item>\n `;\n }\n\n protected renderActions(): TemplateResult {\n const { selectedFile } = this;\n const disableSelect = !selectedFile;\n return html`\n <div class=\"actions\">\n <ui-button type=\"text\" @click=\"${this.handleCancel}\" value=\"cancel\">Cancel</ui-button>\n <ui-button type=\"tonal\" ?disabled=\"${disableSelect}\" @click=\"${this.handleSelect}\" value=\"select\">Select</ui-button>\n </div>\n `;\n }\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FilePicker.styles.d.ts","sourceRoot":"","sources":["../../../src/elements/store/FilePicker.styles.ts"],"names":[],"mappings":";AAGA,wBAqEG"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { css } from "lit";
|
|
2
|
+
import typography from '../../styles/m3/typography.module.js';
|
|
3
|
+
export default [typography, css `
|
|
4
|
+
:host {
|
|
5
|
+
display: block;
|
|
6
|
+
|
|
7
|
+
width: 420px;
|
|
8
|
+
height: 400px;
|
|
9
|
+
|
|
10
|
+
background-color: var(--md-sys-color-background);
|
|
11
|
+
color: var(--md-sys-color-on-background);
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
.content {
|
|
15
|
+
height: 100%;
|
|
16
|
+
display: flex;
|
|
17
|
+
flex-direction: column;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
.header {
|
|
21
|
+
height: 56px;
|
|
22
|
+
display: flex;
|
|
23
|
+
align-items: center;
|
|
24
|
+
position: relative;
|
|
25
|
+
margin: 0 16px;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
.header.withIcon {
|
|
29
|
+
margin: 0 16px 0 4px;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
.header .label {
|
|
33
|
+
display: block;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
.progress {
|
|
37
|
+
position: absolute;
|
|
38
|
+
bottom: -10px; /* aligns with the divider */
|
|
39
|
+
width: 100%;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
.list {
|
|
43
|
+
overflow-y: auto;
|
|
44
|
+
flex: 1;
|
|
45
|
+
margin: 0;
|
|
46
|
+
padding: 0;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
.actions {
|
|
50
|
+
display: flex;
|
|
51
|
+
align-items: center;
|
|
52
|
+
justify-content: flex-end;
|
|
53
|
+
margin: 0 16px;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
.file-icon {
|
|
57
|
+
margin-right: 12px;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
.error {
|
|
61
|
+
background-color: var(--md-sys-color-error-container);
|
|
62
|
+
color: var(--md-sys-color-on-error-container);
|
|
63
|
+
display: block;
|
|
64
|
+
padding: 8px 12px;
|
|
65
|
+
border-radius: var(--md-sys-shape-corner-small);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
.no-files {
|
|
69
|
+
flex: 1;
|
|
70
|
+
margin-left: 16px;
|
|
71
|
+
}
|
|
72
|
+
`];
|
|
73
|
+
//# sourceMappingURL=FilePicker.styles.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FilePicker.styles.js","sourceRoot":"","sources":["../../../src/elements/store/FilePicker.styles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAC1B,OAAO,UAAU,MAAM,sCAAsC,CAAC;AAE9D,eAAe,CAAC,UAAU,EAAE,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqE9B,CAAC,CAAC","sourcesContent":["import { css } from \"lit\";\nimport typography from '../../styles/m3/typography.module.js';\n\nexport default [typography, css`\n:host {\n display: block;\n\n width: 420px;\n height: 400px;\n\n background-color: var(--md-sys-color-background);\n color: var(--md-sys-color-on-background);\n}\n\n.content {\n height: 100%;\n display: flex;\n flex-direction: column;\n}\n\n.header {\n height: 56px;\n display: flex;\n align-items: center;\n position: relative;\n margin: 0 16px;\n}\n\n.header.withIcon {\n margin: 0 16px 0 4px;\n}\n\n.header .label {\n display: block;\n}\n\n.progress {\n position: absolute;\n bottom: -10px; /* aligns with the divider */\n width: 100%;\n}\n\n.list {\n overflow-y: auto;\n flex: 1;\n margin: 0;\n padding: 0;\n}\n\n.actions {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n margin: 0 16px;\n}\n\n.file-icon {\n margin-right: 12px;\n}\n\n.error {\n background-color: var(--md-sys-color-error-container);\n color: var(--md-sys-color-on-error-container);\n display: block;\n padding: 8px 12px;\n border-radius: var(--md-sys-shape-corner-small);\n}\n\n.no-files {\n flex: 1;\n margin-left: 16px;\n}\n`];\n"]}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { IFile } from "@api-client/core/build/browser.js";
|
|
2
|
+
import { IconType } from "../../ui/icons/Icons.js";
|
|
3
|
+
/**
|
|
4
|
+
* Sorts files on the list.
|
|
5
|
+
*
|
|
6
|
+
* Folders are always on top.
|
|
7
|
+
*/
|
|
8
|
+
export declare function filesSortFunction(a: IFile, b: IFile): number;
|
|
9
|
+
export declare function fileIcon(item: IFile): IconType | undefined;
|
|
10
|
+
//# sourceMappingURL=FilesLib.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FilesLib.d.ts","sourceRoot":"","sources":["../../../src/elements/store/FilesLib.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiD,KAAK,EAAe,MAAM,mCAAmC,CAAC;AACtH,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAEnD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,GAAG,MAAM,CAW5D;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,KAAK,GAAG,QAAQ,GAAG,SAAS,CAU1D"}
|