Compare commits

...

12 Commits

Author SHA1 Message Date
25cbf9bfdd v3.49.0
Some checks failed
Default (tags) / security (push) Failing after 1s
Default (tags) / test (push) Failing after 0s
Default (tags) / release (push) Has been skipped
Default (tags) / metadata (push) Has been skipped
2026-03-18 15:28:21 +00:00
4d8ba1fefc feat(dataview-statusobject): add last updated footer to status object and refresh demo data 2026-03-18 15:28:21 +00:00
42317459ff v3.48.5
Some checks failed
Default (tags) / security (push) Failing after 1s
Default (tags) / test (push) Failing after 1s
Default (tags) / release (push) Has been skipped
Default (tags) / metadata (push) Has been skipped
2026-03-14 17:39:34 +00:00
932db338c6 fix(repo): no changes to commit 2026-03-14 17:39:34 +00:00
bc4b87b83a v3.48.4
Some checks failed
Default (tags) / security (push) Failing after 1s
Default (tags) / test (push) Failing after 1s
Default (tags) / release (push) Has been skipped
Default (tags) / metadata (push) Has been skipped
2026-03-14 17:10:20 +00:00
eb055e7214 fix(storage-browser): rename S3-specific storage browser interfaces to generic storage types 2026-03-14 17:10:20 +00:00
c55eb948fe v3.48.3
Some checks failed
Default (tags) / security (push) Failing after 1s
Default (tags) / test (push) Failing after 1s
Default (tags) / release (push) Has been skipped
Default (tags) / metadata (push) Has been skipped
2026-03-14 16:29:46 +00:00
35779209ea fix(dataview): rename dees-s3-browser exports and custom elements to dees-storage-browser 2026-03-14 16:29:46 +00:00
8c6738ea15 v3.48.2
Some checks failed
Default (tags) / security (push) Failing after 1s
Default (tags) / test (push) Failing after 1s
Default (tags) / release (push) Has been skipped
Default (tags) / metadata (push) Has been skipped
2026-03-12 20:11:52 +00:00
e7da1d8b44 fix(repo): no changes to commit 2026-03-12 20:11:52 +00:00
358d82e7fa v3.48.1
Some checks failed
Default (tags) / security (push) Failing after 1s
Default (tags) / test (push) Failing after 1s
Default (tags) / release (push) Has been skipped
Default (tags) / metadata (push) Has been skipped
2026-03-12 20:04:12 +00:00
6452e05e1d fix(repo): no changes to commit 2026-03-12 20:04:12 +00:00
15 changed files with 159 additions and 81 deletions

View File

@@ -1,5 +1,39 @@
# Changelog # Changelog
## 2026-03-18 - 3.49.0 - feat(dataview-statusobject)
add last updated footer to status object and refresh demo data
- Render a bottom bar that shows the status object's lastUpdated timestamp when available.
- Adjust detail row padding to keep spacing consistent with the new footer layout.
- Update demo status objects to include lastUpdated examples for current, hourly, and daily timestamps.
- Bump @tsclass/tsclass from ^9.3.0 to ^9.5.0.
## 2026-03-14 - 3.48.5 - fix(repo)
no changes to commit
## 2026-03-14 - 3.48.4 - fix(storage-browser)
rename S3-specific storage browser interfaces to generic storage types
- Replaces IS3DataProvider, IS3Object, and IS3ChangeEvent with generic storage interface names across storage browser components
- Updates demo provider naming and user-facing demo text from S3 browser to Storage browser
- Aligns interface and utility comments with storage-agnostic terminology
## 2026-03-14 - 3.48.3 - fix(dataview)
rename dees-s3-browser exports and custom elements to dees-storage-browser
- Replaces the dees-s3-browser module path with dees-storage-browser in dataview exports
- Renames the main custom element from dees-s3-browser to dees-storage-browser
- Renames related columns, keys, preview, demo, interfaces, and utility entry points under the new storage-browser module
## 2026-03-12 - 3.48.2 - fix(repo)
no changes to commit
## 2026-03-12 - 3.48.1 - fix(repo)
no changes to commit
## 2026-03-12 - 3.48.0 - feat(dataview) ## 2026-03-12 - 3.48.0 - feat(dataview)
add an S3 browser component with column and list views, file preview, editing, and object management add an S3 browser component with column and list views, file preview, editing, and object management

View File

