@memberjunction/ng-file-storage 6.1.4 → 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
|
@@ -129,20 +129,92 @@ function CategoryTreeComponent_Conditional_25_Template(rf, ctx) { if (rf & 1) {
|
|
|
129
129
|
} }
|
|
130
130
|
export class CategoryTreeComponent extends BaseAngularComponent {
|
|
131
131
|
notifications;
|
|
132
|
-
|
|
132
|
+
CategorySelected = new EventEmitter();
|
|
133
|
+
/**
|
|
134
|
+
* @deprecated Use {@link CategorySelected}.
|
|
135
|
+
*
|
|
136
|
+
* The same emitter under the old binding name, so a template still binding
|
|
137
|
+
* (categorySelected) keeps working. Must stay AFTER CategorySelected: class fields
|
|
138
|
+
* initialise in order, and the other way round this captures undefined.
|
|
139
|
+
*/
|
|
140
|
+
categorySelected = this.CategorySelected;
|
|
133
141
|
isLoading = false;
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
142
|
+
ShowNew = false;
|
|
143
|
+
/** @deprecated Use {@link ShowNew}. */
|
|
144
|
+
get showNew() {
|
|
145
|
+
return this.ShowNew;
|
|
146
|
+
}
|
|
147
|
+
/** @deprecated Use {@link ShowNew}. */
|
|
148
|
+
set showNew(value) {
|
|
149
|
+
this.ShowNew = value;
|
|
150
|
+
}
|
|
151
|
+
NewCategoryName = '';
|
|
152
|
+
/** @deprecated Use {@link NewCategoryName}. */
|
|
153
|
+
get newCategoryName() {
|
|
154
|
+
return this.NewCategoryName;
|
|
155
|
+
}
|
|
156
|
+
/** @deprecated Use {@link NewCategoryName}. */
|
|
157
|
+
set newCategoryName(value) {
|
|
158
|
+
this.NewCategoryName = value;
|
|
159
|
+
}
|
|
160
|
+
RenameFileCategory;
|
|
161
|
+
/** @deprecated Use {@link RenameFileCategory}. */
|
|
162
|
+
get renameFileCategory() {
|
|
163
|
+
return this.RenameFileCategory;
|
|
164
|
+
}
|
|
165
|
+
/** @deprecated Use {@link RenameFileCategory}. */
|
|
166
|
+
set renameFileCategory(value) {
|
|
167
|
+
this.RenameFileCategory = value;
|
|
168
|
+
}
|
|
169
|
+
CategoriesData = [];
|
|
170
|
+
/** @deprecated Use {@link CategoriesData}. */
|
|
171
|
+
get categoriesData() {
|
|
172
|
+
return this.CategoriesData;
|
|
173
|
+
}
|
|
174
|
+
/** @deprecated Use {@link CategoriesData}. */
|
|
175
|
+
set categoriesData(value) {
|
|
176
|
+
this.CategoriesData = value;
|
|
177
|
+
}
|
|
138
178
|
/** Expanded node IDs for the tree */
|
|
139
|
-
|
|
179
|
+
ExpandedIds = new Set();
|
|
180
|
+
/** @deprecated Use {@link ExpandedIds}. */
|
|
181
|
+
get expandedIds() {
|
|
182
|
+
return this.ExpandedIds;
|
|
183
|
+
}
|
|
184
|
+
/** @deprecated Use {@link ExpandedIds}. */
|
|
185
|
+
set expandedIds(value) {
|
|
186
|
+
this.ExpandedIds = value;
|
|
187
|
+
}
|
|
140
188
|
/** Currently selected node ID */
|
|
141
189
|
selectedId;
|
|
142
190
|
/** Context menu state */
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
191
|
+
ContextMenuVisible = false;
|
|
192
|
+
/** @deprecated Use {@link ContextMenuVisible}. */
|
|
193
|
+
get contextMenuVisible() {
|
|
194
|
+
return this.ContextMenuVisible;
|
|
195
|
+
}
|
|
196
|
+
/** @deprecated Use {@link ContextMenuVisible}. */
|
|
197
|
+
set contextMenuVisible(value) {
|
|
198
|
+
this.ContextMenuVisible = value;
|
|
199
|
+
}
|
|
200
|
+
ContextMenuX = 0;
|
|
201
|
+
/** @deprecated Use {@link ContextMenuX}. */
|
|
202
|
+
get contextMenuX() {
|
|
203
|
+
return this.ContextMenuX;
|
|
204
|
+
}
|
|
205
|
+
/** @deprecated Use {@link ContextMenuX}. */
|
|
206
|
+
set contextMenuX(value) {
|
|
207
|
+
this.ContextMenuX = value;
|
|
208
|
+
}
|
|
209
|
+
ContextMenuY = 0;
|
|
210
|
+
/** @deprecated Use {@link ContextMenuY}. */
|
|
211
|
+
get contextMenuY() {
|
|
212
|
+
return this.ContextMenuY;
|
|
213
|
+
}
|
|
214
|
+
/** @deprecated Use {@link ContextMenuY}. */
|
|
215
|
+
set contextMenuY(value) {
|
|
216
|
+
this.ContextMenuY = value;
|
|
217
|
+
}
|
|
146
218
|
contextMenuNode;
|
|
147
219
|
get md() { return this.ProviderToUse; }
|
|
148
220
|
constructor(notifications) {
|
|
@@ -153,88 +225,140 @@ export class CategoryTreeComponent extends BaseAngularComponent {
|
|
|
153
225
|
this.Refresh();
|
|
154
226
|
}
|
|
155
227
|
/** Returns root-level nodes (no parent). */
|
|
228
|
+
get RootNodes() {
|
|
229
|
+
return this.CategoriesData.filter((c) => !c.ParentID);
|
|
230
|
+
}
|
|
231
|
+
/** @deprecated Use {@link RootNodes}. */
|
|
156
232
|
get rootNodes() {
|
|
157
|
-
return this.
|
|
233
|
+
return this.RootNodes;
|
|
158
234
|
}
|
|
159
235
|
/** Checks if a node has children. */
|
|
236
|
+
HasChildren(node) {
|
|
237
|
+
return this.CategoriesData.some((c) => UUIDsEqual(c.ParentID, node.ID));
|
|
238
|
+
}
|
|
239
|
+
/** @deprecated Use {@link HasChildren}. */
|
|
160
240
|
hasChildren(node) {
|
|
161
|
-
return this.
|
|
241
|
+
return this.HasChildren(node);
|
|
162
242
|
}
|
|
163
243
|
/** Returns children of a node. */
|
|
244
|
+
GetChildren(node) {
|
|
245
|
+
return this.CategoriesData.filter((c) => UUIDsEqual(c.ParentID, node.ID));
|
|
246
|
+
}
|
|
247
|
+
/** @deprecated Use {@link GetChildren}. */
|
|
164
248
|
getChildren(node) {
|
|
165
|
-
return this.
|
|
249
|
+
return this.GetChildren(node);
|
|
166
250
|
}
|
|
167
251
|
/** Checks if a node is expanded. */
|
|
252
|
+
IsExpanded(node) {
|
|
253
|
+
return this.ExpandedIds.has(node.ID);
|
|
254
|
+
}
|
|
255
|
+
/** @deprecated Use {@link IsExpanded}. */
|
|
168
256
|
isExpanded(node) {
|
|
169
|
-
return this.
|
|
257
|
+
return this.IsExpanded(node);
|
|
170
258
|
}
|
|
171
259
|
/** Toggles expand/collapse on a node. */
|
|
172
|
-
|
|
260
|
+
ToggleExpand(node, event) {
|
|
173
261
|
event.stopPropagation();
|
|
174
|
-
if (this.
|
|
175
|
-
this.
|
|
262
|
+
if (this.ExpandedIds.has(node.ID)) {
|
|
263
|
+
this.ExpandedIds.delete(node.ID);
|
|
176
264
|
}
|
|
177
265
|
else {
|
|
178
|
-
this.
|
|
266
|
+
this.ExpandedIds.add(node.ID);
|
|
179
267
|
}
|
|
180
268
|
}
|
|
269
|
+
/** @deprecated Use {@link ToggleExpand}. */
|
|
270
|
+
toggleExpand(node, event) {
|
|
271
|
+
return this.ToggleExpand(node, event);
|
|
272
|
+
}
|
|
181
273
|
/** Checks if a node is the currently selected node. */
|
|
182
|
-
|
|
274
|
+
IsSelected(node) {
|
|
183
275
|
return this.selectedId != null && UUIDsEqual(this.selectedId, node.ID);
|
|
184
276
|
}
|
|
277
|
+
/** @deprecated Use {@link IsSelected}. */
|
|
278
|
+
isSelected(node) {
|
|
279
|
+
return this.IsSelected(node);
|
|
280
|
+
}
|
|
185
281
|
/** Selects a node and emits event. */
|
|
186
|
-
|
|
282
|
+
SelectNode(node) {
|
|
187
283
|
this.selectedId = node.ID;
|
|
188
|
-
this.
|
|
284
|
+
this.CategorySelected.emit(node.ID);
|
|
285
|
+
}
|
|
286
|
+
/** @deprecated Use {@link SelectNode}. */
|
|
287
|
+
selectNode(node) {
|
|
288
|
+
return this.SelectNode(node);
|
|
189
289
|
}
|
|
190
290
|
/** Opens context menu on right-click. */
|
|
191
|
-
|
|
291
|
+
OnContextMenu(event, node) {
|
|
192
292
|
event.preventDefault();
|
|
193
293
|
event.stopPropagation();
|
|
194
294
|
this.contextMenuNode = node;
|
|
195
|
-
this.
|
|
196
|
-
this.
|
|
197
|
-
this.
|
|
295
|
+
this.ContextMenuX = event.clientX;
|
|
296
|
+
this.ContextMenuY = event.clientY;
|
|
297
|
+
this.ContextMenuVisible = true;
|
|
298
|
+
}
|
|
299
|
+
/** @deprecated Use {@link OnContextMenu}. */
|
|
300
|
+
onContextMenu(event, node) {
|
|
301
|
+
return this.OnContextMenu(event, node);
|
|
198
302
|
}
|
|
199
303
|
/** Closes the context menu. */
|
|
200
|
-
|
|
201
|
-
this.
|
|
304
|
+
CloseContextMenu() {
|
|
305
|
+
this.ContextMenuVisible = false;
|
|
202
306
|
this.contextMenuNode = undefined;
|
|
203
307
|
}
|
|
308
|
+
/** @deprecated Use {@link CloseContextMenu}. */
|
|
309
|
+
closeContextMenu() {
|
|
310
|
+
return this.CloseContextMenu();
|
|
311
|
+
}
|
|
204
312
|
/** Handles context menu action selection. */
|
|
205
|
-
|
|
313
|
+
OnContextMenuAction(action) {
|
|
206
314
|
const node = this.contextMenuNode;
|
|
207
|
-
this.
|
|
315
|
+
this.CloseContextMenu();
|
|
208
316
|
if (!node) {
|
|
209
317
|
return;
|
|
210
318
|
}
|
|
211
319
|
switch (action) {
|
|
212
320
|
case 'rename':
|
|
213
|
-
this.
|
|
321
|
+
this.RenameFileCategory = node;
|
|
214
322
|
break;
|
|
215
323
|
case 'delete':
|
|
216
|
-
this.
|
|
324
|
+
this.DeleteCategory(node);
|
|
217
325
|
break;
|
|
218
326
|
}
|
|
219
327
|
}
|
|
328
|
+
/** @deprecated Use {@link OnContextMenuAction}. */
|
|
329
|
+
onContextMenuAction(action) {
|
|
330
|
+
return this.OnContextMenuAction(action);
|
|
331
|
+
}
|
|
332
|
+
async CreateNewCategory() {
|
|
333
|
+
this.ShowNew = true;
|
|
334
|
+
}
|
|
335
|
+
/** @deprecated Use {@link CreateNewCategory}. */
|
|
220
336
|
async createNewCategory() {
|
|
221
|
-
this.
|
|
337
|
+
return this.CreateNewCategory();
|
|
338
|
+
}
|
|
339
|
+
CancelNewCategory() {
|
|
340
|
+
this.ShowNew = false;
|
|
222
341
|
}
|
|
342
|
+
/** @deprecated Use {@link CancelNewCategory}. */
|
|
223
343
|
cancelNewCategory() {
|
|
224
|
-
this.
|
|
344
|
+
return this.CancelNewCategory();
|
|
225
345
|
}
|
|
226
|
-
async
|
|
346
|
+
async SaveNewCategory() {
|
|
227
347
|
this.isLoading = true;
|
|
228
348
|
const categoryEntity = await this.md.GetEntityObject('MJ: File Categories', this.md.CurrentUser);
|
|
229
349
|
categoryEntity.NewRecord();
|
|
230
|
-
categoryEntity.Name = this.
|
|
350
|
+
categoryEntity.Name = this.NewCategoryName;
|
|
231
351
|
await categoryEntity?.Save();
|
|
232
|
-
this.
|
|
233
|
-
this.
|
|
234
|
-
this.
|
|
352
|
+
this.CategoriesData = [...this.CategoriesData, categoryEntity];
|
|
353
|
+
this.ShowNew = false;
|
|
354
|
+
this.NewCategoryName = '';
|
|
235
355
|
this.isLoading = false;
|
|
236
356
|
}
|
|
237
|
-
|
|
357
|
+
/** @deprecated Use {@link SaveNewCategory}. */
|
|
358
|
+
async saveNewCategory() {
|
|
359
|
+
return this.SaveNewCategory();
|
|
360
|
+
}
|
|
361
|
+
async DeleteCategory(fileCategory) {
|
|
238
362
|
this.isLoading = true;
|
|
239
363
|
const { ID } = fileCategory;
|
|
240
364
|
const success = await fileCategory.Delete();
|
|
@@ -244,24 +368,40 @@ export class CategoryTreeComponent extends BaseAngularComponent {
|
|
|
244
368
|
this.isLoading = false;
|
|
245
369
|
return;
|
|
246
370
|
}
|
|
247
|
-
this.
|
|
248
|
-
this.
|
|
371
|
+
this.CategoriesData = this.CategoriesData.filter((c) => !UUIDsEqual(c.ID, ID));
|
|
372
|
+
this.ClearSelection();
|
|
249
373
|
this.isLoading = false;
|
|
250
374
|
}
|
|
251
|
-
|
|
375
|
+
/** @deprecated Use {@link DeleteCategory}. */
|
|
376
|
+
async deleteCategory(fileCategory) {
|
|
377
|
+
return this.DeleteCategory(fileCategory);
|
|
378
|
+
}
|
|
379
|
+
ClearSelection() {
|
|
252
380
|
this.selectedId = undefined;
|
|
253
|
-
this.
|
|
381
|
+
this.CategorySelected.emit(undefined);
|
|
254
382
|
}
|
|
383
|
+
/** @deprecated Use {@link ClearSelection}. */
|
|
384
|
+
clearSelection() {
|
|
385
|
+
return this.ClearSelection();
|
|
386
|
+
}
|
|
387
|
+
CancelRename() {
|
|
388
|
+
this.RenameFileCategory?.Revert();
|
|
389
|
+
this.RenameFileCategory = undefined;
|
|
390
|
+
}
|
|
391
|
+
/** @deprecated Use {@link CancelRename}. */
|
|
255
392
|
cancelRename() {
|
|
256
|
-
this.
|
|
257
|
-
this.renameFileCategory = undefined;
|
|
393
|
+
return this.CancelRename();
|
|
258
394
|
}
|
|
259
|
-
async
|
|
395
|
+
async SaveRename() {
|
|
260
396
|
this.isLoading = true;
|
|
261
|
-
await this.
|
|
262
|
-
this.
|
|
397
|
+
await this.RenameFileCategory?.Save();
|
|
398
|
+
this.RenameFileCategory = undefined;
|
|
263
399
|
this.isLoading = false;
|
|
264
400
|
}
|
|
401
|
+
/** @deprecated Use {@link SaveRename}. */
|
|
402
|
+
async saveRename() {
|
|
403
|
+
return this.SaveRename();
|
|
404
|
+
}
|
|
265
405
|
async Refresh() {
|
|
266
406
|
this.isLoading = true;
|
|
267
407
|
const rv = RunView.FromMetadataProvider(this.ProviderToUse);
|
|
@@ -270,7 +410,7 @@ export class CategoryTreeComponent extends BaseAngularComponent {
|
|
|
270
410
|
ResultType: 'entity_object',
|
|
271
411
|
});
|
|
272
412
|
if (result.Success) {
|
|
273
|
-
this.
|
|
413
|
+
this.CategoriesData = result.Results;
|
|
274
414
|
}
|
|
275
415
|
else {
|
|
276
416
|
throw new Error('Error loading file categories: ' + result.ErrorMessage);
|
|
@@ -278,7 +418,7 @@ export class CategoryTreeComponent extends BaseAngularComponent {
|
|
|
278
418
|
this.isLoading = false;
|
|
279
419
|
}
|
|
280
420
|
static ɵfac = function CategoryTreeComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || CategoryTreeComponent)(i0.ɵɵdirectiveInject(i1.MJNotificationService)); };
|
|
281
|
-
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: CategoryTreeComponent, selectors: [["mj-files-category-tree"]], outputs: { categorySelected: "categorySelected" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 26, vars: 9, consts: [["treeNode", ""], ["newForm", "ngForm"], ["renameForm", "ngForm"], [1, "container"], [1, "tree-header"], ["mjButton", "", 3, "click"], ["mjButton", "", "variant", "primary", "size", "sm", 3, "click"], [1, "category-tree"], [1, "context-menu", 3, "top", "left"], ["Title", "New file category", 3, "Close", "Visible", "Width", "MinWidth"], [1, "dialog-form-container"], [1, "mj-form-field"], [1, "mj-form-label"], ["name", "name", "required", "", 1, "mj-input", 3, "ngModelChange", "ngModel", "disabled"], ["mjButton", "", "variant", "primary", 3, "click", "disabled"], ["mjButton", "", 3, "click", "disabled"], ["Title", "Rename file category", 3, "Visible", "Width", "MinWidth"], [4, "ngTemplateOutlet", "ngTemplateOutletContext"], [1, "tree-node"], [1, "tree-node-row", 3, "click", "contextmenu"], [1, "tree-expand-btn"], [1, "tree-expand-placeholder"], [1, "fa-solid", "fa-folder", "tree-folder-icon"], [1, "tree-node-label"], [1, "tree-expand-btn", 3, "click"], [1, "fa-solid"], [1, "context-menu", 3, "click"], [1, "context-menu-item", 3, "click"], [1, "fa-solid", "fa-pen"], ["disabled", "", 1, "context-menu-item", 3, "click"], [1, "fa-solid", "fa-trash-can"], ["Title", "Rename file category", 3, "Close", "Visible", "Width", "MinWidth"], ["name", "Name", "required", "", 1, "mj-input", 3, "ngModelChange", "ngModel", "disabled"]], template: function CategoryTreeComponent_Template(rf, ctx) { if (rf & 1) {
|
|
421
|
+
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: CategoryTreeComponent, selectors: [["mj-files-category-tree"]], outputs: { CategorySelected: "CategorySelected", categorySelected: "categorySelected" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 26, vars: 9, consts: [["treeNode", ""], ["newForm", "ngForm"], ["renameForm", "ngForm"], [1, "container"], [1, "tree-header"], ["mjButton", "", 3, "click"], ["mjButton", "", "variant", "primary", "size", "sm", 3, "click"], [1, "category-tree"], [1, "context-menu", 3, "top", "left"], ["Title", "New file category", 3, "Close", "Visible", "Width", "MinWidth"], [1, "dialog-form-container"], [1, "mj-form-field"], [1, "mj-form-label"], ["name", "name", "required", "", 1, "mj-input", 3, "ngModelChange", "ngModel", "disabled"], ["mjButton", "", "variant", "primary", 3, "click", "disabled"], ["mjButton", "", 3, "click", "disabled"], ["Title", "Rename file category", 3, "Visible", "Width", "MinWidth"], [4, "ngTemplateOutlet", "ngTemplateOutletContext"], [1, "tree-node"], [1, "tree-node-row", 3, "click", "contextmenu"], [1, "tree-expand-btn"], [1, "tree-expand-placeholder"], [1, "fa-solid", "fa-folder", "tree-folder-icon"], [1, "tree-node-label"], [1, "tree-expand-btn", 3, "click"], [1, "fa-solid"], [1, "context-menu", 3, "click"], [1, "context-menu-item", 3, "click"], [1, "fa-solid", "fa-pen"], ["disabled", "", 1, "context-menu-item", 3, "click"], [1, "fa-solid", "fa-trash-can"], ["Title", "Rename file category", 3, "Close", "Visible", "Width", "MinWidth"], ["name", "Name", "required", "", 1, "mj-input", 3, "ngModelChange", "ngModel", "disabled"]], template: function CategoryTreeComponent_Template(rf, ctx) { if (rf & 1) {
|
|
282
422
|
const _r1 = i0.ɵɵgetCurrentView();
|
|
283
423
|
i0.ɵɵelementStart(0, "div", 3)(1, "div", 4)(2, "button", 5);
|
|
284
424
|
i0.ɵɵlistener("click", function CategoryTreeComponent_Template_button_click_2_listener() { return ctx.clearSelection(); });
|
|
@@ -332,7 +472,9 @@ export class CategoryTreeComponent extends BaseAngularComponent {
|
|
|
332
472
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(CategoryTreeComponent, [{
|
|
333
473
|
type: Component,
|
|
334
474
|
args: [{ standalone: false, selector: 'mj-files-category-tree', template: "<div class=\"container\">\n <div class=\"tree-header\">\n <button mjButton (click)=\"clearSelection()\">All Files</button>\n <button mjButton variant=\"primary\" size=\"sm\" (click)=\"createNewCategory()\">Add category</button>\n </div>\n\n <div class=\"category-tree\">\n @for (node of rootNodes; track node.ID) {\n <ng-container *ngTemplateOutlet=\"treeNode; context: { $implicit: node, level: 0 }\"></ng-container>\n }\n </div>\n\n <ng-template #treeNode let-node let-level=\"level\">\n <div class=\"tree-node\" [style.padding-left.px]=\"level * 20\">\n <div class=\"tree-node-row\"\n [class.selected]=\"isSelected(node)\"\n (click)=\"selectNode(node)\"\n (contextmenu)=\"onContextMenu($event, node)\">\n @if (hasChildren(node)) {\n <button class=\"tree-expand-btn\" (click)=\"toggleExpand(node, $event)\">\n <i class=\"fa-solid\" [class.fa-chevron-right]=\"!isExpanded(node)\" [class.fa-chevron-down]=\"isExpanded(node)\"></i>\n </button>\n } @else {\n <span class=\"tree-expand-placeholder\"></span>\n }\n <i class=\"fa-solid fa-folder tree-folder-icon\"></i>\n <span class=\"tree-node-label\">{{ node.Name }}</span>\n </div>\n @if (isExpanded(node)) {\n @for (child of getChildren(node); track child.ID) {\n <ng-container *ngTemplateOutlet=\"treeNode; context: { $implicit: child, level: level + 1 }\"></ng-container>\n }\n }\n </div>\n </ng-template>\n\n <!-- Context Menu -->\n @if (contextMenuVisible) {\n <div class=\"context-menu\"\n [style.top.px]=\"contextMenuY\"\n [style.left.px]=\"contextMenuX\"\n (document:click)=\"closeContextMenu()\">\n <button class=\"context-menu-item\" (click)=\"onContextMenuAction('rename')\">\n <i class=\"fa-solid fa-pen\"></i> Rename\n </button>\n <button class=\"context-menu-item\" (click)=\"onContextMenuAction('delete')\" disabled>\n <i class=\"fa-solid fa-trash-can\"></i> Delete\n </button>\n </div>\n }\n\n <mj-dialog\n [Visible]=\"showNew\"\n Title=\"New file category\"\n [Width]=\"450\"\n [MinWidth]=\"250\"\n (Close)=\"cancelNewCategory()\">\n <div class=\"dialog-form-container\">\n <form #newForm=\"ngForm\">\n <label class=\"mj-form-field\">\n <span class=\"mj-form-label\">Name</span>\n <input\n class=\"mj-input\"\n name=\"name\"\n [(ngModel)]=\"newCategoryName\"\n required\n [disabled]=\"isLoading\" />\n </label>\n </form>\n </div>\n <mj-dialog-actions>\n <button mjButton variant=\"primary\" (click)=\"saveNewCategory()\" [disabled]=\"isLoading\">Save</button>\n <button mjButton (click)=\"cancelNewCategory()\" [disabled]=\"isLoading\">Cancel</button>\n </mj-dialog-actions>\n </mj-dialog>\n\n @if (!!renameFileCategory) {\n <mj-dialog\n [Visible]=\"true\"\n Title=\"Rename file category\"\n [Width]=\"450\"\n [MinWidth]=\"250\"\n (Close)=\"cancelRename()\">\n <div class=\"dialog-form-container\">\n <form #renameForm=\"ngForm\">\n <label class=\"mj-form-field\">\n <span class=\"mj-form-label\">Name</span>\n <input\n class=\"mj-input\"\n name=\"Name\"\n [(ngModel)]=\"renameFileCategory.Name\"\n required\n [disabled]=\"isLoading\" />\n </label>\n </form>\n </div>\n <mj-dialog-actions>\n <button mjButton variant=\"primary\" (click)=\"saveRename()\" [disabled]=\"isLoading || !renameFileCategory.Dirty\">Save</button>\n <button mjButton (click)=\"cancelRename()\" [disabled]=\"isLoading\">Cancel</button>\n </mj-dialog-actions>\n </mj-dialog>\n }\n</div>\n", styles: ["/* Styles for category tree */\n.container {\n display: flex;\n flex-direction: column;\n}\n\n.category-tree {\n width: 250px;\n max-height: 500px;\n overflow-y: auto;\n border: 1px solid var(--mj-border-subtle);\n border-radius: 4px;\n background: var(--mj-bg-surface);\n}\n\n.tree-header {\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n align-items: center;\n padding-right: 4px;\n margin-bottom: 4px;\n}\n\n.tree-node-row {\n display: flex;\n align-items: center;\n gap: 4px;\n padding: 4px 8px;\n cursor: pointer;\n border-radius: 4px;\n transition: background-color 0.15s;\n user-select: none;\n}\n\n.tree-node-row:hover {\n background-color: var(--mj-bg-surface-hover);\n}\n\n.tree-node-row.selected {\n background-color: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n.tree-expand-btn {\n background: none;\n border: none;\n cursor: pointer;\n padding: 0;\n width: 16px;\n height: 16px;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-muted);\n font-size: 10px;\n}\n\n.tree-expand-placeholder {\n width: 16px;\n height: 16px;\n display: inline-block;\n}\n\n.tree-folder-icon {\n color: var(--mj-text-muted);\n font-size: 14px;\n}\n\n.tree-node-label {\n font-size: 13px;\n color: var(--mj-text-primary);\n}\n\n/* Context Menu */\n.context-menu {\n position: fixed;\n z-index: 10000;\n background: var(--mj-bg-surface-elevated);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n box-shadow: 0 4px 12px var(--mj-bg-overlay);\n padding: 4px 0;\n min-width: 140px;\n}\n\n.context-menu-item {\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n padding: 8px 16px;\n border: none;\n background: none;\n color: var(--mj-text-primary);\n font-size: 13px;\n cursor: pointer;\n text-align: left;\n}\n\n.context-menu-item:hover:not(:disabled) {\n background: var(--mj-bg-surface-hover);\n}\n\n.context-menu-item:disabled {\n opacity: 0.4;\n cursor: default;\n}\n\n.dialog-form-container {\n padding: 8px 0;\n}\n\n.mj-form-field {\n display: flex;\n flex-direction: row;\n align-items: center;\n column-gap: 12px;\n margin-bottom: 8px;\n}\n\n.mj-form-label {\n min-width: 80px;\n color: var(--mj-text-secondary);\n font-weight: 500;\n}\n\n.mj-form-field .mj-input {\n width: 100%;\n}\n"] }]
|
|
335
|
-
}], () => [{ type: i1.MJNotificationService }], {
|
|
475
|
+
}], () => [{ type: i1.MJNotificationService }], { CategorySelected: [{
|
|
476
|
+
type: Output
|
|
477
|
+
}], categorySelected: [{
|
|
336
478
|
type: Output
|
|
337
479
|
}] }); })();
|
|
338
480
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(CategoryTreeComponent, { className: "CategoryTreeComponent", filePath: "src/lib/category-tree/category-tree.ts", lineNumber: 14 }); })();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"category-tree.js","sourceRoot":"","sources":["../../../src/lib/category-tree/category-tree.ts","../../../src/lib/category-tree/category-tree.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, EventEmitter, OnInit, Output } from '@angular/core';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\nimport { RunView } from '@memberjunction/core';\nimport { MJFileCategoryEntity } from '@memberjunction/core-entities';\nimport { UUIDsEqual } from '@memberjunction/global';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\n\n@Component({\n standalone: false,\n selector: 'mj-files-category-tree',\n templateUrl: './category-tree.html',\n styleUrls: ['./category-tree.css'],\n})\nexport class CategoryTreeComponent extends BaseAngularComponent implements OnInit {\n @Output() categorySelected = new EventEmitter<string | undefined>();\n\n public isLoading: boolean = false;\n public showNew: boolean = false;\n public newCategoryName = '';\n public renameFileCategory: MJFileCategoryEntity | undefined;\n\n public categoriesData: MJFileCategoryEntity[] = [];\n\n /** Expanded node IDs for the tree */\n public expandedIds = new Set<string>();\n\n /** Currently selected node ID */\n private selectedId: string | undefined;\n\n /** Context menu state */\n public contextMenuVisible = false;\n public contextMenuX = 0;\n public contextMenuY = 0;\n private contextMenuNode: MJFileCategoryEntity | undefined;\n\n private get md() { return this.ProviderToUse; }\n\n constructor(private notifications: MJNotificationService) { super(); }\n\n ngOnInit(): void {\n this.Refresh();\n }\n\n /** Returns root-level nodes (no parent). */\n get rootNodes(): MJFileCategoryEntity[] {\n return this.categoriesData.filter((c) => !c.ParentID);\n }\n\n /** Checks if a node has children. */\n hasChildren(node: MJFileCategoryEntity): boolean {\n return this.categoriesData.some((c) => UUIDsEqual(c.ParentID, node.ID));\n }\n\n /** Returns children of a node. */\n getChildren(node: MJFileCategoryEntity): MJFileCategoryEntity[] {\n return this.categoriesData.filter((c) => UUIDsEqual(c.ParentID, node.ID));\n }\n\n /** Checks if a node is expanded. */\n isExpanded(node: MJFileCategoryEntity): boolean {\n return this.expandedIds.has(node.ID);\n }\n\n /** Toggles expand/collapse on a node. */\n toggleExpand(node: MJFileCategoryEntity, event: Event): void {\n event.stopPropagation();\n if (this.expandedIds.has(node.ID)) {\n this.expandedIds.delete(node.ID);\n } else {\n this.expandedIds.add(node.ID);\n }\n }\n\n /** Checks if a node is the currently selected node. */\n isSelected(node: MJFileCategoryEntity): boolean {\n return this.selectedId != null && UUIDsEqual(this.selectedId, node.ID);\n }\n\n /** Selects a node and emits event. */\n selectNode(node: MJFileCategoryEntity): void {\n this.selectedId = node.ID;\n this.categorySelected.emit(node.ID);\n }\n\n /** Opens context menu on right-click. */\n onContextMenu(event: MouseEvent, node: MJFileCategoryEntity): void {\n event.preventDefault();\n event.stopPropagation();\n this.contextMenuNode = node;\n this.contextMenuX = event.clientX;\n this.contextMenuY = event.clientY;\n this.contextMenuVisible = true;\n }\n\n /** Closes the context menu. */\n closeContextMenu(): void {\n this.contextMenuVisible = false;\n this.contextMenuNode = undefined;\n }\n\n /** Handles context menu action selection. */\n onContextMenuAction(action: string): void {\n const node = this.contextMenuNode;\n this.closeContextMenu();\n if (!node) {\n return;\n }\n\n switch (action) {\n case 'rename':\n this.renameFileCategory = node;\n break;\n case 'delete':\n this.deleteCategory(node);\n break;\n }\n }\n\n async createNewCategory() {\n this.showNew = true;\n }\n\n cancelNewCategory() {\n this.showNew = false;\n }\n\n async saveNewCategory() {\n this.isLoading = true;\n const categoryEntity: MJFileCategoryEntity = await this.md.GetEntityObject('MJ: File Categories', this.md.CurrentUser);\n categoryEntity.NewRecord();\n categoryEntity.Name = this.newCategoryName;\n await categoryEntity?.Save();\n this.categoriesData = [...this.categoriesData, categoryEntity];\n this.showNew = false;\n this.newCategoryName = '';\n this.isLoading = false;\n }\n\n async deleteCategory(fileCategory: MJFileCategoryEntity) {\n this.isLoading = true;\n const { ID } = fileCategory;\n const success = await fileCategory.Delete();\n if (!success) {\n console.error('Unable to delete file category:', fileCategory);\n this.notifications.CreateSimpleNotification(`Unable to delete category '${fileCategory.Name}'`, 'error');\n this.isLoading = false;\n return;\n }\n\n this.categoriesData = this.categoriesData.filter((c) => !UUIDsEqual(c.ID, ID));\n this.clearSelection();\n this.isLoading = false;\n }\n\n clearSelection() {\n this.selectedId = undefined;\n this.categorySelected.emit(undefined);\n }\n\n cancelRename() {\n this.renameFileCategory?.Revert();\n this.renameFileCategory = undefined;\n }\n\n async saveRename() {\n this.isLoading = true;\n await this.renameFileCategory?.Save();\n this.renameFileCategory = undefined;\n this.isLoading = false;\n }\n\n async Refresh() {\n this.isLoading = true;\n\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const result = await rv.RunView({\n EntityName: 'MJ: File Categories',\n ResultType: 'entity_object',\n });\n\n if (result.Success) {\n this.categoriesData = <MJFileCategoryEntity[]>result.Results;\n } else {\n throw new Error('Error loading file categories: ' + result.ErrorMessage);\n }\n this.isLoading = false;\n }\n}\n","<div class=\"container\">\n <div class=\"tree-header\">\n <button mjButton (click)=\"clearSelection()\">All Files</button>\n <button mjButton variant=\"primary\" size=\"sm\" (click)=\"createNewCategory()\">Add category</button>\n </div>\n\n <div class=\"category-tree\">\n @for (node of rootNodes; track node.ID) {\n <ng-container *ngTemplateOutlet=\"treeNode; context: { $implicit: node, level: 0 }\"></ng-container>\n }\n </div>\n\n <ng-template #treeNode let-node let-level=\"level\">\n <div class=\"tree-node\" [style.padding-left.px]=\"level * 20\">\n <div class=\"tree-node-row\"\n [class.selected]=\"isSelected(node)\"\n (click)=\"selectNode(node)\"\n (contextmenu)=\"onContextMenu($event, node)\">\n @if (hasChildren(node)) {\n <button class=\"tree-expand-btn\" (click)=\"toggleExpand(node, $event)\">\n <i class=\"fa-solid\" [class.fa-chevron-right]=\"!isExpanded(node)\" [class.fa-chevron-down]=\"isExpanded(node)\"></i>\n </button>\n } @else {\n <span class=\"tree-expand-placeholder\"></span>\n }\n <i class=\"fa-solid fa-folder tree-folder-icon\"></i>\n <span class=\"tree-node-label\">{{ node.Name }}</span>\n </div>\n @if (isExpanded(node)) {\n @for (child of getChildren(node); track child.ID) {\n <ng-container *ngTemplateOutlet=\"treeNode; context: { $implicit: child, level: level + 1 }\"></ng-container>\n }\n }\n </div>\n </ng-template>\n\n <!-- Context Menu -->\n @if (contextMenuVisible) {\n <div class=\"context-menu\"\n [style.top.px]=\"contextMenuY\"\n [style.left.px]=\"contextMenuX\"\n (document:click)=\"closeContextMenu()\">\n <button class=\"context-menu-item\" (click)=\"onContextMenuAction('rename')\">\n <i class=\"fa-solid fa-pen\"></i> Rename\n </button>\n <button class=\"context-menu-item\" (click)=\"onContextMenuAction('delete')\" disabled>\n <i class=\"fa-solid fa-trash-can\"></i> Delete\n </button>\n </div>\n }\n\n <mj-dialog\n [Visible]=\"showNew\"\n Title=\"New file category\"\n [Width]=\"450\"\n [MinWidth]=\"250\"\n (Close)=\"cancelNewCategory()\">\n <div class=\"dialog-form-container\">\n <form #newForm=\"ngForm\">\n <label class=\"mj-form-field\">\n <span class=\"mj-form-label\">Name</span>\n <input\n class=\"mj-input\"\n name=\"name\"\n [(ngModel)]=\"newCategoryName\"\n required\n [disabled]=\"isLoading\" />\n </label>\n </form>\n </div>\n <mj-dialog-actions>\n <button mjButton variant=\"primary\" (click)=\"saveNewCategory()\" [disabled]=\"isLoading\">Save</button>\n <button mjButton (click)=\"cancelNewCategory()\" [disabled]=\"isLoading\">Cancel</button>\n </mj-dialog-actions>\n </mj-dialog>\n\n @if (!!renameFileCategory) {\n <mj-dialog\n [Visible]=\"true\"\n Title=\"Rename file category\"\n [Width]=\"450\"\n [MinWidth]=\"250\"\n (Close)=\"cancelRename()\">\n <div class=\"dialog-form-container\">\n <form #renameForm=\"ngForm\">\n <label class=\"mj-form-field\">\n <span class=\"mj-form-label\">Name</span>\n <input\n class=\"mj-input\"\n name=\"Name\"\n [(ngModel)]=\"renameFileCategory.Name\"\n required\n [disabled]=\"isLoading\" />\n </label>\n </form>\n </div>\n <mj-dialog-actions>\n <button mjButton variant=\"primary\" (click)=\"saveRename()\" [disabled]=\"isLoading || !renameFileCategory.Dirty\">Save</button>\n <button mjButton (click)=\"cancelRename()\" [disabled]=\"isLoading\">Cancel</button>\n </mj-dialog-actions>\n </mj-dialog>\n }\n</div>\n"]}
|
|
1
|
+
{"version":3,"file":"category-tree.js","sourceRoot":"","sources":["../../../src/lib/category-tree/category-tree.ts","../../../src/lib/category-tree/category-tree.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, EventEmitter, OnInit, Output } from '@angular/core';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\nimport { RunView } from '@memberjunction/core';\nimport { MJFileCategoryEntity } from '@memberjunction/core-entities';\nimport { UUIDsEqual } from '@memberjunction/global';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\n\n@Component({\n standalone: false,\n selector: 'mj-files-category-tree',\n templateUrl: './category-tree.html',\n styleUrls: ['./category-tree.css'],\n})\nexport class CategoryTreeComponent extends BaseAngularComponent implements OnInit {\n @Output() CategorySelected = new EventEmitter<string | undefined>();\n\n /**\n * @deprecated Use {@link CategorySelected}.\n *\n * The same emitter under the old binding name, so a template still binding\n * (categorySelected) keeps working. Must stay AFTER CategorySelected: class fields\n * initialise in order, and the other way round this captures undefined.\n */\n @Output() categorySelected = this.CategorySelected;\n\n public isLoading: boolean = false;\n public ShowNew: boolean = false;\n\n /** @deprecated Use {@link ShowNew}. */\n public get showNew(): boolean {\n return this.ShowNew;\n }\n /** @deprecated Use {@link ShowNew}. */\n public set showNew(value: boolean) {\n this.ShowNew = value;\n }\n public NewCategoryName = '';\n\n /** @deprecated Use {@link NewCategoryName}. */\n public get newCategoryName() {\n return this.NewCategoryName;\n }\n /** @deprecated Use {@link NewCategoryName}. */\n public set newCategoryName(value) {\n this.NewCategoryName = value;\n }\n public RenameFileCategory: MJFileCategoryEntity | undefined;\n\n /** @deprecated Use {@link RenameFileCategory}. */\n public get renameFileCategory(): MJFileCategoryEntity | undefined {\n return this.RenameFileCategory;\n }\n /** @deprecated Use {@link RenameFileCategory}. */\n public set renameFileCategory(value: MJFileCategoryEntity | undefined) {\n this.RenameFileCategory = value;\n }\n\n public CategoriesData: MJFileCategoryEntity[] = [];\n\n /** @deprecated Use {@link CategoriesData}. */\n public get categoriesData(): MJFileCategoryEntity[] {\n return this.CategoriesData;\n }\n /** @deprecated Use {@link CategoriesData}. */\n public set categoriesData(value: MJFileCategoryEntity[]) {\n this.CategoriesData = value;\n }\n\n /** Expanded node IDs for the tree */\n public ExpandedIds = new Set<string>();\n\n /** @deprecated Use {@link ExpandedIds}. */\n public get expandedIds() {\n return this.ExpandedIds;\n }\n /** @deprecated Use {@link ExpandedIds}. */\n public set expandedIds(value) {\n this.ExpandedIds = value;\n }\n\n /** Currently selected node ID */\n private selectedId: string | undefined;\n\n /** Context menu state */\n public ContextMenuVisible = false;\n\n /** @deprecated Use {@link ContextMenuVisible}. */\n public get contextMenuVisible() {\n return this.ContextMenuVisible;\n }\n /** @deprecated Use {@link ContextMenuVisible}. */\n public set contextMenuVisible(value) {\n this.ContextMenuVisible = value;\n }\n public ContextMenuX = 0;\n\n /** @deprecated Use {@link ContextMenuX}. */\n public get contextMenuX() {\n return this.ContextMenuX;\n }\n /** @deprecated Use {@link ContextMenuX}. */\n public set contextMenuX(value) {\n this.ContextMenuX = value;\n }\n public ContextMenuY = 0;\n\n /** @deprecated Use {@link ContextMenuY}. */\n public get contextMenuY() {\n return this.ContextMenuY;\n }\n /** @deprecated Use {@link ContextMenuY}. */\n public set contextMenuY(value) {\n this.ContextMenuY = value;\n }\n private contextMenuNode: MJFileCategoryEntity | undefined;\n\n private get md() { return this.ProviderToUse; }\n\n constructor(private notifications: MJNotificationService) { super(); }\n\n ngOnInit(): void {\n this.Refresh();\n }\n\n /** Returns root-level nodes (no parent). */\n get RootNodes(): MJFileCategoryEntity[] {\n return this.CategoriesData.filter((c) => !c.ParentID);\n }\n\n /** @deprecated Use {@link RootNodes}. */\n get rootNodes(): MJFileCategoryEntity[] {\n return this.RootNodes;\n }\n\n /** Checks if a node has children. */\n HasChildren(node: MJFileCategoryEntity): boolean {\n return this.CategoriesData.some((c) => UUIDsEqual(c.ParentID, node.ID));\n }\n\n /** @deprecated Use {@link HasChildren}. */\n hasChildren(node: MJFileCategoryEntity): boolean {\n return this.HasChildren(node);\n }\n\n /** Returns children of a node. */\n GetChildren(node: MJFileCategoryEntity): MJFileCategoryEntity[] {\n return this.CategoriesData.filter((c) => UUIDsEqual(c.ParentID, node.ID));\n }\n\n /** @deprecated Use {@link GetChildren}. */\n getChildren(node: MJFileCategoryEntity): MJFileCategoryEntity[] {\n return this.GetChildren(node);\n }\n\n /** Checks if a node is expanded. */\n IsExpanded(node: MJFileCategoryEntity): boolean {\n return this.ExpandedIds.has(node.ID);\n }\n\n /** @deprecated Use {@link IsExpanded}. */\n isExpanded(node: MJFileCategoryEntity): boolean {\n return this.IsExpanded(node);\n }\n\n /** Toggles expand/collapse on a node. */\n ToggleExpand(node: MJFileCategoryEntity, event: Event): void {\n event.stopPropagation();\n if (this.ExpandedIds.has(node.ID)) {\n this.ExpandedIds.delete(node.ID);\n } else {\n this.ExpandedIds.add(node.ID);\n }\n }\n\n /** @deprecated Use {@link ToggleExpand}. */\n toggleExpand(node: MJFileCategoryEntity, event: Event): void {\n return this.ToggleExpand(node, event);\n }\n\n /** Checks if a node is the currently selected node. */\n IsSelected(node: MJFileCategoryEntity): boolean {\n return this.selectedId != null && UUIDsEqual(this.selectedId, node.ID);\n }\n\n /** @deprecated Use {@link IsSelected}. */\n isSelected(node: MJFileCategoryEntity): boolean {\n return this.IsSelected(node);\n }\n\n /** Selects a node and emits event. */\n SelectNode(node: MJFileCategoryEntity): void {\n this.selectedId = node.ID;\n this.CategorySelected.emit(node.ID);\n }\n\n /** @deprecated Use {@link SelectNode}. */\n selectNode(node: MJFileCategoryEntity): void {\n return this.SelectNode(node);\n }\n\n /** Opens context menu on right-click. */\n OnContextMenu(event: MouseEvent, node: MJFileCategoryEntity): void {\n event.preventDefault();\n event.stopPropagation();\n this.contextMenuNode = node;\n this.ContextMenuX = event.clientX;\n this.ContextMenuY = event.clientY;\n this.ContextMenuVisible = true;\n }\n\n /** @deprecated Use {@link OnContextMenu}. */\n onContextMenu(event: MouseEvent, node: MJFileCategoryEntity): void {\n return this.OnContextMenu(event, node);\n }\n\n /** Closes the context menu. */\n CloseContextMenu(): void {\n this.ContextMenuVisible = false;\n this.contextMenuNode = undefined;\n }\n\n /** @deprecated Use {@link CloseContextMenu}. */\n closeContextMenu(): void {\n return this.CloseContextMenu();\n }\n\n /** Handles context menu action selection. */\n OnContextMenuAction(action: string): void {\n const node = this.contextMenuNode;\n this.CloseContextMenu();\n if (!node) {\n return;\n }\n\n switch (action) {\n case 'rename':\n this.RenameFileCategory = node;\n break;\n case 'delete':\n this.DeleteCategory(node);\n break;\n }\n }\n\n /** @deprecated Use {@link OnContextMenuAction}. */\n onContextMenuAction(action: string): void {\n return this.OnContextMenuAction(action);\n }\n\n async CreateNewCategory() {\n this.ShowNew = true;\n }\n\n /** @deprecated Use {@link CreateNewCategory}. */\n async createNewCategory() {\n return this.CreateNewCategory();\n }\n\n CancelNewCategory() {\n this.ShowNew = false;\n }\n\n /** @deprecated Use {@link CancelNewCategory}. */\n cancelNewCategory() {\n return this.CancelNewCategory();\n }\n\n async SaveNewCategory() {\n this.isLoading = true;\n const categoryEntity: MJFileCategoryEntity = await this.md.GetEntityObject('MJ: File Categories', this.md.CurrentUser);\n categoryEntity.NewRecord();\n categoryEntity.Name = this.NewCategoryName;\n await categoryEntity?.Save();\n this.CategoriesData = [...this.CategoriesData, categoryEntity];\n this.ShowNew = false;\n this.NewCategoryName = '';\n this.isLoading = false;\n }\n\n /** @deprecated Use {@link SaveNewCategory}. */\n async saveNewCategory() {\n return this.SaveNewCategory();\n }\n\n async DeleteCategory(fileCategory: MJFileCategoryEntity) {\n this.isLoading = true;\n const { ID } = fileCategory;\n const success = await fileCategory.Delete();\n if (!success) {\n console.error('Unable to delete file category:', fileCategory);\n this.notifications.CreateSimpleNotification(`Unable to delete category '${fileCategory.Name}'`, 'error');\n this.isLoading = false;\n return;\n }\n\n this.CategoriesData = this.CategoriesData.filter((c) => !UUIDsEqual(c.ID, ID));\n this.ClearSelection();\n this.isLoading = false;\n }\n\n /** @deprecated Use {@link DeleteCategory}. */\n async deleteCategory(fileCategory: MJFileCategoryEntity) {\n return this.DeleteCategory(fileCategory);\n }\n\n ClearSelection() {\n this.selectedId = undefined;\n this.CategorySelected.emit(undefined);\n }\n\n /** @deprecated Use {@link ClearSelection}. */\n clearSelection() {\n return this.ClearSelection();\n }\n\n CancelRename() {\n this.RenameFileCategory?.Revert();\n this.RenameFileCategory = undefined;\n }\n\n /** @deprecated Use {@link CancelRename}. */\n cancelRename() {\n return this.CancelRename();\n }\n\n async SaveRename() {\n this.isLoading = true;\n await this.RenameFileCategory?.Save();\n this.RenameFileCategory = undefined;\n this.isLoading = false;\n }\n\n /** @deprecated Use {@link SaveRename}. */\n async saveRename() {\n return this.SaveRename();\n }\n\n async Refresh() {\n this.isLoading = true;\n\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const result = await rv.RunView({\n EntityName: 'MJ: File Categories',\n ResultType: 'entity_object',\n });\n\n if (result.Success) {\n this.CategoriesData = <MJFileCategoryEntity[]>result.Results;\n } else {\n throw new Error('Error loading file categories: ' + result.ErrorMessage);\n }\n this.isLoading = false;\n }\n}\n","<div class=\"container\">\n <div class=\"tree-header\">\n <button mjButton (click)=\"clearSelection()\">All Files</button>\n <button mjButton variant=\"primary\" size=\"sm\" (click)=\"createNewCategory()\">Add category</button>\n </div>\n\n <div class=\"category-tree\">\n @for (node of rootNodes; track node.ID) {\n <ng-container *ngTemplateOutlet=\"treeNode; context: { $implicit: node, level: 0 }\"></ng-container>\n }\n </div>\n\n <ng-template #treeNode let-node let-level=\"level\">\n <div class=\"tree-node\" [style.padding-left.px]=\"level * 20\">\n <div class=\"tree-node-row\"\n [class.selected]=\"isSelected(node)\"\n (click)=\"selectNode(node)\"\n (contextmenu)=\"onContextMenu($event, node)\">\n @if (hasChildren(node)) {\n <button class=\"tree-expand-btn\" (click)=\"toggleExpand(node, $event)\">\n <i class=\"fa-solid\" [class.fa-chevron-right]=\"!isExpanded(node)\" [class.fa-chevron-down]=\"isExpanded(node)\"></i>\n </button>\n } @else {\n <span class=\"tree-expand-placeholder\"></span>\n }\n <i class=\"fa-solid fa-folder tree-folder-icon\"></i>\n <span class=\"tree-node-label\">{{ node.Name }}</span>\n </div>\n @if (isExpanded(node)) {\n @for (child of getChildren(node); track child.ID) {\n <ng-container *ngTemplateOutlet=\"treeNode; context: { $implicit: child, level: level + 1 }\"></ng-container>\n }\n }\n </div>\n </ng-template>\n\n <!-- Context Menu -->\n @if (contextMenuVisible) {\n <div class=\"context-menu\"\n [style.top.px]=\"contextMenuY\"\n [style.left.px]=\"contextMenuX\"\n (document:click)=\"closeContextMenu()\">\n <button class=\"context-menu-item\" (click)=\"onContextMenuAction('rename')\">\n <i class=\"fa-solid fa-pen\"></i> Rename\n </button>\n <button class=\"context-menu-item\" (click)=\"onContextMenuAction('delete')\" disabled>\n <i class=\"fa-solid fa-trash-can\"></i> Delete\n </button>\n </div>\n }\n\n <mj-dialog\n [Visible]=\"showNew\"\n Title=\"New file category\"\n [Width]=\"450\"\n [MinWidth]=\"250\"\n (Close)=\"cancelNewCategory()\">\n <div class=\"dialog-form-container\">\n <form #newForm=\"ngForm\">\n <label class=\"mj-form-field\">\n <span class=\"mj-form-label\">Name</span>\n <input\n class=\"mj-input\"\n name=\"name\"\n [(ngModel)]=\"newCategoryName\"\n required\n [disabled]=\"isLoading\" />\n </label>\n </form>\n </div>\n <mj-dialog-actions>\n <button mjButton variant=\"primary\" (click)=\"saveNewCategory()\" [disabled]=\"isLoading\">Save</button>\n <button mjButton (click)=\"cancelNewCategory()\" [disabled]=\"isLoading\">Cancel</button>\n </mj-dialog-actions>\n </mj-dialog>\n\n @if (!!renameFileCategory) {\n <mj-dialog\n [Visible]=\"true\"\n Title=\"Rename file category\"\n [Width]=\"450\"\n [MinWidth]=\"250\"\n (Close)=\"cancelRename()\">\n <div class=\"dialog-form-container\">\n <form #renameForm=\"ngForm\">\n <label class=\"mj-form-field\">\n <span class=\"mj-form-label\">Name</span>\n <input\n class=\"mj-input\"\n name=\"Name\"\n [(ngModel)]=\"renameFileCategory.Name\"\n required\n [disabled]=\"isLoading\" />\n </label>\n </form>\n </div>\n <mj-dialog-actions>\n <button mjButton variant=\"primary\" (click)=\"saveRename()\" [disabled]=\"isLoading || !renameFileCategory.Dirty\">Save</button>\n <button mjButton (click)=\"cancelRename()\" [disabled]=\"isLoading\">Cancel</button>\n </mj-dialog-actions>\n </mj-dialog>\n }\n</div>\n"]}
|
|
@@ -19,37 +19,59 @@ export declare class FileBrowserComponent {
|
|
|
19
19
|
/**
|
|
20
20
|
* Reference to the folder tree component for programmatic navigation
|
|
21
21
|
*/
|
|
22
|
-
|
|
22
|
+
FolderTree: FolderTreeComponent;
|
|
23
|
+
/** @deprecated Use {@link FolderTree}. */
|
|
24
|
+
get folderTree(): FolderTreeComponent;
|
|
25
|
+
/** @deprecated Use {@link FolderTree}. */
|
|
26
|
+
set folderTree(value: FolderTreeComponent);
|
|
23
27
|
/**
|
|
24
28
|
* Controls manual collapse of the sidebar (toggle button on mobile).
|
|
25
29
|
* CSS media queries handle the responsive layout automatically.
|
|
26
30
|
*/
|
|
27
|
-
|
|
31
|
+
IsSidebarCollapsed: boolean;
|
|
32
|
+
/** @deprecated Use {@link IsSidebarCollapsed}. */
|
|
33
|
+
get isSidebarCollapsed(): boolean;
|
|
34
|
+
/** @deprecated Use {@link IsSidebarCollapsed}. */
|
|
35
|
+
set isSidebarCollapsed(value: boolean);
|
|
28
36
|
/**
|
|
29
37
|
* Currently selected storage account with its provider details.
|
|
30
38
|
*/
|
|
31
|
-
|
|
39
|
+
SelectedAccount: StorageAccountWithProvider | null;
|
|
40
|
+
/** @deprecated Use {@link SelectedAccount}. */
|
|
41
|
+
get selectedAccount(): StorageAccountWithProvider | null;
|
|
42
|
+
/** @deprecated Use {@link SelectedAccount}. */
|
|
43
|
+
set selectedAccount(value: StorageAccountWithProvider | null);
|
|
32
44
|
/**
|
|
33
45
|
* Currently selected folder path in the tree.
|
|
34
46
|
*/
|
|
35
|
-
|
|
47
|
+
SelectedFolderPath: string;
|
|
48
|
+
/** @deprecated Use {@link SelectedFolderPath}. */
|
|
49
|
+
get selectedFolderPath(): string;
|
|
50
|
+
/** @deprecated Use {@link SelectedFolderPath}. */
|
|
51
|
+
set selectedFolderPath(value: string);
|
|
36
52
|
constructor();
|
|
37
53
|
/**
|
|
38
54
|
* Toggles the visibility of the accounts sidebar.
|
|
39
55
|
* Used for manual toggle on mobile devices.
|
|
40
56
|
*/
|
|
57
|
+
ToggleSidebar(): void;
|
|
58
|
+
/** @deprecated Use {@link ToggleSidebar}. */
|
|
41
59
|
toggleSidebar(): void;
|
|
42
60
|
/**
|
|
43
61
|
* Handles storage account selection from the sidebar.
|
|
44
62
|
*
|
|
45
63
|
* @param accountWithProvider - The selected storage account with provider details, or null if no accounts available
|
|
46
64
|
*/
|
|
65
|
+
OnAccountSelected(accountWithProvider: StorageAccountWithProvider | null): void;
|
|
66
|
+
/** @deprecated Use {@link OnAccountSelected}. */
|
|
47
67
|
onAccountSelected(accountWithProvider: StorageAccountWithProvider | null): void;
|
|
48
68
|
/**
|
|
49
69
|
* Handles folder selection from the tree navigation.
|
|
50
70
|
*
|
|
51
71
|
* @param folderPath - The full path of the selected folder
|
|
52
72
|
*/
|
|
73
|
+
OnFolderSelected(folderPath: string): void;
|
|
74
|
+
/** @deprecated Use {@link OnFolderSelected}. */
|
|
53
75
|
onFolderSelected(folderPath: string): void;
|
|
54
76
|
/**
|
|
55
77
|
* Handles folder navigation from the file grid (double-click on folder).
|
|
@@ -57,11 +79,15 @@ export declare class FileBrowserComponent {
|
|
|
57
79
|
*
|
|
58
80
|
* @param folderPath - The full path of the folder to navigate to
|
|
59
81
|
*/
|
|
82
|
+
OnFolderNavigate(folderPath: string): void;
|
|
83
|
+
/** @deprecated Use {@link OnFolderNavigate}. */
|
|
60
84
|
onFolderNavigate(folderPath: string): void;
|
|
61
85
|
/**
|
|
62
86
|
* Handles folder structure changes (e.g., new folder created, folder deleted).
|
|
63
87
|
* Refreshes the folder tree to show the new structure.
|
|
64
88
|
*/
|
|
89
|
+
OnFolderStructureChanged(): void;
|
|
90
|
+
/** @deprecated Use {@link OnFolderStructureChanged}. */
|
|
65
91
|
onFolderStructureChanged(): void;
|
|
66
92
|
static ɵfac: i0.ɵɵFactoryDeclaration<FileBrowserComponent, never>;
|
|
67
93
|
static ɵcmp: i0.ɵɵComponentDeclaration<FileBrowserComponent, "mj-file-browser", never, {}, {}, never, never, false, never>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-browser.component.d.ts","sourceRoot":"","sources":["../../../src/lib/file-browser/file-browser.component.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,0BAA0B,EAAE,MAAM,+BAA+B,CAAC;;AAE3E;;;;;;;;;;;;;GAaG;AACH,qBAMa,oBAAoB;IAC/B;;OAEG;IAC6B,UAAU,EAAG,mBAAmB,CAAC;IAEjE;;;OAGG;IACI,kBAAkB,EAAE,OAAO,CAAS;IAE3C;;OAEG;IACI,eAAe,EAAE,0BAA0B,GAAG,IAAI,CAAQ;IAEjE;;OAEG;IACI,kBAAkB,EAAE,MAAM,CAAO;;
|
|
1
|
+
{"version":3,"file":"file-browser.component.d.ts","sourceRoot":"","sources":["../../../src/lib/file-browser/file-browser.component.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,0BAA0B,EAAE,MAAM,+BAA+B,CAAC;;AAE3E;;;;;;;;;;;;;GAaG;AACH,qBAMa,oBAAoB;IAC/B;;OAEG;IAC6B,UAAU,EAAG,mBAAmB,CAAC;IAEjE,0CAA0C;IAC1C,IAAI,UAAU,IAAI,mBAAmB,CAEpC;IACD,0CAA0C;IAC1C,IAAI,UAAU,CAAC,KAAK,EAAE,mBAAmB,EAExC;IAED;;;OAGG;IACI,kBAAkB,EAAE,OAAO,CAAS;IAE3C,kDAAkD;IAClD,IAAW,kBAAkB,IAAI,OAAO,CAEvC;IACD,kDAAkD;IAClD,IAAW,kBAAkB,CAAC,KAAK,EAAE,OAAO,EAE3C;IAED;;OAEG;IACI,eAAe,EAAE,0BAA0B,GAAG,IAAI,CAAQ;IAEjE,+CAA+C;IAC/C,IAAW,eAAe,IAAI,0BAA0B,GAAG,IAAI,CAE9D;IACD,+CAA+C;IAC/C,IAAW,eAAe,CAAC,KAAK,EAAE,0BAA0B,GAAG,IAAI,EAElE;IAED;;OAEG;IACI,kBAAkB,EAAE,MAAM,CAAO;IAExC,kDAAkD;IAClD,IAAW,kBAAkB,IAAI,MAAM,CAEtC;IACD,kDAAkD;IAClD,IAAW,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAE1C;;IAID;;;OAGG;IACI,aAAa,IAAI,IAAI;IAI5B,6CAA6C;IACtC,aAAa,IAAI,IAAI;IAI5B;;;;OAIG;IACI,iBAAiB,CAAC,mBAAmB,EAAE,0BAA0B,GAAG,IAAI,GAAG,IAAI;IAKtF,iDAAiD;IAC1C,iBAAiB,CAAC,mBAAmB,EAAE,0BAA0B,GAAG,IAAI,GAAG,IAAI;IAItF;;;;OAIG;IACI,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAIjD,gDAAgD;IACzC,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAIjD;;;;;OAKG;IACI,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAMjD,gDAAgD;IACzC,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAIjD;;;OAGG;IACI,wBAAwB,IAAI,IAAI;IAQvC,wDAAwD;IACjD,wBAAwB,IAAI,IAAI;yCApI5B,oBAAoB;2CAApB,oBAAoB;CAuIhC"}
|