@api-client/ui 0.0.13 → 0.0.14

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 (60) hide show
  1. package/dist/define/http/http-body-editor.d.ts.map +1 -1
  2. package/dist/define/http/http-body-editor.js +1 -1
  3. package/dist/define/http/http-body-editor.js.map +1 -1
  4. package/dist/elements/http/BodyEditor.js +5 -5
  5. package/dist/elements/http/BodyEditor.js.map +1 -1
  6. package/dist/elements/http/BodyEditor.styles.d.ts +1 -1
  7. package/dist/elements/http/BodyEditor.styles.d.ts.map +1 -1
  8. package/dist/elements/http/BodyEditor.styles.js +5 -19
  9. package/dist/elements/http/BodyEditor.styles.js.map +1 -1
  10. package/dist/elements/store/FilesLib.d.ts +2 -2
  11. package/dist/elements/store/FilesLib.d.ts.map +1 -1
  12. package/dist/elements/store/FilesLib.js.map +1 -1
  13. package/dist/http-client/store/Cursor.js +2 -2
  14. package/dist/http-client/store/Cursor.js.map +1 -1
  15. package/dist/http-client/store/HttpClientIdbDatabase.d.ts.map +1 -1
  16. package/dist/http-client/store/HttpClientIdbDatabase.js +2 -6
  17. package/dist/http-client/store/HttpClientIdbDatabase.js.map +1 -1
  18. package/dist/http-client/store/State.d.ts +1 -3
  19. package/dist/http-client/store/State.d.ts.map +1 -1
  20. package/dist/http-client/store/State.js.map +1 -1
  21. package/dist/http-client/store/idb/IdbStore.d.ts +1 -10
  22. package/dist/http-client/store/idb/IdbStore.d.ts.map +1 -1
  23. package/dist/http-client/store/idb/IdbStore.js +0 -48
  24. package/dist/http-client/store/idb/IdbStore.js.map +1 -1
  25. package/dist/http-client/store/types.d.ts +2 -56
  26. package/dist/http-client/store/types.d.ts.map +1 -1
  27. package/dist/http-client/store/types.js.map +1 -1
  28. package/dist/index.d.ts +1 -0
  29. package/dist/index.d.ts.map +1 -1
  30. package/dist/index.js +2 -0
  31. package/dist/index.js.map +1 -1
  32. package/dist/pages/api-client/ApiClient.screen.d.ts +4 -4
  33. package/dist/pages/api-client/ApiClient.screen.d.ts.map +1 -1
  34. package/dist/pages/api-client/ApiClient.screen.js +2 -2
  35. package/dist/pages/api-client/ApiClient.screen.js.map +1 -1
  36. package/dist/pages/api-client/pages/Trash.page.d.ts.map +1 -1
  37. package/dist/pages/api-client/pages/Trash.page.js +3 -11
  38. package/dist/pages/api-client/pages/Trash.page.js.map +1 -1
  39. package/dist/ui/list/UiDropdownList.js +1 -1
  40. package/dist/ui/list/UiDropdownList.js.map +1 -1
  41. package/package.json +2 -2
  42. package/src/define/http/http-body-editor.ts +1 -1
  43. package/src/elements/http/BodyEditor.styles.ts +5 -19
  44. package/src/elements/http/BodyEditor.ts +5 -5
  45. package/src/elements/store/FilesLib.ts +2 -2
  46. package/src/http-client/store/Cursor.ts +2 -2
  47. package/src/http-client/store/HttpClientIdbDatabase.ts +5 -9
  48. package/src/http-client/store/State.ts +1 -5
  49. package/src/http-client/store/idb/IdbStore.ts +1 -51
  50. package/src/http-client/store/types.ts +2 -57
  51. package/src/index.ts +3 -0
  52. package/src/pages/api-client/ApiClient.screen.ts +7 -7
  53. package/src/pages/api-client/pages/Trash.page.ts +3 -10
  54. package/src/ui/list/UiDropdownList.ts +1 -1
  55. package/web-test-runner.config.mjs +2 -2
  56. package/dist/http-client/store/Validator.d.ts +0 -4
  57. package/dist/http-client/store/Validator.d.ts.map +0 -1
  58. package/dist/http-client/store/Validator.js +0 -32
  59. package/dist/http-client/store/Validator.js.map +0 -1
  60. package/src/http-client/store/Validator.ts +0 -33
