@memberjunction/ng-file-storage 6.2.0-edge.0 → 6.2.0-edge.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/admin/storage-admin-dialog.component.d.ts +1 -1
- package/dist/lib/admin/storage-admin-dialog.component.js +2 -2
- package/dist/lib/admin/storage-admin-dialog.component.js.map +1 -1
- package/dist/lib/category-tree/category-tree.d.ts +83 -9
- package/dist/lib/category-tree/category-tree.d.ts.map +1 -1
- package/dist/lib/category-tree/category-tree.js +192 -50
- package/dist/lib/category-tree/category-tree.js.map +1 -1
- package/dist/lib/file-browser/file-browser.component.d.ts +30 -4
- package/dist/lib/file-browser/file-browser.component.d.ts.map +1 -1
- package/dist/lib/file-browser/file-browser.component.js +68 -16
- package/dist/lib/file-browser/file-browser.component.js.map +1 -1
- package/dist/lib/file-browser/file-grid.component.d.ts +404 -58
- package/dist/lib/file-browser/file-grid.component.d.ts.map +1 -1
- package/dist/lib/file-browser/file-grid.component.js +1040 -396
- package/dist/lib/file-browser/file-grid.component.js.map +1 -1
- package/dist/lib/file-browser/folder-tree.component.d.ts +65 -9
- package/dist/lib/file-browser/folder-tree.component.d.ts.map +1 -1
- package/dist/lib/file-browser/folder-tree.component.js +166 -58
- package/dist/lib/file-browser/folder-tree.component.js.map +1 -1
- package/dist/lib/file-browser/storage-providers-list.component.d.ts +55 -7
- package/dist/lib/file-browser/storage-providers-list.component.d.ts.map +1 -1
- package/dist/lib/file-browser/storage-providers-list.component.js +124 -34
- package/dist/lib/file-browser/storage-providers-list.component.js.map +1 -1
- package/dist/lib/file-upload/file-upload.d.ts +22 -2
- package/dist/lib/file-upload/file-upload.d.ts.map +1 -1
- package/dist/lib/file-upload/file-upload.js +40 -10
- package/dist/lib/file-upload/file-upload.js.map +1 -1
- package/dist/lib/files-grid/files-grid.d.ts +28 -4
- package/dist/lib/files-grid/files-grid.d.ts.map +1 -1
- package/dist/lib/files-grid/files-grid.js +71 -23
- package/dist/lib/files-grid/files-grid.js.map +1 -1
- package/dist/lib/record-attachments/record-attachments.component.d.ts +15 -7
- package/dist/lib/record-attachments/record-attachments.component.d.ts.map +1 -1
- package/dist/lib/record-attachments/record-attachments.component.js +34 -18
- package/dist/lib/record-attachments/record-attachments.component.js.map +1 -1
- package/package.json +13 -13
|
@@ -30,41 +30,81 @@ export declare class FolderTreeComponent {
|
|
|
30
30
|
*/
|
|
31
31
|
private _account;
|
|
32
32
|
constructor();
|
|
33
|
-
set
|
|
33
|
+
set Account(value: StorageAccountWithProvider | null);
|
|
34
|
+
get Account(): StorageAccountWithProvider | null;
|
|
35
|
+
/** @deprecated Use {@link Account}. */
|
|
34
36
|
get account(): StorageAccountWithProvider | null;
|
|
37
|
+
/** @deprecated Use {@link Account}. */
|
|
38
|
+
set account(value: StorageAccountWithProvider | null);
|
|
35
39
|
/**
|
|
36
40
|
* Emits when a folder is selected in the tree
|
|
37
41
|
*/
|
|
42
|
+
FolderSelected: EventEmitter<string>;
|
|
43
|
+
/**
|
|
44
|
+
* @deprecated Use {@link FolderSelected}.
|
|
45
|
+
*
|
|
46
|
+
* The same emitter under the old binding name, so a template still binding
|
|
47
|
+
* (folderSelected) keeps working. Must stay AFTER FolderSelected: class fields
|
|
48
|
+
* initialise in order, and the other way round this captures undefined.
|
|
49
|
+
*/
|
|
38
50
|
folderSelected: EventEmitter<string>;
|
|
39
51
|
/**
|
|
40
52
|
* Current folder path
|
|
41
53
|
*/
|
|
42
|
-
|
|
54
|
+
CurrentPath: string;
|
|
55
|
+
/** @deprecated Use {@link CurrentPath}. */
|
|
56
|
+
get currentPath(): string;
|
|
57
|
+
/** @deprecated Use {@link CurrentPath}. */
|
|
58
|
+
set currentPath(value: string);
|
|
43
59
|
/**
|
|
44
60
|
* Navigation history (for back button)
|
|
45
61
|
*/
|
|
46
|
-
|
|
62
|
+
History: string[];
|
|
63
|
+
/** @deprecated Use {@link History}. */
|
|
64
|
+
get history(): string[];
|
|
65
|
+
/** @deprecated Use {@link History}. */
|
|
66
|
+
set history(value: string[]);
|
|
47
67
|
/**
|
|
48
68
|
* Current position in history
|
|
49
69
|
*/
|
|
50
|
-
|
|
70
|
+
HistoryIndex: number;
|
|
71
|
+
/** @deprecated Use {@link HistoryIndex}. */
|
|
72
|
+
get historyIndex(): number;
|
|
73
|
+
/** @deprecated Use {@link HistoryIndex}. */
|
|
74
|
+
set historyIndex(value: number);
|
|
51
75
|
/**
|
|
52
76
|
* Breadcrumb items for current path
|
|
53
77
|
*/
|
|
54
|
-
|
|
78
|
+
Breadcrumbs: BreadcrumbItem[];
|
|
79
|
+
/** @deprecated Use {@link Breadcrumbs}. */
|
|
80
|
+
get breadcrumbs(): BreadcrumbItem[];
|
|
81
|
+
/** @deprecated Use {@link Breadcrumbs}. */
|
|
82
|
+
set breadcrumbs(value: BreadcrumbItem[]);
|
|
55
83
|
/**
|
|
56
84
|
* Folders in current path
|
|
57
85
|
*/
|
|
58
|
-
|
|
86
|
+
Folders: FolderItem[];
|
|
87
|
+
/** @deprecated Use {@link Folders}. */
|
|
88
|
+
get folders(): FolderItem[];
|
|
89
|
+
/** @deprecated Use {@link Folders}. */
|
|
90
|
+
set folders(value: FolderItem[]);
|
|
59
91
|
private cdr;
|
|
60
92
|
/**
|
|
61
93
|
* Loading state
|
|
62
94
|
*/
|
|
63
|
-
|
|
95
|
+
IsLoading: boolean;
|
|
96
|
+
/** @deprecated Use {@link IsLoading}. */
|
|
97
|
+
get isLoading(): boolean;
|
|
98
|
+
/** @deprecated Use {@link IsLoading}. */
|
|
99
|
+
set isLoading(value: boolean);
|
|
64
100
|
/**
|
|
65
101
|
* Error message
|
|
66
102
|
*/
|
|
67
|
-
|
|
103
|
+
ErrorMessage: string | null;
|
|
104
|
+
/** @deprecated Use {@link ErrorMessage}. */
|
|
105
|
+
get errorMessage(): string | null;
|
|
106
|
+
/** @deprecated Use {@link ErrorMessage}. */
|
|
107
|
+
set errorMessage(value: string | null);
|
|
68
108
|
/**
|
|
69
109
|
* Resets navigation when provider changes
|
|
70
110
|
*/
|
|
@@ -72,27 +112,39 @@ export declare class FolderTreeComponent {
|
|
|
72
112
|
/**
|
|
73
113
|
* Navigates to a specific folder path
|
|
74
114
|
*/
|
|
115
|
+
NavigateToPath(path: string): void;
|
|
116
|
+
/** @deprecated Use {@link NavigateToPath}. */
|
|
75
117
|
navigateToPath(path: string): void;
|
|
76
118
|
/**
|
|
77
119
|
* Refreshes the current folder view without changing navigation
|
|
78
120
|
* Used when folder structure changes (e.g., folder deleted) but we're staying in the same location
|
|
79
121
|
*/
|
|
122
|
+
Refresh(): void;
|
|
123
|
+
/** @deprecated Use {@link Refresh}. */
|
|
80
124
|
refresh(): void;
|
|
81
125
|
/**
|
|
82
126
|
* Navigates back in history
|
|
83
127
|
*/
|
|
128
|
+
NavigateBack(): void;
|
|
129
|
+
/** @deprecated Use {@link NavigateBack}. */
|
|
84
130
|
navigateBack(): void;
|
|
85
131
|
/**
|
|
86
132
|
* Navigates forward in history
|
|
87
133
|
*/
|
|
134
|
+
NavigateForward(): void;
|
|
135
|
+
/** @deprecated Use {@link NavigateForward}. */
|
|
88
136
|
navigateForward(): void;
|
|
89
137
|
/**
|
|
90
138
|
* Checks if can navigate back
|
|
91
139
|
*/
|
|
140
|
+
CanGoBack(): boolean;
|
|
141
|
+
/** @deprecated Use {@link CanGoBack}. */
|
|
92
142
|
canGoBack(): boolean;
|
|
93
143
|
/**
|
|
94
144
|
* Checks if can navigate forward
|
|
95
145
|
*/
|
|
146
|
+
CanGoForward(): boolean;
|
|
147
|
+
/** @deprecated Use {@link CanGoForward}. */
|
|
96
148
|
canGoForward(): boolean;
|
|
97
149
|
/**
|
|
98
150
|
* Updates breadcrumbs based on current path
|
|
@@ -101,6 +153,8 @@ export declare class FolderTreeComponent {
|
|
|
101
153
|
/**
|
|
102
154
|
* Handles breadcrumb click
|
|
103
155
|
*/
|
|
156
|
+
OnBreadcrumbClick(item: BreadcrumbItem): void;
|
|
157
|
+
/** @deprecated Use {@link OnBreadcrumbClick}. */
|
|
104
158
|
onBreadcrumbClick(item: BreadcrumbItem): void;
|
|
105
159
|
/**
|
|
106
160
|
* Loads folders from the storage account for the current path
|
|
@@ -109,8 +163,10 @@ export declare class FolderTreeComponent {
|
|
|
109
163
|
/**
|
|
110
164
|
* Handles folder click for navigation
|
|
111
165
|
*/
|
|
166
|
+
OnFolderClick(folder: FolderItem): void;
|
|
167
|
+
/** @deprecated Use {@link OnFolderClick}. */
|
|
112
168
|
onFolderClick(folder: FolderItem): void;
|
|
113
169
|
static ɵfac: i0.ɵɵFactoryDeclaration<FolderTreeComponent, never>;
|
|
114
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<FolderTreeComponent, "mj-folder-tree", never, { "account": { "alias": "account"; "required": false; }; }, { "folderSelected": "folderSelected"; }, never, never, false, never>;
|
|
170
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<FolderTreeComponent, "mj-folder-tree", never, { "Account": { "alias": "Account"; "required": false; }; "account": { "alias": "account"; "required": false; }; }, { "FolderSelected": "FolderSelected"; "folderSelected": "folderSelected"; }, never, never, false, never>;
|
|
115
171
|
}
|
|
116
172
|
//# sourceMappingURL=folder-tree.component.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"folder-tree.component.d.ts","sourceRoot":"","sources":["../../../src/lib/file-browser/folder-tree.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,YAAY,EAA4C,MAAM,eAAe,CAAC;AAElG,OAAO,EAAE,0BAA0B,EAAE,MAAM,+BAA+B,CAAC;;AAG3E;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;;GAIG;AACH,qBAMa,mBAAmB;IAC9B;;OAEG;IACH,OAAO,CAAC,aAAa,CAA2B;IAEhD;;OAEG;IACH,OAAO,CAAC,QAAQ,CAA2C;;IAM3D,IACI,OAAO,CAAC,KAAK,EAAE,0BAA0B,GAAG,IAAI,EAQnD;IACD,IAAI,OAAO,IAAI,0BAA0B,GAAG,IAAI,CAE/C;IAED;;OAEG;IACO,cAAc,uBAA8B;IAEtD;;OAEG;IACI,WAAW,EAAE,MAAM,CAAO;IAEjC;;OAEG;IACI,OAAO,EAAE,MAAM,EAAE,CAAM;IAE9B;;OAEG;IACI,YAAY,EAAE,MAAM,CAAM;IAEjC;;OAEG;IACI,WAAW,EAAE,cAAc,EAAE,CAAM;IAE1C;;OAEG;IACI,OAAO,EAAE,UAAU,EAAE,CAAM;IAElC,OAAO,CAAC,GAAG,CAA6B;IAExC;;OAEG;IACI,SAAS,EAAE,OAAO,CAAS;IAElC;;OAEG;IACI,YAAY,EAAE,MAAM,GAAG,IAAI,CAAQ;IAE1C;;OAEG;IACH,OAAO,CAAC,eAAe;IAOvB;;OAEG;IACI,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAuBzC;;;OAGG;IACI,OAAO,IAAI,IAAI;IAItB;;OAEG;IACI,YAAY,IAAI,IAAI;IAY3B;;OAEG;IACI,eAAe,IAAI,IAAI;IAY9B;;OAEG;IACI,SAAS,IAAI,OAAO;IAI3B;;OAEG;IACI,YAAY,IAAI,OAAO;IAI9B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IA+BzB;;OAEG;IACI,iBAAiB,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI;IAKpD;;OAEG;YACW,WAAW;IA6CzB;;OAEG;IACI,aAAa,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI;
|
|
1
|
+
{"version":3,"file":"folder-tree.component.d.ts","sourceRoot":"","sources":["../../../src/lib/file-browser/folder-tree.component.ts"],"names":[],"mappings":"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"}
|
|
@@ -132,7 +132,7 @@ export class FolderTreeComponent {
|
|
|
132
132
|
constructor() {
|
|
133
133
|
this.storageClient = new GraphQLFileStorageClient(GraphQLDataProvider.Instance);
|
|
134
134
|
}
|
|
135
|
-
set
|
|
135
|
+
set Account(value) {
|
|
136
136
|
const previousAccount = this._account;
|
|
137
137
|
this._account = value;
|
|
138
138
|
if (value && !UUIDsEqual(value.account.ID, previousAccount?.account.ID)) {
|
|
@@ -140,138 +140,234 @@ export class FolderTreeComponent {
|
|
|
140
140
|
this.loadFolders();
|
|
141
141
|
}
|
|
142
142
|
}
|
|
143
|
-
get
|
|
143
|
+
get Account() {
|
|
144
144
|
return this._account;
|
|
145
145
|
}
|
|
146
|
+
/** @deprecated Use {@link Account}. */
|
|
147
|
+
get account() {
|
|
148
|
+
return this.Account;
|
|
149
|
+
}
|
|
150
|
+
/** @deprecated Use {@link Account}. */
|
|
151
|
+
set account(value) {
|
|
152
|
+
this.Account = value;
|
|
153
|
+
}
|
|
146
154
|
/**
|
|
147
155
|
* Emits when a folder is selected in the tree
|
|
148
156
|
*/
|
|
149
|
-
|
|
157
|
+
FolderSelected = new EventEmitter();
|
|
158
|
+
/**
|
|
159
|
+
* @deprecated Use {@link FolderSelected}.
|
|
160
|
+
*
|
|
161
|
+
* The same emitter under the old binding name, so a template still binding
|
|
162
|
+
* (folderSelected) keeps working. Must stay AFTER FolderSelected: class fields
|
|
163
|
+
* initialise in order, and the other way round this captures undefined.
|
|
164
|
+
*/
|
|
165
|
+
folderSelected = this.FolderSelected;
|
|
150
166
|
/**
|
|
151
167
|
* Current folder path
|
|
152
168
|
*/
|
|
153
|
-
|
|
169
|
+
CurrentPath = '/';
|
|
170
|
+
/** @deprecated Use {@link CurrentPath}. */
|
|
171
|
+
get currentPath() {
|
|
172
|
+
return this.CurrentPath;
|
|
173
|
+
}
|
|
174
|
+
/** @deprecated Use {@link CurrentPath}. */
|
|
175
|
+
set currentPath(value) {
|
|
176
|
+
this.CurrentPath = value;
|
|
177
|
+
}
|
|
154
178
|
/**
|
|
155
179
|
* Navigation history (for back button)
|
|
156
180
|
*/
|
|
157
|
-
|
|
181
|
+
History = [];
|
|
182
|
+
/** @deprecated Use {@link History}. */
|
|
183
|
+
get history() {
|
|
184
|
+
return this.History;
|
|
185
|
+
}
|
|
186
|
+
/** @deprecated Use {@link History}. */
|
|
187
|
+
set history(value) {
|
|
188
|
+
this.History = value;
|
|
189
|
+
}
|
|
158
190
|
/**
|
|
159
191
|
* Current position in history
|
|
160
192
|
*/
|
|
161
|
-
|
|
193
|
+
HistoryIndex = -1;
|
|
194
|
+
/** @deprecated Use {@link HistoryIndex}. */
|
|
195
|
+
get historyIndex() {
|
|
196
|
+
return this.HistoryIndex;
|
|
197
|
+
}
|
|
198
|
+
/** @deprecated Use {@link HistoryIndex}. */
|
|
199
|
+
set historyIndex(value) {
|
|
200
|
+
this.HistoryIndex = value;
|
|
201
|
+
}
|
|
162
202
|
/**
|
|
163
203
|
* Breadcrumb items for current path
|
|
164
204
|
*/
|
|
165
|
-
|
|
205
|
+
Breadcrumbs = [];
|
|
206
|
+
/** @deprecated Use {@link Breadcrumbs}. */
|
|
207
|
+
get breadcrumbs() {
|
|
208
|
+
return this.Breadcrumbs;
|
|
209
|
+
}
|
|
210
|
+
/** @deprecated Use {@link Breadcrumbs}. */
|
|
211
|
+
set breadcrumbs(value) {
|
|
212
|
+
this.Breadcrumbs = value;
|
|
213
|
+
}
|
|
166
214
|
/**
|
|
167
215
|
* Folders in current path
|
|
168
216
|
*/
|
|
169
|
-
|
|
217
|
+
Folders = [];
|
|
218
|
+
/** @deprecated Use {@link Folders}. */
|
|
219
|
+
get folders() {
|
|
220
|
+
return this.Folders;
|
|
221
|
+
}
|
|
222
|
+
/** @deprecated Use {@link Folders}. */
|
|
223
|
+
set folders(value) {
|
|
224
|
+
this.Folders = value;
|
|
225
|
+
}
|
|
170
226
|
cdr = inject(ChangeDetectorRef);
|
|
171
227
|
/**
|
|
172
228
|
* Loading state
|
|
173
229
|
*/
|
|
174
|
-
|
|
230
|
+
IsLoading = false;
|
|
231
|
+
/** @deprecated Use {@link IsLoading}. */
|
|
232
|
+
get isLoading() {
|
|
233
|
+
return this.IsLoading;
|
|
234
|
+
}
|
|
235
|
+
/** @deprecated Use {@link IsLoading}. */
|
|
236
|
+
set isLoading(value) {
|
|
237
|
+
this.IsLoading = value;
|
|
238
|
+
}
|
|
175
239
|
/**
|
|
176
240
|
* Error message
|
|
177
241
|
*/
|
|
178
|
-
|
|
242
|
+
ErrorMessage = null;
|
|
243
|
+
/** @deprecated Use {@link ErrorMessage}. */
|
|
244
|
+
get errorMessage() {
|
|
245
|
+
return this.ErrorMessage;
|
|
246
|
+
}
|
|
247
|
+
/** @deprecated Use {@link ErrorMessage}. */
|
|
248
|
+
set errorMessage(value) {
|
|
249
|
+
this.ErrorMessage = value;
|
|
250
|
+
}
|
|
179
251
|
/**
|
|
180
252
|
* Resets navigation when provider changes
|
|
181
253
|
*/
|
|
182
254
|
resetNavigation() {
|
|
183
|
-
this.
|
|
184
|
-
this.
|
|
185
|
-
this.
|
|
255
|
+
this.CurrentPath = '/';
|
|
256
|
+
this.History = ['/'];
|
|
257
|
+
this.HistoryIndex = 0;
|
|
186
258
|
this.updateBreadcrumbs();
|
|
187
259
|
}
|
|
188
260
|
/**
|
|
189
261
|
* Navigates to a specific folder path
|
|
190
262
|
*/
|
|
191
|
-
|
|
263
|
+
NavigateToPath(path) {
|
|
192
264
|
// Don't navigate if already at this path
|
|
193
|
-
if (path === this.
|
|
265
|
+
if (path === this.CurrentPath) {
|
|
194
266
|
return;
|
|
195
267
|
}
|
|
196
268
|
// Add to history if navigating from user action (not back/forward)
|
|
197
|
-
if (this.
|
|
198
|
-
this.
|
|
199
|
-
this.
|
|
269
|
+
if (this.HistoryIndex === this.History.length - 1) {
|
|
270
|
+
this.History.push(path);
|
|
271
|
+
this.HistoryIndex = this.History.length - 1;
|
|
200
272
|
}
|
|
201
273
|
else {
|
|
202
274
|
// Navigating from middle of history - truncate forward history
|
|
203
|
-
this.
|
|
204
|
-
this.
|
|
205
|
-
this.
|
|
275
|
+
this.History = this.History.slice(0, this.HistoryIndex + 1);
|
|
276
|
+
this.History.push(path);
|
|
277
|
+
this.HistoryIndex = this.History.length - 1;
|
|
206
278
|
}
|
|
207
|
-
this.
|
|
279
|
+
this.CurrentPath = path;
|
|
208
280
|
this.updateBreadcrumbs();
|
|
209
281
|
this.loadFolders();
|
|
210
|
-
this.
|
|
282
|
+
this.FolderSelected.emit(path);
|
|
283
|
+
}
|
|
284
|
+
/** @deprecated Use {@link NavigateToPath}. */
|
|
285
|
+
navigateToPath(path) {
|
|
286
|
+
return this.NavigateToPath(path);
|
|
211
287
|
}
|
|
212
288
|
/**
|
|
213
289
|
* Refreshes the current folder view without changing navigation
|
|
214
290
|
* Used when folder structure changes (e.g., folder deleted) but we're staying in the same location
|
|
215
291
|
*/
|
|
216
|
-
|
|
292
|
+
Refresh() {
|
|
217
293
|
this.loadFolders();
|
|
218
294
|
}
|
|
295
|
+
/** @deprecated Use {@link Refresh}. */
|
|
296
|
+
refresh() {
|
|
297
|
+
return this.Refresh();
|
|
298
|
+
}
|
|
219
299
|
/**
|
|
220
300
|
* Navigates back in history
|
|
221
301
|
*/
|
|
222
|
-
|
|
223
|
-
if (!this.
|
|
302
|
+
NavigateBack() {
|
|
303
|
+
if (!this.CanGoBack()) {
|
|
224
304
|
return;
|
|
225
305
|
}
|
|
226
|
-
this.
|
|
227
|
-
this.
|
|
306
|
+
this.HistoryIndex--;
|
|
307
|
+
this.CurrentPath = this.History[this.HistoryIndex];
|
|
228
308
|
this.updateBreadcrumbs();
|
|
229
|
-
this.
|
|
309
|
+
this.FolderSelected.emit(this.CurrentPath);
|
|
230
310
|
this.loadFolders();
|
|
231
311
|
}
|
|
312
|
+
/** @deprecated Use {@link NavigateBack}. */
|
|
313
|
+
navigateBack() {
|
|
314
|
+
return this.NavigateBack();
|
|
315
|
+
}
|
|
232
316
|
/**
|
|
233
317
|
* Navigates forward in history
|
|
234
318
|
*/
|
|
235
|
-
|
|
236
|
-
if (!this.
|
|
319
|
+
NavigateForward() {
|
|
320
|
+
if (!this.CanGoForward()) {
|
|
237
321
|
return;
|
|
238
322
|
}
|
|
239
|
-
this.
|
|
240
|
-
this.
|
|
323
|
+
this.HistoryIndex++;
|
|
324
|
+
this.CurrentPath = this.History[this.HistoryIndex];
|
|
241
325
|
this.updateBreadcrumbs();
|
|
242
|
-
this.
|
|
326
|
+
this.FolderSelected.emit(this.CurrentPath);
|
|
243
327
|
this.loadFolders();
|
|
244
328
|
}
|
|
329
|
+
/** @deprecated Use {@link NavigateForward}. */
|
|
330
|
+
navigateForward() {
|
|
331
|
+
return this.NavigateForward();
|
|
332
|
+
}
|
|
245
333
|
/**
|
|
246
334
|
* Checks if can navigate back
|
|
247
335
|
*/
|
|
336
|
+
CanGoBack() {
|
|
337
|
+
return this.HistoryIndex > 0;
|
|
338
|
+
}
|
|
339
|
+
/** @deprecated Use {@link CanGoBack}. */
|
|
248
340
|
canGoBack() {
|
|
249
|
-
return this.
|
|
341
|
+
return this.CanGoBack();
|
|
250
342
|
}
|
|
251
343
|
/**
|
|
252
344
|
* Checks if can navigate forward
|
|
253
345
|
*/
|
|
346
|
+
CanGoForward() {
|
|
347
|
+
return this.HistoryIndex < this.History.length - 1;
|
|
348
|
+
}
|
|
349
|
+
/** @deprecated Use {@link CanGoForward}. */
|
|
254
350
|
canGoForward() {
|
|
255
|
-
return this.
|
|
351
|
+
return this.CanGoForward();
|
|
256
352
|
}
|
|
257
353
|
/**
|
|
258
354
|
* Updates breadcrumbs based on current path
|
|
259
355
|
*/
|
|
260
356
|
updateBreadcrumbs() {
|
|
261
|
-
if (!this.
|
|
262
|
-
this.
|
|
357
|
+
if (!this.Account) {
|
|
358
|
+
this.Breadcrumbs = [];
|
|
263
359
|
return;
|
|
264
360
|
}
|
|
265
361
|
// Start with account root (show account name)
|
|
266
362
|
const items = [
|
|
267
363
|
{
|
|
268
|
-
label: this.
|
|
364
|
+
label: this.Account.account.Name,
|
|
269
365
|
path: '/'
|
|
270
366
|
}
|
|
271
367
|
];
|
|
272
368
|
// Add path segments if not at root
|
|
273
|
-
if (this.
|
|
274
|
-
const segments = this.
|
|
369
|
+
if (this.CurrentPath !== '/') {
|
|
370
|
+
const segments = this.CurrentPath.split('/').filter(s => s.length > 0);
|
|
275
371
|
let builtPath = '';
|
|
276
372
|
for (const segment of segments) {
|
|
277
373
|
builtPath += '/' + segment;
|
|
@@ -281,37 +377,41 @@ export class FolderTreeComponent {
|
|
|
281
377
|
});
|
|
282
378
|
}
|
|
283
379
|
}
|
|
284
|
-
this.
|
|
380
|
+
this.Breadcrumbs = items;
|
|
285
381
|
}
|
|
286
382
|
/**
|
|
287
383
|
* Handles breadcrumb click
|
|
288
384
|
*/
|
|
289
|
-
|
|
290
|
-
this.
|
|
385
|
+
OnBreadcrumbClick(item) {
|
|
386
|
+
this.NavigateToPath(item.path);
|
|
291
387
|
this.loadFolders();
|
|
292
388
|
}
|
|
389
|
+
/** @deprecated Use {@link OnBreadcrumbClick}. */
|
|
390
|
+
onBreadcrumbClick(item) {
|
|
391
|
+
return this.OnBreadcrumbClick(item);
|
|
392
|
+
}
|
|
293
393
|
/**
|
|
294
394
|
* Loads folders from the storage account for the current path
|
|
295
395
|
*/
|
|
296
396
|
async loadFolders() {
|
|
297
|
-
if (!this.
|
|
298
|
-
this.
|
|
397
|
+
if (!this.Account) {
|
|
398
|
+
this.Folders = [];
|
|
299
399
|
return;
|
|
300
400
|
}
|
|
301
|
-
this.
|
|
302
|
-
this.
|
|
401
|
+
this.IsLoading = true;
|
|
402
|
+
this.ErrorMessage = null;
|
|
303
403
|
this.cdr.detectChanges();
|
|
304
404
|
try {
|
|
305
405
|
// Blob keys (Azure/S3) have NO leading slash and use a trailing slash to denote a
|
|
306
406
|
// directory prefix. currentPath is stored with a leading slash (e.g. "/test"), which
|
|
307
407
|
// never matches real keys — so nested-folder listings came back empty (empty folder
|
|
308
408
|
// names). Normalize to a slash-free, trailing-slash prefix before listing.
|
|
309
|
-
const rawPath = this.
|
|
409
|
+
const rawPath = this.CurrentPath && this.CurrentPath !== '/' ? this.CurrentPath : '';
|
|
310
410
|
const listPrefix = rawPath ? rawPath.replace(/^\/+/, '').replace(/\/+$/, '') + '/' : '';
|
|
311
|
-
const listResult = await this.storageClient.ListObjects(this.
|
|
411
|
+
const listResult = await this.storageClient.ListObjects(this.Account.account.ID, listPrefix, '/');
|
|
312
412
|
// Convert prefixes to FolderItems
|
|
313
413
|
const prefixes = listResult.prefixes || [];
|
|
314
|
-
this.
|
|
414
|
+
this.Folders = prefixes.map((prefix) => {
|
|
315
415
|
// Remove trailing slash and get just the folder name
|
|
316
416
|
const cleanPath = prefix.endsWith('/') ? prefix.slice(0, -1) : prefix;
|
|
317
417
|
const name = cleanPath.split('/').pop() || cleanPath;
|
|
@@ -323,23 +423,27 @@ export class FolderTreeComponent {
|
|
|
323
423
|
}
|
|
324
424
|
catch (error) {
|
|
325
425
|
console.error('Error loading folders:', error);
|
|
326
|
-
this.
|
|
327
|
-
this.
|
|
426
|
+
this.ErrorMessage = error instanceof Error ? error.message : 'Failed to load folders';
|
|
427
|
+
this.Folders = [];
|
|
328
428
|
}
|
|
329
429
|
finally {
|
|
330
|
-
this.
|
|
430
|
+
this.IsLoading = false;
|
|
331
431
|
this.cdr.detectChanges();
|
|
332
432
|
}
|
|
333
433
|
}
|
|
334
434
|
/**
|
|
335
435
|
* Handles folder click for navigation
|
|
336
436
|
*/
|
|
337
|
-
|
|
338
|
-
this.
|
|
437
|
+
OnFolderClick(folder) {
|
|
438
|
+
this.NavigateToPath(folder.fullPath);
|
|
339
439
|
this.loadFolders();
|
|
340
440
|
}
|
|
441
|
+
/** @deprecated Use {@link OnFolderClick}. */
|
|
442
|
+
onFolderClick(folder) {
|
|
443
|
+
return this.OnFolderClick(folder);
|
|
444
|
+
}
|
|
341
445
|
static ɵfac = function FolderTreeComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || FolderTreeComponent)(); };
|
|
342
|
-
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: FolderTreeComponent, selectors: [["mj-folder-tree"]], inputs: { account: "account" }, outputs: { folderSelected: "folderSelected" }, standalone: false, decls: 6, vars: 4, consts: [[1, "folder-tree"], [1, "navigation-bar"], [1, "tree-content"], [1, "tree-loading"], [1, "tree-error"], [1, "folder-list"], [1, "nav-buttons"], ["type", "button", "title", "Go back", 1, "nav-button", 3, "click", "disabled"], [1, "fa-solid", "fa-chevron-left"], ["type", "button", "title", "Go forward", 1, "nav-button", 3, "click", "disabled"], [1, "fa-solid", "fa-chevron-right"], [1, "breadcrumbs"], ["type", "button", 1, "breadcrumb-item", 3, "click"], [1, "fa-solid", "fa-chevron-right", "breadcrumb-separator"], ["text", "Loading folders..."], [1, "fa-solid", "fa-triangle-exclamation", "error-icon"], [1, "error-text"], [1, "folder-item", 3, "title"], [1, "tree-placeholder"], [1, "folder-item", 3, "click", "title"], [1, "fa-solid", "fa-folder", "folder-icon"], [1, "folder-name"], [1, "fa-solid", "fa-folder-open", "placeholder-icon"], [1, "placeholder-text"], [1, "placeholder-hint"]], template: function FolderTreeComponent_Template(rf, ctx) { if (rf & 1) {
|
|
446
|
+
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: FolderTreeComponent, selectors: [["mj-folder-tree"]], inputs: { Account: "Account", account: "account" }, outputs: { FolderSelected: "FolderSelected", folderSelected: "folderSelected" }, standalone: false, decls: 6, vars: 4, consts: [[1, "folder-tree"], [1, "navigation-bar"], [1, "tree-content"], [1, "tree-loading"], [1, "tree-error"], [1, "folder-list"], [1, "nav-buttons"], ["type", "button", "title", "Go back", 1, "nav-button", 3, "click", "disabled"], [1, "fa-solid", "fa-chevron-left"], ["type", "button", "title", "Go forward", 1, "nav-button", 3, "click", "disabled"], [1, "fa-solid", "fa-chevron-right"], [1, "breadcrumbs"], ["type", "button", 1, "breadcrumb-item", 3, "click"], [1, "fa-solid", "fa-chevron-right", "breadcrumb-separator"], ["text", "Loading folders..."], [1, "fa-solid", "fa-triangle-exclamation", "error-icon"], [1, "error-text"], [1, "folder-item", 3, "title"], [1, "tree-placeholder"], [1, "folder-item", 3, "click", "title"], [1, "fa-solid", "fa-folder", "folder-icon"], [1, "folder-name"], [1, "fa-solid", "fa-folder-open", "placeholder-icon"], [1, "placeholder-text"], [1, "placeholder-hint"]], template: function FolderTreeComponent_Template(rf, ctx) { if (rf & 1) {
|
|
343
447
|
i0.ɵɵelementStart(0, "div", 0);
|
|
344
448
|
i0.ɵɵconditionalCreate(1, FolderTreeComponent_Conditional_1_Template, 9, 2, "div", 1);
|
|
345
449
|
i0.ɵɵelementStart(2, "div", 2);
|
|
@@ -361,8 +465,12 @@ export class FolderTreeComponent {
|
|
|
361
465
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(FolderTreeComponent, [{
|
|
362
466
|
type: Component,
|
|
363
467
|
args: [{ standalone: false, selector: 'mj-folder-tree', template: "<div class=\"folder-tree\">\n <!-- Navigation bar with back/forward buttons and breadcrumbs -->\n @if (account) {\n <div class=\"navigation-bar\">\n <!-- Back/Forward buttons -->\n <div class=\"nav-buttons\">\n <button\n type=\"button\"\n [disabled]=\"!canGoBack()\"\n (click)=\"navigateBack()\"\n title=\"Go back\"\n class=\"nav-button\">\n <i class=\"fa-solid fa-chevron-left\"></i>\n </button>\n <button\n type=\"button\"\n [disabled]=\"!canGoForward()\"\n (click)=\"navigateForward()\"\n title=\"Go forward\"\n class=\"nav-button\">\n <i class=\"fa-solid fa-chevron-right\"></i>\n </button>\n </div>\n <!-- Breadcrumb path -->\n <div class=\"breadcrumbs\">\n @for (item of breadcrumbs; track item.path; let last = $last) {\n <button\n type=\"button\"\n (click)=\"onBreadcrumbClick(item)\"\n [class.current]=\"last\"\n class=\"breadcrumb-item\">\n {{ item.label }}\n </button>\n @if (!last) {\n <i class=\"fa-solid fa-chevron-right breadcrumb-separator\"></i>\n }\n }\n </div>\n </div>\n }\n\n <!-- Folder tree content -->\n <div class=\"tree-content\">\n <!-- Loading state -->\n @if (isLoading) {\n <div class=\"tree-loading\">\n <mj-loading text=\"Loading folders...\"></mj-loading>\n </div>\n }\n\n <!-- Error state -->\n @if (errorMessage && !isLoading) {\n <div class=\"tree-error\">\n <i class=\"fa-solid fa-triangle-exclamation error-icon\"></i>\n <p class=\"error-text\">{{ errorMessage }}</p>\n </div>\n }\n\n <!-- Folder list -->\n @if (!isLoading && !errorMessage) {\n <div class=\"folder-list\">\n @for (folder of folders; track folder.name) {\n <div\n class=\"folder-item\"\n (click)=\"onFolderClick(folder)\"\n [title]=\"folder.name\">\n <i class=\"fa-solid fa-folder folder-icon\"></i>\n <span class=\"folder-name\">{{ folder.name }}</span>\n </div>\n }\n <!-- Empty state -->\n @if (folders.length === 0) {\n <div class=\"tree-placeholder\">\n <i class=\"fa-solid fa-folder-open placeholder-icon\"></i>\n <p class=\"placeholder-text\">No folders in this location</p>\n @if (account) {\n <p class=\"placeholder-hint\">Account: {{ account.account.Name }}</p>\n }\n <p class=\"placeholder-hint\">Path: {{ currentPath }}</p>\n </div>\n }\n </div>\n }\n </div>\n</div>\n", styles: [".folder-tree {\n height: 100%;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n color: var(--mj-text-primary);\n}\n\n/* Navigation Bar */\n.navigation-bar {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 8px 12px;\n background-color: transparent;\n border-bottom: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n}\n\n/* Back/Forward buttons */\n.nav-buttons {\n display: flex;\n gap: 3px;\n flex-shrink: 0;\n}\n\n.nav-button {\n width: 26px;\n height: 26px;\n min-width: 26px;\n padding: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: var(--mj-radius-sm, 6px);\n border: 1px solid var(--mj-border-default);\n background-color: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.nav-button i {\n font-size: 10px;\n}\n\n.nav-button:hover:not([disabled]) {\n background-color: color-mix(in srgb, var(--mj-text-primary) 6%, var(--mj-bg-surface));\n color: var(--mj-text-primary);\n border-color: var(--mj-brand-primary);\n}\n\n.nav-button[disabled] {\n opacity: 0.4;\n cursor: not-allowed;\n background-color: transparent;\n border-color: transparent;\n}\n\n/* Breadcrumbs */\n.breadcrumbs {\n display: flex;\n align-items: center;\n gap: 2px;\n flex: 1;\n min-width: 0;\n overflow-x: auto;\n overflow-y: hidden;\n}\n\n.breadcrumb-item {\n flex-shrink: 0;\n height: 24px;\n padding: 0 8px;\n font-size: 0.76rem;\n font-weight: 500;\n color: var(--mj-text-secondary);\n border: none;\n background: transparent;\n border-radius: 4px;\n cursor: pointer;\n transition: all 0.12s ease;\n white-space: nowrap;\n}\n\n.breadcrumb-item:hover {\n background-color: color-mix(in srgb, var(--mj-text-primary) 6%, var(--mj-bg-surface));\n color: var(--mj-text-primary);\n}\n\n.breadcrumb-item.current {\n color: var(--mj-brand-primary);\n font-weight: 600;\n background-color: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n}\n\n.breadcrumb-separator {\n font-size: 8px;\n color: var(--mj-text-muted);\n flex-shrink: 0;\n}\n\n/* Tree content area */\n.tree-content {\n flex: 1;\n overflow-y: auto;\n padding: 6px 8px;\n}\n\n.tree-loading {\n padding: 24px;\n display: flex;\n justify-content: center;\n}\n\n/* Folder list */\n.folder-list {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.folder-item {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 7px 10px;\n border-radius: var(--mj-radius-sm, 6px);\n cursor: pointer;\n transition: all 0.12s ease;\n color: var(--mj-text-primary);\n}\n\n.folder-item:hover {\n background-color: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n.folder-icon {\n font-size: 0.88rem;\n color: var(--mj-status-warning, #f59e0b);\n flex-shrink: 0;\n}\n\n.folder-item:hover .folder-icon {\n color: var(--mj-brand-primary);\n}\n\n.folder-name {\n font-size: 0.82rem;\n font-weight: 500;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n/* Error State */\n.tree-error {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 32px 16px;\n text-align: center;\n gap: 8px;\n}\n\n.error-icon {\n font-size: 1.5rem;\n color: var(--mj-status-error, #ef4444);\n}\n\n.error-text {\n margin: 0;\n font-size: 0.82rem;\n color: var(--mj-status-error, #ef4444);\n font-weight: 500;\n}\n\n/* Placeholder State */\n.tree-placeholder {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 32px 16px;\n text-align: center;\n gap: 6px;\n}\n\n.placeholder-icon {\n font-size: 2rem;\n color: var(--mj-text-muted);\n margin-bottom: 4px;\n}\n\n.placeholder-text {\n margin: 0;\n font-size: 0.84rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.placeholder-hint {\n margin: 0;\n font-size: 0.74rem;\n color: var(--mj-text-muted);\n}\n"] }]
|
|
364
|
-
}], () => [], {
|
|
468
|
+
}], () => [], { Account: [{
|
|
365
469
|
type: Input
|
|
470
|
+
}], account: [{
|
|
471
|
+
type: Input
|
|
472
|
+
}], FolderSelected: [{
|
|
473
|
+
type: Output
|
|
366
474
|
}], folderSelected: [{
|
|
367
475
|
type: Output
|
|
368
476
|
}] }); })();
|