@design.estate/dees-catalog 3.47.1 → 3.48.3

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 (33) hide show
  1. package/dist_bundle/bundle.js +4903 -2056
  2. package/dist_ts_web/00_commitinfo_data.js +1 -1
  3. package/dist_ts_web/elements/00group-dataview/dees-storage-browser/dees-storage-browser.d.ts +50 -0
  4. package/dist_ts_web/elements/00group-dataview/dees-storage-browser/dees-storage-browser.demo.d.ts +2 -0
  5. package/dist_ts_web/elements/00group-dataview/dees-storage-browser/dees-storage-browser.demo.js +148 -0
  6. package/dist_ts_web/elements/00group-dataview/dees-storage-browser/dees-storage-browser.js +520 -0
  7. package/dist_ts_web/elements/00group-dataview/dees-storage-browser/dees-storage-columns.d.ts +99 -0
  8. package/dist_ts_web/elements/00group-dataview/dees-storage-browser/dees-storage-columns.js +1731 -0
  9. package/dist_ts_web/elements/00group-dataview/dees-storage-browser/dees-storage-keys.d.ts +64 -0
  10. package/dist_ts_web/elements/00group-dataview/dees-storage-browser/dees-storage-keys.js +1232 -0
  11. package/dist_ts_web/elements/00group-dataview/dees-storage-browser/dees-storage-preview.d.ts +37 -0
  12. package/dist_ts_web/elements/00group-dataview/dees-storage-browser/dees-storage-preview.js +626 -0
  13. package/dist_ts_web/elements/00group-dataview/dees-storage-browser/index.d.ts +6 -0
  14. package/dist_ts_web/elements/00group-dataview/dees-storage-browser/index.js +7 -0
  15. package/dist_ts_web/elements/00group-dataview/dees-storage-browser/interfaces.d.ts +48 -0
  16. package/dist_ts_web/elements/00group-dataview/dees-storage-browser/interfaces.js +5 -0
  17. package/dist_ts_web/elements/00group-dataview/dees-storage-browser/utilities.d.ts +39 -0
  18. package/dist_ts_web/elements/00group-dataview/dees-storage-browser/utilities.js +109 -0
  19. package/dist_ts_web/elements/00group-dataview/index.d.ts +1 -0
  20. package/dist_ts_web/elements/00group-dataview/index.js +2 -1
  21. package/dist_watch/bundle.js +4928 -2090
  22. package/dist_watch/bundle.js.map +4 -4
  23. package/package.json +3 -3
  24. package/ts_web/00_commitinfo_data.ts +1 -1
  25. package/ts_web/elements/00group-dataview/dees-storage-browser/dees-storage-browser.demo.ts +156 -0
  26. package/ts_web/elements/00group-dataview/dees-storage-browser/dees-storage-browser.ts +439 -0
  27. package/ts_web/elements/00group-dataview/dees-storage-browser/dees-storage-columns.ts +1652 -0
  28. package/ts_web/elements/00group-dataview/dees-storage-browser/dees-storage-keys.ts +1094 -0
  29. package/ts_web/elements/00group-dataview/dees-storage-browser/dees-storage-preview.ts +540 -0
  30. package/ts_web/elements/00group-dataview/dees-storage-browser/index.ts +6 -0
  31. package/ts_web/elements/00group-dataview/dees-storage-browser/interfaces.ts +37 -0
  32. package/ts_web/elements/00group-dataview/dees-storage-browser/utilities.ts +120 -0
  33. package/ts_web/elements/00group-dataview/index.ts +1 -0