@@ -1 +1 @@
1
- {"version":3,"file":"Trash.page.js","sourceRoot":"","sources":["../../../../src/pages/api-client/pages/Trash.page.ts"],"names":[],"mappings":"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","sourcesContent":["import { ProjectKind, EventUtils, FolderKind, TrashEntry, ContextSpaceListOptions, IFile, BroadcastEvent, BroadcastCreatedEvent, DataFileKind } from \"@api-client/core/build/browser.js\";\nimport { html, TemplateResult } from \"lit\";\nimport '@github/relative-time-element';\nimport { IconType } from \"../../../ui/icons/Icons.js\";\nimport { navigate } from \"../../../lib/route.js\";\nimport { SnackNotifications } from \"../../../ui/notification/SnackNotifications.js\";\nimport { DataTable } from \"../../../ui/table/DataTable.js\";\nimport type ApiClientScreen from \"../ApiClient.screen.js\";\nimport '../../../define/ui/ui-icon.js';\n\n/**\n * A class that specializes in rendering the list of trash in HTTP Client.\n */\nexport class TrashPage {\n files: TrashEntry[] = [];\n\n /**\n * The pagination cursor for trash.\n * As long there's a cursor, there are more files to request.\n */\n cursor?: string;\n\n dt = new DataTable(() => this.files, { ariaLabel: 'Trashed files' });\n\n readingFiles?: boolean;\n\n /**\n * The list of keys of files to delete.\n */\n deleteKeys?: string[];\n\n get deleteItems(): TrashEntry[] {\n const { deleteKeys, files } = this;\n if (!deleteKeys) {\n return [];\n }\n const result: TrashEntry[] = [];\n deleteKeys.forEach((key) => {\n const item = files.find(i => i.key === key);\n if (item) {\n result.push(item);\n }\n });\n return result;\n }\n\n constructor(protected screen: ApiClientScreen) {\n this.dt.addEventListener('empty', this.renderEmptyTable.bind(this));\n this.dt.addEventListener('header', this.renderTableHeader.bind(this));\n this.dt.addEventListener('item', this.renderTableItem.bind(this));\n\n this.itemOptionsSelectHandler = this.itemOptionsSelectHandler.bind(this);\n this.cancelDeleteAllDialog = this.cancelDeleteAllDialog.bind(this);\n this.deleteAllHandler = this.deleteAllHandler.bind(this);\n this.cancelDeleteFilesDialog = this.cancelDeleteFilesDialog.bind(this);\n this.deleteFilesHandler = this.deleteFilesHandler.bind(this);\n this.openEmptyAllDialogHandler = this.openEmptyAllDialogHandler.bind(this);\n }\n\n handleFileEvent(event: BroadcastEvent): void {\n switch (event.operation) {\n case 'created': this.handleTrashAdded((event as BroadcastCreatedEvent).data as TrashEntry); break;\n case 'deleted': this.handleTrashRemoved(event.key as string); break;\n default:\n }\n }\n\n protected handleTrashAdded(item: TrashEntry): void {\n this.files.push(item);\n this.files.sort(this.filesSortFunction.bind(this));\n this.screen.render();\n }\n\n protected handleTrashRemoved(key: string): void {\n const index = this.files.findIndex(i => i.key === key);\n if (index === -1) {\n return;\n }\n this.files.splice(index, 1);\n this.screen.render();\n }\n\n async refresh(): Promise<void> {\n this.resetList();\n this.screen.render();\n await this.readFiles();\n }\n\n resetList(): void {\n this.files = [];\n this.cursor = undefined;\n }\n\n async readFiles(): Promise<void> {\n const { selectedSpace } = this.screen;\n if (!selectedSpace) {\n return;\n }\n if (this.readingFiles) {\n return;\n }\n this.readingFiles = true;\n const { cursor: currentCursor } = this;\n const opts: ContextSpaceListOptions = {\n space: selectedSpace,\n descending: true,\n };\n if (currentCursor) {\n opts.cursor = currentCursor;\n }\n try {\n const result = await this.screen.bindings.store.trash.list(opts);\n const { items, cursor } = result;\n this.files = this.files.concat(items).sort(this.filesSortFunction.bind(this));\n this.cursor = cursor;\n } finally {\n this.readingFiles = false;\n }\n this.screen.render();\n }\n\n /**\n * Sorts files on the list.\n * \n * Folders are always on top.\n */\n filesSortFunction(a: TrashEntry, b: TrashEntry): number {\n return b.info.time - a.info.time;\n }\n\n protected itemOptionsSelectHandler(e: CustomEvent): void {\n const item = e.detail.item as HTMLElement;\n const list = e.target as HTMLElement;\n const operation = item.dataset.option as string;\n const key = list.dataset.key as string;\n if (!key || !operation) {\n return;\n }\n if (operation === 'restore') {\n this.restoreItem(key);\n } else if (operation === 'delete') {\n this.deleteKeys = [key];\n this.screen.render();\n this.screen.openDialog('deleteFilesDialog');\n }\n }\n\n async restoreItem(key: string): Promise<void> {\n const { bindings, selectedSpace } = this.screen;\n if (!selectedSpace) {\n throw new Error(`Invalid state: Folder is not selected.`);\n }\n const record = await bindings.store.trash.restore(key);\n const file = record.item as IFile;\n const parentId = file.parents && file.parents.length ? file.parents[file.parents.length - 1] : undefined;\n SnackNotifications.notify(`Restored file: ${file.info.name}`, {\n actionLabel: 'Go to file location',\n actionCallback: () => {\n if (parentId) {\n navigate('files', parentId);\n } else {\n navigate('files');\n }\n },\n });\n }\n\n async deleteItem(key: string): Promise<void> {\n const { bindings, selectedSpace } = this.screen;\n if (!selectedSpace) {\n throw new Error(`Invalid state: Folder is not selected.`);\n }\n await bindings.store.trash.delete(key);\n }\n\n protected openEmptyAllDialogHandler(): void {\n this.screen.openDialog('deleteAllDialog');\n }\n\n protected cancelDeleteAllDialog(): void {\n this.screen.closeDialog('deleteAllDialog');\n }\n\n protected deleteAllHandler(): void {\n this.screen.closeDialog('deleteAllDialog');\n const { bindings, selectedSpace } = this.screen;\n if (!selectedSpace) {\n throw new Error(`Invalid state: Folder is not selected.`);\n }\n bindings.store.trash.empty(selectedSpace);\n }\n\n protected cancelDeleteFilesDialog(): void {\n this.deleteKeys = undefined;\n this.screen.closeDialog('deleteFilesDialog');\n }\n\n protected deleteFilesHandler(): void {\n this.screen.closeDialog('deleteFilesDialog');\n this.screen.render();\n const { deleteKeys } = this;\n this.deleteKeys = undefined;\n if (!deleteKeys || !deleteKeys.length) {\n return;\n }\n deleteKeys.forEach(k => this.deleteItem(k));\n }\n\n render(): TemplateResult {\n return html`\n <div class=\"section-header\">\n <h2 class=\"headline-small\">Trash</h2>\n <div class=\"spacer\"></div>\n ${this.renderEmptyTrash()}\n </div>\n ${this.renderTrashTable()}\n ${this.renderDeleteAllDialog()}\n ${this.renderDeleteFilesDialog()}\n `;\n }\n\n protected renderEmptyTrash(): TemplateResult {\n const { files } = this;\n const disabled = !files || !files.length;\n return html`\n <ui-button type=\"outlined\" ?disabled=\"${disabled}\" @click=\"${this.openEmptyAllDialogHandler}\">\n <ui-icon icon=\"deleteOutline\" slot=\"icon\"></ui-icon>\n Empty trash\n </ui-button>\n `;\n }\n\n protected renderTrashTable(): TemplateResult {\n return this.dt.render();\n }\n\n protected renderEmptyTable(): TemplateResult {\n return html`\n <p>The trash bin is empty.</p>\n `;\n }\n\n protected renderTableHeader(): TemplateResult[] {\n const name = this.dt.header('Name', { class: 'name-cell' });\n const deleted = this.dt.header('Deleted', { class: 'updated-cell' });\n const menu = this.dt.header(html`<span hidden>Menu</span>`, { class: 'menu-cell' });\n return [name, deleted, menu];\n }\n\n protected renderTableItem(item: TrashEntry): TemplateResult[] {\n const { kind, name, info } = item;\n let icon: IconType | undefined;\n if (kind === ProjectKind) {\n icon = 'collectionsBookmark';\n } else if (kind === FolderKind) {\n icon = 'folder';\n } else if (kind === DataFileKind) {\n icon = 'schema';\n }\n\n const nameCell = this.dt.cell(html`\n ${icon ? html`<ui-icon icon=\"${icon}\" class=\"cell-icon\"></ui-icon>` : ''}\n ${name || 'Unnamed file'}\n `, { class: 'name-cell', data: { kind } });\n\n const deleted = this.dt.cell(html`\n <relative-time datetime=\"${new Date(info.time).toISOString()}\"></relative-time>\n `, { class: 'updated-cell' });\n\n const menu = this.dt.cell(this.renderItemOptions(item), { class: 'menu-cell' });\n\n return [nameCell, deleted, menu];\n }\n\n protected renderItemOptions(item: TrashEntry): TemplateResult {\n return html`\n <ui-dropdown-list\n horizontalAlign=\"auto\"\n verticalAlign=\"auto\"\n closeOnOutsideClick\n @mousedown=\"${EventUtils.cancelEvent}\" \n @mouseup=\"${EventUtils.cancelEvent}\" \n @click=\"${EventUtils.cancelEvent}\"\n @dblclick=\"${EventUtils.cancelEvent}\"\n @select=\"${this.itemOptionsSelectHandler}\"\n data-key=\"${item.key}\"\n >\n <ui-icon-button title=\"Project options\" aria-label=\"Activate for more options\">\n <ui-icon icon=\"moreVert\"></ui-icon>\n </ui-icon-button>\n <ui-list slot=\"dropdown\" role=\"menu\">\n <ui-list-item image=\"icon\" data-option=\"restore\" role=\"menuitem\" title=\"Restores the file to its original folder.\">\n <ui-icon icon=\"restoreFromTrash\" slot=\"start\"></ui-icon>\n Restore\n </ui-list-item>\n <ui-list-item image=\"icon\" data-option=\"delete\" role=\"menuitem\" title=\"Permanently deleted the item.\">\n <ui-icon icon=\"deleteOutline\" slot=\"start\"></ui-icon>\n Delete forever\n </ui-list-item>\n </ui-list>\n </ui-dropdown-list>\n `;\n }\n\n protected renderDeleteAllDialog(): TemplateResult {\n return html`\n <dialog id=\"deleteAllDialog\" class=\"warning\">\n <h3>Empty Trash?</h3>\n <div>\n <p class=\"body-medium\">\n This will permanently delete all files in the trash.\n </p>\n </div>\n <div class=\"dialog-buttons\">\n <ui-button type=\"text\" value=\"cancel\" @click=\"${this.cancelDeleteAllDialog}\">Cancel</ui-button>\n <ui-button type=\"text\" value=\"delete\" @click=\"${this.deleteAllHandler}\">Delete</ui-button>\n </div>\n </dialog>\n `;\n }\n\n protected renderDeleteFilesDialog(): TemplateResult {\n const { deleteItems } = this;\n return html`\n <dialog id=\"deleteFilesDialog\" class=\"warning\">\n <h3>Delete Forever?</h3>\n <div>\n ${deleteItems.length > 1 ? this.renderDeleteMultiFile(deleteItems) : this.renderDeleteSingleFile(deleteItems[0])}\n </div>\n <div class=\"dialog-buttons\">\n <ui-button type=\"text\" value=\"cancel\" @click=\"${this.cancelDeleteFilesDialog}\">Cancel</ui-button>\n <ui-button type=\"text\" value=\"delete\" @click=\"${this.deleteFilesHandler}\">Delete</ui-button>\n </div>\n </dialog>\n `;\n }\n\n protected renderDeleteSingleFile(item: TrashEntry): TemplateResult {\n if (!item) {\n return html`\n <p class=\"body-medium\">Invalid state. Couldn't find files to delete.</p>\n `;\n }\n return html`\n <p class=\"body-medium\">\n <b>\"${item.name}\"</b> will be deleted forever and you won't be able to restore it.\n </p>\n `;\n }\n\n protected renderDeleteMultiFile(items: TrashEntry[]): TemplateResult {\n return html`\n <p class=\"body-medium\">\n The following files will be deleted forever and you won't be able to restore them:\n </p>\n <ui-divider></ui-divider>\n <ul>\n ${items.map(i => html`<li>${i.name}</li>`)}\n </ul>\n <ui-divider></ui-divider>\n `;\n }\n}\n"]}
1
+ {"version":3,"file":"Trash.page.js","sourceRoot":"","sources":["../../../../src/pages/api-client/pages/Trash.page.ts"],"names":[],"mappings":"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","sourcesContent":["import { EventUtils, TrashEntry, ContextSpaceListOptions, IFile, BroadcastEvent, BroadcastCreatedEvent } from \"@api-client/core/build/browser.js\";\nimport { html, TemplateResult } from \"lit\";\nimport '@github/relative-time-element';\nimport { navigate } from \"../../../lib/route.js\";\nimport { SnackNotifications } from \"../../../ui/notification/SnackNotifications.js\";\nimport { DataTable } from \"../../../ui/table/DataTable.js\";\nimport { fileIcon } from \"../../../elements/store/FilesLib.js\";\nimport type ApiClientScreen from \"../ApiClient.screen.js\";\nimport '../../../define/ui/ui-icon.js';\n\n/**\n * A class that specializes in rendering the list of trash in HTTP Client.\n */\nexport class TrashPage {\n files: TrashEntry[] = [];\n\n /**\n * The pagination cursor for trash.\n * As long there's a cursor, there are more files to request.\n */\n cursor?: string;\n\n dt = new DataTable(() => this.files, { ariaLabel: 'Trashed files' });\n\n readingFiles?: boolean;\n\n /**\n * The list of keys of files to delete.\n */\n deleteKeys?: string[];\n\n get deleteItems(): TrashEntry[] {\n const { deleteKeys, files } = this;\n if (!deleteKeys) {\n return [];\n }\n const result: TrashEntry[] = [];\n deleteKeys.forEach((key) => {\n const item = files.find(i => i.key === key);\n if (item) {\n result.push(item);\n }\n });\n return result;\n }\n\n constructor(protected screen: ApiClientScreen) {\n this.dt.addEventListener('empty', this.renderEmptyTable.bind(this));\n this.dt.addEventListener('header', this.renderTableHeader.bind(this));\n this.dt.addEventListener('item', this.renderTableItem.bind(this));\n\n this.itemOptionsSelectHandler = this.itemOptionsSelectHandler.bind(this);\n this.cancelDeleteAllDialog = this.cancelDeleteAllDialog.bind(this);\n this.deleteAllHandler = this.deleteAllHandler.bind(this);\n this.cancelDeleteFilesDialog = this.cancelDeleteFilesDialog.bind(this);\n this.deleteFilesHandler = this.deleteFilesHandler.bind(this);\n this.openEmptyAllDialogHandler = this.openEmptyAllDialogHandler.bind(this);\n }\n\n handleFileEvent(event: BroadcastEvent): void {\n switch (event.operation) {\n case 'created': this.handleTrashAdded((event as BroadcastCreatedEvent).data as TrashEntry); break;\n case 'deleted': this.handleTrashRemoved(event.key as string); break;\n default:\n }\n }\n\n protected handleTrashAdded(item: TrashEntry): void {\n this.files.push(item);\n this.files.sort(this.filesSortFunction.bind(this));\n this.screen.render();\n }\n\n protected handleTrashRemoved(key: string): void {\n const index = this.files.findIndex(i => i.key === key);\n if (index === -1) {\n return;\n }\n this.files.splice(index, 1);\n this.screen.render();\n }\n\n async refresh(): Promise<void> {\n this.resetList();\n this.screen.render();\n await this.readFiles();\n }\n\n resetList(): void {\n this.files = [];\n this.cursor = undefined;\n }\n\n async readFiles(): Promise<void> {\n const { selectedSpace } = this.screen;\n if (!selectedSpace) {\n return;\n }\n if (this.readingFiles) {\n return;\n }\n this.readingFiles = true;\n const { cursor: currentCursor } = this;\n const opts: ContextSpaceListOptions = {\n space: selectedSpace,\n descending: true,\n };\n if (currentCursor) {\n opts.cursor = currentCursor;\n }\n try {\n const result = await this.screen.bindings.store.trash.list(opts);\n const { items, cursor } = result;\n this.files = this.files.concat(items).sort(this.filesSortFunction.bind(this));\n this.cursor = cursor;\n } finally {\n this.readingFiles = false;\n }\n this.screen.render();\n }\n\n /**\n * Sorts files on the list.\n * \n * Folders are always on top.\n */\n filesSortFunction(a: TrashEntry, b: TrashEntry): number {\n return b.info.time - a.info.time;\n }\n\n protected itemOptionsSelectHandler(e: CustomEvent): void {\n const item = e.detail.item as HTMLElement;\n const list = e.target as HTMLElement;\n const operation = item.dataset.option as string;\n const key = list.dataset.key as string;\n if (!key || !operation) {\n return;\n }\n if (operation === 'restore') {\n this.restoreItem(key);\n } else if (operation === 'delete') {\n this.deleteKeys = [key];\n this.screen.render();\n this.screen.openDialog('deleteFilesDialog');\n }\n }\n\n async restoreItem(key: string): Promise<void> {\n const { bindings, selectedSpace } = this.screen;\n if (!selectedSpace) {\n throw new Error(`Invalid state: Folder is not selected.`);\n }\n const record = await bindings.store.trash.restore(key);\n const file = record.item as IFile;\n const parentId = file.parents && file.parents.length ? file.parents[file.parents.length - 1] : undefined;\n SnackNotifications.notify(`Restored file: ${file.info.name}`, {\n actionLabel: 'Go to file location',\n actionCallback: () => {\n if (parentId) {\n navigate('files', parentId);\n } else {\n navigate('files');\n }\n },\n });\n }\n\n async deleteItem(key: string): Promise<void> {\n const { bindings, selectedSpace } = this.screen;\n if (!selectedSpace) {\n throw new Error(`Invalid state: Folder is not selected.`);\n }\n await bindings.store.trash.delete(key);\n }\n\n protected openEmptyAllDialogHandler(): void {\n this.screen.openDialog('deleteAllDialog');\n }\n\n protected cancelDeleteAllDialog(): void {\n this.screen.closeDialog('deleteAllDialog');\n }\n\n protected deleteAllHandler(): void {\n this.screen.closeDialog('deleteAllDialog');\n const { bindings, selectedSpace } = this.screen;\n if (!selectedSpace) {\n throw new Error(`Invalid state: Folder is not selected.`);\n }\n bindings.store.trash.empty(selectedSpace);\n }\n\n protected cancelDeleteFilesDialog(): void {\n this.deleteKeys = undefined;\n this.screen.closeDialog('deleteFilesDialog');\n }\n\n protected deleteFilesHandler(): void {\n this.screen.closeDialog('deleteFilesDialog');\n this.screen.render();\n const { deleteKeys } = this;\n this.deleteKeys = undefined;\n if (!deleteKeys || !deleteKeys.length) {\n return;\n }\n deleteKeys.forEach(k => this.deleteItem(k));\n }\n\n render(): TemplateResult {\n return html`\n <div class=\"section-header\">\n <h2 class=\"headline-small\">Trash</h2>\n <div class=\"spacer\"></div>\n ${this.renderEmptyTrash()}\n </div>\n ${this.renderTrashTable()}\n ${this.renderDeleteAllDialog()}\n ${this.renderDeleteFilesDialog()}\n `;\n }\n\n protected renderEmptyTrash(): TemplateResult {\n const { files } = this;\n const disabled = !files || !files.length;\n return html`\n <ui-button type=\"outlined\" ?disabled=\"${disabled}\" @click=\"${this.openEmptyAllDialogHandler}\">\n <ui-icon icon=\"deleteOutline\" slot=\"icon\"></ui-icon>\n Empty trash\n </ui-button>\n `;\n }\n\n protected renderTrashTable(): TemplateResult {\n return this.dt.render();\n }\n\n protected renderEmptyTable(): TemplateResult {\n return html`\n <p>The trash bin is empty.</p>\n `;\n }\n\n protected renderTableHeader(): TemplateResult[] {\n const name = this.dt.header('Name', { class: 'name-cell' });\n const deleted = this.dt.header('Deleted', { class: 'updated-cell' });\n const menu = this.dt.header(html`<span hidden>Menu</span>`, { class: 'menu-cell' });\n return [name, deleted, menu];\n }\n\n protected renderTableItem(item: TrashEntry): TemplateResult[] {\n const { kind, name, info } = item;\n const icon = fileIcon(item);\n\n const nameCell = this.dt.cell(html`\n ${icon ? html`<ui-icon icon=\"${icon}\" class=\"cell-icon\"></ui-icon>` : ''}\n ${name || 'Unnamed file'}\n `, { class: 'name-cell', data: { kind } });\n\n const deleted = this.dt.cell(html`\n <relative-time datetime=\"${new Date(info.time).toISOString()}\"></relative-time>\n `, { class: 'updated-cell' });\n\n const menu = this.dt.cell(this.renderItemOptions(item), { class: 'menu-cell' });\n\n return [nameCell, deleted, menu];\n }\n\n protected renderItemOptions(item: TrashEntry): TemplateResult {\n return html`\n <ui-dropdown-list\n horizontalAlign=\"auto\"\n verticalAlign=\"auto\"\n closeOnOutsideClick\n @mousedown=\"${EventUtils.cancelEvent}\" \n @mouseup=\"${EventUtils.cancelEvent}\" \n @click=\"${EventUtils.cancelEvent}\"\n @dblclick=\"${EventUtils.cancelEvent}\"\n @select=\"${this.itemOptionsSelectHandler}\"\n data-key=\"${item.key}\"\n >\n <ui-icon-button title=\"Project options\" aria-label=\"Activate for more options\">\n <ui-icon icon=\"moreVert\"></ui-icon>\n </ui-icon-button>\n <ui-list slot=\"dropdown\" role=\"menu\">\n <ui-list-item image=\"icon\" data-option=\"restore\" role=\"menuitem\" title=\"Restores the file to its original folder.\">\n <ui-icon icon=\"restoreFromTrash\" slot=\"start\"></ui-icon>\n Restore\n </ui-list-item>\n <ui-list-item image=\"icon\" data-option=\"delete\" role=\"menuitem\" title=\"Permanently deleted the item.\">\n <ui-icon icon=\"deleteOutline\" slot=\"start\"></ui-icon>\n Delete forever\n </ui-list-item>\n </ui-list>\n </ui-dropdown-list>\n `;\n }\n\n protected renderDeleteAllDialog(): TemplateResult {\n return html`\n <dialog id=\"deleteAllDialog\" class=\"warning\">\n <h3>Empty Trash?</h3>\n <div>\n <p class=\"body-medium\">\n This will permanently delete all files in the trash.\n </p>\n </div>\n <div class=\"dialog-buttons\">\n <ui-button type=\"text\" value=\"cancel\" @click=\"${this.cancelDeleteAllDialog}\">Cancel</ui-button>\n <ui-button type=\"text\" value=\"delete\" @click=\"${this.deleteAllHandler}\">Delete</ui-button>\n </div>\n </dialog>\n `;\n }\n\n protected renderDeleteFilesDialog(): TemplateResult {\n const { deleteItems } = this;\n return html`\n <dialog id=\"deleteFilesDialog\" class=\"warning\">\n <h3>Delete Forever?</h3>\n <div>\n ${deleteItems.length > 1 ? this.renderDeleteMultiFile(deleteItems) : this.renderDeleteSingleFile(deleteItems[0])}\n </div>\n <div class=\"dialog-buttons\">\n <ui-button type=\"text\" value=\"cancel\" @click=\"${this.cancelDeleteFilesDialog}\">Cancel</ui-button>\n <ui-button type=\"text\" value=\"delete\" @click=\"${this.deleteFilesHandler}\">Delete</ui-button>\n </div>\n </dialog>\n `;\n }\n\n protected renderDeleteSingleFile(item: TrashEntry): TemplateResult {\n if (!item) {\n return html`\n <p class=\"body-medium\">Invalid state. Couldn't find files to delete.</p>\n `;\n }\n return html`\n <p class=\"body-medium\">\n <b>\"${item.name}\"</b> will be deleted forever and you won't be able to restore it.\n </p>\n `;\n }\n\n protected renderDeleteMultiFile(items: TrashEntry[]): TemplateResult {\n return html`\n <p class=\"body-medium\">\n The following files will be deleted forever and you won't be able to restore them:\n </p>\n <ui-divider></ui-divider>\n <ul>\n ${items.map(i => html`<li>${i.name}</li>`)}\n </ul>\n <ui-divider></ui-divider>\n `;\n }\n}\n"]}
@@ -264,7 +264,7 @@ export default class UiDropdownList extends LitElement {
264
264
  }