@@ -1,6 +1,6 @@
{ {
"name": "@design.estate/dees-catalog", "name": "@design.estate/dees-catalog",
"version": "3.48.0", "version": "3.49.0",
"private": false, "private": false,
"description": "A comprehensive library that provides dynamic web components for building sophisticated and modern web applications using JavaScript and TypeScript.", "description": "A comprehensive library that provides dynamic web components for building sophisticated and modern web applications using JavaScript and TypeScript.",
"main": "dist_ts_web/index.js", "main": "dist_ts_web/index.js",
@@ -33,7 +33,7 @@
"@tiptap/extension-typography": "^2.23.0", "@tiptap/extension-typography": "^2.23.0",
"@tiptap/extension-underline": "^2.23.0", "@tiptap/extension-underline": "^2.23.0",
"@tiptap/starter-kit": "^2.23.0", "@tiptap/starter-kit": "^2.23.0",
"@tsclass/tsclass": "^9.3.0", "@tsclass/tsclass": "^9.5.0",
"apexcharts": "^5.10.3", "apexcharts": "^5.10.3",
"highlight.js": "11.11.1", "highlight.js": "11.11.1",
"ibantools": "^4.5.1", "ibantools": "^4.5.1",

52
pnpm-lock.yaml generated
View File

@@ -60,8 +60,8 @@ importers:
specifier: ^2.23.0 specifier: ^2.23.0
version: 2.27.2 version: 2.27.2
'@tsclass/tsclass': '@tsclass/tsclass':
specifier: ^9.3.0 specifier: ^9.5.0
version: 9.3.0 version: 9.5.0
apexcharts: apexcharts:
specifier: ^5.10.3 specifier: ^5.10.3
version: 5.10.3 version: 5.10.3
@@ -1867,8 +1867,8 @@ packages:
'@tsclass/tsclass@4.4.4': '@tsclass/tsclass@4.4.4':
resolution: {integrity: sha512-YZOAF+u+r4u5rCev2uUd1KBTBdfyFdtDmcv4wuN+864lMccbdfRICR3SlJwCfYS1lbeV3QNLYGD30wjRXgvCJA==} resolution: {integrity: sha512-YZOAF+u+r4u5rCev2uUd1KBTBdfyFdtDmcv4wuN+864lMccbdfRICR3SlJwCfYS1lbeV3QNLYGD30wjRXgvCJA==}
'@tsclass/tsclass@9.3.0': '@tsclass/tsclass@9.5.0':
resolution: {integrity: sha512-KD3oTUN3RGu67tgjNHgWWZGsdYipr1RUDxQ9MMKSgIJ6oNZ4q5m2rg0ibrgyHWkAjTPlHVa6kHP3uVOY+8bnHw==} resolution: {integrity: sha512-HwMVwkrBnEFMjwOsMkGwWN/q+XEczSpf4a/PBAXgkDdV6sXdxAMFXUH1tW8Y5ecuvXFYMvFry4X57MCCT7Dm8A==}
'@tybys/wasm-util@0.10.1': '@tybys/wasm-util@0.10.1':
resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==}
@@ -3750,6 +3750,10 @@ packages:
os: [darwin, linux, win32, freebsd, openbsd, netbsd, sunos, android] os: [darwin, linux, win32, freebsd, openbsd, netbsd, sunos, android]
hasBin: true hasBin: true
tagged-tag@1.0.0:
resolution: {integrity: sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==}
engines: {node: '>=20'}
tar-fs@3.1.2: tar-fs@3.1.2:
resolution: {integrity: sha512-QGxxTxxyleAdyM3kpFs14ymbYmNFrfY+pHj7Z8FgtbZ7w2//VAgLMac7sT6nRpIHjppXO2AwwEOg0bPFVRcmXw==} resolution: {integrity: sha512-QGxxTxxyleAdyM3kpFs14ymbYmNFrfY+pHj7Z8FgtbZ7w2//VAgLMac7sT6nRpIHjppXO2AwwEOg0bPFVRcmXw==}
@@ -3833,6 +3837,10 @@ packages:
resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==}
engines: {node: '>=16'} engines: {node: '>=16'}
type-fest@5.4.4:
resolution: {integrity: sha512-JnTrzGu+zPV3aXIUhnyWJj4z/wigMsdYajGLIYakqyOW1nPllzXEJee0QQbHj+CTIQtXGlAjuK0UY+2xTyjVAw==}
engines: {node: '>=20'}
typed-query-selector@2.12.1: typed-query-selector@2.12.1:
resolution: {integrity: sha512-uzR+FzI8qrUEIu96oaeBJmd9E7CFEiQ3goA5qCVgc4s5llSubcfGHq9yUstZx/k4s9dXHVKsE35YWoFyvEqEHA==} resolution: {integrity: sha512-uzR+FzI8qrUEIu96oaeBJmd9E7CFEiQ3goA5qCVgc4s5llSubcfGHq9yUstZx/k4s9dXHVKsE35YWoFyvEqEHA==}
@@ -4072,7 +4080,7 @@ snapshots:
'@push.rocks/taskbuffer': 3.5.0 '@push.rocks/taskbuffer': 3.5.0
'@push.rocks/webrequest': 4.0.5 '@push.rocks/webrequest': 4.0.5
'@push.rocks/webstore': 2.0.20 '@push.rocks/webstore': 2.0.20
'@tsclass/tsclass': 9.3.0 '@tsclass/tsclass': 9.5.0
lit: 3.3.2 lit: 3.3.2
transitivePeerDependencies: transitivePeerDependencies:
- '@nuxt/kit' - '@nuxt/kit'
@@ -4578,7 +4586,7 @@ snapshots:
'@tiptap/extension-typography': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2)) '@tiptap/extension-typography': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))
'@tiptap/extension-underline': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2)) '@tiptap/extension-underline': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))
'@tiptap/starter-kit': 2.27.2 '@tiptap/starter-kit': 2.27.2
'@tsclass/tsclass': 9.3.0 '@tsclass/tsclass': 9.5.0
apexcharts: 5.10.3 apexcharts: 5.10.3
highlight.js: 11.11.1 highlight.js: 11.11.1
ibantools: 4.5.1 ibantools: 4.5.1
@@ -5571,7 +5579,7 @@ snapshots:
'@push.rocks/smartstring': 4.1.0 '@push.rocks/smartstring': 4.1.0
'@push.rocks/smartunique': 3.0.9 '@push.rocks/smartunique': 3.0.9
'@push.rocks/taskbuffer': 3.5.0 '@push.rocks/taskbuffer': 3.5.0
'@tsclass/tsclass': 9.3.0 '@tsclass/tsclass': 9.5.0
transitivePeerDependencies: transitivePeerDependencies:
- '@nuxt/kit' - '@nuxt/kit'
- aws-crt - aws-crt
@@ -5597,7 +5605,7 @@ snapshots:
'@push.rocks/smartjson': 5.2.0 '@push.rocks/smartjson': 5.2.0
'@push.rocks/smartpath': 6.0.0 '@push.rocks/smartpath': 6.0.0
'@push.rocks/smartpromise': 4.2.3 '@push.rocks/smartpromise': 4.2.3
'@tsclass/tsclass': 9.3.0 '@tsclass/tsclass': 9.5.0
mongodb: 6.21.0(socks@2.8.7) mongodb: 6.21.0(socks@2.8.7)
transitivePeerDependencies: transitivePeerDependencies:
- '@aws-sdk/credential-providers' - '@aws-sdk/credential-providers'
@@ -5618,7 +5626,7 @@ snapshots:
'@push.rocks/smartpromise': 4.2.3 '@push.rocks/smartpromise': 4.2.3
'@push.rocks/smartrx': 3.0.10 '@push.rocks/smartrx': 3.0.10
'@push.rocks/taskbuffer': 3.5.0 '@push.rocks/taskbuffer': 3.5.0
'@tsclass/tsclass': 9.3.0 '@tsclass/tsclass': 9.5.0
transitivePeerDependencies: transitivePeerDependencies:
- '@nuxt/kit' - '@nuxt/kit'
- react - react
@@ -5690,7 +5698,7 @@ snapshots:
'@push.rocks/smartstream': 3.4.0 '@push.rocks/smartstream': 3.4.0
'@push.rocks/smartstring': 4.1.0 '@push.rocks/smartstring': 4.1.0
'@push.rocks/smartunique': 3.0.9 '@push.rocks/smartunique': 3.0.9
'@tsclass/tsclass': 9.3.0 '@tsclass/tsclass': 9.5.0
transitivePeerDependencies: transitivePeerDependencies:
- aws-crt - aws-crt
@@ -5742,7 +5750,7 @@ snapshots:
'@push.rocks/smarttime': 4.2.3 '@push.rocks/smarttime': 4.2.3
'@push.rocks/smartunique': 3.0.9 '@push.rocks/smartunique': 3.0.9
'@push.rocks/taskbuffer': 3.5.0 '@push.rocks/taskbuffer': 3.5.0
'@tsclass/tsclass': 9.3.0 '@tsclass/tsclass': 9.5.0
mongodb: 6.21.0(socks@2.8.7) mongodb: 6.21.0(socks@2.8.7)
transitivePeerDependencies: transitivePeerDependencies:
- '@aws-sdk/credential-providers' - '@aws-sdk/credential-providers'
@@ -5770,7 +5778,7 @@ snapshots:
'@push.rocks/smartenv': 6.0.0 '@push.rocks/smartenv': 6.0.0
'@push.rocks/smartpromise': 4.2.3 '@push.rocks/smartpromise': 4.2.3
'@push.rocks/smartrust': 1.3.1 '@push.rocks/smartrust': 1.3.1
'@tsclass/tsclass': 9.3.0 '@tsclass/tsclass': 9.5.0
acme-client: 5.4.0 acme-client: 5.4.0
minimatch: 10.2.4 minimatch: 10.2.4
transitivePeerDependencies: transitivePeerDependencies:
@@ -5809,7 +5817,7 @@ snapshots:
'@push.rocks/smartfeed@1.4.0': '@push.rocks/smartfeed@1.4.0':
dependencies: dependencies:
'@tsclass/tsclass': 9.3.0 '@tsclass/tsclass': 9.5.0
fast-xml-parser: 4.5.4 fast-xml-parser: 4.5.4
'@push.rocks/smartfile-interfaces@1.0.7': {} '@push.rocks/smartfile-interfaces@1.0.7': {}
@@ -5951,7 +5959,7 @@ snapshots:
'@push.rocks/smartpromise': 4.2.3 '@push.rocks/smartpromise': 4.2.3
'@push.rocks/smarttime': 4.2.3 '@push.rocks/smarttime': 4.2.3
'@push.rocks/webrequest': 4.0.5 '@push.rocks/webrequest': 4.0.5
'@tsclass/tsclass': 9.3.0 '@tsclass/tsclass': 9.5.0
'@push.rocks/smartmanifest@2.0.2': {} '@push.rocks/smartmanifest@2.0.2': {}
@@ -6109,7 +6117,7 @@ snapshots:
'@push.rocks/smartpuppeteer': 2.0.5(typescript@5.9.3) '@push.rocks/smartpuppeteer': 2.0.5(typescript@5.9.3)
'@push.rocks/smartserve': 2.0.1 '@push.rocks/smartserve': 2.0.1
'@push.rocks/smartunique': 3.0.9 '@push.rocks/smartunique': 3.0.9
'@tsclass/tsclass': 9.3.0 '@tsclass/tsclass': 9.5.0
pdf-lib: 1.17.1 pdf-lib: 1.17.1
pdf2json: 4.0.2 pdf2json: 4.0.2
transitivePeerDependencies: transitivePeerDependencies:
@@ -6191,7 +6199,7 @@ snapshots:
dependencies: dependencies:
'@push.rocks/smartpath': 6.0.0 '@push.rocks/smartpath': 6.0.0
'@push.rocks/smartrust': 1.3.1 '@push.rocks/smartrust': 1.3.1
'@tsclass/tsclass': 9.3.0 '@tsclass/tsclass': 9.5.0
'@push.rocks/smartserve@2.0.1': '@push.rocks/smartserve@2.0.1':
dependencies: dependencies:
@@ -6221,7 +6229,7 @@ snapshots:
'@push.rocks/smartxml': 2.0.0 '@push.rocks/smartxml': 2.0.0
'@push.rocks/smartyaml': 3.0.4 '@push.rocks/smartyaml': 3.0.4
'@push.rocks/webrequest': 4.0.5 '@push.rocks/webrequest': 4.0.5
'@tsclass/tsclass': 9.3.0 '@tsclass/tsclass': 9.5.0
'@push.rocks/smartspawn@3.0.3': '@push.rocks/smartspawn@3.0.3':
dependencies: dependencies:
@@ -7009,9 +7017,9 @@ snapshots:
dependencies: dependencies:
type-fest: 4.41.0 type-fest: 4.41.0
'@tsclass/tsclass@9.3.0': '@tsclass/tsclass@9.5.0':
dependencies: dependencies:
type-fest: 4.41.0 type-fest: 5.4.4
'@tybys/wasm-util@0.10.1': '@tybys/wasm-util@0.10.1':
dependencies: dependencies:
@@ -9264,6 +9272,8 @@ snapshots:
systeminformation@5.31.3: {} systeminformation@5.31.3: {}
tagged-tag@1.0.0: {}
tar-fs@3.1.2: tar-fs@3.1.2:
dependencies: dependencies:
pump: 3.0.4 pump: 3.0.4
@@ -9373,6 +9383,10 @@ snapshots:
type-fest@4.41.0: {} type-fest@4.41.0: {}
type-fest@5.4.4:
dependencies:
tagged-tag: 1.0.0
typed-query-selector@2.12.1: {} typed-query-selector@2.12.1: {}
typescript@5.9.3: {} typescript@5.9.3: {}