@@ -0,0 +1,1731 @@
1
+ var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
2
+ function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
3
+ var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
4
+ var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
5
+ var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
6
+ var _, done = false;
7
+ for (var i = decorators.length - 1; i >= 0; i--) {
8
+ var context = {};
9
+ for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
10
+ for (var p in contextIn.access) context.access[p] = contextIn.access[p];
11
+ context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
12
+ var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
13
+ if (kind === "accessor") {
14
+ if (result === void 0) continue;
15
+ if (result === null || typeof result !== "object") throw new TypeError("Object expected");
16
+ if (_ = accept(result.get)) descriptor.get = _;
17
+ if (_ = accept(result.set)) descriptor.set = _;
18
+ if (_ = accept(result.init)) initializers.unshift(_);
19
+ }
20
+ else if (_ = accept(result)) {
21
+ if (kind === "field") initializers.unshift(_);
22
+ else descriptor[key] = _;
23
+ }
24
+ }
25
+ if (target) Object.defineProperty(target, contextIn.name, descriptor);
26
+ done = true;
27
+ };
28
+ var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
29
+ var useValue = arguments.length > 2;
30
+ for (var i = 0; i < initializers.length; i++) {
31
+ value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
32
+ }
33
+ return useValue ? value : void 0;
34
+ };
35
+ import { customElement, html, css, cssManager, property, state, DeesElement } from '@design.estate/dees-element';
36
+ import { DeesContextmenu } from '../../00group-overlay/dees-contextmenu/dees-contextmenu.js';
37
+ import { themeDefaultStyles } from '../../00theme.js';
38
+ import { getFileName, validateMove, getParentPrefix, getContentType, getDefaultContent, getPathSegments } from './utilities.js';
39
+ let DeesStorageColumns = (() => {
40
+ let _classDecorators = [customElement('dees-storage-columns')];
41
+ let _classDescriptor;
42
+ let _classExtraInitializers = [];
43
+ let _classThis;
44
+ let _classSuper = DeesElement;
45
+ let _dataProvider_decorators;
46
+ let _dataProvider_initializers = [];
47
+ let _dataProvider_extraInitializers = [];
48
+ let _bucketName_decorators;
49
+ let _bucketName_initializers = [];
50
+ let _bucketName_extraInitializers = [];
51
+ let _currentPrefix_decorators;
52
+ let _currentPrefix_initializers = [];
53
+ let _currentPrefix_extraInitializers = [];
54
+ let _refreshKey_decorators;
55
+ let _refreshKey_initializers = [];
56
+ let _refreshKey_extraInitializers = [];
57
+ let _columns_decorators;
58
+ let _columns_initializers = [];
59
+ let _columns_extraInitializers = [];
60
+ let _loading_decorators;
61
+ let _loading_initializers = [];
62
+ let _loading_extraInitializers = [];
63
+ let _showCreateDialog_decorators;
64
+ let _showCreateDialog_initializers = [];
65
+ let _showCreateDialog_extraInitializers = [];
66
+ let _createDialogType_decorators;
67
+ let _createDialogType_initializers = [];
68
+ let _createDialogType_extraInitializers = [];
69
+ let _createDialogPrefix_decorators;
70
+ let _createDialogPrefix_initializers = [];
71
+ let _createDialogPrefix_extraInitializers = [];
72
+ let _createDialogName_decorators;
73
+ let _createDialogName_initializers = [];
74
+ let _createDialogName_extraInitializers = [];
75
+ let _dragOverColumnIndex_decorators;
76
+ let _dragOverColumnIndex_initializers = [];
77
+ let _dragOverColumnIndex_extraInitializers = [];
78
+ let _dragOverFolderPrefix_decorators;
79
+ let _dragOverFolderPrefix_initializers = [];
80
+ let _dragOverFolderPrefix_extraInitializers = [];
81
+ let _uploading_decorators;
82
+ let _uploading_initializers = [];
83
+ let _uploading_extraInitializers = [];
84
+ let _uploadProgress_decorators;
85
+ let _uploadProgress_initializers = [];
86
+ let _uploadProgress_extraInitializers = [];
87
+ let _showMoveDialog_decorators;
88
+ let _showMoveDialog_initializers = [];
89
+ let _showMoveDialog_extraInitializers = [];
90
+ let _moveSource_decorators;
91
+ let _moveSource_initializers = [];
92
+ let _moveSource_extraInitializers = [];
93
+ let _moveDestination_decorators;
94
+ let _moveDestination_initializers = [];
95
+ let _moveDestination_extraInitializers = [];
96
+ let _moveInProgress_decorators;
97
+ let _moveInProgress_initializers = [];
98
+ let _moveInProgress_extraInitializers = [];
99
+ let _moveError_decorators;
100
+ let _moveError_initializers = [];
101
+ let _moveError_extraInitializers = [];
102
+ let _showMovePickerDialog_decorators;
103
+ let _showMovePickerDialog_initializers = [];
104
+ let _showMovePickerDialog_extraInitializers = [];
105
+ let _movePickerSource_decorators;
106
+ let _movePickerSource_initializers = [];
107
+ let _movePickerSource_extraInitializers = [];
108
+ let _movePickerCurrentPrefix_decorators;
109
+ let _movePickerCurrentPrefix_initializers = [];
110
+ let _movePickerCurrentPrefix_extraInitializers = [];
111
+ let _movePickerPrefixes_decorators;
112
+ let _movePickerPrefixes_initializers = [];
113
+ let _movePickerPrefixes_extraInitializers = [];
114
+ let _movePickerLoading_decorators;
115
+ let _movePickerLoading_initializers = [];
116
+ let _movePickerLoading_extraInitializers = [];
117
+ let _showRenameDialog_decorators;
118
+ let _showRenameDialog_initializers = [];
119
+ let _showRenameDialog_extraInitializers = [];
120
+ let _renameSource_decorators;
121
+ let _renameSource_initializers = [];
122
+ let _renameSource_extraInitializers = [];
123
+ let _renameName_decorators;
124
+ let _renameName_initializers = [];
125
+ let _renameName_extraInitializers = [];
126
+ let _renameInProgress_decorators;
127
+ let _renameInProgress_initializers = [];
128
+ let _renameInProgress_extraInitializers = [];
129
+ let _renameError_decorators;
130
+ let _renameError_initializers = [];
131
+ let _renameError_extraInitializers = [];
132
+ let _draggedItem_decorators;
133
+ let _draggedItem_initializers = [];
134
+ let _draggedItem_extraInitializers = [];
135
+ var DeesStorageColumns = class extends _classSuper {
136
+ static { _classThis = this; }
137
+ static {
138
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
139
+ _dataProvider_decorators = [property({ type: Object })];
140
+ _bucketName_decorators = [property({ type: String })];
141
+ _currentPrefix_decorators = [property({ type: String })];
142
+ _refreshKey_decorators = [property({ type: Number })];
143
+ _columns_decorators = [state()];
144
+ _loading_decorators = [state()];
145
+ _showCreateDialog_decorators = [state()];
146
+ _createDialogType_decorators = [state()];
147
+ _createDialogPrefix_decorators = [state()];
148
+ _createDialogName_decorators = [state()];
149
+ _dragOverColumnIndex_decorators = [state()];
150
+ _dragOverFolderPrefix_decorators = [state()];
151
+ _uploading_decorators = [state()];
152
+ _uploadProgress_decorators = [state()];
153
+ _showMoveDialog_decorators = [state()];
154
+ _moveSource_decorators = [state()];
155
+ _moveDestination_decorators = [state()];
156
+ _moveInProgress_decorators = [state()];
157
+ _moveError_decorators = [state()];
158
+ _showMovePickerDialog_decorators = [state()];
159
+ _movePickerSource_decorators = [state()];
160
+ _movePickerCurrentPrefix_decorators = [state()];
161
+ _movePickerPrefixes_decorators = [state()];
162
+ _movePickerLoading_decorators = [state()];
163
+ _showRenameDialog_decorators = [state()];
164
+ _renameSource_decorators = [state()];
165
+ _renameName_decorators = [state()];
166
+ _renameInProgress_decorators = [state()];
167
+ _renameError_decorators = [state()];
168
+ _draggedItem_decorators = [state()];
169
+ __esDecorate(this, null, _dataProvider_decorators, { kind: "accessor", name: "dataProvider", static: false, private: false, access: { has: obj => "dataProvider" in obj, get: obj => obj.dataProvider, set: (obj, value) => { obj.dataProvider = value; } }, metadata: _metadata }, _dataProvider_initializers, _dataProvider_extraInitializers);
170
+ __esDecorate(this, null, _bucketName_decorators, { kind: "accessor", name: "bucketName", static: false, private: false, access: { has: obj => "bucketName" in obj, get: obj => obj.bucketName, set: (obj, value) => { obj.bucketName = value; } }, metadata: _metadata }, _bucketName_initializers, _bucketName_extraInitializers);
171
+ __esDecorate(this, null, _currentPrefix_decorators, { kind: "accessor", name: "currentPrefix", static: false, private: false, access: { has: obj => "currentPrefix" in obj, get: obj => obj.currentPrefix, set: (obj, value) => { obj.currentPrefix = value; } }, metadata: _metadata }, _currentPrefix_initializers, _currentPrefix_extraInitializers);
172
+ __esDecorate(this, null, _refreshKey_decorators, { kind: "accessor", name: "refreshKey", static: false, private: false, access: { has: obj => "refreshKey" in obj, get: obj => obj.refreshKey, set: (obj, value) => { obj.refreshKey = value; } }, metadata: _metadata }, _refreshKey_initializers, _refreshKey_extraInitializers);
173
+ __esDecorate(this, null, _columns_decorators, { kind: "accessor", name: "columns", static: false, private: false, access: { has: obj => "columns" in obj, get: obj => obj.columns, set: (obj, value) => { obj.columns = value; } }, metadata: _metadata }, _columns_initializers, _columns_extraInitializers);
174
+ __esDecorate(this, null, _loading_decorators, { kind: "accessor", name: "loading", static: false, private: false, access: { has: obj => "loading" in obj, get: obj => obj.loading, set: (obj, value) => { obj.loading = value; } }, metadata: _metadata }, _loading_initializers, _loading_extraInitializers);
175
+ __esDecorate(this, null, _showCreateDialog_decorators, { kind: "accessor", name: "showCreateDialog", static: false, private: false, access: { has: obj => "showCreateDialog" in obj, get: obj => obj.showCreateDialog, set: (obj, value) => { obj.showCreateDialog = value; } }, metadata: _metadata }, _showCreateDialog_initializers, _showCreateDialog_extraInitializers);
176
+ __esDecorate(this, null, _createDialogType_decorators, { kind: "accessor", name: "createDialogType", static: false, private: false, access: { has: obj => "createDialogType" in obj, get: obj => obj.createDialogType, set: (obj, value) => { obj.createDialogType = value; } }, metadata: _metadata }, _createDialogType_initializers, _createDialogType_extraInitializers);
177
+ __esDecorate(this, null, _createDialogPrefix_decorators, { kind: "accessor", name: "createDialogPrefix", static: false, private: false, access: { has: obj => "createDialogPrefix" in obj, get: obj => obj.createDialogPrefix, set: (obj, value) => { obj.createDialogPrefix = value; } }, metadata: _metadata }, _createDialogPrefix_initializers, _createDialogPrefix_extraInitializers);
178
+ __esDecorate(this, null, _createDialogName_decorators, { kind: "accessor", name: "createDialogName", static: false, private: false, access: { has: obj => "createDialogName" in obj, get: obj => obj.createDialogName, set: (obj, value) => { obj.createDialogName = value; } }, metadata: _metadata }, _createDialogName_initializers, _createDialogName_extraInitializers);
179
+ __esDecorate(this, null, _dragOverColumnIndex_decorators, { kind: "accessor", name: "dragOverColumnIndex", static: false, private: false, access: { has: obj => "dragOverColumnIndex" in obj, get: obj => obj.dragOverColumnIndex, set: (obj, value) => { obj.dragOverColumnIndex = value; } }, metadata: _metadata }, _dragOverColumnIndex_initializers, _dragOverColumnIndex_extraInitializers);
180
+ __esDecorate(this, null, _dragOverFolderPrefix_decorators, { kind: "accessor", name: "dragOverFolderPrefix", static: false, private: false, access: { has: obj => "dragOverFolderPrefix" in obj, get: obj => obj.dragOverFolderPrefix, set: (obj, value) => { obj.dragOverFolderPrefix = value; } }, metadata: _metadata }, _dragOverFolderPrefix_initializers, _dragOverFolderPrefix_extraInitializers);
181
+ __esDecorate(this, null, _uploading_decorators, { kind: "accessor", name: "uploading", static: false, private: false, access: { has: obj => "uploading" in obj, get: obj => obj.uploading, set: (obj, value) => { obj.uploading = value; } }, metadata: _metadata }, _uploading_initializers, _uploading_extraInitializers);
182
+ __esDecorate(this, null, _uploadProgress_decorators, { kind: "accessor", name: "uploadProgress", static: false, private: false, access: { has: obj => "uploadProgress" in obj, get: obj => obj.uploadProgress, set: (obj, value) => { obj.uploadProgress = value; } }, metadata: _metadata }, _uploadProgress_initializers, _uploadProgress_extraInitializers);
183
+ __esDecorate(this, null, _showMoveDialog_decorators, { kind: "accessor", name: "showMoveDialog", static: false, private: false, access: { has: obj => "showMoveDialog" in obj, get: obj => obj.showMoveDialog, set: (obj, value) => { obj.showMoveDialog = value; } }, metadata: _metadata }, _showMoveDialog_initializers, _showMoveDialog_extraInitializers);
184
+ __esDecorate(this, null, _moveSource_decorators, { kind: "accessor", name: "moveSource", static: false, private: false, access: { has: obj => "moveSource" in obj, get: obj => obj.moveSource, set: (obj, value) => { obj.moveSource = value; } }, metadata: _metadata }, _moveSource_initializers, _moveSource_extraInitializers);
185
+ __esDecorate(this, null, _moveDestination_decorators, { kind: "accessor", name: "moveDestination", static: false, private: false, access: { has: obj => "moveDestination" in obj, get: obj => obj.moveDestination, set: (obj, value) => { obj.moveDestination = value; } }, metadata: _metadata }, _moveDestination_initializers, _moveDestination_extraInitializers);
186
+ __esDecorate(this, null, _moveInProgress_decorators, { kind: "accessor", name: "moveInProgress", static: false, private: false, access: { has: obj => "moveInProgress" in obj, get: obj => obj.moveInProgress, set: (obj, value) => { obj.moveInProgress = value; } }, metadata: _metadata }, _moveInProgress_initializers, _moveInProgress_extraInitializers);
187
+ __esDecorate(this, null, _moveError_decorators, { kind: "accessor", name: "moveError", static: false, private: false, access: { has: obj => "moveError" in obj, get: obj => obj.moveError, set: (obj, value) => { obj.moveError = value; } }, metadata: _metadata }, _moveError_initializers, _moveError_extraInitializers);
188
+ __esDecorate(this, null, _showMovePickerDialog_decorators, { kind: "accessor", name: "showMovePickerDialog", static: false, private: false, access: { has: obj => "showMovePickerDialog" in obj, get: obj => obj.showMovePickerDialog, set: (obj, value) => { obj.showMovePickerDialog = value; } }, metadata: _metadata }, _showMovePickerDialog_initializers, _showMovePickerDialog_extraInitializers);
189
+ __esDecorate(this, null, _movePickerSource_decorators, { kind: "accessor", name: "movePickerSource", static: false, private: false, access: { has: obj => "movePickerSource" in obj, get: obj => obj.movePickerSource, set: (obj, value) => { obj.movePickerSource = value; } }, metadata: _metadata }, _movePickerSource_initializers, _movePickerSource_extraInitializers);
190
+ __esDecorate(this, null, _movePickerCurrentPrefix_decorators, { kind: "accessor", name: "movePickerCurrentPrefix", static: false, private: false, access: { has: obj => "movePickerCurrentPrefix" in obj, get: obj => obj.movePickerCurrentPrefix, set: (obj, value) => { obj.movePickerCurrentPrefix = value; } }, metadata: _metadata }, _movePickerCurrentPrefix_initializers, _movePickerCurrentPrefix_extraInitializers);
191
+ __esDecorate(this, null, _movePickerPrefixes_decorators, { kind: "accessor", name: "movePickerPrefixes", static: false, private: false, access: { has: obj => "movePickerPrefixes" in obj, get: obj => obj.movePickerPrefixes, set: (obj, value) => { obj.movePickerPrefixes = value; } }, metadata: _metadata }, _movePickerPrefixes_initializers, _movePickerPrefixes_extraInitializers);
192
+ __esDecorate(this, null, _movePickerLoading_decorators, { kind: "accessor", name: "movePickerLoading", static: false, private: false, access: { has: obj => "movePickerLoading" in obj, get: obj => obj.movePickerLoading, set: (obj, value) => { obj.movePickerLoading = value; } }, metadata: _metadata }, _movePickerLoading_initializers, _movePickerLoading_extraInitializers);
193
+ __esDecorate(this, null, _showRenameDialog_decorators, { kind: "accessor", name: "showRenameDialog", static: false, private: false, access: { has: obj => "showRenameDialog" in obj, get: obj => obj.showRenameDialog, set: (obj, value) => { obj.showRenameDialog = value; } }, metadata: _metadata }, _showRenameDialog_initializers, _showRenameDialog_extraInitializers);
194
+ __esDecorate(this, null, _renameSource_decorators, { kind: "accessor", name: "renameSource", static: false, private: false, access: { has: obj => "renameSource" in obj, get: obj => obj.renameSource, set: (obj, value) => { obj.renameSource = value; } }, metadata: _metadata }, _renameSource_initializers, _renameSource_extraInitializers);
195
+ __esDecorate(this, null, _renameName_decorators, { kind: "accessor", name: "renameName", static: false, private: false, access: { has: obj => "renameName" in obj, get: obj => obj.renameName, set: (obj, value) => { obj.renameName = value; } }, metadata: _metadata }, _renameName_initializers, _renameName_extraInitializers);
196
+ __esDecorate(this, null, _renameInProgress_decorators, { kind: "accessor", name: "renameInProgress", static: false, private: false, access: { has: obj => "renameInProgress" in obj, get: obj => obj.renameInProgress, set: (obj, value) => { obj.renameInProgress = value; } }, metadata: _metadata }, _renameInProgress_initializers, _renameInProgress_extraInitializers);
197
+ __esDecorate(this, null, _renameError_decorators, { kind: "accessor", name: "renameError", static: false, private: false, access: { has: obj => "renameError" in obj, get: obj => obj.renameError, set: (obj, value) => { obj.renameError = value; } }, metadata: _metadata }, _renameError_initializers, _renameError_extraInitializers);
198
+ __esDecorate(this, null, _draggedItem_decorators, { kind: "accessor", name: "draggedItem", static: false, private: false, access: { has: obj => "draggedItem" in obj, get: obj => obj.draggedItem, set: (obj, value) => { obj.draggedItem = value; } }, metadata: _metadata }, _draggedItem_initializers, _draggedItem_extraInitializers);
199
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
200
+ DeesStorageColumns = _classThis = _classDescriptor.value;
201
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
202
+ }
203
+ #dataProvider_accessor_storage = __runInitializers(this, _dataProvider_initializers, null);
204
+ get dataProvider() { return this.#dataProvider_accessor_storage; }
205
+ set dataProvider(value) { this.#dataProvider_accessor_storage = value; }
206
+ #bucketName_accessor_storage = (__runInitializers(this, _dataProvider_extraInitializers), __runInitializers(this, _bucketName_initializers, ''));
207
+ get bucketName() { return this.#bucketName_accessor_storage; }
208
+ set bucketName(value) { this.#bucketName_accessor_storage = value; }
209
+ #currentPrefix_accessor_storage = (__runInitializers(this, _bucketName_extraInitializers), __runInitializers(this, _currentPrefix_initializers, ''));
210
+ get currentPrefix() { return this.#currentPrefix_accessor_storage; }
211
+ set currentPrefix(value) { this.#currentPrefix_accessor_storage = value; }
212
+ #refreshKey_accessor_storage = (__runInitializers(this, _currentPrefix_extraInitializers), __runInitializers(this, _refreshKey_initializers, 0));
213
+ get refreshKey() { return this.#refreshKey_accessor_storage; }
214
+ set refreshKey(value) { this.#refreshKey_accessor_storage = value; }
215
+ #columns_accessor_storage = (__runInitializers(this, _refreshKey_extraInitializers), __runInitializers(this, _columns_initializers, []));
216
+ get columns() { return this.#columns_accessor_storage; }
217
+ set columns(value) { this.#columns_accessor_storage = value; }
218
+ #loading_accessor_storage = (__runInitializers(this, _columns_extraInitializers), __runInitializers(this, _loading_initializers, false));
219
+ get loading() { return this.#loading_accessor_storage; }
220
+ set loading(value) { this.#loading_accessor_storage = value; }
221
+ #showCreateDialog_accessor_storage = (__runInitializers(this, _loading_extraInitializers), __runInitializers(this, _showCreateDialog_initializers, false));
222
+ get showCreateDialog() { return this.#showCreateDialog_accessor_storage; }
223
+ set showCreateDialog(value) { this.#showCreateDialog_accessor_storage = value; }
224
+ #createDialogType_accessor_storage = (__runInitializers(this, _showCreateDialog_extraInitializers), __runInitializers(this, _createDialogType_initializers, 'folder'));
225
+ get createDialogType() { return this.#createDialogType_accessor_storage; }
226
+ set createDialogType(value) { this.#createDialogType_accessor_storage = value; }
227
+ #createDialogPrefix_accessor_storage = (__runInitializers(this, _createDialogType_extraInitializers), __runInitializers(this, _createDialogPrefix_initializers, ''));
228
+ get createDialogPrefix() { return this.#createDialogPrefix_accessor_storage; }
229
+ set createDialogPrefix(value) { this.#createDialogPrefix_accessor_storage = value; }
230
+ #createDialogName_accessor_storage = (__runInitializers(this, _createDialogPrefix_extraInitializers), __runInitializers(this, _createDialogName_initializers, ''));
231
+ get createDialogName() { return this.#createDialogName_accessor_storage; }
232
+ set createDialogName(value) { this.#createDialogName_accessor_storage = value; }
233
+ #dragOverColumnIndex_accessor_storage = (__runInitializers(this, _createDialogName_extraInitializers), __runInitializers(this, _dragOverColumnIndex_initializers, -1));
234
+ get dragOverColumnIndex() { return this.#dragOverColumnIndex_accessor_storage; }
235
+ set dragOverColumnIndex(value) { this.#dragOverColumnIndex_accessor_storage = value; }
236
+ #dragOverFolderPrefix_accessor_storage = (__runInitializers(this, _dragOverColumnIndex_extraInitializers), __runInitializers(this, _dragOverFolderPrefix_initializers, null));
237
+ get dragOverFolderPrefix() { return this.#dragOverFolderPrefix_accessor_storage; }
238
+ set dragOverFolderPrefix(value) { this.#dragOverFolderPrefix_accessor_storage = value; }
239
+ #uploading_accessor_storage = (__runInitializers(this, _dragOverFolderPrefix_extraInitializers), __runInitializers(this, _uploading_initializers, false));
240
+ get uploading() { return this.#uploading_accessor_storage; }
241
+ set uploading(value) { this.#uploading_accessor_storage = value; }
242
+ #uploadProgress_accessor_storage = (__runInitializers(this, _uploading_extraInitializers), __runInitializers(this, _uploadProgress_initializers, null));
243
+ get uploadProgress() { return this.#uploadProgress_accessor_storage; }
244
+ set uploadProgress(value) { this.#uploadProgress_accessor_storage = value; }
245
+ #showMoveDialog_accessor_storage = (__runInitializers(this, _uploadProgress_extraInitializers), __runInitializers(this, _showMoveDialog_initializers, false));
246
+ // Move dialog state
247
+ get showMoveDialog() { return this.#showMoveDialog_accessor_storage; }
248
+ set showMoveDialog(value) { this.#showMoveDialog_accessor_storage = value; }
249
+ #moveSource_accessor_storage = (__runInitializers(this, _showMoveDialog_extraInitializers), __runInitializers(this, _moveSource_initializers, null));
250
+ get moveSource() { return this.#moveSource_accessor_storage; }
251
+ set moveSource(value) { this.#moveSource_accessor_storage = value; }
252
+ #moveDestination_accessor_storage = (__runInitializers(this, _moveSource_extraInitializers), __runInitializers(this, _moveDestination_initializers, ''));
253
+ get moveDestination() { return this.#moveDestination_accessor_storage; }
254
+ set moveDestination(value) { this.#moveDestination_accessor_storage = value; }
255
+ #moveInProgress_accessor_storage = (__runInitializers(this, _moveDestination_extraInitializers), __runInitializers(this, _moveInProgress_initializers, false));
256
+ get moveInProgress() { return this.#moveInProgress_accessor_storage; }
257
+ set moveInProgress(value) { this.#moveInProgress_accessor_storage = value; }
258
+ #moveError_accessor_storage = (__runInitializers(this, _moveInProgress_extraInitializers), __runInitializers(this, _moveError_initializers, null));
259
+ get moveError() { return this.#moveError_accessor_storage; }
260
+ set moveError(value) { this.#moveError_accessor_storage = value; }
261
+ #showMovePickerDialog_accessor_storage = (__runInitializers(this, _moveError_extraInitializers), __runInitializers(this, _showMovePickerDialog_initializers, false));
262
+ // Move picker dialog state
263
+ get showMovePickerDialog() { return this.#showMovePickerDialog_accessor_storage; }
264
+ set showMovePickerDialog(value) { this.#showMovePickerDialog_accessor_storage = value; }
265
+ #movePickerSource_accessor_storage = (__runInitializers(this, _showMovePickerDialog_extraInitializers), __runInitializers(this, _movePickerSource_initializers, null));
266
+ get movePickerSource() { return this.#movePickerSource_accessor_storage; }
267
+ set movePickerSource(value) { this.#movePickerSource_accessor_storage = value; }
268
+ #movePickerCurrentPrefix_accessor_storage = (__runInitializers(this, _movePickerSource_extraInitializers), __runInitializers(this, _movePickerCurrentPrefix_initializers, ''));
269
+ get movePickerCurrentPrefix() { return this.#movePickerCurrentPrefix_accessor_storage; }
270
+ set movePickerCurrentPrefix(value) { this.#movePickerCurrentPrefix_accessor_storage = value; }
271
+ #movePickerPrefixes_accessor_storage = (__runInitializers(this, _movePickerCurrentPrefix_extraInitializers), __runInitializers(this, _movePickerPrefixes_initializers, []));
272
+ get movePickerPrefixes() { return this.#movePickerPrefixes_accessor_storage; }
273
+ set movePickerPrefixes(value) { this.#movePickerPrefixes_accessor_storage = value; }
274
+ #movePickerLoading_accessor_storage = (__runInitializers(this, _movePickerPrefixes_extraInitializers), __runInitializers(this, _movePickerLoading_initializers, false));
275
+ get movePickerLoading() { return this.#movePickerLoading_accessor_storage; }
276
+ set movePickerLoading(value) { this.#movePickerLoading_accessor_storage = value; }
277
+ #showRenameDialog_accessor_storage = (__runInitializers(this, _movePickerLoading_extraInitializers), __runInitializers(this, _showRenameDialog_initializers, false));
278
+ // Rename dialog state
279
+ get showRenameDialog() { return this.#showRenameDialog_accessor_storage; }
280
+ set showRenameDialog(value) { this.#showRenameDialog_accessor_storage = value; }
281
+ #renameSource_accessor_storage = (__runInitializers(this, _showRenameDialog_extraInitializers), __runInitializers(this, _renameSource_initializers, null));
282
+ get renameSource() { return this.#renameSource_accessor_storage; }
283
+ set renameSource(value) { this.#renameSource_accessor_storage = value; }
284
+ #renameName_accessor_storage = (__runInitializers(this, _renameSource_extraInitializers), __runInitializers(this, _renameName_initializers, ''));
285
+ get renameName() { return this.#renameName_accessor_storage; }
286
+ set renameName(value) { this.#renameName_accessor_storage = value; }
287
+ #renameInProgress_accessor_storage = (__runInitializers(this, _renameName_extraInitializers), __runInitializers(this, _renameInProgress_initializers, false));
288
+ get renameInProgress() { return this.#renameInProgress_accessor_storage; }
289
+ set renameInProgress(value) { this.#renameInProgress_accessor_storage = value; }
290
+ #renameError_accessor_storage = (__runInitializers(this, _renameInProgress_extraInitializers), __runInitializers(this, _renameError_initializers, null));
291
+ get renameError() { return this.#renameError_accessor_storage; }
292
+ set renameError(value) { this.#renameError_accessor_storage = value; }
293
+ #draggedItem_accessor_storage = (__runInitializers(this, _renameError_extraInitializers), __runInitializers(this, _draggedItem_initializers, null));
294
+ // Internal drag state
295
+ get draggedItem() { return this.#draggedItem_accessor_storage; }
296
+ set draggedItem(value) { this.#draggedItem_accessor_storage = value; }
297
+ resizing = (__runInitializers(this, _draggedItem_extraInitializers), null);
298
+ DEFAULT_COLUMN_WIDTH = 250;
299
+ MIN_COLUMN_WIDTH = 150;
300
+ MAX_COLUMN_WIDTH = 500;
301
+ dragCounters = new Map();
302
+ folderHoverTimer = null;
303
+ fileInputElement = null;
304
+ folderInputElement = null;
305
+ static styles = [
306
+ cssManager.defaultStyles,
307
+ themeDefaultStyles,
308
+ css `
309
+ :host {
310
+ display: block;
311
+ height: 100%;
312
+ overflow-x: auto;
313
+ overflow-y: hidden;
314
+ }
315
+
316
+ .columns-container {
317
+ display: flex;
318
+ height: 100%;
319
+ min-width: max-content;
320
+ }
321
+
322
+ .column-wrapper {
323
+ display: flex;
324
+ height: 100%;
325
+ flex-shrink: 0;
326
+ }
327
+
328
+ .column {
329
+ display: flex;
330
+ flex-direction: column;
331
+ height: 100%;
332
+ flex-shrink: 0;
333
+ overflow: hidden;
334
+ position: relative;
335
+ }
336
+
337
+ .resize-handle {
338
+ width: 5px;
339
+ height: 100%;
340
+ background: transparent;
341
+ cursor: col-resize;
342
+ position: relative;
343
+ flex-shrink: 0;
344
+ }
345
+
346
+ .resize-handle::after {
347
+ content: '';
348
+ position: absolute;
349
+ top: 0;
350
+ left: 2px;
351
+ width: 1px;
352
+ height: 100%;
353
+ background: ${cssManager.bdTheme('#e5e7eb', '#333')};
354
+ }
355
+
356
+ .resize-handle:hover::after,
357
+ .resize-handle.active::after {
358
+ background: ${cssManager.bdTheme('#a1a1aa', '#404040')};
359
+ width: 2px;
360
+ left: 1px;
361
+ }
362
+
363
+ .column-wrapper:last-child .resize-handle {
364
+ display: none;
365
+ }
366
+
367
+ .column-header {
368
+ padding: 8px 12px;
369
+ font-size: 12px;
370
+ font-weight: 500;
371
+ color: ${cssManager.bdTheme('#71717a', '#666')};
372
+ background: ${cssManager.bdTheme('rgba(0, 0, 0, 0.02)', 'rgba(0, 0, 0, 0.2)')};
373
+ border-bottom: 1px solid ${cssManager.bdTheme('#e5e7eb', '#333')};
374
+ white-space: nowrap;
375
+ overflow: hidden;
376
+ text-overflow: ellipsis;
377
+ }
378
+
379
+ .column-items {
380
+ flex: 1;
381
+ overflow-y: auto;
382
+ padding: 4px;
383
+ }
384
+
385
+ .column-item {
386
+ display: flex;
387
+ align-items: center;
388
+ gap: 8px;
389
+ padding: 6px 10px;
390
+ border-radius: 4px;
391
+ cursor: pointer;
392
+ font-size: 13px;
393
+ transition: background 0.1s;
394
+ }
395
+
396
+ .column-item:hover {
397
+ background: ${cssManager.bdTheme('rgba(0, 0, 0, 0.04)', 'rgba(255, 255, 255, 0.05)')};
398
+ }
399
+
400
+ .column-item.selected {
401
+ background: ${cssManager.bdTheme('rgba(59, 130, 246, 0.1)', 'rgba(255, 255, 255, 0.1)')};
402
+ color: ${cssManager.bdTheme('#1d4ed8', '#e0e0e0')};
403
+ }
404
+
405
+ .column-item.folder {
406
+ color: #fbbf24;
407
+ }
408
+
409
+ .column-item .icon {
410
+ width: 16px;
411
+ height: 16px;
412
+ flex-shrink: 0;
413
+ }
414
+
415
+ .column-item .name {
416
+ flex: 1;
417
+ white-space: nowrap;
418
+ overflow: hidden;
419
+ text-overflow: ellipsis;
420
+ }
421
+
422
+ .column-item .chevron {
423
+ width: 14px;
424
+ height: 14px;
425
+ color: ${cssManager.bdTheme('#d4d4d8', '#555')};
426
+ }
427
+
428
+ .empty-state {
429
+ padding: 16px;
430
+ text-align: center;
431
+ color: ${cssManager.bdTheme('#a1a1aa', '#666')};
432
+ font-size: 13px;
433
+ }
434
+
435
+ .loading {
436
+ padding: 16px;
437
+ text-align: center;
438
+ color: ${cssManager.bdTheme('#a1a1aa', '#666')};
439
+ }
440
+
441
+ .column.drag-over {
442
+ background: rgba(59, 130, 246, 0.08);
443
+ outline: 2px dashed rgba(59, 130, 246, 0.4);
444
+ outline-offset: -2px;
445
+ }
446
+
447
+ .column-item.folder.drag-target {
448
+ background: rgba(59, 130, 246, 0.2) !important;
449
+ outline: 1px solid rgba(59, 130, 246, 0.5);
450
+ }
451
+
452
+ .upload-overlay {
453
+ position: absolute;
454
+ top: 0;
455
+ left: 0;
456
+ right: 0;
457
+ bottom: 0;
458
+ background: rgba(0, 0, 0, 0.6);
459
+ display: flex;
460
+ flex-direction: column;
461
+ align-items: center;
462
+ justify-content: center;
463
+ gap: 8px;
464
+ z-index: 10;
465
+ border-radius: 4px;
466
+ }
467
+
468
+ .upload-overlay .upload-text {
469
+ color: #e0e0e0;
470
+ font-size: 13px;
471
+ }
472
+
473
+ .upload-overlay .upload-progress {
474
+ color: #888;
475
+ font-size: 11px;
476
+ }
477
+
478
+ .drag-hint {
479
+ position: absolute;
480
+ bottom: 8px;
481
+ left: 50%;
482
+ transform: translateX(-50%);
483
+ background: rgba(59, 130, 246, 0.9);
484
+ color: white;
485
+ padding: 4px 12px;
486
+ border-radius: 4px;
487
+ font-size: 11px;
488
+ pointer-events: none;
489
+ white-space: nowrap;
490
+ z-index: 5;
491
+ }
492
+
493
+ .dialog-overlay {
494
+ position: fixed;
495
+ top: 0;
496
+ left: 0;
497
+ right: 0;
498
+ bottom: 0;
499
+ background: rgba(0, 0, 0, 0.7);
500
+ display: flex;
501
+ align-items: center;
502
+ justify-content: center;
503
+ z-index: 1000;
504
+ }
505
+
506
+ .dialog {
507
+ background: ${cssManager.bdTheme('#ffffff', '#1e1e1e')};
508
+ border-radius: 12px;
509
+ padding: 24px;
510
+ min-width: 400px;
511
+ box-shadow: 0 20px 40px rgba(0, 0, 0, 0.5);
512
+ }
513
+
514
+ .dialog-title {
515
+ font-size: 18px;
516
+ font-weight: 600;
517
+ margin-bottom: 16px;
518
+ color: ${cssManager.bdTheme('#18181b', '#fff')};
519
+ }
520
+
521
+ .dialog-location {
522
+ font-size: 12px;
523
+ color: ${cssManager.bdTheme('#71717a', '#888')};
524
+ margin-bottom: 12px;
525
+ font-family: monospace;
526
+ }
527
+
528
+ .dialog-input {
529
+ width: 100%;
530
+ padding: 10px 12px;
531
+ background: ${cssManager.bdTheme('#f4f4f5', '#141414')};
532
+ border: 1px solid ${cssManager.bdTheme('#d4d4d8', '#333')};
533
+ border-radius: 6px;
534
+ color: ${cssManager.bdTheme('#18181b', '#fff')};
535
+ font-size: 14px;
536
+ margin-bottom: 8px;
537
+ box-sizing: border-box;
538
+ }
539
+
540
+ .dialog-input:focus {
541
+ outline: none;
542
+ border-color: ${cssManager.bdTheme('#a1a1aa', '#e0e0e0')};
543
+ }
544
+
545
+ .dialog-hint {
546
+ font-size: 11px;
547
+ color: ${cssManager.bdTheme('#a1a1aa', '#666')};
548
+ margin-bottom: 16px;
549
+ }
550
+
551
+ .dialog-actions {
552
+ display: flex;
553
+ gap: 12px;
554
+ justify-content: flex-end;
555
+ }
556
+
557
+ .dialog-btn {
558
+ padding: 8px 16px;
559
+ border-radius: 6px;
560
+ font-size: 14px;
561
+ cursor: pointer;
562
+ transition: all 0.2s;
563
+ }
564
+
565
+ .dialog-btn-cancel {
566
+ background: transparent;
567
+ border: 1px solid ${cssManager.bdTheme('#d4d4d8', '#444')};
568
+ color: ${cssManager.bdTheme('#71717a', '#aaa')};
569
+ }
570
+
571
+ .dialog-btn-cancel:hover {
572
+ background: ${cssManager.bdTheme('rgba(0, 0, 0, 0.03)', 'rgba(255, 255, 255, 0.05)')};
573
+ color: ${cssManager.bdTheme('#18181b', '#fff')};
574
+ }
575
+
576
+ .dialog-btn-create {
577
+ background: ${cssManager.bdTheme('#e5e7eb', '#404040')};
578
+ border: none;
579
+ color: ${cssManager.bdTheme('#18181b', '#fff')};
580
+ }
581
+
582
+ .dialog-btn-create:hover {
583
+ background: ${cssManager.bdTheme('#d4d4d8', '#505050')};
584
+ }
585
+
586
+ .dialog-btn-create:disabled {
587
+ opacity: 0.5;
588
+ cursor: not-allowed;
589
+ }
590
+
591
+ /* Move dialog styles */
592
+ .move-summary {
593
+ background: ${cssManager.bdTheme('rgba(0, 0, 0, 0.03)', 'rgba(0, 0, 0, 0.2)')};
594
+ border-radius: 8px;
595
+ padding: 16px;
596
+ margin-bottom: 16px;
597
+ }
598
+
599
+ .move-item {
600
+ display: flex;
601
+ gap: 8px;
602
+ margin-bottom: 8px;
603
+ }
604
+
605
+ .move-item:last-child {
606
+ margin-bottom: 0;
607
+ }
608
+
609
+ .move-label {
610
+ color: ${cssManager.bdTheme('#71717a', '#888')};
611
+ min-width: 40px;
612
+ }
613
+
614
+ .move-path {
615
+ color: ${cssManager.bdTheme('#3f3f46', '#e0e0e0')};
616
+ font-family: monospace;
617
+ font-size: 12px;
618
+ word-break: break-all;
619
+ }
620
+
621
+ .move-error {
622
+ background: rgba(239, 68, 68, 0.15);
623
+ border: 1px solid rgba(239, 68, 68, 0.3);
624
+ color: #f87171;
625
+ padding: 12px 16px;
626
+ border-radius: 8px;
627
+ margin-bottom: 16px;
628
+ font-size: 13px;
629
+ }
630
+
631
+ /* Move picker dialog styles */
632
+ .move-picker-dialog {
633
+ min-width: 450px;
634
+ max-height: 500px;
635
+ }
636
+
637
+ .picker-breadcrumb {
638
+ display: flex;
639
+ align-items: center;
640
+ gap: 4px;
641
+ padding: 8px 12px;
642
+ background: ${cssManager.bdTheme('rgba(0, 0, 0, 0.03)', 'rgba(0, 0, 0, 0.2)')};
643
+ border-radius: 6px;
644
+ margin-bottom: 12px;
645
+ font-size: 12px;
646
+ overflow-x: auto;
647
+ }
648
+
649
+ .picker-crumb {
650
+ color: ${cssManager.bdTheme('#71717a', '#888')};
651
+ cursor: pointer;
652
+ white-space: nowrap;
653
+ }
654
+
655
+ .picker-crumb:hover {
656
+ color: ${cssManager.bdTheme('#18181b', '#fff')};
657
+ }
658
+
659
+ .picker-separator {
660
+ color: ${cssManager.bdTheme('#d4d4d8', '#555')};
661
+ }
662
+
663
+ .picker-list {
664
+ max-height: 280px;
665
+ overflow-y: auto;
666
+ border: 1px solid ${cssManager.bdTheme('#e5e7eb', '#333')};
667
+ border-radius: 6px;
668
+ margin-bottom: 16px;
669
+ min-height: 100px;
670
+ }
671
+
672
+ .picker-item {
673
+ display: flex;
674
+ align-items: center;
675
+ gap: 8px;
676
+ padding: 8px 12px;
677
+ cursor: pointer;
678
+ color: #fbbf24;
679
+ }
680
+
681
+ .picker-item:hover {
682
+ background: ${cssManager.bdTheme('rgba(0, 0, 0, 0.03)', 'rgba(255, 255, 255, 0.05)')};
683
+ }
684
+
685
+ .picker-item .icon {
686
+ width: 16px;
687
+ height: 16px;
688
+ flex-shrink: 0;
689
+ }
690
+
691
+ .picker-item .name {
692
+ flex: 1;
693
+ overflow: hidden;
694
+ text-overflow: ellipsis;
695
+ white-space: nowrap;
696
+ }
697
+
698
+ .picker-empty {
699
+ padding: 24px;
700
+ text-align: center;
701
+ color: ${cssManager.bdTheme('#a1a1aa', '#666')};
702
+ font-size: 13px;
703
+ }
704
+
705
+ .column-item.dragging {
706
+ opacity: 0.5;
707
+ }
708
+
709
+ .column-item.drop-target {
710
+ background: rgba(59, 130, 246, 0.15) !important;
711
+ outline: 1px dashed rgba(59, 130, 246, 0.5);
712
+ }
713
+
714
+ .column-item.drop-invalid {
715
+ background: rgba(239, 68, 68, 0.1) !important;
716
+ cursor: not-allowed;
717
+ }
718
+ `,
719
+ ];
720
+ async connectedCallback() {
721
+ super.connectedCallback();
722
+ await this.loadInitialColumn();
723
+ }
724
+ async disconnectedCallback() {
725
+ await super.disconnectedCallback();
726
+ this.clearFolderHover();
727
+ this.dragCounters.clear();
728
+ if (this.fileInputElement) {
729
+ this.fileInputElement.remove();
730
+ this.fileInputElement = null;
731
+ }
732
+ if (this.folderInputElement) {
733
+ this.folderInputElement.remove();
734
+ this.folderInputElement = null;
735
+ }
736
+ }
737
+ updated(changedProperties) {
738
+ if (changedProperties.has('bucketName') || changedProperties.has('currentPrefix')) {
739
+ this.loadInitialColumn();
740
+ }
741
+ else if (changedProperties.has('refreshKey')) {
742
+ this.refreshAllColumns();
743
+ }
744
+ }
745
+ async loadInitialColumn() {
746
+ if (!this.dataProvider)
747
+ return;
748
+ this.loading = true;
749
+ try {
750
+ const pathSegments = getPathSegments(this.currentPrefix);
751
+ const prefixesToLoad = ['', ...pathSegments];
752
+ const columnResults = await Promise.all(prefixesToLoad.map(prefix => this.dataProvider.listObjects(this.bucketName, prefix, '/')));
753
+ this.columns = columnResults.map((result, index) => {
754
+ const prefix = prefixesToLoad[index];
755
+ const selectedItem = index < pathSegments.length ? pathSegments[index] : null;
756
+ return {
757
+ prefix,
758
+ objects: result.objects,
759
+ prefixes: result.prefixes,
760
+ selectedItem,
761
+ width: this.DEFAULT_COLUMN_WIDTH,
762
+ };
763
+ });
764
+ this.updateComplete.then(() => this.scrollToEnd());
765
+ }
766
+ catch (err) {
767
+ console.error('Error loading objects:', err);
768
+ this.columns = [];
769
+ }
770
+ this.loading = false;
771
+ }
772
+ async refreshAllColumns() {
773
+ if (!this.dataProvider)
774
+ return;
775
+ const updatedColumns = await Promise.all(this.columns.map(async (col) => {
776
+ try {
777
+ const result = await this.dataProvider.listObjects(this.bucketName, col.prefix, '/');
778
+ return { ...col, objects: result.objects, prefixes: result.prefixes };
779
+ }
780
+ catch {
781
+ return col;
782
+ }
783
+ }));
784
+ this.columns = updatedColumns;
785
+ }
786
+ async selectFolder(columnIndex, prefix) {
787
+ if (!this.dataProvider)
788
+ return;
789
+ this.columns = this.columns.map((col, i) => {
790
+ if (i === columnIndex) {
791
+ return { ...col, selectedItem: prefix };
792
+ }
793
+ return col;
794
+ });
795
+ this.columns = this.columns.slice(0, columnIndex + 1);
796
+ try {
797
+ const result = await this.dataProvider.listObjects(this.bucketName, prefix, '/');
798
+ this.columns = [
799
+ ...this.columns,
800
+ {
801
+ prefix,
802
+ objects: result.objects,
803
+ prefixes: result.prefixes,
804
+ selectedItem: null,
805
+ width: this.DEFAULT_COLUMN_WIDTH,
806
+ },
807
+ ];
808
+ this.updateComplete.then(() => this.scrollToEnd());
809
+ }
810
+ catch (err) {
811
+ console.error('Error loading folder:', err);
812
+ }
813
+ }
814
+ scrollToEnd() {
815
+ this.scrollLeft = this.scrollWidth - this.clientWidth;
816
+ }
817
+ startResize(e, columnIndex) {
818
+ e.preventDefault();
819
+ this.resizing = {
820
+ columnIndex,
821
+ startX: e.clientX,
822
+ startWidth: this.columns[columnIndex].width,
823
+ };
824
+ document.addEventListener('mousemove', this.handleResize);
825
+ document.addEventListener('mouseup', this.stopResize);
826
+ document.body.style.cursor = 'col-resize';
827
+ document.body.style.userSelect = 'none';
828
+ }
829
+ handleResize = (e) => {
830
+ if (!this.resizing)
831
+ return;
832
+ const delta = e.clientX - this.resizing.startX;
833
+ const newWidth = Math.min(this.MAX_COLUMN_WIDTH, Math.max(this.MIN_COLUMN_WIDTH, this.resizing.startWidth + delta));
834
+ this.columns = this.columns.map((col, i) => {
835
+ if (i === this.resizing.columnIndex) {
836
+ return { ...col, width: newWidth };
837
+ }
838
+ return col;
839
+ });
840
+ };
841
+ stopResize = () => {
842
+ this.resizing = null;
843
+ document.removeEventListener('mousemove', this.handleResize);
844
+ document.removeEventListener('mouseup', this.stopResize);
845
+ document.body.style.cursor = '';
846
+ document.body.style.userSelect = '';
847
+ };
848
+ selectFile(columnIndex, key) {
849
+ this.columns = this.columns.map((col, i) => {
850
+ if (i === columnIndex) {
851
+ return { ...col, selectedItem: key };
852
+ }
853
+ return col;
854
+ });
855
+ this.columns = this.columns.slice(0, columnIndex + 1);
856
+ this.dispatchEvent(new CustomEvent('key-selected', {
857
+ detail: { key },
858
+ bubbles: true,
859
+ composed: true,
860
+ }));
861
+ }
862
+ getFileIcon(key) {
863
+ const ext = key.split('.').pop()?.toLowerCase() || '';
864
+ const iconMap = {
865
+ json: 'M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z',
866
+ txt: 'M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z',
867
+ png: 'M5 3h14a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2z',
868
+ jpg: 'M5 3h14a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2z',
869
+ jpeg: 'M5 3h14a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2z',
870
+ gif: 'M5 3h14a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2z',
871
+ pdf: 'M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z',
872
+ };
873
+ return iconMap[ext] || 'M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z';
874
+ }
875
+ handleFolderContextMenu(event, columnIndex, prefix) {
876
+ if (!this.dataProvider)
877
+ return;
878
+ event.preventDefault();
879
+ DeesContextmenu.openContextMenuWithOptions(event, [
880
+ {
881
+ name: 'Open',
882
+ iconName: 'lucide:folderOpen',
883
+ action: async () => {
884
+ this.selectFolder(columnIndex, prefix);
885
+ },
886
+ },
887
+ {
888
+ name: 'Copy Path',
889
+ iconName: 'lucide:copy',
890
+ action: async () => {
891
+ await navigator.clipboard.writeText(prefix);
892
+ },
893
+ },
894
+ {
895
+ name: 'Rename',
896
+ iconName: 'lucide:pencil',
897
+ action: async () => this.openRenameDialog(prefix, true),
898
+ },
899
+ { divider: true },
900
+ {
901
+ name: 'Move to...',
902
+ iconName: 'lucide:folderInput',
903
+ action: async () => this.openMovePickerDialog(prefix, true),
904
+ },
905
+ { divider: true },
906
+ {
907
+ name: 'New Folder Inside',
908
+ iconName: 'lucide:folderPlus',
909
+ action: async () => this.openCreateDialog('folder', prefix),
910
+ },
911
+ {
912
+ name: 'New File Inside',
913
+ iconName: 'lucide:filePlus',
914
+ action: async () => this.openCreateDialog('file', prefix),
915
+ },
916
+ {
917
+ name: 'Upload Files...',
918
+ iconName: 'lucide:file',
919
+ action: async () => this.triggerFileUpload(prefix, 'files'),
920
+ },
921
+ {
922
+ name: 'Upload Folder...',
923
+ iconName: 'lucide:folderUp',
924
+ action: async () => this.triggerFileUpload(prefix, 'folder'),
925
+ },
926
+ { divider: true },
927
+ {
928
+ name: 'Delete Folder',
929
+ iconName: 'lucide:trash2',
930
+ action: async () => {
931
+ if (confirm(`Delete folder "${getFileName(prefix)}" and all its contents?`)) {
932
+ const success = await this.dataProvider.deletePrefix(this.bucketName, prefix);
933
+ if (success) {
934
+ this.columns = this.columns.slice(0, columnIndex + 1);
935
+ this.columns = this.columns.map((col, i) => i === columnIndex ? { ...col, selectedItem: null } : col);
936
+ await this.refreshColumnByPrefix(this.columns[columnIndex].prefix);
937
+ }
938
+ }
939
+ },
940
+ },
941
+ ]);
942
+ }
943
+ handleFileContextMenu(event, columnIndex, key) {
944
+ if (!this.dataProvider)
945
+ return;
946
+ event.preventDefault();
947
+ DeesContextmenu.openContextMenuWithOptions(event, [
948
+ {
949
+ name: 'Preview',
950
+ iconName: 'lucide:eye',
951
+ action: async () => {
952
+ this.selectFile(columnIndex, key);
953
+ },
954
+ },
955
+ {
956
+ name: 'Download',
957
+ iconName: 'lucide:download',
958
+ action: async () => {
959
+ const url = await this.dataProvider.getObjectUrl(this.bucketName, key);
960
+ const link = document.createElement('a');
961
+ link.href = url;
962
+ link.download = getFileName(key);
963
+ link.click();
964
+ },
965
+ },
966
+ {
967
+ name: 'Copy Path',
968
+ iconName: 'lucide:copy',
969
+ action: async () => {
970
+ await navigator.clipboard.writeText(key);
971
+ },
972
+ },
973
+ {
974
+ name: 'Rename',
975
+ iconName: 'lucide:pencil',
976
+ action: async () => this.openRenameDialog(key, false),
977
+ },
978
+ { divider: true },
979
+ {
980
+ name: 'Move to...',
981
+ iconName: 'lucide:folderInput',
982
+ action: async () => this.openMovePickerDialog(key, false),
983
+ },
984
+ { divider: true },
985
+ {
986
+ name: 'Delete',
987
+ iconName: 'lucide:trash2',
988
+ action: async () => {
989
+ if (confirm(`Delete file "${getFileName(key)}"?`)) {
990
+ const success = await this.dataProvider.deleteObject(this.bucketName, key);
991
+ if (success) {
992
+ await this.refreshColumnByPrefix(this.columns[columnIndex].prefix);
993
+ }
994
+ }
995
+ },
996
+ },
997
+ ]);
998
+ }
999
+ handleEmptySpaceContextMenu(event, columnIndex) {
1000
+ if (event.target !== event.currentTarget)
1001
+ return;
1002
+ event.preventDefault();
1003
+ const prefix = this.columns[columnIndex].prefix;
1004
+ DeesContextmenu.openContextMenuWithOptions(event, [
1005
+ {
1006
+ name: 'New Folder',
1007
+ iconName: 'lucide:folderPlus',
1008
+ action: async () => this.openCreateDialog('folder', prefix),
1009
+ },
1010
+ {
1011
+ name: 'New File',
1012
+ iconName: 'lucide:filePlus',
1013
+ action: async () => this.openCreateDialog('file', prefix),
1014
+ },
1015
+ {
1016
+ name: 'Upload Files...',
1017
+ iconName: 'lucide:file',
1018
+ action: async () => this.triggerFileUpload(prefix, 'files'),
1019
+ },
1020
+ {
1021
+ name: 'Upload Folder...',
1022
+ iconName: 'lucide:folderUp',
1023
+ action: async () => this.triggerFileUpload(prefix, 'folder'),
1024
+ },
1025
+ ]);
1026
+ }
1027
+ openCreateDialog(type, prefix) {
1028
+ this.createDialogType = type;
1029
+ this.createDialogPrefix = prefix;
1030
+ this.createDialogName = '';
1031
+ this.showCreateDialog = true;
1032
+ }
1033
+ // --- File upload helpers ---
1034
+ ensureFileInputs() {
1035
+ if (!this.fileInputElement) {
1036
+ this.fileInputElement = document.createElement('input');
1037
+ this.fileInputElement.type = 'file';
1038
+ this.fileInputElement.multiple = true;
1039
+ this.fileInputElement.style.display = 'none';
1040
+ this.shadowRoot.appendChild(this.fileInputElement);
1041
+ }
1042
+ if (!this.folderInputElement) {
1043
+ this.folderInputElement = document.createElement('input');
1044
+ this.folderInputElement.type = 'file';
1045
+ this.folderInputElement.multiple = true;
1046
+ this.folderInputElement.webkitdirectory = true;
1047
+ this.folderInputElement.style.display = 'none';
1048
+ this.shadowRoot.appendChild(this.folderInputElement);
1049
+ }
1050
+ }
1051
+ triggerFileUpload(targetPrefix, type) {
1052
+ this.ensureFileInputs();
1053
+ const input = type === 'folder' ? this.folderInputElement : this.fileInputElement;
1054
+ input.value = '';
1055
+ const handler = async () => {
1056
+ input.removeEventListener('change', handler);
1057
+ if (input.files && input.files.length > 0) {
1058
+ await this.uploadFiles(Array.from(input.files), targetPrefix);
1059
+ }
1060
+ };
1061
+ input.addEventListener('change', handler);
1062
+ input.click();
1063
+ }
1064
+ async uploadFiles(files, targetPrefix) {
1065
+ if (!this.dataProvider)
1066
+ return;
1067
+ this.uploading = true;
1068
+ this.uploadProgress = { current: 0, total: files.length };
1069
+ for (let i = 0; i < files.length; i++) {
1070
+ const file = files[i];
1071
+ this.uploadProgress = { current: i + 1, total: files.length };
1072
+ try {
1073
+ const base64 = await this.readFileAsBase64(file);
1074
+ const relativePath = file.webkitRelativePath || file.name;
1075
+ const key = targetPrefix + relativePath;
1076
+ const contentType = file.type || getContentType(file.name.split('.').pop()?.toLowerCase() || '');
1077
+ await this.dataProvider.putObject(this.bucketName, key, base64, contentType);
1078
+ }
1079
+ catch (err) {
1080
+ console.error(`Failed to upload ${file.name}:`, err);
1081
+ }
1082
+ }
1083
+ this.uploading = false;
1084
+ this.uploadProgress = null;
1085
+ await this.refreshColumnByPrefix(targetPrefix);
1086
+ }
1087
+ async uploadFilesWithPaths(files, targetPrefix) {
1088
+ if (!this.dataProvider)
1089
+ return;
1090
+ this.uploading = true;
1091
+ this.uploadProgress = { current: 0, total: files.length };
1092
+ for (let i = 0; i < files.length; i++) {
1093
+ const { file, relativePath } = files[i];
1094
+ this.uploadProgress = { current: i + 1, total: files.length };
1095
+ try {
1096
+ const base64 = await this.readFileAsBase64(file);
1097
+ const key = targetPrefix + relativePath;
1098
+ const contentType = file.type || getContentType(file.name.split('.').pop()?.toLowerCase() || '');
1099
+ await this.dataProvider.putObject(this.bucketName, key, base64, contentType);
1100
+ }
1101
+ catch (err) {
1102
+ console.error(`Failed to upload ${relativePath}:`, err);
1103
+ }
1104
+ }
1105
+ this.uploading = false;
1106
+ this.uploadProgress = null;
1107
+ await this.refreshColumnByPrefix(targetPrefix);
1108
+ }
1109
+ readFileAsBase64(file) {
1110
+ return new Promise((resolve, reject) => {
1111
+ const reader = new FileReader();
1112
+ reader.onload = () => {
1113
+ const result = reader.result;
1114
+ resolve(result.split(',')[1] || '');
1115
+ };
1116
+ reader.onerror = () => reject(reader.error);
1117
+ reader.readAsDataURL(file);
1118
+ });
1119
+ }
1120
+ async refreshColumnByPrefix(prefix) {
1121
+ if (!this.dataProvider)
1122
+ return;
1123
+ const columnIndex = this.columns.findIndex(col => col.prefix === prefix);
1124
+ if (columnIndex === -1) {
1125
+ await this.refreshAllColumns();
1126
+ return;
1127
+ }
1128
+ try {
1129
+ const result = await this.dataProvider.listObjects(this.bucketName, prefix, '/');
1130
+ this.columns = this.columns.map((col, i) => i === columnIndex ? { ...col, objects: result.objects, prefixes: result.prefixes } : col);
1131
+ }
1132
+ catch {
1133
+ await this.refreshAllColumns();
1134
+ }
1135
+ }
1136
+ // --- Drag-and-drop handlers ---
1137
+ handleColumnDragEnter(e, columnIndex) {
1138
+ e.preventDefault();
1139
+ e.stopPropagation();
1140
+ const count = (this.dragCounters.get(columnIndex) || 0) + 1;
1141
+ this.dragCounters.set(columnIndex, count);
1142
+ this.dragOverColumnIndex = columnIndex;
1143
+ }
1144
+ handleColumnDragOver(e) {
1145
+ e.preventDefault();
1146
+ e.stopPropagation();
1147
+ if (e.dataTransfer) {
1148
+ e.dataTransfer.dropEffect = this.draggedItem ? 'move' : 'copy';
1149
+ }
1150
+ }
1151
+ handleColumnDragLeave(e, columnIndex) {
1152
+ e.stopPropagation();
1153
+ const count = (this.dragCounters.get(columnIndex) || 1) - 1;
1154
+ this.dragCounters.set(columnIndex, count);
1155
+ if (count <= 0) {
1156
+ this.dragCounters.delete(columnIndex);
1157
+ if (this.dragOverColumnIndex === columnIndex)
1158
+ this.dragOverColumnIndex = -1;
1159
+ this.clearFolderHover();
1160
+ }
1161
+ }
1162
+ async handleColumnDrop(e, columnIndex) {
1163
+ e.preventDefault();
1164
+ e.stopPropagation();
1165
+ const targetPrefix = this.dragOverFolderPrefix ?? this.columns[columnIndex].prefix;
1166
+ if (this.draggedItem) {
1167
+ this.initiateMove(this.draggedItem.key, this.draggedItem.isFolder, targetPrefix);
1168
+ this.draggedItem = null;
1169
+ this.clearFolderHover();
1170
+ this.dragCounters.clear();
1171
+ this.dragOverColumnIndex = -1;
1172
+ return;
1173
+ }
1174
+ this.dragCounters.clear();
1175
+ this.dragOverColumnIndex = -1;
1176
+ const items = e.dataTransfer?.items;
1177
+ if (!items || items.length === 0)
1178
+ return;
1179
+ this.clearFolderHover();
1180
+ const allFiles = [];
1181
+ const processEntry = async (entry, path) => {
1182
+ if (entry.isFile) {
1183
+ const fileEntry = entry;
1184
+ const file = await new Promise((resolve, reject) => {
1185
+ fileEntry.file(resolve, reject);
1186
+ });
1187
+ allFiles.push({ file, relativePath: path + file.name });
1188
+ }
1189
+ else if (entry.isDirectory) {
1190
+ const dirEntry = entry;
1191
+ const reader = dirEntry.createReader();
1192
+ const entries = await new Promise((resolve, reject) => {
1193
+ reader.readEntries(resolve, reject);
1194
+ });
1195
+ for (const childEntry of entries) {
1196
+ await processEntry(childEntry, path + entry.name + '/');
1197
+ }
1198
+ }
1199
+ };
1200
+ for (let i = 0; i < items.length; i++) {
1201
+ const item = items[i];
1202
+ if (item.kind === 'file') {
1203
+ const entry = item.webkitGetAsEntry();
1204
+ if (entry) {
1205
+ await processEntry(entry, '');
1206
+ }
1207
+ }
1208
+ }
1209
+ if (allFiles.length > 0) {
1210
+ await this.uploadFilesWithPaths(allFiles, targetPrefix);
1211
+ }
1212
+ }
1213
+ handleFolderDragEnter(e, folderPrefix) {
1214
+ e.stopPropagation();
1215
+ this.clearFolderHover();
1216
+ this.folderHoverTimer = setTimeout(() => {
1217
+ this.dragOverFolderPrefix = folderPrefix;
1218
+ }, 500);
1219
+ }
1220
+ handleFolderDragLeave(e, folderPrefix) {
1221
+ e.stopPropagation();
1222
+ const target = e.currentTarget;
1223
+ const relatedTarget = e.relatedTarget;
1224
+ if (relatedTarget && target.contains(relatedTarget)) {
1225
+ return;
1226
+ }
1227
+ if (this.dragOverFolderPrefix === folderPrefix)
1228
+ this.dragOverFolderPrefix = null;
1229
+ if (this.folderHoverTimer) {
1230
+ clearTimeout(this.folderHoverTimer);
1231
+ this.folderHoverTimer = null;
1232
+ }
1233
+ }
1234
+ handleFolderDragOver(e) {
1235
+ e.preventDefault();
1236
+ e.stopPropagation();
1237
+ if (e.dataTransfer) {
1238
+ e.dataTransfer.dropEffect = this.draggedItem ? 'move' : 'copy';
1239
+ }
1240
+ }
1241
+ clearFolderHover() {
1242
+ if (this.folderHoverTimer) {
1243
+ clearTimeout(this.folderHoverTimer);
1244
+ this.folderHoverTimer = null;
1245
+ }
1246
+ this.dragOverFolderPrefix = null;
1247
+ }
1248
+ // --- Internal drag handlers for move ---
1249
+ handleItemDragStart(e, key, isFolder) {
1250
+ this.draggedItem = { key, isFolder };
1251
+ e.dataTransfer?.setData('text/plain', key);
1252
+ e.dataTransfer.effectAllowed = 'copyMove';
1253
+ const target = e.target;
1254
+ target.classList.add('dragging');
1255
+ }
1256
+ handleItemDragEnd(e) {
1257
+ this.draggedItem = null;
1258
+ const target = e.target;
1259
+ target.classList.remove('dragging');
1260
+ }
1261
+ // --- Move picker dialog ---
1262
+ async openMovePickerDialog(key, isFolder) {
1263
+ this.movePickerSource = { key, isFolder };
1264
+ this.movePickerCurrentPrefix = '';
1265
+ this.showMovePickerDialog = true;
1266
+ await this.loadMovePickerPrefixes('');
1267
+ }
1268
+ async navigateMovePicker(prefix) {
1269
+ this.movePickerCurrentPrefix = prefix;
1270
+ await this.loadMovePickerPrefixes(prefix);
1271
+ }
1272
+ async loadMovePickerPrefixes(prefix) {
1273
+ if (!this.dataProvider)
1274
+ return;
1275
+ this.movePickerLoading = true;
1276
+ try {
1277
+ const result = await this.dataProvider.listObjects(this.bucketName, prefix, '/');
1278
+ this.movePickerPrefixes = result.prefixes;
1279
+ }
1280
+ catch {
1281
+ this.movePickerPrefixes = [];
1282
+ }
1283
+ this.movePickerLoading = false;
1284
+ }
1285
+ selectMoveDestination(destPrefix) {
1286
+ if (!this.movePickerSource)
1287
+ return;
1288
+ this.closeMovePickerDialog();
1289
+ this.initiateMove(this.movePickerSource.key, this.movePickerSource.isFolder, destPrefix);
1290
+ }
1291
+ closeMovePickerDialog() {
1292
+ this.showMovePickerDialog = false;
1293
+ this.movePickerSource = null;
1294
+ this.movePickerCurrentPrefix = '';
1295
+ this.movePickerPrefixes = [];
1296
+ }
1297
+ // --- Move confirmation dialog ---
1298
+ initiateMove(sourceKey, isFolder, destPrefix) {
1299
+ const validation = validateMove(sourceKey, destPrefix);
1300
+ if (!validation.valid) {
1301
+ this.moveSource = { key: sourceKey, isFolder };
1302
+ this.moveDestination = destPrefix;
1303
+ this.moveError = validation.error;
1304
+ this.showMoveDialog = true;
1305
+ return;
1306
+ }
1307
+ this.moveSource = { key: sourceKey, isFolder };
1308
+ this.moveDestination = destPrefix;
1309
+ this.moveError = null;
1310
+ this.showMoveDialog = true;
1311
+ }
1312
+ async executeMove() {
1313
+ if (!this.moveSource || !this.dataProvider)
1314
+ return;
1315
+ this.moveInProgress = true;
1316
+ try {
1317
+ const sourceName = getFileName(this.moveSource.key);
1318
+ const destKey = this.moveDestination + sourceName + (this.moveSource.isFolder ? '/' : '');
1319
+ let result;
1320
+ if (this.moveSource.isFolder) {
1321
+ result = await this.dataProvider.movePrefix(this.bucketName, this.moveSource.key, destKey);
1322
+ }
1323
+ else {
1324
+ result = await this.dataProvider.moveObject(this.bucketName, this.moveSource.key, destKey);
1325
+ }
1326
+ if (result.success) {
1327
+ this.closeMoveDialog();
1328
+ await this.refreshAllColumns();
1329
+ }
1330
+ else {
1331
+ this.moveError = result.error || 'Move operation failed';
1332
+ }
1333
+ }
1334
+ catch (err) {
1335
+ this.moveError = `Error: ${err}`;
1336
+ }
1337
+ this.moveInProgress = false;
1338
+ }
1339
+ closeMoveDialog() {
1340
+ this.showMoveDialog = false;
1341
+ this.moveSource = null;
1342
+ this.moveDestination = '';
1343
+ this.moveError = null;
1344
+ this.moveInProgress = false;
1345
+ }
1346
+ // --- Rename dialog methods ---
1347
+ openRenameDialog(key, isFolder) {
1348
+ this.renameSource = { key, isFolder };
1349
+ this.renameName = getFileName(key);
1350
+ this.renameError = null;
1351
+ this.showRenameDialog = true;
1352
+ this.updateComplete.then(() => {
1353
+ const input = this.shadowRoot?.querySelector('.rename-dialog-input');
1354
+ if (input) {
1355
+ input.focus();
1356
+ if (!isFolder) {
1357
+ const lastDot = this.renameName.lastIndexOf('.');
1358
+ if (lastDot > 0) {
1359
+ input.setSelectionRange(0, lastDot);
1360
+ }
1361
+ else {
1362
+ input.select();
1363
+ }
1364
+ }
1365
+ else {
1366
+ input.select();
1367
+ }
1368
+ }
1369
+ });
1370
+ }
1371
+ async executeRename() {
1372
+ if (!this.renameSource || !this.renameName.trim() || !this.dataProvider)
1373
+ return;
1374
+ const newName = this.renameName.trim();
1375
+ const currentName = getFileName(this.renameSource.key);
1376
+ if (newName === currentName) {
1377
+ this.renameError = 'Name is the same as current';
1378
+ return;
1379
+ }
1380
+ if (!newName) {
1381
+ this.renameError = 'Name cannot be empty';
1382
+ return;
1383
+ }
1384
+ if (newName.includes('/')) {
1385
+ this.renameError = 'Name cannot contain "/"';
1386
+ return;
1387
+ }
1388
+ this.renameInProgress = true;
1389
+ this.renameError = null;
1390
+ try {
1391
+ const parentPrefix = getParentPrefix(this.renameSource.key);
1392
+ const newKey = parentPrefix + newName + (this.renameSource.isFolder ? '/' : '');
1393
+ let result;
1394
+ if (this.renameSource.isFolder) {
1395
+ result = await this.dataProvider.movePrefix(this.bucketName, this.renameSource.key, newKey);
1396
+ }
1397
+ else {
1398
+ result = await this.dataProvider.moveObject(this.bucketName, this.renameSource.key, newKey);
1399
+ }
1400
+ if (result.success) {
1401
+ this.closeRenameDialog();
1402
+ await this.refreshAllColumns();
1403
+ }
1404
+ else {
1405
+ this.renameError = result.error || 'Rename failed';
1406
+ }
1407
+ }
1408
+ catch (err) {
1409
+ this.renameError = `Error: ${err}`;
1410
+ }
1411
+ this.renameInProgress = false;
1412
+ }
1413
+ closeRenameDialog() {
1414
+ this.showRenameDialog = false;
1415
+ this.renameSource = null;
1416
+ this.renameName = '';
1417
+ this.renameError = null;
1418
+ this.renameInProgress = false;
1419
+ }
1420
+ renderRenameDialog() {
1421
+ if (!this.showRenameDialog || !this.renameSource)
1422
+ return '';
1423
+ const isFolder = this.renameSource.isFolder;
1424
+ const title = isFolder ? 'Rename Folder' : 'Rename File';
1425
+ return html `
1426
+ <div class="dialog-overlay" @click=${() => this.closeRenameDialog()}>
1427
+ <div class="dialog" @click=${(e) => e.stopPropagation()}>
1428
+ <div class="dialog-title">${title}</div>
1429
+ <div class="dialog-location">
1430
+ Location: ${this.bucketName}/${getParentPrefix(this.renameSource.key)}
1431
+ </div>
1432
+ ${this.renameError ? html `<div class="move-error">${this.renameError}</div>` : ''}
1433
+ <input
1434
+ type="text"
1435
+ class="dialog-input rename-dialog-input"
1436
+ placeholder=${isFolder ? 'folder-name' : 'filename.ext'}
1437
+ .value=${this.renameName}
1438
+ @input=${(e) => {
1439
+ this.renameName = e.target.value;
1440
+ this.renameError = null;
1441
+ }}
1442
+ @keydown=${(e) => {
1443
+ if (e.key === 'Enter')
1444
+ this.executeRename();
1445
+ if (e.key === 'Escape')
1446
+ this.closeRenameDialog();
1447
+ }}
1448
+ />
1449
+ <div class="dialog-actions">
1450
+ <button class="dialog-btn dialog-btn-cancel"
1451
+ @click=${() => this.closeRenameDialog()}
1452
+ ?disabled=${this.renameInProgress}>Cancel</button>
1453
+ <button class="dialog-btn dialog-btn-create"
1454
+ @click=${() => this.executeRename()}
1455
+ ?disabled=${this.renameInProgress || !this.renameName.trim()}>
1456
+ ${this.renameInProgress ? 'Renaming...' : 'Rename'}
1457
+ </button>
1458
+ </div>
1459
+ </div>
1460
+ </div>
1461
+ `;
1462
+ }
1463
+ renderMoveDialog() {
1464
+ if (!this.showMoveDialog || !this.moveSource)
1465
+ return '';
1466
+ const sourceName = getFileName(this.moveSource.key);
1467
+ return html `
1468
+ <div class="dialog-overlay" @click=${() => this.closeMoveDialog()}>
1469
+ <div class="dialog" @click=${(e) => e.stopPropagation()}>
1470
+ <div class="dialog-title">Move ${this.moveSource.isFolder ? 'Folder' : 'File'}</div>
1471
+
1472
+ ${this.moveError ? html `
1473
+ <div class="move-error">${this.moveError}</div>
1474
+ ` : html `
1475
+ <div class="move-summary">
1476
+ <div class="move-item">
1477
+ <span class="move-label">From:</span>
1478
+ <span class="move-path">${this.moveSource.key}</span>
1479
+ </div>
1480
+ <div class="move-item">
1481
+ <span class="move-label">To:</span>
1482
+ <span class="move-path">${this.moveDestination}${sourceName}</span>
1483
+ </div>
1484
+ </div>
1485
+ `}
1486
+
1487
+ <div class="dialog-actions">
1488
+ <button class="dialog-btn dialog-btn-cancel"
1489
+ @click=${() => this.closeMoveDialog()}
1490
+ ?disabled=${this.moveInProgress}>
1491
+ Cancel
1492
+ </button>
1493
+ ${!this.moveError ? html `
1494
+ <button class="dialog-btn dialog-btn-create"
1495
+ @click=${() => this.executeMove()}
1496
+ ?disabled=${this.moveInProgress}>
1497
+ ${this.moveInProgress ? 'Moving...' : 'Move'}
1498
+ </button>
1499
+ ` : ''}
1500
+ </div>
1501
+ </div>
1502
+ </div>
1503
+ `;
1504
+ }
1505
+ renderMovePickerDialog() {
1506
+ if (!this.showMovePickerDialog || !this.movePickerSource)
1507
+ return '';
1508
+ const sourceName = getFileName(this.movePickerSource.key);
1509
+ const sourceParent = getParentPrefix(this.movePickerSource.key);
1510
+ return html `
1511
+ <div class="dialog-overlay" @click=${() => this.closeMovePickerDialog()}>
1512
+ <div class="dialog move-picker-dialog" @click=${(e) => e.stopPropagation()}>
1513
+ <div class="dialog-title">Move "${sourceName}" to...</div>
1514
+
1515
+ <div class="picker-breadcrumb">
1516
+ <span class="picker-crumb" @click=${() => this.navigateMovePicker('')}>
1517
+ ${this.bucketName}
1518
+ </span>
1519
+ ${getPathSegments(this.movePickerCurrentPrefix).map(seg => html `
1520
+ <span class="picker-separator">/</span>
1521
+ <span class="picker-crumb" @click=${() => this.navigateMovePicker(seg)}>
1522
+ ${getFileName(seg)}
1523
+ </span>
1524
+ `)}
1525
+ </div>
1526
+
1527
+ <div class="picker-list">
1528
+ ${this.movePickerLoading ? html `<div class="picker-empty">Loading...</div>` : ''}
1529
+ ${!this.movePickerLoading && this.movePickerPrefixes.filter(p => p !== this.movePickerSource.key).length === 0 ? html `
1530
+ <div class="picker-empty">No subfolders</div>
1531
+ ` : ''}
1532
+ ${this.movePickerPrefixes
1533
+ .filter(p => p !== this.movePickerSource.key)
1534
+ .map(prefix => html `
1535
+ <div class="picker-item"
1536
+ @click=${() => this.navigateMovePicker(prefix)}
1537
+ @dblclick=${() => this.selectMoveDestination(prefix)}>
1538
+ <svg class="icon" viewBox="0 0 24 24" fill="currentColor">
1539
+ <path d="M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z"/>
1540
+ </svg>
1541
+ <span class="name">${getFileName(prefix)}</span>
1542
+ </div>
1543
+ `)}
1544
+ </div>
1545
+
1546
+ <div class="dialog-actions">
1547
+ <button class="dialog-btn dialog-btn-cancel" @click=${() => this.closeMovePickerDialog()}>
1548
+ Cancel
1549
+ </button>
1550
+ <button class="dialog-btn dialog-btn-create"
1551
+ @click=${() => this.selectMoveDestination(this.movePickerCurrentPrefix)}
1552
+ ?disabled=${this.movePickerCurrentPrefix === sourceParent}>
1553
+ Move Here
1554
+ </button>
1555
+ </div>
1556
+ </div>
1557
+ </div>
1558
+ `;
1559
+ }
1560
+ async handleCreate() {
1561
+ if (!this.createDialogName.trim() || !this.dataProvider)
1562
+ return;
1563
+ const name = this.createDialogName.trim();
1564
+ let path;
1565
+ if (this.createDialogType === 'folder') {
1566
+ path = this.createDialogPrefix + name + '/.keep';
1567
+ }
1568
+ else {
1569
+ path = this.createDialogPrefix + name;
1570
+ }
1571
+ const ext = name.split('.').pop()?.toLowerCase() || '';
1572
+ const contentType = this.createDialogType === 'file' ? getContentType(ext) : 'application/octet-stream';
1573
+ const content = this.createDialogType === 'file' ? getDefaultContent(ext) : '';
1574
+ const success = await this.dataProvider.putObject(this.bucketName, path, btoa(content), contentType);
1575
+ if (success) {
1576
+ this.showCreateDialog = false;
1577
+ await this.refreshColumnByPrefix(this.createDialogPrefix);
1578
+ }
1579
+ }
1580
+ renderCreateDialog() {
1581
+ if (!this.showCreateDialog)
1582
+ return '';
1583
+ const isFolder = this.createDialogType === 'folder';
1584
+ const title = isFolder ? 'Create New Folder' : 'Create New File';
1585
+ const placeholder = isFolder ? 'folder-name or path/to/folder' : 'filename.txt or path/to/file.txt';
1586
+ return html `
1587
+ <div class="dialog-overlay" @click=${() => this.showCreateDialog = false}>
1588
+ <div class="dialog" @click=${(e) => e.stopPropagation()}>
1589
+ <div class="dialog-title">${title}</div>
1590
+ <div class="dialog-location">
1591
+ Location: ${this.bucketName}/${this.createDialogPrefix}
1592
+ </div>
1593
+ <input
1594
+ type="text"
1595
+ class="dialog-input"
1596
+ placeholder=${placeholder}
1597
+ .value=${this.createDialogName}
1598
+ @input=${(e) => this.createDialogName = e.target.value}
1599
+ @keydown=${(e) => e.key === 'Enter' && this.handleCreate()}
1600
+ />
1601
+ <div class="dialog-hint">
1602
+ Use "/" to create nested ${isFolder ? 'folders' : 'path'} (e.g., ${isFolder ? 'parent/child' : 'folder/file.txt'})
1603
+ </div>
1604
+ <div class="dialog-actions">
1605
+ <button class="dialog-btn dialog-btn-cancel" @click=${() => this.showCreateDialog = false}>
1606
+ Cancel
1607
+ </button>
1608
+ <button
1609
+ class="dialog-btn dialog-btn-create"
1610
+ ?disabled=${!this.createDialogName.trim()}
1611
+ @click=${() => this.handleCreate()}
1612
+ >
1613
+ Create
1614
+ </button>
1615
+ </div>
1616
+ </div>
1617
+ </div>
1618
+ `;
1619
+ }
1620
+ render() {
1621
+ if (this.loading && this.columns.length === 0) {
1622
+ return html `<div class="loading">Loading...</div>`;
1623
+ }
1624
+ return html `
1625
+ <div class="columns-container">
1626
+ ${this.columns.map((column, index) => this.renderColumnWrapper(column, index))}
1627
+ </div>
1628
+ ${this.renderCreateDialog()}
1629
+ ${this.renderMoveDialog()}
1630
+ ${this.renderMovePickerDialog()}
1631
+ ${this.renderRenameDialog()}
1632
+ `;
1633
+ }
1634
+ renderColumnWrapper(column, index) {
1635
+ return html `
1636
+ <div class="column-wrapper">
1637
+ ${this.renderColumn(column, index)}
1638
+ <div
1639
+ class="resize-handle ${this.resizing?.columnIndex === index ? 'active' : ''}"
1640
+ @mousedown=${(e) => this.startResize(e, index)}
1641
+ ></div>
1642
+ </div>
1643
+ `;
1644
+ }
1645
+ renderColumn(column, index) {
1646
+ const headerName = column.prefix
1647
+ ? getFileName(column.prefix)
1648
+ : this.bucketName;
1649
+ return html `
1650
+ <div
1651
+ class="column ${this.dragOverColumnIndex === index ? 'drag-over' : ''}"
1652
+ style="width: ${column.width}px"
1653
+ @dragenter=${(e) => this.handleColumnDragEnter(e, index)}
1654
+ @dragover=${(e) => this.handleColumnDragOver(e)}
1655
+ @dragleave=${(e) => this.handleColumnDragLeave(e, index)}
1656
+ @drop=${(e) => this.handleColumnDrop(e, index)}
1657
+ >
1658
+ <div class="column-header" title=${column.prefix || this.bucketName}>
1659
+ ${headerName}
1660
+ </div>
1661
+ <div class="column-items" @contextmenu=${(e) => this.handleEmptySpaceContextMenu(e, index)}>
1662
+ ${column.prefixes.length === 0 && column.objects.length === 0
1663
+ ? html `<div class="empty-state">Empty folder</div>`
1664
+ : ''}
1665
+ ${column.prefixes.map((prefix) => html `
1666
+ <div
1667
+ class="column-item folder ${column.selectedItem === prefix ? 'selected' : ''} ${this.dragOverFolderPrefix === prefix ? 'drag-target' : ''}"
1668
+ draggable="true"
1669
+ @click=${() => this.selectFolder(index, prefix)}
1670
+ @contextmenu=${(e) => this.handleFolderContextMenu(e, index, prefix)}
1671
+ @dragstart=${(e) => this.handleItemDragStart(e, prefix, true)}
1672
+ @dragend=${(e) => this.handleItemDragEnd(e)}
1673
+ @dragenter=${(e) => this.handleFolderDragEnter(e, prefix)}
1674
+ @dragover=${(e) => this.handleFolderDragOver(e)}
1675
+ @dragleave=${(e) => this.handleFolderDragLeave(e, prefix)}
1676
+ >
1677
+ <svg class="icon" viewBox="0 0 24 24" fill="currentColor">
1678
+ <path d="M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z" />
1679
+ </svg>
1680
+ <span class="name">${getFileName(prefix)}</span>
1681
+ <svg class="chevron" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
1682
+ <polyline points="9 18 15 12 9 6"></polyline>
1683
+ </svg>
1684
+ </div>
1685
+ `)}
1686
+ ${column.objects.map((obj) => html `
1687
+ <div
1688
+ class="column-item ${column.selectedItem === obj.key ? 'selected' : ''}"
1689
+ draggable="true"
1690
+ @click=${() => this.selectFile(index, obj.key)}
1691
+ @contextmenu=${(e) => this.handleFileContextMenu(e, index, obj.key)}
1692
+ @dragstart=${(e) => this.handleItemDragStart(e, obj.key, false)}
1693
+ @dragend=${(e) => this.handleItemDragEnd(e)}
1694
+ >
1695
+ <svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
1696
+ <path d="${this.getFileIcon(obj.key)}" />
1697
+ </svg>
1698
+ <span class="name">${getFileName(obj.key)}</span>
1699
+ </div>
1700
+ `)}
1701
+ </div>
1702
+ ${this.dragOverColumnIndex === index ? html `
1703
+ <div class="drag-hint">
1704
+ ${this.draggedItem
1705
+ ? (this.dragOverFolderPrefix
1706
+ ? `Move to ${getFileName(this.dragOverFolderPrefix)}`
1707
+ : 'Move here')
1708
+ : (this.dragOverFolderPrefix
1709
+ ? `Drop to upload into ${getFileName(this.dragOverFolderPrefix)}`
1710
+ : 'Drop to upload here')}
1711
+ </div>
1712
+ ` : ''}
1713
+ ${this.uploading ? html `
1714
+ <div class="upload-overlay">
1715
+ <div class="upload-text">Uploading...</div>
1716
+ ${this.uploadProgress ? html `
1717
+ <div class="upload-progress">${this.uploadProgress.current} / ${this.uploadProgress.total} files</div>
1718
+ ` : ''}
1719
+ </div>
1720
+ ` : ''}
1721
+ </div>
1722
+ `;
1723
+ }
1724
+ static {
1725
+ __runInitializers(_classThis, _classExtraInitializers);
1726
+ }
1727
+ };
1728
+ return DeesStorageColumns = _classThis;
1729
+ })();
1730
+ export { DeesStorageColumns };
1731
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVlcy1zdG9yYWdlLWNvbHVtbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90c193ZWIvZWxlbWVudHMvMDBncm91cC1kYXRhdmlldy9kZWVzLXN0b3JhZ2UtYnJvd3Nlci9kZWVzLXN0b3JhZ2UtY29sdW1ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsT0FBTyxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ2pILE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSw0REFBNEQsQ0FBQztBQUM3RixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUV0RCxPQUFPLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBRSxlQUFlLEVBQUUsY0FBYyxFQUFFLGlCQUFpQixFQUFFLGVBQWUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0lBNEJuSCxrQkFBa0I7NEJBRDlCLGFBQWEsQ0FBQyxzQkFBc0IsQ0FBQzs7OztzQkFDRSxXQUFXOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O2tDQUFuQixTQUFRLFdBQVc7Ozs7d0NBQ2hELFFBQVEsQ0FBQyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQztzQ0FHMUIsUUFBUSxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDO3lDQUcxQixRQUFRLENBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUM7c0NBRzFCLFFBQVEsQ0FBQyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQzttQ0FHMUIsS0FBSyxFQUFFO21DQUdQLEtBQUssRUFBRTs0Q0FH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