265
265
  const event = new CustomEvent('select', {
266
266
  cancelable: true,
267
- composed: true,
267
+ // composed: true,
268
268
  detail: {
269
269
  item,
270
270
  },
@@ -1 +1 @@
1
- {"version":3,"file":"UiDropdownList.js","sourceRoot":"","sources":["../../../src/ui/list/UiDropdownList.ts"],"names":[],"mappings":"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","sourcesContent":["import { html, LitElement, PropertyValues, TemplateResult } from \"lit\";\nimport { property, queryAssignedElements, state } from \"lit/decorators.js\";\nimport { ClassInfo, classMap } from \"lit/directives/class-map.js\";\nimport { StyleInfo, styleMap } from \"lit/directives/style-map.js\";\nimport { randomString } from \"../../lib/Random.js\";\nimport { ElementPositioning, HorizontalAlignment, VerticalAlignment } from \"../lib/ElementPositioning.js\";\nimport { ScrollHelper } from \"../lib/ScrollHelper.js\";\n\nconst itemRole = ['menuitem', 'menuitemcheckbox', 'menuitemradio'];\n\nexport interface UiDropdownListSelection {\n item: HTMLElement;\n}\n\n/**\n * An overlay list rendered over a button.\n * \n * Examples:\n * \n * <ui-dropdown-list>\n * <ui-button>Click me</ui-button>\n * <ui-list slot=\"dropdown\" role=\"menu\">\n * <ui-list-item role=\"menuitem\">Item 1</ui-list-item>\n * <ui-list-item role=\"menuitem\">Item 2</ui-list-item>\n * </ui-list>\n * </ui-dropdown-list>\n * \n * @slot - The default slot for the dropdown trigger (button) \n * @slot dropdown - The slot for the list.\n * @fires select - Custom event with the selected item on the `detail.item` when the user selected an item. When the event is cancelled then there's no side effects (closing the dropdown)\n * @fires dropdownopen - An event informing other dropdowns that this one was opened and other should close.\n * @fires open - An event dispatched when the open state change through a user interaction\n */\nexport default class UiDropdownList extends LitElement {\n @queryAssignedElements()\n protected triggers!: HTMLElement[] | null;\n\n @queryAssignedElements({ slot: 'dropdown' })\n protected dropdowns!: HTMLElement[] | null;\n\n @state() protected triggerId = `ui-trigger-${randomString(4)}`;\n\n @state() protected menuId = `ui-menu-${randomString(4)}`;\n\n /**\n * Whether the menu is opened.\n * @attribute\n */\n @property({ type: Boolean, reflect: true }) open = false;\n\n /**\n * The vertical (y-axis) alignment of the dropdown content.\n * - top\n * - bottom\n * - middle\n * \n * No value means the natural position according to the box model.\n * @attribute\n */\n @property({ type: String, reflect: true }) verticalAlign?: VerticalAlignment;\n\n /**\n * The horizontal (x-axis) alignment of the dropdown content.\n * - top\n * - bottom\n * - middle\n * \n * No value means the natural position according to the box model.\n * @attribute\n */\n @property({ type: String, reflect: true }) horizontalAlign?: HorizontalAlignment;\n\n /**\n * Affects the `horizontal` and `vertical` positioning so that the target element does not overlap with the anchor.\n * For example, when the `vertical` align is `top`, the top edge of the target will be rendered at the bottom \n * of the anchor down to the edge of the viewport.\n * @attribute\n */\n @property({ type: Boolean, reflect: true }) noOverlap?: boolean;\n\n /**\n * When set it closes the opened list when registering a click outside the list.\n * @attribute\n */\n @property({ type: Boolean }) closeOnOutsideClick?: boolean;\n\n /**\n * When set it makes the drop-down to match the width of the trigger.\n * Be careful as this may crop the content when the trigger is not wide enough.\n * @attribute\n */\n @property({ type: Boolean }) matchTriggerWidth?: boolean;\n\n /**\n * When set it closes the drop-down when `tab` button is pressed.\n * This is not a default behavior since the drop-down content can have its own logic\n * related to tab index.\n */\n @property({ type: Boolean }) closeOnTab?: boolean;\n\n /**\n * The first element located in the default slot.\n */\n protected get trigger(): HTMLElement | null {\n const { triggers } = this;\n if (!triggers || !triggers.length) {\n return null;\n }\n const [button] = triggers;\n return button;\n }\n\n /**\n * The first element located in the \"dropdown\" slot.\n */\n protected get dropdown(): HTMLElement | null {\n const { dropdowns } = this;\n if (!dropdowns || !dropdowns.length) {\n return null;\n }\n const [content] = dropdowns;\n return content;\n }\n\n @state() protected overlayPositioning?: StyleInfo;\n\n constructor() {\n super();\n this.dropdownOpenHandler = this.dropdownOpenHandler.bind(this);\n this.scrollHandler = this.scrollHandler.bind(this);\n this.clickHandler = this.clickHandler.bind(this);\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n window.addEventListener('dropdownopen', this.dropdownOpenHandler);\n window.addEventListener('click', this.clickHandler, { capture: true });\n ScrollHelper.addListeners(this, this.scrollHandler);\n\n this.setAttribute('aria-haspopup', 'menu');\n this.setAttribute('aria-expanded', 'false');\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n window.removeEventListener('dropdownopen', this.dropdownOpenHandler);\n window.removeEventListener('click', this.clickHandler, { capture: true });\n ScrollHelper.removeListeners(this);\n }\n\n protected dropdownOpenHandler(e: Event): void {\n if (e.composedPath()[0] === this) {\n return;\n }\n this.close();\n }\n\n protected updateExpanded(): void {\n this.setAttribute('aria-expanded', String(this.open));\n }\n\n protected triggerChanged(): void {\n const { trigger } = this;\n if (!trigger) {\n return;\n }\n this.decorateTrigger(trigger);\n }\n\n protected dropdownChanged(): void {\n const { dropdown } = this;\n if (!dropdown) {\n return;\n }\n this.decorateDropdown(dropdown);\n }\n\n /**\n * Decorates the trigger with aria attributes.\n */\n protected decorateTrigger(button: HTMLElement): void {\n button.setAttribute('aria-controls', this.menuId);\n button.setAttribute('tabindex', '0');\n if (button.id) {\n this.triggerId = button.id;\n } else {\n // eslint-disable-next-line no-param-reassign\n button.id = this.triggerId;\n }\n }\n\n protected decorateDropdown(list: HTMLElement): void {\n if (!list.hasAttribute('role')) {\n list.setAttribute('role', 'menu');\n }\n if (!list.hasAttribute('aria-labelledby')) {\n list.setAttribute('aria-labelledby', this.triggerId);\n }\n list.setAttribute('tabindex', '-1');\n // eslint-disable-next-line no-param-reassign\n list.id = this.menuId;\n }\n\n protected triggerClickHandler(): void {\n this.open = !this.open;\n this.updateExpanded();\n this.notifyOpen();\n }\n\n protected triggerKeyDownHandler(e: KeyboardEvent): void {\n if (['Enter', 'Space', 'ArrowDown', 'ArrowUp'].includes(e.code)) {\n e.preventDefault();\n this.open = true;\n this.updateExpanded();\n this.notifyOpen();\n }\n }\n\n protected contentKeyDownHandler(e: KeyboardEvent): void {\n if (e.defaultPrevented) {\n return;\n }\n if (e.code === 'Escape') {\n this.close();\n } else if (e.code === 'Tab') {\n if (this.closeOnTab) {\n this.close();\n }\n } else if (['Enter', 'Space'].includes(e.code)) {\n this.activate(e);\n }\n }\n\n protected contentClickHandler(e: PointerEvent): void {\n this.activate(e);\n }\n\n close(): void {\n this.open = false;\n this.updateExpanded();\n this.notifyOpen();\n }\n\n protected contentCloseHandler(e: Event): void {\n e.stopPropagation();\n this.close();\n }\n\n protected override willUpdate(cp: PropertyValues<this>): void {\n super.willUpdate(cp);\n if ((cp.has('noOverlap') || cp.has('verticalAlign') || cp.has('horizontalAlign') || cp.has('open')) && this.open) {\n this.computePositioning();\n }\n }\n\n protected override updated(cp: PropertyValues<this>): void {\n super.updated(cp);\n if (cp.has('open')) {\n this.toggleOpened();\n }\n }\n\n /**\n * Since the container for the dropdown content is positioned as fixed\n * we need to position the dropdown according to the configured rules.\n */\n protected computePositioning(): void {\n const { trigger, dropdown } = this;\n if (!trigger || !dropdown) {\n return;\n }\n this.overlayPositioning = ElementPositioning.positionOverlay(dropdown, trigger, {\n horizontal: this.horizontalAlign,\n vertical: this.verticalAlign,\n noOverlap: this.noOverlap,\n constrain: true,\n constrainPaddingY: 20,\n matchAnchorWidth: this.matchTriggerWidth,\n });\n }\n\n protected scrollHandler(): void {\n if (this.open) {\n this.computePositioning();\n }\n }\n\n protected clickHandler(e: Event): void {\n if (!this.open || !this.closeOnOutsideClick) {\n return;\n }\n const inside = e.composedPath().some(i => i === this);\n if (inside) {\n return;\n }\n this.close();\n }\n\n protected toggleOpened(): void {\n const { open } = this;\n if (open) {\n this.handleOpened();\n } else {\n this.handleClosed();\n }\n }\n\n protected handleOpened(): void {\n const { trigger, dropdown } = this;\n if (trigger) {\n trigger.removeAttribute('tabindex');\n }\n if (dropdown) {\n dropdown.setAttribute('tabindex', '0');\n dropdown.focus();\n }\n }\n\n protected handleClosed(): void {\n const { trigger, dropdown } = this;\n if (trigger) {\n trigger.setAttribute('tabindex', '0');\n if (this.matches(':focus-within')) {\n trigger.focus();\n }\n }\n if (dropdown) {\n dropdown.removeAttribute('tabindex');\n }\n }\n\n protected activate(e: Event): void {\n if (e.defaultPrevented) {\n return;\n }\n const path = e.composedPath();\n let item: HTMLElement | undefined;\n while (!item) {\n const next = path.shift() as Element;\n if (next === this) {\n break;\n }\n if (next.nodeType !== Node.ELEMENT_NODE) {\n continue;\n }\n if (itemRole.includes(next.getAttribute('role') || '')) {\n item = next as HTMLElement;\n }\n }\n if (!item) {\n return;\n }\n const event = new CustomEvent<UiDropdownListSelection>('select', {\n cancelable: true,\n composed: true,\n detail: {\n item,\n },\n })\n this.dispatchEvent(event);\n if (event.defaultPrevented) {\n return;\n }\n this.close();\n }\n\n protected notifyOpen(): void {\n this.dispatchEvent(new Event('open'));\n if (this.open) {\n this.dispatchEvent(new Event('dropdownopen', {\n bubbles: true,\n composed: true,\n cancelable: true,\n }));\n }\n }\n\n protected override render(): TemplateResult {\n const classes: ClassInfo = {\n container: true,\n open: this.open,\n };\n \n return html`\n <div class=\"${classMap(classes)}\">\n ${this.renderTrigger()}\n ${this.renderContent()}\n </div>\n `;\n }\n\n protected renderTrigger(): TemplateResult {\n return html`\n <div \n class=\"trigger\" \n @click=\"${this.triggerClickHandler}\" \n @keydown=\"${this.triggerKeyDownHandler}\"\n ><slot @slotchange=\"${this.triggerChanged}\"></slot></div>\n `;\n }\n\n protected renderContent(): TemplateResult {\n const contentStyles = this.overlayPositioning || {};\n return html`\n <div \n class=\"content\" \n style=\"${styleMap(contentStyles)}\"\n >\n <slot \n name=\"dropdown\" \n @slotchange=\"${this.dropdownChanged}\" \n @keydown=\"${this.contentKeyDownHandler}\" \n @click=\"${this.contentClickHandler}\"\n @close=\"${this.contentCloseHandler}\"\n ></slot>\n </div>\n `;\n }\n}\n"]}
1
+ {"version":3,"file":"UiDropdownList.js","sourceRoot":"","sources":["../../../src/ui/list/UiDropdownList.ts"],"names":[],"mappings":"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","sourcesContent":["import { html, LitElement, PropertyValues, TemplateResult } from \"lit\";\nimport { property, queryAssignedElements, state } from \"lit/decorators.js\";\nimport { ClassInfo, classMap } from \"lit/directives/class-map.js\";\nimport { StyleInfo, styleMap } from \"lit/directives/style-map.js\";\nimport { randomString } from \"../../lib/Random.js\";\nimport { ElementPositioning, HorizontalAlignment, VerticalAlignment } from \"../lib/ElementPositioning.js\";\nimport { ScrollHelper } from \"../lib/ScrollHelper.js\";\n\nconst itemRole = ['menuitem', 'menuitemcheckbox', 'menuitemradio'];\n\nexport interface UiDropdownListSelection {\n item: HTMLElement;\n}\n\n/**\n * An overlay list rendered over a button.\n * \n * Examples:\n * \n * <ui-dropdown-list>\n * <ui-button>Click me</ui-button>\n * <ui-list slot=\"dropdown\" role=\"menu\">\n * <ui-list-item role=\"menuitem\">Item 1</ui-list-item>\n * <ui-list-item role=\"menuitem\">Item 2</ui-list-item>\n * </ui-list>\n * </ui-dropdown-list>\n * \n * @slot - The default slot for the dropdown trigger (button) \n * @slot dropdown - The slot for the list.\n * @fires select - Custom event with the selected item on the `detail.item` when the user selected an item. When the event is cancelled then there's no side effects (closing the dropdown)\n * @fires dropdownopen - An event informing other dropdowns that this one was opened and other should close.\n * @fires open - An event dispatched when the open state change through a user interaction\n */\nexport default class UiDropdownList extends LitElement {\n @queryAssignedElements()\n protected triggers!: HTMLElement[] | null;\n\n @queryAssignedElements({ slot: 'dropdown' })\n protected dropdowns!: HTMLElement[] | null;\n\n @state() protected triggerId = `ui-trigger-${randomString(4)}`;\n\n @state() protected menuId = `ui-menu-${randomString(4)}`;\n\n /**\n * Whether the menu is opened.\n * @attribute\n */\n @property({ type: Boolean, reflect: true }) open = false;\n\n /**\n * The vertical (y-axis) alignment of the dropdown content.\n * - top\n * - bottom\n * - middle\n * \n * No value means the natural position according to the box model.\n * @attribute\n */\n @property({ type: String, reflect: true }) verticalAlign?: VerticalAlignment;\n\n /**\n * The horizontal (x-axis) alignment of the dropdown content.\n * - top\n * - bottom\n * - middle\n * \n * No value means the natural position according to the box model.\n * @attribute\n */\n @property({ type: String, reflect: true }) horizontalAlign?: HorizontalAlignment;\n\n /**\n * Affects the `horizontal` and `vertical` positioning so that the target element does not overlap with the anchor.\n * For example, when the `vertical` align is `top`, the top edge of the target will be rendered at the bottom \n * of the anchor down to the edge of the viewport.\n * @attribute\n */\n @property({ type: Boolean, reflect: true }) noOverlap?: boolean;\n\n /**\n * When set it closes the opened list when registering a click outside the list.\n * @attribute\n */\n @property({ type: Boolean }) closeOnOutsideClick?: boolean;\n\n /**\n * When set it makes the drop-down to match the width of the trigger.\n * Be careful as this may crop the content when the trigger is not wide enough.\n * @attribute\n */\n @property({ type: Boolean }) matchTriggerWidth?: boolean;\n\n /**\n * When set it closes the drop-down when `tab` button is pressed.\n * This is not a default behavior since the drop-down content can have its own logic\n * related to tab index.\n */\n @property({ type: Boolean }) closeOnTab?: boolean;\n\n /**\n * The first element located in the default slot.\n */\n protected get trigger(): HTMLElement | null {\n const { triggers } = this;\n if (!triggers || !triggers.length) {\n return null;\n }\n const [button] = triggers;\n return button;\n }\n\n /**\n * The first element located in the \"dropdown\" slot.\n */\n protected get dropdown(): HTMLElement | null {\n const { dropdowns } = this;\n if (!dropdowns || !dropdowns.length) {\n return null;\n }\n const [content] = dropdowns;\n return content;\n }\n\n @state() protected overlayPositioning?: StyleInfo;\n\n constructor() {\n super();\n this.dropdownOpenHandler = this.dropdownOpenHandler.bind(this);\n this.scrollHandler = this.scrollHandler.bind(this);\n this.clickHandler = this.clickHandler.bind(this);\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n window.addEventListener('dropdownopen', this.dropdownOpenHandler);\n window.addEventListener('click', this.clickHandler, { capture: true });\n ScrollHelper.addListeners(this, this.scrollHandler);\n\n this.setAttribute('aria-haspopup', 'menu');\n this.setAttribute('aria-expanded', 'false');\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n window.removeEventListener('dropdownopen', this.dropdownOpenHandler);\n window.removeEventListener('click', this.clickHandler, { capture: true });\n ScrollHelper.removeListeners(this);\n }\n\n protected dropdownOpenHandler(e: Event): void {\n if (e.composedPath()[0] === this) {\n return;\n }\n this.close();\n }\n\n protected updateExpanded(): void {\n this.setAttribute('aria-expanded', String(this.open));\n }\n\n protected triggerChanged(): void {\n const { trigger } = this;\n if (!trigger) {\n return;\n }\n this.decorateTrigger(trigger);\n }\n\n protected dropdownChanged(): void {\n const { dropdown } = this;\n if (!dropdown) {\n return;\n }\n this.decorateDropdown(dropdown);\n }\n\n /**\n * Decorates the trigger with aria attributes.\n */\n protected decorateTrigger(button: HTMLElement): void {\n button.setAttribute('aria-controls', this.menuId);\n button.setAttribute('tabindex', '0');\n if (button.id) {\n this.triggerId = button.id;\n } else {\n // eslint-disable-next-line no-param-reassign\n button.id = this.triggerId;\n }\n }\n\n protected decorateDropdown(list: HTMLElement): void {\n if (!list.hasAttribute('role')) {\n list.setAttribute('role', 'menu');\n }\n if (!list.hasAttribute('aria-labelledby')) {\n list.setAttribute('aria-labelledby', this.triggerId);\n }\n list.setAttribute('tabindex', '-1');\n // eslint-disable-next-line no-param-reassign\n list.id = this.menuId;\n }\n\n protected triggerClickHandler(): void {\n this.open = !this.open;\n this.updateExpanded();\n this.notifyOpen();\n }\n\n protected triggerKeyDownHandler(e: KeyboardEvent): void {\n if (['Enter', 'Space', 'ArrowDown', 'ArrowUp'].includes(e.code)) {\n e.preventDefault();\n this.open = true;\n this.updateExpanded();\n this.notifyOpen();\n }\n }\n\n protected contentKeyDownHandler(e: KeyboardEvent): void {\n if (e.defaultPrevented) {\n return;\n }\n if (e.code === 'Escape') {\n this.close();\n } else if (e.code === 'Tab') {\n if (this.closeOnTab) {\n this.close();\n }\n } else if (['Enter', 'Space'].includes(e.code)) {\n this.activate(e);\n }\n }\n\n protected contentClickHandler(e: PointerEvent): void {\n this.activate(e);\n }\n\n close(): void {\n this.open = false;\n this.updateExpanded();\n this.notifyOpen();\n }\n\n protected contentCloseHandler(e: Event): void {\n e.stopPropagation();\n this.close();\n }\n\n protected override willUpdate(cp: PropertyValues<this>): void {\n super.willUpdate(cp);\n if ((cp.has('noOverlap') || cp.has('verticalAlign') || cp.has('horizontalAlign') || cp.has('open')) && this.open) {\n this.computePositioning();\n }\n }\n\n protected override updated(cp: PropertyValues<this>): void {\n super.updated(cp);\n if (cp.has('open')) {\n this.toggleOpened();\n }\n }\n\n /**\n * Since the container for the dropdown content is positioned as fixed\n * we need to position the dropdown according to the configured rules.\n */\n protected computePositioning(): void {\n const { trigger, dropdown } = this;\n if (!trigger || !dropdown) {\n return;\n }\n this.overlayPositioning = ElementPositioning.positionOverlay(dropdown, trigger, {\n horizontal: this.horizontalAlign,\n vertical: this.verticalAlign,\n noOverlap: this.noOverlap,\n constrain: true,\n constrainPaddingY: 20,\n matchAnchorWidth: this.matchTriggerWidth,\n });\n }\n\n protected scrollHandler(): void {\n if (this.open) {\n this.computePositioning();\n }\n }\n\n protected clickHandler(e: Event): void {\n if (!this.open || !this.closeOnOutsideClick) {\n return;\n }\n const inside = e.composedPath().some(i => i === this);\n if (inside) {\n return;\n }\n this.close();\n }\n\n protected toggleOpened(): void {\n const { open } = this;\n if (open) {\n this.handleOpened();\n } else {\n this.handleClosed();\n }\n }\n\n protected handleOpened(): void {\n const { trigger, dropdown } = this;\n if (trigger) {\n trigger.removeAttribute('tabindex');\n }\n if (dropdown) {\n dropdown.setAttribute('tabindex', '0');\n dropdown.focus();\n }\n }\n\n protected handleClosed(): void {\n const { trigger, dropdown } = this;\n if (trigger) {\n trigger.setAttribute('tabindex', '0');\n if (this.matches(':focus-within')) {\n trigger.focus();\n }\n }\n if (dropdown) {\n dropdown.removeAttribute('tabindex');\n }\n }\n\n protected activate(e: Event): void {\n if (e.defaultPrevented) {\n return;\n }\n const path = e.composedPath();\n let item: HTMLElement | undefined;\n while (!item) {\n const next = path.shift() as Element;\n if (next === this) {\n break;\n }\n if (next.nodeType !== Node.ELEMENT_NODE) {\n continue;\n }\n if (itemRole.includes(next.getAttribute('role') || '')) {\n item = next as HTMLElement;\n }\n }\n if (!item) {\n return;\n }\n const event = new CustomEvent<UiDropdownListSelection>('select', {\n cancelable: true,\n // composed: true,\n detail: {\n item,\n },\n })\n this.dispatchEvent(event);\n if (event.defaultPrevented) {\n return;\n }\n this.close();\n }\n\n protected notifyOpen(): void {\n this.dispatchEvent(new Event('open'));\n if (this.open) {\n this.dispatchEvent(new Event('dropdownopen', {\n bubbles: true,\n composed: true,\n cancelable: true,\n }));\n }\n }\n\n protected override render(): TemplateResult {\n const classes: ClassInfo = {\n container: true,\n open: this.open,\n };\n \n return html`\n <div class=\"${classMap(classes)}\">\n ${this.renderTrigger()}\n ${this.renderContent()}\n </div>\n `;\n }\n\n protected renderTrigger(): TemplateResult {\n return html`\n <div \n class=\"trigger\" \n @click=\"${this.triggerClickHandler}\" \n @keydown=\"${this.triggerKeyDownHandler}\"\n ><slot @slotchange=\"${this.triggerChanged}\"></slot></div>\n `;\n }\n\n protected renderContent(): TemplateResult {\n const contentStyles = this.overlayPositioning || {};\n return html`\n <div \n class=\"content\" \n style=\"${styleMap(contentStyles)}\"\n >\n <slot \n name=\"dropdown\" \n @slotchange=\"${this.dropdownChanged}\" \n @keydown=\"${this.contentKeyDownHandler}\" \n @click=\"${this.contentClickHandler}\"\n @close=\"${this.contentCloseHandler}\"\n ></slot>\n </div>\n `;\n }\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@api-client/ui",
3
- "version": "0.0.13",
3
+ "version": "0.0.14",
4
4
  "description": "UI for API Client.",
5
5
  "license": "CC-BY-2.0",
6
6
  "main": "dist/index.js",
@@ -49,7 +49,7 @@
49
49
  "idb-keyval": "^6.1.0",
50
50
  "lit": "^2.2.2",
51
51
  "marked": "^4.0.15",
52
- "monaco-editor": "^0.35.0",
52
+ "monaco-editor": "^0.36.0",
53
53
  "pouchdb": "^7.3.0",
54
54
  "prismjs": "^1.28.0"
55
55
  },
@@ -4,7 +4,7 @@ import styles from '../../elements/http/BodyEditor.styles.js';
4
4
 
5
5
  @customElement('http-body-editor')
6
6
  export class HttpBodyEditorElement extends Element {
7
- static override styles = [styles];
7
+ static override styles = [...styles];
8
8
  }
9
9
 
10
10
  declare global {
@@ -1,6 +1,7 @@
1
1
  import { css } from 'lit';
2
+ import typography from '../../styles/m3/typography.module.js';
2
3
 
3
- export default css`
4
+ export default [typography, css`
4
5
  :host {
5
6
  display: flex;
6
7
  flex-direction: column;
@@ -32,7 +33,8 @@ http-body-text-editor {
32
33
  background-color: #FFEB3B;
33
34
  color: #000;
34
35
  padding: 0 8px;
35
- border-radius: 8px;
36
+ border-radius: var(--md-sys-shape-corner-small);
37
+ margin-bottom: 20px;
36
38
  }
37
39
 
38
40
  .invalid-mime .warning-icon {
@@ -54,14 +56,6 @@ http-body-text-editor {
54
56
  .form-info {
55
57
  margin: 20px 0 0 0;
56
58
  color: var(--md-sys-color-on-surface);
57
- font-family: var(--md-sys-typescale-body-small-font-family-name);
58
- font-style: var(--md-sys-typescale-body-small-font-family-style);
59
- font-weight: var(--md-sys-typescale-body-small-font-weight);
60
- font-size: var(--md-sys-typescale-body-small-font-size);
61
- letter-spacing: var(--md-sys-typescale-body-small-tracking);
62
- line-height: var(--md-sys-typescale-body-small-height);
63
- text-transform: var(--md-sys-typescale-body-small-text-transform);
64
- text-decoration: var(--md-sys-typescale-body-small-text-decoration);
65
59
  }
66
60
 
67
61
  .file-picker {
@@ -73,13 +67,5 @@ http-body-text-editor {
73
67
  display: flex;
74
68
  align-items: center;
75
69
  margin-left: 8px;
76
- font-family: var(--md-sys-typescale-label-medium-font-family-name);
77
- font-style: var(--md-sys-typescale-label-medium-font-family-style);
78
- font-weight: var(--md-sys-typescale-label-medium-font-weight);
79
- font-size: var(--md-sys-typescale-label-medium-font-size);
80
- letter-spacing: var(--md-sys-typescale-label-medium-tracking);
81
- line-height: var(--md-sys-typescale-label-medium-height);
82
- text-transform: var(--md-sys-typescale-label-medium-text-transform);
83
- text-decoration: var(--md-sys-typescale-label-medium-text-decoration);
84
70
  }
85
- `;
71
+ `];
@@ -683,7 +683,7 @@ export default class BodyEditor extends ApiElement {
683
683
  >
684
684
  URL decode
685
685
  </ui-button>
686
- <label title="When set it automatically encodes the values before sending the request">
686
+ <label title="When set it automatically encodes the values before sending the request" class="label-medium">
687
687
  <ui-checkbox .checked="${autoEncode}" @change="${this.handleUrlEncodeAutoChange}"></ui-checkbox>
688
688
  Encode on send
689
689
  </label>
@@ -803,7 +803,7 @@ export default class BodyEditor extends ApiElement {
803
803
 
804
804
  protected renderFormInfo(): TemplateResult {
805
805
  return html`
806
- <p class="form-info">
806
+ <p class="form-info body-small">
807
807
  Note that the content-type header will be added when the request is sent.
808
808
  </p>
809
809
  `;
@@ -829,7 +829,7 @@ export default class BodyEditor extends ApiElement {
829
829
  const { value } = this;
830
830
  const { size, name } = value as File;
831
831
  return html`
832
- <div class="file-info">
832
+ <div class="file-info label-medium">
833
833
  <span class="file-name">${name || 'unknown name'}</span>
834
834
  <span class="file-size">${size} bytes</span>
835
835
  <ui-icon-button
@@ -850,7 +850,7 @@ export default class BodyEditor extends ApiElement {
850
850
  }
851
851
  const id = this.invalidMimeMessage;
852
852
  return html`
853
- <div class="invalid-mime">
853
+ <div class="invalid-mime body-medium">
854
854
  <ui-icon icon="warning" class="warning-icon"></ui-icon>
855
855
  ${id === 1 ? this.renderFixableInvalidMime('multipart/form-data') : ''}
856
856
  ${id === 2 ? this.renderFixableInvalidMime('application/x-www-form-urlencoded') : ''}
@@ -863,7 +863,7 @@ export default class BodyEditor extends ApiElement {
863
863
  */
864
864
  protected renderFixableInvalidMime(suggested: string): TemplateResult {
865
865
  return html`
866
- <p class="message">
866
+ <p class="message body-medium">
867
867
  The <code>content-type</code> header has different value than <b>${suggested}</b>.
868
868
  </p>
869
869
  <ui-button class="fix" type="tonal" title="Updates the content type header for the request" @click="${this.autoFixMime}">Fix</ui-button>
@@ -1,4 +1,4 @@
1
- import { CertificateFileKind, DataFileKind, FolderKind, IFile, ProjectKind } from "@api-client/core/build/browser.js";
1
+ import { CertificateFileKind, DataFileKind, FolderKind, IFile, ProjectKind, TrashEntry } from "@api-client/core/build/browser.js";
2
2
  import { IconType } from "../../ui/icons/Icons.js";
3
3
 
4
4
  /**
@@ -19,7 +19,7 @@ export function filesSortFunction(a: IFile, b: IFile): number {
19
19
  return b.lastModified.time - a.lastModified.time;
20
20
  }
21
21
 
22
- export function fileIcon(item: IFile): IconType | undefined {
22
+ export function fileIcon(item: IFile | TrashEntry): IconType | undefined {
23
23
  let icon: IconType | undefined;
24
24
  switch (item.kind) {
25
25
  case DataFileKind: icon = 'schema'; break;
@@ -12,7 +12,7 @@ export class Cursor {
12
12
  async decodeCursor(cursor: string): Promise<IListState> {
13
13
  let result: IListState;
14
14
  try {
15
- const decoded = atob(cursor);
15
+ const decoded = window.atob(cursor);
16
16
  result = JSON.parse(decoded);
17
17
  } catch (e) {
18
18
  throw new ApiError(`Invalid page cursor.`, 400);
@@ -27,6 +27,6 @@ export class Cursor {
27
27
  */
28
28
  async encodeCursor(state: object): Promise<string> {
29
29
  const str = JSON.stringify(state);
30
- return btoa(str);
30
+ return window.btoa(str);
31
31
  }
32
32
  }
@@ -3,7 +3,7 @@ import { ContextListOptions } from '@api-client/core/build/browser.js';
3
3
  import { HttpClientPersistance } from "./HttpClientPersistance.js";
4
4
  import { Cursor } from './Cursor.js';
5
5
  import { IListState } from './State.js';
6
- import { HttpClientDB, SpaceStoreNames, StoreName } from './types.js';
6
+ import { HttpClientDB, StoreName } from './types.js';
7
7
  import { IdbUrlHistory } from './idb/IdbUrlHistory.js';
8
8
  import { IdbWsHistory } from './idb/IdbWsHistory.js';
9
9
  import { IdbProjectUi } from './idb/IdbProjectUi.js';
@@ -132,9 +132,7 @@ export class HttpClientIdbDatabase implements HttpClientPersistance {
132
132
  const dbResult = await openDB<HttpClientDB>('HttpClient', 1, {
133
133
  upgrade: (db) => {
134
134
  const stores: StoreName[] = [
135
- 'UrlHistory', 'WsHistory',
136
- 'AuthCache', 'Hosts', 'Environments',
137
- 'ProjectUi',
135
+ 'UrlHistory', 'WsHistory', 'ProjectUi',
138
136
  ];
139
137
  const names = db.objectStoreNames;
140
138
  for (const name of stores) {
@@ -143,7 +141,7 @@ export class HttpClientIdbDatabase implements HttpClientPersistance {
143
141
  if (typeof this[fnName] === 'function') {
144
142
  this[fnName](db, exists);
145
143
  } else if (!exists) {
146
- this._defaultUpgradeHandler(name as SpaceStoreNames, db, exists);
144
+ this._defaultUpgradeHandler(name as StoreName, db, exists);
147
145
  }
148
146
  }
149
147
  },
@@ -157,13 +155,11 @@ export class HttpClientIdbDatabase implements HttpClientPersistance {
157
155
  * @param name The store name to create
158
156
  * @param db The handler to the database
159
157
  */
160
- private _defaultUpgradeHandler(name: SpaceStoreNames, db: IDBPDatabase<HttpClientDB>, storeExists: boolean): void {
158
+ private _defaultUpgradeHandler(name: StoreName, db: IDBPDatabase<HttpClientDB>, storeExists: boolean): void {
161
159
  if (storeExists) {
162
160
  return;
163
161
  }
164
- const store = db.createObjectStore(name, { keyPath: 'data.key' });
165
- const typed = store as IDBPObjectStore<HttpClientDB, SpaceStoreNames[], SpaceStoreNames, 'versionchange'>;
166
- typed.createIndex('space', 'meta.space', { unique: false });
162
+ db.createObjectStore(name, { keyPath: 'data.key' });
167
163
  }
168
164
 
169
165
  private _UrlHistoryUpgradeHandler(db: IDBPDatabase<HttpClientDB>, storeExists: boolean): void {
@@ -1,4 +1,4 @@
1
- import { ContextSpaceListOptions, HistoryListOptions, IProjectExecutionListOptions } from "@api-client/core/build/browser.js";
1
+ import { ContextSpaceListOptions } from "@api-client/core/build/browser.js";
2
2
 
3
3
  export interface CursorState {
4
4
  /**
@@ -14,7 +14,3 @@ export interface CursorState {
14
14
  }
15
15
 
16
16
  export type IListState = ContextSpaceListOptions & CursorState;
17
-
18
- export type HistoryState = HistoryListOptions & CursorState;
19
-
20
- export type ProjectRunsState = IProjectExecutionListOptions & CursorState;
@@ -1,6 +1,5 @@
1
1
  import { IDBPDatabase } from "idb";
2
- import { HttpClientDB, IStoredEntity, StoreName } from "../types.js";
3
- import { IListState } from "../State.js";
2
+ import { HttpClientDB } from "../types.js";
4
3
  import { HttpClientIdbDatabase } from "../HttpClientIdbDatabase.js";
5
4
 
6
5
  export abstract class IdbStore {
@@ -24,53 +23,4 @@ export abstract class IdbStore {
24
23
  async cleanup(): Promise<void> {
25
24
  //
26
25
  }
27
-
28
- /**
29
- * Lists entities that uses `IStoredEntity` format.
30
- * @param db A reference to the database
31
- * @param storeName The name of the store to query.
32
- * @param opts Query options.
33
- * @returns The list of listed objects.
34
- */
35
- protected async listStoredEntities(db: IDBPDatabase<HttpClientDB>, storeName: StoreName, opts: IListState): Promise<unknown[]> {
36
- let adv = opts.skip || 0;
37
- const { descending, limit = this.parent.defaultLimit, lastKey, space } = opts;
38
- const tx = db.transaction(storeName, 'readonly');
39
- const dir = descending === true ? 'prev' : 'next';
40
- let keyFound = false;
41
- const items: unknown[] = [];
42
- for await (const cursor of tx.store.iterate(null, dir)) {
43
- const info = cursor.value as IStoredEntity;
44
- if (!info.meta || !info.data) {
45
- continue;
46
- }
47
- const { meta, data } = info;
48
- if (space && meta.space !== space) {
49
- continue;
50
- }
51
- const { key } = data as { key: string };
52
- if (!key) {
53
- continue;
54
- }
55
- if (lastKey && !keyFound) {
56
- if (key !== lastKey) {
57
- continue;
58
- }
59
- keyFound = true;
60
- }
61
- if (adv) {
62
- cursor.advance(adv);
63
- adv = 0;
64
- continue;
65
- }
66
- if (meta.deleted) {
67
- continue;
68
- }
69
- items.push(data);
70
- if (items.length >= limit) {
71
- break;
72
- }
73
- }
74
- return items;
75
- }
76
26
  }
@@ -1,52 +1,12 @@
1
- import {
2
- IAuthorizationData, IEnvironment, IHostRule,
3
- IRequestUiMeta, IUrl,
4
- } from '@api-client/core/build/browser.js';
1
+ import { IRequestUiMeta, IUrl } from '@api-client/core/build/browser.js';
5
2
  import { DBSchema } from 'idb/with-async-ittr';
6
3
 
7
- export interface IEntityMeta {
8
- /**
9
- * The space this object belongs to.
10
- */
11
- space: string;
12
- /**
13
- * Whether the entity is deleted.
14
- */
15
- deleted?: boolean;
16
- /**
17
- * A timestamp when the entity was deleted.
18
- * Can be used to cleanup the store after some time.
19
- */
20
- deleteTime?: number;
21
- }
22
-
23
- export interface IStoredEntity<T = unknown> {
24
- meta: IEntityMeta;
25
- data: T;
26
- }
27
-
28
- export interface IGetOptions {
29
- /**
30
- * Whether to return a deleted document.
31
- */
32
- deleted?: boolean;
33
- }
34
-
35
- export interface IStoredMedia<T = unknown> {
36
- key: string;
37
- value: T;
38
- mime: string;
39
- deleted?: boolean;
40
- }
41
-
42
4
  export interface IStoredRequestUi {
43
5
  data: IRequestUiMeta;
44
6
  meta: { key: string; project: string; }
45
7
  }
46
8
 
47
- export type SpaceStoreNames = 'AuthCache' | 'Hosts' | 'Environments';
48
- export type GeneralStoreNames = 'UrlHistory' | 'WsHistory' | 'ProjectUi';
49
- export type StoreName = GeneralStoreNames | SpaceStoreNames;
9
+ export type StoreName = 'UrlHistory' | 'WsHistory' | 'ProjectUi';
50
10
 
51
11
  export interface HttpClientDB extends DBSchema {
52
12
  UrlHistory: {
@@ -57,21 +17,6 @@ export interface HttpClientDB extends DBSchema {
57
17
  key: string;
58
18
  value: IUrl;
59
19
  }
60
- AuthCache: {
61
- key: string;
62
- value: IStoredEntity<IAuthorizationData>;
63
- indexes: { 'space': string };
64
- }
65
- Hosts: {
66
- key: string;
67
- value: IStoredEntity<IHostRule>;
68
- indexes: { 'space': string };
69
- }
70
- Environments: {
71
- key: string;
72
- value: IStoredEntity<IEnvironment>;
73
- indexes: { 'space': string };
74
- }
75
20
  ProjectUi: {
76
21
  key: string[];
77
22
  value: IStoredRequestUi;
package/src/index.ts CHANGED
@@ -31,6 +31,9 @@ export * from './bindings/base/ProxyBindings.js';
31
31
  export * from './bindings/base/SharedWorkerThread.js';
32
32
  export * from './bindings/base/StoreBindings.js';
33
33
 
34
+ // HTTP Client IDB
35
+ export * from './http-client/store/HttpClientIdbDatabase.js';
36
+
34
37
  // Events
35
38
 
36
39
  export { Events } from './events/Events.js';
@@ -2,7 +2,6 @@
2
2
  import { html, TemplateResult, CSSResult, nothing } from 'lit';
3
3
  import { BroadcastCreatedEvent, BroadcastEvent, IFile, ISpace, uuidV4 } from '@api-client/core/build/browser.js';
4
4
  import { ApplicationInit, ApplicationScreen } from '../ApplicationScreen.js';
5
- import { IRoute, IRouteResult } from '../../mixins/RouteMixin.js';
6
5
  import pageStyles from './ApiClient.styles.js';
7
6
  import globalStyles from '../../styles/global-styles.js';
8
7
  import typography from '../../styles/m3/typography.module.js';
@@ -11,15 +10,16 @@ import dialogStyles from '../../styles/m3/dialog.module.js';
11
10
  import { navigate } from '../../lib/route.js';
12
11
  import { reactive } from '../../lib/decorators.js';
13
12
  import { DataTable } from '../../ui/table/DataTable.js';
14
- import Input from '../../ui/input/Input.js';
15
13
  import { FilesPage } from './pages/Files.page.js';
16
14
  import { SharedPage } from './pages/Shared.page.js';
17
15
  import { TrashPage } from './pages/Trash.page.js';
18
16
  import { SettingsPage } from './pages/Settings.page.js';
19
- import { HttpClientStoreBindings } from '../../bindings/base/HttpClientStoreBindings.js';
17
+ import type { IRoute, IRouteResult } from '../../mixins/RouteMixin.js';
18
+ import type Input from '../../ui/input/Input.js';
19
+ import type { HttpClientStoreBindings } from '../../bindings/base/HttpClientStoreBindings.js';
20
+ import type { NavigationBindings } from '../../bindings/base/NavigationBindings.js';
21
+ import type { FileBindings } from '../../bindings/base/FileBindings.js';
20
22
  import { StoreBroadcast } from '../../http-client/store/StoreBroadcast.js';
21
- import { NavigationBindings } from '../../bindings/base/NavigationBindings.js';
22
- import { FileBindings } from '../../bindings/base/FileBindings.js';
23
23
  import AppInfo from './AppInfo.js';
24
24
  import '../../define/ui/ui-button.js';
25
25
  import '../../define/app-navigation-item.js';
@@ -196,7 +196,7 @@ export default class ApiClientScreen extends ApplicationScreen {
196
196
  protected async createLastSpaceStoreKey(): Promise<string | undefined> {
197
197
  try {
198
198
  const env = await this.bindings.store.global.get();
199
- return `http-client.latest.space.${env.key}`;
199
+ return `api-client.latest.space.${env.key}`;
200
200
  } catch (_) {
201
201
  return undefined;
202
202
  }
@@ -547,7 +547,7 @@ export default class ApiClientScreen extends ApplicationScreen {
547
547
  const { page, isSingleUser } = this;
548
548
  return html`
549
549
  <nav aria-label="Main">
550
- <h1 class="title-small nav-title">HTTP Client</h1>
550
+ <h1 class="title-small nav-title">API Client</h1>
551
551
  <ol class="nav-list">
552
552
  <li>
553
553
  <app-navigation-item data-page="files" .selected=${page === 'files'} @click="${this.mainNavHandler}">