View File

@@ -3,6 +3,6 @@
*/ */
export const commitinfo = { export const commitinfo = {
name: '@design.estate/dees-catalog', name: '@design.estate/dees-catalog',
version: '3.48.0', version: '3.49.0',
description: 'A comprehensive library that provides dynamic web components for building sophisticated and modern web applications using JavaScript and TypeScript.' description: 'A comprehensive library that provides dynamic web components for building sophisticated and modern web applications using JavaScript and TypeScript.'
} }

View File

@@ -50,6 +50,7 @@ export const demoFunc = () => html` <style>
.statusObject=${{ .statusObject=${{
id: '1', id: '1',
name: 'API Gateway Service', name: 'API Gateway Service',
lastUpdated: Date.now(),
combinedStatus: 'ok', combinedStatus: 'ok',
combinedStatusText: 'All systems operational', combinedStatusText: 'All systems operational',
details: [ details: [
@@ -89,6 +90,7 @@ export const demoFunc = () => html` <style>
.statusObject=${{ .statusObject=${{
id: '2', id: '2',
name: 'PostgreSQL Cluster', name: 'PostgreSQL Cluster',
lastUpdated: Date.now() - 3600000,
combinedStatus: 'partly_ok', combinedStatus: 'partly_ok',
combinedStatusText: 'Minor issues detected', combinedStatusText: 'Minor issues detected',
details: [ details: [
@@ -128,6 +130,7 @@ export const demoFunc = () => html` <style>
.statusObject=${{ .statusObject=${{
id: '3', id: '3',
name: 'CI/CD Pipeline', name: 'CI/CD Pipeline',
lastUpdated: Date.now() - 86400000,
combinedStatus: 'not_ok', combinedStatus: 'not_ok',
combinedStatusText: 'Build failure', combinedStatusText: 'Build failure',
details: [ details: [

View File

@@ -128,7 +128,7 @@ export class DeesDataviewStatusobject extends DeesElement {
grid-template-columns: 48px auto; grid-template-columns: 48px auto;
border-top: 1px solid ${cssManager.bdTheme('hsl(0 0% 94%)', 'hsl(0 0% 14.9%)')}; border-top: 1px solid ${cssManager.bdTheme('hsl(0 0% 94%)', 'hsl(0 0% 14.9%)')};
transition: background-color 0.15s ease; transition: background-color 0.15s ease;
padding-right: 16px; padding: 0 16px;
cursor: context-menu; cursor: context-menu;
} }
@@ -148,7 +148,7 @@ export class DeesDataviewStatusobject extends DeesElement {
.detail .detailsText .label { .detail .detailsText .label {
font-size: 12px; font-size: 12px;
font-weight: 500; font-weight: 500;
color: ${cssManager.bdTheme('hsl(0 0% 45.1%)', 'hsl(0 0% 63.9%)')} color: ${cssManager.bdTheme('hsl(0 0% 45.1%)', 'hsl(0 0% 63.9%)')};
margin-bottom: 2px; margin-bottom: 2px;
letter-spacing: -0.01em; letter-spacing: -0.01em;
} }
@@ -159,6 +159,28 @@ export class DeesDataviewStatusobject extends DeesElement {
color: ${cssManager.bdTheme('hsl(0 0% 15%)', 'hsl(0 0% 90%)')}; color: ${cssManager.bdTheme('hsl(0 0% 15%)', 'hsl(0 0% 90%)')};
line-height: 1.5; line-height: 1.5;
} }
.bottomBar {
position: relative;
color: ${cssManager.bdTheme('hsl(0 0% 45.1%)', 'hsl(0 0% 63.9%)')};
background: ${cssManager.bdTheme('hsl(0 0% 97%)', 'hsl(0 0% 7%)')};
border-top: 1px solid ${cssManager.bdTheme('hsl(0 0% 89.8%)', 'hsl(0 0% 14.9%)')};
height: 28px;
font-size: 12px;
line-height: 28px;
display: flex;
justify-content: flex-end;
align-items: stretch;
overflow: hidden;
flex-shrink: 0;
}
.bottomBar .statusLabel {
padding: 0 16px;
display: flex;
align-items: center;
font-weight: 500;
}
`, `,
]; ];
@@ -209,6 +231,11 @@ export class DeesDataviewStatusobject extends DeesElement {
</div> </div>
`; `;
})} })}
<div class="bottomBar">
<div class="statusLabel">${this.statusObject?.lastUpdated
? `Last updated: ${new Date(this.statusObject.lastUpdated).toLocaleString()}`
: ''}</div>
</div>
</div> </div>
`; `;
} }

View File

@@ -1,16 +1,16 @@
import { html } from '@design.estate/dees-element'; import { html } from '@design.estate/dees-element';
import type { IS3DataProvider, IS3Object } from './interfaces.js'; import type { IStorageDataProvider, IStorageObject } from './interfaces.js';
import './dees-s3-browser.js'; import './dees-storage-browser.js';
// Mock in-memory S3 data provider for demo purposes // Mock in-memory storage data provider for demo purposes
class MockS3DataProvider implements IS3DataProvider { class MockStorageDataProvider implements IStorageDataProvider {
private objects: Map<string, { content: string; contentType: string; size: number; lastModified: string }> = new Map(); private objects: Map<string, { content: string; contentType: string; size: number; lastModified: string }> = new Map();
constructor() { constructor() {
const now = new Date().toISOString(); const now = new Date().toISOString();
// Seed with sample data // Seed with sample data
this.objects.set('documents/readme.md', { this.objects.set('documents/readme.md', {
content: btoa('# Welcome\n\nThis is a demo S3 browser.\n'), content: btoa('# Welcome\n\nThis is a demo Storage browser.\n'),
contentType: 'text/markdown', contentType: 'text/markdown',
size: 42, size: 42,
lastModified: now, lastModified: now,
@@ -59,9 +59,9 @@ class MockS3DataProvider implements IS3DataProvider {
}); });
} }
async listObjects(bucket: string, prefix?: string, delimiter?: string): Promise<{ objects: IS3Object[]; prefixes: string[] }> { async listObjects(bucket: string, prefix?: string, delimiter?: string): Promise<{ objects: IStorageObject[]; prefixes: string[] }> {
const pfx = prefix || ''; const pfx = prefix || '';
const objects: IS3Object[] = []; const objects: IStorageObject[] = [];
const prefixes = new Set<string>(); const prefixes = new Set<string>();
for (const [key, data] of this.objects) { for (const [key, data] of this.objects) {
@@ -148,9 +148,9 @@ export const demoFunc = () => html`
} }
</style> </style>
<div class="demo-container"> <div class="demo-container">
<dees-s3-browser <dees-storage-browser
.dataProvider=${new MockS3DataProvider()} .dataProvider=${new MockStorageDataProvider()}
.bucketName=${'demo-bucket'} .bucketName=${'demo-bucket'}
></dees-s3-browser> ></dees-storage-browser>
</div> </div>
`; `;

View File

@@ -1,26 +1,26 @@
import { customElement, html, css, cssManager, property, state, DeesElement } from '@design.estate/dees-element'; import { customElement, html, css, cssManager, property, state, DeesElement } from '@design.estate/dees-element';
import { themeDefaultStyles } from '../../00theme.js'; import { themeDefaultStyles } from '../../00theme.js';
import { demoFunc } from './dees-s3-browser.demo.js'; import { demoFunc } from './dees-storage-browser.demo.js';
import type { IS3DataProvider, IS3ChangeEvent } from './interfaces.js'; import type { IStorageDataProvider, IStorageChangeEvent } from './interfaces.js';
import './dees-s3-columns.js'; import './dees-storage-columns.js';
import './dees-s3-keys.js'; import './dees-storage-keys.js';
import './dees-s3-preview.js'; import './dees-storage-preview.js';
declare global { declare global {
interface HTMLElementTagNameMap { interface HTMLElementTagNameMap {
'dees-s3-browser': DeesS3Browser; 'dees-storage-browser': DeesStorageBrowser;
} }
} }
type TViewType = 'columns' | 'keys'; type TViewType = 'columns' | 'keys';
@customElement('dees-s3-browser') @customElement('dees-storage-browser')
export class DeesS3Browser extends DeesElement { export class DeesStorageBrowser extends DeesElement {
public static demo = demoFunc; public static demo = demoFunc;
public static demoGroups = ['Data View']; public static demoGroups = ['Data View'];
@property({ type: Object }) @property({ type: Object })
public accessor dataProvider: IS3DataProvider | null = null; public accessor dataProvider: IStorageDataProvider | null = null;
@property({ type: String }) @property({ type: String })
public accessor bucketName: string = ''; public accessor bucketName: string = '';
@@ -30,7 +30,7 @@ export class DeesS3Browser extends DeesElement {
* Pass a function that takes a callback and returns an unsubscribe function. * Pass a function that takes a callback and returns an unsubscribe function.
*/ */
@property({ type: Object }) @property({ type: Object })
public accessor onChangeEvent: ((callback: (event: IS3ChangeEvent) => void) => (() => void)) | null = null; public accessor onChangeEvent: ((callback: (event: IStorageChangeEvent) => void) => (() => void)) | null = null;
@state() @state()
private accessor viewType: TViewType = 'columns'; private accessor viewType: TViewType = 'columns';
@@ -288,12 +288,12 @@ export class DeesS3Browser extends DeesElement {
} }
try { try {
this.changeUnsubscribe = this.onChangeEvent((event: IS3ChangeEvent) => { this.changeUnsubscribe = this.onChangeEvent((event: IStorageChangeEvent) => {
this.handleChange(event); this.handleChange(event);
}); });
this.isStreamConnected = true; this.isStreamConnected = true;
} catch (error) { } catch (error) {
console.warn('[S3Browser] Failed to subscribe to changes:', error); console.warn('[StorageBrowser] Failed to subscribe to changes:', error);
this.isStreamConnected = false; this.isStreamConnected = false;
} }
} }
@@ -306,7 +306,7 @@ export class DeesS3Browser extends DeesElement {
this.isStreamConnected = false; this.isStreamConnected = false;
} }
private handleChange(event: IS3ChangeEvent) { private handleChange(event: IStorageChangeEvent) {
this.recentChangeCount++; this.recentChangeCount++;
this.refreshKey++; this.refreshKey++;
} }
@@ -395,24 +395,24 @@ export class DeesS3Browser extends DeesElement {
<div class="main-view"> <div class="main-view">
${this.viewType === 'columns' ${this.viewType === 'columns'
? html` ? html`
<dees-s3-columns <dees-storage-columns
.dataProvider=${this.dataProvider} .dataProvider=${this.dataProvider}
.bucketName=${this.bucketName} .bucketName=${this.bucketName}
.currentPrefix=${this.currentPrefix} .currentPrefix=${this.currentPrefix}
.refreshKey=${this.refreshKey} .refreshKey=${this.refreshKey}
@key-selected=${this.handleKeySelected} @key-selected=${this.handleKeySelected}
@navigate=${this.handleNavigate} @navigate=${this.handleNavigate}
></dees-s3-columns> ></dees-storage-columns>
` `
: html` : html`
<dees-s3-keys <dees-storage-keys
.dataProvider=${this.dataProvider} .dataProvider=${this.dataProvider}
.bucketName=${this.bucketName} .bucketName=${this.bucketName}
.currentPrefix=${this.currentPrefix} .currentPrefix=${this.currentPrefix}
.refreshKey=${this.refreshKey} .refreshKey=${this.refreshKey}
@key-selected=${this.handleKeySelected} @key-selected=${this.handleKeySelected}
@navigate=${this.handleNavigate} @navigate=${this.handleNavigate}
></dees-s3-keys> ></dees-storage-keys>
`} `}
</div> </div>
@@ -423,12 +423,12 @@ export class DeesS3Browser extends DeesElement {
@mousedown=${this.startPreviewResize} @mousedown=${this.startPreviewResize}
></div> ></div>
<div class="preview-panel"> <div class="preview-panel">
<dees-s3-preview <dees-storage-preview
.dataProvider=${this.dataProvider} .dataProvider=${this.dataProvider}
.bucketName=${this.bucketName} .bucketName=${this.bucketName}
.objectKey=${this.selectedKey} .objectKey=${this.selectedKey}
@object-deleted=${this.handleObjectDeleted} @object-deleted=${this.handleObjectDeleted}
></dees-s3-preview> ></dees-storage-preview>
</div> </div>
` `
: ''} : ''}

View File

@@ -1,7 +1,7 @@
import { customElement, html, css, cssManager, property, state, DeesElement } from '@design.estate/dees-element'; import { customElement, html, css, cssManager, property, state, DeesElement } from '@design.estate/dees-element';
import { DeesContextmenu } from '../../00group-overlay/dees-contextmenu/dees-contextmenu.js'; import { DeesContextmenu } from '../../00group-overlay/dees-contextmenu/dees-contextmenu.js';
import { themeDefaultStyles } from '../../00theme.js'; import { themeDefaultStyles } from '../../00theme.js';
import type { IS3DataProvider, IS3Object, IColumn } from './interfaces.js'; import type { IStorageDataProvider, IStorageObject, IColumn } from './interfaces.js';
import { getFileName, validateMove, getParentPrefix, getContentType, getDefaultContent, getPathSegments } from './utilities.js'; import { getFileName, validateMove, getParentPrefix, getContentType, getDefaultContent, getPathSegments } from './utilities.js';
// FileSystem API types for drag-and-drop folder support // FileSystem API types for drag-and-drop folder support
@@ -25,14 +25,14 @@ interface FileSystemDirectoryReader {
declare global { declare global {
interface HTMLElementTagNameMap { interface HTMLElementTagNameMap {
'dees-s3-columns': DeesS3Columns; 'dees-storage-columns': DeesStorageColumns;
} }
} }
@customElement('dees-s3-columns') @customElement('dees-storage-columns')
export class DeesS3Columns extends DeesElement { export class DeesStorageColumns extends DeesElement {
@property({ type: Object }) @property({ type: Object })
public accessor dataProvider: IS3DataProvider | null = null; public accessor dataProvider: IStorageDataProvider | null = null;
@property({ type: String }) @property({ type: String })
public accessor bucketName: string = ''; public accessor bucketName: string = '';

View File

@@ -1,19 +1,19 @@
import { customElement, html, css, cssManager, property, state, DeesElement } from '@design.estate/dees-element'; import { customElement, html, css, cssManager, property, state, DeesElement } from '@design.estate/dees-element';
import { DeesContextmenu } from '../../00group-overlay/dees-contextmenu/dees-contextmenu.js'; import { DeesContextmenu } from '../../00group-overlay/dees-contextmenu/dees-contextmenu.js';
import { themeDefaultStyles } from '../../00theme.js'; import { themeDefaultStyles } from '../../00theme.js';
import type { IS3DataProvider, IS3Object } from './interfaces.js'; import type { IStorageDataProvider, IStorageObject } from './interfaces.js';
import { formatSize, getFileName, validateMove, getParentPrefix, getContentType, getDefaultContent, getPathSegments } from './utilities.js'; import { formatSize, getFileName, validateMove, getParentPrefix, getContentType, getDefaultContent, getPathSegments } from './utilities.js';
declare global { declare global {
interface HTMLElementTagNameMap { interface HTMLElementTagNameMap {
'dees-s3-keys': DeesS3Keys; 'dees-storage-keys': DeesStorageKeys;
} }
} }
@customElement('dees-s3-keys') @customElement('dees-storage-keys')
export class DeesS3Keys extends DeesElement { export class DeesStorageKeys extends DeesElement {
@property({ type: Object }) @property({ type: Object })
public accessor dataProvider: IS3DataProvider | null = null; public accessor dataProvider: IStorageDataProvider | null = null;
@property({ type: String }) @property({ type: String })
public accessor bucketName: string = ''; public accessor bucketName: string = '';
@@ -25,7 +25,7 @@ export class DeesS3Keys extends DeesElement {
public accessor refreshKey: number = 0; public accessor refreshKey: number = 0;
@state() @state()
private accessor allKeys: IS3Object[] = []; private accessor allKeys: IStorageObject[] = [];
@state() @state()
private accessor prefixes: string[] = []; private accessor prefixes: string[] = [];

View File

@@ -1,18 +1,18 @@
import { customElement, html, css, cssManager, property, state, DeesElement } from '@design.estate/dees-element'; import { customElement, html, css, cssManager, property, state, DeesElement } from '@design.estate/dees-element';
import { themeDefaultStyles } from '../../00theme.js'; import { themeDefaultStyles } from '../../00theme.js';
import type { IS3DataProvider } from './interfaces.js'; import type { IStorageDataProvider } from './interfaces.js';
import { formatSize, getFileName } from './utilities.js'; import { formatSize, getFileName } from './utilities.js';
declare global { declare global {
interface HTMLElementTagNameMap { interface HTMLElementTagNameMap {
'dees-s3-preview': DeesS3Preview; 'dees-storage-preview': DeesStoragePreview;
} }
} }
@customElement('dees-s3-preview') @customElement('dees-storage-preview')
export class DeesS3Preview extends DeesElement { export class DeesStoragePreview extends DeesElement {
@property({ type: Object }) @property({ type: Object })
public accessor dataProvider: IS3DataProvider | null = null; public accessor dataProvider: IStorageDataProvider | null = null;
@property({ type: String }) @property({ type: String })
public accessor bucketName: string = ''; public accessor bucketName: string = '';

View File

@@ -1,6 +1,6 @@
export * from './dees-s3-browser.js'; export * from './dees-storage-browser.js';
export * from './dees-s3-columns.js'; export * from './dees-storage-columns.js';
export * from './dees-s3-keys.js'; export * from './dees-storage-keys.js';
export * from './dees-s3-preview.js'; export * from './dees-storage-preview.js';
export * from './interfaces.js'; export * from './interfaces.js';
export { formatSize, formatCount, getFileName, validateMove, getParentPrefix, getContentType, getDefaultContent, getPathSegments } from './utilities.js'; export { formatSize, formatCount, getFileName, validateMove, getParentPrefix, getContentType, getDefaultContent, getPathSegments } from './utilities.js';

View File

@@ -1,15 +1,15 @@
/** /**
* S3 Data Provider interface - implement this to connect the S3 browser to your backend * Storage Data Provider interface - implement this to connect the storage browser to your backend
*/ */
export interface IS3Object { export interface IStorageObject {
key: string; key: string;
size?: number; size?: number;
lastModified?: string; lastModified?: string;
isPrefix?: boolean; isPrefix?: boolean;
} }
export interface IS3ChangeEvent { export interface IStorageChangeEvent {
type: 'add' | 'modify' | 'delete'; type: 'add' | 'modify' | 'delete';
key: string; key: string;
bucket: string; bucket: string;
@@ -17,8 +17,8 @@ export interface IS3ChangeEvent {
lastModified?: Date; lastModified?: Date;
} }
export interface IS3DataProvider { export interface IStorageDataProvider {
listObjects(bucket: string, prefix?: string, delimiter?: string): Promise<{ objects: IS3Object[]; prefixes: string[] }>; listObjects(bucket: string, prefix?: string, delimiter?: string): Promise<{ objects: IStorageObject[]; prefixes: string[] }>;
getObject(bucket: string, key: string): Promise<{ content: string; contentType: string; size: number; lastModified: string }>; getObject(bucket: string, key: string): Promise<{ content: string; contentType: string; size: number; lastModified: string }>;
putObject(bucket: string, key: string, base64Content: string, contentType: string): Promise<boolean>; putObject(bucket: string, key: string, base64Content: string, contentType: string): Promise<boolean>;
deleteObject(bucket: string, key: string): Promise<boolean>; deleteObject(bucket: string, key: string): Promise<boolean>;
@@ -30,7 +30,7 @@ export interface IS3DataProvider {
export interface IColumn { export interface IColumn {
prefix: string; prefix: string;
objects: IS3Object[]; objects: IStorageObject[];
prefixes: string[]; prefixes: string[];
selectedItem: string | null; selectedItem: string | null;
width: number; width: number;

View File

@@ -1,5 +1,5 @@
/** /**
* Shared utilities for S3 browser components * Shared utilities for Storage browser components
*/ */
export interface IMoveValidation { export interface IMoveValidation {

View File

@@ -3,4 +3,4 @@ export * from './dees-dataview-codebox/index.js';
export * from './dees-dataview-statusobject/index.js'; export * from './dees-dataview-statusobject/index.js';
export * from './dees-table/index.js'; export * from './dees-table/index.js';
export * from './dees-statsgrid/index.js'; export * from './dees-statsgrid/index.js';
export * from './dees-s3-browser/index.js'; export * from './dees-storage-browser/index.js';