@memberjunction/ng-file-storage 5.51.0 → 6.1.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/LICENSE ADDED
@@ -0,0 +1,7 @@
1
+ ISC License
2
+
3
+ Copyright (c) 2023 MemberJunction
4
+
5
+ Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.
6
+
7
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
@@ -1,10 +1,10 @@
1
1
  import { EventEmitter, OnInit } from '@angular/core';
2
+ import { MJNotificationService } from '@memberjunction/ng-notifications';
2
3
  import { MJFileCategoryEntity } from '@memberjunction/core-entities';
3
- import { SharedService } from '@memberjunction/ng-shared';
4
4
  import { BaseAngularComponent } from '@memberjunction/ng-base-types';
5
5
  import * as i0 from "@angular/core";
6
6
  export declare class CategoryTreeComponent extends BaseAngularComponent implements OnInit {
7
- private sharedService;
7
+ private notifications;
8
8
  categorySelected: EventEmitter<string | undefined>;
9
9
  isLoading: boolean;
10
10
  showNew: boolean;
@@ -21,7 +21,7 @@ export declare class CategoryTreeComponent extends BaseAngularComponent implemen
21
21
  contextMenuY: number;
22
22
  private contextMenuNode;
23
23
  private get md();
24
- constructor(sharedService: SharedService);
24
+ constructor(notifications: MJNotificationService);
25
25
  ngOnInit(): void;
26
26
  /** Returns root-level nodes (no parent). */
27
27
  get rootNodes(): MJFileCategoryEntity[];
@@ -1 +1 @@
1
- {"version":3,"file":"category-tree.d.ts","sourceRoot":"","sources":["../../../src/lib/category-tree/category-tree.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,YAAY,EAAE,MAAM,EAAU,MAAM,eAAe,CAAC;AAExE,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAE1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;;AAErE,qBAMa,qBAAsB,SAAQ,oBAAqB,YAAW,MAAM;IAwBnE,OAAO,CAAC,aAAa;IAvBvB,gBAAgB,mCAA0C;IAE7D,SAAS,EAAE,OAAO,CAAS;IAC3B,OAAO,EAAE,OAAO,CAAS;IACzB,eAAe,SAAM;IACrB,kBAAkB,EAAE,oBAAoB,GAAG,SAAS,CAAC;IAErD,cAAc,EAAE,oBAAoB,EAAE,CAAM;IAEnD,qCAAqC;IAC9B,WAAW,cAAqB;IAEvC,iCAAiC;IACjC,OAAO,CAAC,UAAU,CAAqB;IAEvC,yBAAyB;IAClB,kBAAkB,UAAS;IAC3B,YAAY,SAAK;IACjB,YAAY,SAAK;IACxB,OAAO,CAAC,eAAe,CAAmC;IAE1D,OAAO,KAAK,EAAE,GAAiC;gBAE3B,aAAa,EAAE,aAAa;IAEhD,QAAQ,IAAI,IAAI;IAIhB,4CAA4C;IAC5C,IAAI,SAAS,IAAI,oBAAoB,EAAE,CAEtC;IAED,qCAAqC;IACrC,WAAW,CAAC,IAAI,EAAE,oBAAoB,GAAG,OAAO;IAIhD,kCAAkC;IAClC,WAAW,CAAC,IAAI,EAAE,oBAAoB,GAAG,oBAAoB,EAAE;IAI/D,oCAAoC;IACpC,UAAU,CAAC,IAAI,EAAE,oBAAoB,GAAG,OAAO;IAI/C,yCAAyC;IACzC,YAAY,CAAC,IAAI,EAAE,oBAAoB,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI;IAS5D,uDAAuD;IACvD,UAAU,CAAC,IAAI,EAAE,oBAAoB,GAAG,OAAO;IAI/C,sCAAsC;IACtC,UAAU,CAAC,IAAI,EAAE,oBAAoB,GAAG,IAAI;IAK5C,yCAAyC;IACzC,aAAa,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,oBAAoB,GAAG,IAAI;IASlE,+BAA+B;IAC/B,gBAAgB,IAAI,IAAI;IAKxB,6CAA6C;IAC7C,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAiBnC,iBAAiB;IAIvB,iBAAiB;IAIX,eAAe;IAYf,cAAc,CAAC,YAAY,EAAE,oBAAoB;IAgBvD,cAAc;IAKd,YAAY;IAKN,UAAU;IAOV,OAAO;yCA9JF,qBAAqB;2CAArB,qBAAqB;CA8KjC"}
1
+ {"version":3,"file":"category-tree.d.ts","sourceRoot":"","sources":["../../../src/lib/category-tree/category-tree.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,YAAY,EAAE,MAAM,EAAU,MAAM,eAAe,CAAC;AACxE,OAAO,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AAEzE,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAErE,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;;AAErE,qBAMa,qBAAsB,SAAQ,oBAAqB,YAAW,MAAM;IAwBnE,OAAO,CAAC,aAAa;IAvBvB,gBAAgB,mCAA0C;IAE7D,SAAS,EAAE,OAAO,CAAS;IAC3B,OAAO,EAAE,OAAO,CAAS;IACzB,eAAe,SAAM;IACrB,kBAAkB,EAAE,oBAAoB,GAAG,SAAS,CAAC;IAErD,cAAc,EAAE,oBAAoB,EAAE,CAAM;IAEnD,qCAAqC;IAC9B,WAAW,cAAqB;IAEvC,iCAAiC;IACjC,OAAO,CAAC,UAAU,CAAqB;IAEvC,yBAAyB;IAClB,kBAAkB,UAAS;IAC3B,YAAY,SAAK;IACjB,YAAY,SAAK;IACxB,OAAO,CAAC,eAAe,CAAmC;IAE1D,OAAO,KAAK,EAAE,GAAiC;gBAE3B,aAAa,EAAE,qBAAqB;IAExD,QAAQ,IAAI,IAAI;IAIhB,4CAA4C;IAC5C,IAAI,SAAS,IAAI,oBAAoB,EAAE,CAEtC;IAED,qCAAqC;IACrC,WAAW,CAAC,IAAI,EAAE,oBAAoB,GAAG,OAAO;IAIhD,kCAAkC;IAClC,WAAW,CAAC,IAAI,EAAE,oBAAoB,GAAG,oBAAoB,EAAE;IAI/D,oCAAoC;IACpC,UAAU,CAAC,IAAI,EAAE,oBAAoB,GAAG,OAAO;IAI/C,yCAAyC;IACzC,YAAY,CAAC,IAAI,EAAE,oBAAoB,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI;IAS5D,uDAAuD;IACvD,UAAU,CAAC,IAAI,EAAE,oBAAoB,GAAG,OAAO;IAI/C,sCAAsC;IACtC,UAAU,CAAC,IAAI,EAAE,oBAAoB,GAAG,IAAI;IAK5C,yCAAyC;IACzC,aAAa,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,oBAAoB,GAAG,IAAI;IASlE,+BAA+B;IAC/B,gBAAgB,IAAI,IAAI;IAKxB,6CAA6C;IAC7C,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAiBnC,iBAAiB;IAIvB,iBAAiB;IAIX,eAAe;IAYf,cAAc,CAAC,YAAY,EAAE,oBAAoB;IAgBvD,cAAc;IAKd,YAAY;IAKN,UAAU;IAOV,OAAO;yCA9JF,qBAAqB;2CAArB,qBAAqB;CA8KjC"}
@@ -3,7 +3,7 @@ import { RunView } from '@memberjunction/core';
3
3
  import { UUIDsEqual } from '@memberjunction/global';
4
4
  import { BaseAngularComponent } from '@memberjunction/ng-base-types';
5
5
  import * as i0 from "@angular/core";
6
- import * as i1 from "@memberjunction/ng-shared";
6
+ import * as i1 from "@memberjunction/ng-notifications";
7
7
  import * as i2 from "@angular/common";
8
8
  import * as i3 from "@angular/forms";
9
9
  import * as i4 from "@memberjunction/ng-ui-components";
@@ -128,7 +128,7 @@ function CategoryTreeComponent_Conditional_25_Template(rf, ctx) { if (rf & 1) {
128
128
  i0.ɵɵproperty("disabled", ctx_r5.isLoading);
129
129
  } }
130
130
  export class CategoryTreeComponent extends BaseAngularComponent {
131
- sharedService;
131
+ notifications;
132
132
  categorySelected = new EventEmitter();
133
133
  isLoading = false;
134
134
  showNew = false;
@@ -145,9 +145,9 @@ export class CategoryTreeComponent extends BaseAngularComponent {
145
145
  contextMenuY = 0;
146
146
  contextMenuNode;
147
147
  get md() { return this.ProviderToUse; }
148
- constructor(sharedService) {
148
+ constructor(notifications) {
149
149
  super();
150
- this.sharedService = sharedService;
150
+ this.notifications = notifications;
151
151
  }
152
152
  ngOnInit() {
153
153
  this.Refresh();
@@ -240,7 +240,7 @@ export class CategoryTreeComponent extends BaseAngularComponent {
240
240
  const success = await fileCategory.Delete();
241
241
  if (!success) {
242
242
  console.error('Unable to delete file category:', fileCategory);
243
- this.sharedService.CreateSimpleNotification(`Unable to delete category '${fileCategory.Name}'`, 'error');
243
+ this.notifications.CreateSimpleNotification(`Unable to delete category '${fileCategory.Name}'`, 'error');
244
244
  this.isLoading = false;
245
245
  return;
246
246
  }
@@ -277,7 +277,7 @@ export class CategoryTreeComponent extends BaseAngularComponent {
277
277
  }
278
278
  this.isLoading = false;
279
279
  }
280
- static ɵfac = function CategoryTreeComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || CategoryTreeComponent)(i0.ɵɵdirectiveInject(i1.SharedService)); };
280
+ static ɵfac = function CategoryTreeComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || CategoryTreeComponent)(i0.ɵɵdirectiveInject(i1.MJNotificationService)); };
281
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) {
282
282
  const _r1 = i0.ɵɵgetCurrentView();
283
283
  i0.ɵɵelementStart(0, "div", 3)(1, "div", 4)(2, "button", 5);
@@ -332,7 +332,7 @@ export class CategoryTreeComponent extends BaseAngularComponent {
332
332
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(CategoryTreeComponent, [{
333
333
  type: Component,
334
334
  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.SharedService }], { categorySelected: [{
335
+ }], () => [{ type: i1.MJNotificationService }], { categorySelected: [{
336
336
  type: Output
337
337
  }] }); })();
338
338
  (() => { (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 { RunView } from '@memberjunction/core';\nimport { MJFileCategoryEntity } from '@memberjunction/core-entities';\nimport { SharedService } from '@memberjunction/ng-shared';\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 sharedService: SharedService) { 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.sharedService.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 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 +1 @@
1
- {"version":3,"file":"file-browser-resource.component.d.ts","sourceRoot":"","sources":["../../../src/lib/file-browser/file-browser-resource.component.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;;AAG7D;;;GAGG;AACH,qBAqCa,mBAAoB,SAAQ,qBAAqB;IAC5D,OAAO,CAAC,UAAU,CAAS;;IAM3B,IAAa,IAAI,CAAC,KAAK,EAAE,YAAY,EAMpC;IAED,IAAa,IAAI,IAAI,YAAY,CAEhC;IAED;;;OAGG;YACW,eAAe;IAO7B;;OAEG;IACY,sBAAsB,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;IAI1E;;OAEG;IACY,oBAAoB,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;yCAxC7D,mBAAmB;2CAAnB,mBAAmB;CA2C/B"}
1
+ {"version":3,"file":"file-browser-resource.component.d.ts","sourceRoot":"","sources":["../../../src/lib/file-browser/file-browser-resource.component.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;;AAG7D;;;GAGG;AACH,qBAqCa,mBAAoB,SAAQ,qBAAqB;IAC5D,OAAO,CAAC,UAAU,CAAS;;IAM3B,IAAa,IAAI,CAAC,KAAK,EAAE,YAAY,EAMpC;IAED,IAAa,IAAI,IAAI,YAAY,CAEhC;IAED;;;OAGG;YACW,eAAe;IAO7B;;OAEG;IACY,sBAAsB,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;IAI1E;;OAEG;IACY,oBAAoB,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;yCAxC7D,mBAAmB;2CAAnB,mBAAmB;CA2C/B"}
@@ -5,6 +5,12 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
5
5
  return c > 3 && r && Object.defineProperty(target, key, r), r;
6
6
  };
7
7
  import { Component } from '@angular/core';
8
+ // This component is an Explorer surface (layer 3), which is why the package declares
9
+ // "mjUILayer": "surface" rather than "widgets" — a package holding a BaseResourceComponent
10
+ // subclass cannot be widgets by the gate's own table, and ng-shared is legal at L3.
11
+ // Splitting the surface out from the widgets in this package is still worth doing (MJ#3404);
12
+ // it is registered in three CodeGen-generated manifests, so it needs a CodeGen run, not a
13
+ // hand edit.
8
14
  import { BaseResourceComponent } from '@memberjunction/ng-shared';
9
15
  import { RegisterClass } from '@memberjunction/global';
10
16
  import * as i0 from "@angular/core";
@@ -79,5 +85,5 @@ export { FileBrowserResource };
79
85
  </mj-page-layout>
80
86
  `, styles: ["\n :host {\n display: block;\n width: 100%;\n height: 100%;\n }\n .file-browser-body {\n flex: 1;\n min-height: 0;\n padding: 0 24px 24px;\n display: flex;\n }\n /* The inner mj-file-browser needs to fill the body container. */\n .file-browser-body :is(mj-file-browser) {\n flex: 1;\n min-height: 0;\n min-width: 0;\n display: flex;\n }\n "] }]
81
87
  }], () => [], null); })();
82
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(FileBrowserResource, { className: "FileBrowserResource", filePath: "src/lib/file-browser/file-browser-resource.component.ts", lineNumber: 47 }); })();
88
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(FileBrowserResource, { className: "FileBrowserResource", filePath: "src/lib/file-browser/file-browser-resource.component.ts", lineNumber: 53 }); })();
83
89
  //# sourceMappingURL=file-browser-resource.component.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"file-browser-resource.component.js","sourceRoot":"","sources":["../../../src/lib/file-browser/file-browser-resource.component.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAElE,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;;;;AAEvD;;;GAGG;AAsCI,IAAM,mBAAmB,GAAzB,MAAM,mBAAoB,SAAQ,qBAAqB;IACpD,UAAU,GAAG,KAAK,CAAC;IAE3B;QACE,KAAK,EAAE,CAAC;IACV,CAAC;IAED,IAAa,IAAI,CAAC,KAAmB;QACnC,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACrB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;YACvB,IAAI,CAAC,eAAe,EAAE,CAAC;QACzB,CAAC;IACH,CAAC;IAED,IAAa,IAAI;QACf,OAAO,KAAK,CAAC,IAAI,CAAC;IACpB,CAAC;IAED;;;OAGG;IACK,KAAK,CAAC,eAAe;QAC3B,oEAAoE;QACpE,6CAA6C;QAC7C,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;QACxB,IAAI,CAAC,kBAAkB,EAAE,CAAC;IAC5B,CAAC;IAED;;OAEG;IACM,KAAK,CAAC,sBAAsB,CAAC,IAAkB;QACtD,OAAO,IAAI,CAAC,IAAI,IAAI,cAAc,CAAC;IACrC,CAAC;IAED;;OAEG;IACM,KAAK,CAAC,oBAAoB,CAAC,IAAkB;QACpD,OAAO,yBAAyB,CAAC;IACnC,CAAC;6GA1CU,mBAAmB;6DAAnB,mBAAmB;YAhC5B,sCAAgB;YACd,oCAIiB;YACjB,8BAA+B;YAC7B,kCAAmC;YAEvC,AADE,iBAAM,EACS;;;AAuBR,mBAAmB;IArC/B,aAAa,CAAC,qBAAqB,EAAE,qBAAqB,CAAC;GAqC/C,mBAAmB,CA2C/B;;iFA3CY,mBAAmB;cApC/B,SAAS;6BACI,KAAK,YACP,0BAA0B,YAC1B;;;;;;;;;;;GAWT;;kFAsBU,mBAAmB","sourcesContent":["import { Component } from '@angular/core';\nimport { BaseResourceComponent } from '@memberjunction/ng-shared';\nimport { ResourceData } from '@memberjunction/core-entities';\nimport { RegisterClass } from '@memberjunction/global';\n\n/**\n * File Browser Resource Wrapper - displays the file browser in a tab\n * Extends BaseResourceComponent to work with the MJ resource type system\n */\n@RegisterClass(BaseResourceComponent, 'FileBrowserResource')\n@Component({\n standalone: false,\n selector: 'mj-file-browser-resource',\n template: `\n <mj-page-layout>\n <mj-page-header\n Title=\"File Browser\"\n Icon=\"fa-solid fa-folder-tree\"\n Subtitle=\"Browse and manage files across storage providers\">\n </mj-page-header>\n <div class=\"file-browser-body\">\n <mj-file-browser></mj-file-browser>\n </div>\n </mj-page-layout>\n `,\n styles: [`\n :host {\n display: block;\n width: 100%;\n height: 100%;\n }\n .file-browser-body {\n flex: 1;\n min-height: 0;\n padding: 0 24px 24px;\n display: flex;\n }\n /* The inner mj-file-browser needs to fill the body container. */\n .file-browser-body :is(mj-file-browser) {\n flex: 1;\n min-height: 0;\n min-width: 0;\n display: flex;\n }\n `]\n})\nexport class FileBrowserResource extends BaseResourceComponent {\n private dataLoaded = false;\n\n constructor() {\n super();\n }\n\n override set Data(value: ResourceData) {\n super.Data = value;\n if (!this.dataLoaded) {\n this.dataLoaded = true;\n this.loadFileBrowser();\n }\n }\n\n override get Data(): ResourceData {\n return super.Data;\n }\n\n /**\n * Load the file browser (currently just notifies load complete)\n * In future phases, this could pass configuration from ResourceData\n */\n private async loadFileBrowser(): Promise<void> {\n // Defer to next microtask so the shell's LoadCompleteEvent callback\n // is wired before we fire NotifyLoadComplete\n await Promise.resolve();\n this.NotifyLoadComplete();\n }\n\n /**\n * Get the display name for the file browser resource\n */\n override async GetResourceDisplayName(data: ResourceData): Promise<string> {\n return data.Name || 'File Browser';\n }\n\n /**\n * Get the icon class for file browser resources\n */\n override async GetResourceIconClass(data: ResourceData): Promise<string> {\n return 'fa-solid fa-folder-tree';\n }\n}\n"]}
1
+ {"version":3,"file":"file-browser-resource.component.js","sourceRoot":"","sources":["../../../src/lib/file-browser/file-browser-resource.component.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1C,qFAAqF;AACrF,2FAA2F;AAC3F,oFAAoF;AACpF,6FAA6F;AAC7F,0FAA0F;AAC1F,aAAa;AACb,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAElE,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;;;;AAEvD;;;GAGG;AAsCI,IAAM,mBAAmB,GAAzB,MAAM,mBAAoB,SAAQ,qBAAqB;IACpD,UAAU,GAAG,KAAK,CAAC;IAE3B;QACE,KAAK,EAAE,CAAC;IACV,CAAC;IAED,IAAa,IAAI,CAAC,KAAmB;QACnC,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACrB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;YACvB,IAAI,CAAC,eAAe,EAAE,CAAC;QACzB,CAAC;IACH,CAAC;IAED,IAAa,IAAI;QACf,OAAO,KAAK,CAAC,IAAI,CAAC;IACpB,CAAC;IAED;;;OAGG;IACK,KAAK,CAAC,eAAe;QAC3B,oEAAoE;QACpE,6CAA6C;QAC7C,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;QACxB,IAAI,CAAC,kBAAkB,EAAE,CAAC;IAC5B,CAAC;IAED;;OAEG;IACM,KAAK,CAAC,sBAAsB,CAAC,IAAkB;QACtD,OAAO,IAAI,CAAC,IAAI,IAAI,cAAc,CAAC;IACrC,CAAC;IAED;;OAEG;IACM,KAAK,CAAC,oBAAoB,CAAC,IAAkB;QACpD,OAAO,yBAAyB,CAAC;IACnC,CAAC;6GA1CU,mBAAmB;6DAAnB,mBAAmB;YAhC5B,sCAAgB;YACd,oCAIiB;YACjB,8BAA+B;YAC7B,kCAAmC;YAEvC,AADE,iBAAM,EACS;;;AAuBR,mBAAmB;IArC/B,aAAa,CAAC,qBAAqB,EAAE,qBAAqB,CAAC;GAqC/C,mBAAmB,CA2C/B;;iFA3CY,mBAAmB;cApC/B,SAAS;6BACI,KAAK,YACP,0BAA0B,YAC1B;;;;;;;;;;;GAWT;;kFAsBU,mBAAmB","sourcesContent":["import { Component } from '@angular/core';\n// This component is an Explorer surface (layer 3), which is why the package declares\n// \"mjUILayer\": \"surface\" rather than \"widgets\" — a package holding a BaseResourceComponent\n// subclass cannot be widgets by the gate's own table, and ng-shared is legal at L3.\n// Splitting the surface out from the widgets in this package is still worth doing (MJ#3404);\n// it is registered in three CodeGen-generated manifests, so it needs a CodeGen run, not a\n// hand edit.\nimport { BaseResourceComponent } from '@memberjunction/ng-shared';\nimport { ResourceData } from '@memberjunction/core-entities';\nimport { RegisterClass } from '@memberjunction/global';\n\n/**\n * File Browser Resource Wrapper - displays the file browser in a tab\n * Extends BaseResourceComponent to work with the MJ resource type system\n */\n@RegisterClass(BaseResourceComponent, 'FileBrowserResource')\n@Component({\n standalone: false,\n selector: 'mj-file-browser-resource',\n template: `\n <mj-page-layout>\n <mj-page-header\n Title=\"File Browser\"\n Icon=\"fa-solid fa-folder-tree\"\n Subtitle=\"Browse and manage files across storage providers\">\n </mj-page-header>\n <div class=\"file-browser-body\">\n <mj-file-browser></mj-file-browser>\n </div>\n </mj-page-layout>\n `,\n styles: [`\n :host {\n display: block;\n width: 100%;\n height: 100%;\n }\n .file-browser-body {\n flex: 1;\n min-height: 0;\n padding: 0 24px 24px;\n display: flex;\n }\n /* The inner mj-file-browser needs to fill the body container. */\n .file-browser-body :is(mj-file-browser) {\n flex: 1;\n min-height: 0;\n min-width: 0;\n display: flex;\n }\n `]\n})\nexport class FileBrowserResource extends BaseResourceComponent {\n private dataLoaded = false;\n\n constructor() {\n super();\n }\n\n override set Data(value: ResourceData) {\n super.Data = value;\n if (!this.dataLoaded) {\n this.dataLoaded = true;\n this.loadFileBrowser();\n }\n }\n\n override get Data(): ResourceData {\n return super.Data;\n }\n\n /**\n * Load the file browser (currently just notifies load complete)\n * In future phases, this could pass configuration from ResourceData\n */\n private async loadFileBrowser(): Promise<void> {\n // Defer to next microtask so the shell's LoadCompleteEvent callback\n // is wired before we fire NotifyLoadComplete\n await Promise.resolve();\n this.NotifyLoadComplete();\n }\n\n /**\n * Get the display name for the file browser resource\n */\n override async GetResourceDisplayName(data: ResourceData): Promise<string> {\n return data.Name || 'File Browser';\n }\n\n /**\n * Get the icon class for file browser resources\n */\n override async GetResourceIconClass(data: ResourceData): Promise<string> {\n return 'fa-solid fa-folder-tree';\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"file-grid.component.d.ts","sourceRoot":"","sources":["../../../src/lib/file-browser/file-grid.component.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"file-grid.component.d.ts","sourceRoot":"","sources":["../../../src/lib/file-browser/file-grid.component.ts"],"names":[],"mappings":"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"}
@@ -1491,7 +1491,7 @@ export class FileGridComponent {
1491
1491
  const uploadData = await this.storageClient.CreatePreAuthUploadUrl(this.account.account.ID, objectName, file.type || 'application/octet-stream');
1492
1492
  console.log('[FileGrid] Got upload URL:', uploadData.uploadUrl);
1493
1493
  // Upload the file using XMLHttpRequest to track progress
1494
- await this.uploadFileToUrl(file, uploadData.uploadUrl);
1494
+ await this.uploadFileToUrl(file, uploadData.uploadUrl, this.account?.provider?.ServerDriverKey);
1495
1495
  console.log('[FileGrid] File uploaded successfully:', file.name);
1496
1496
  }
1497
1497
  catch (error) {
@@ -1520,7 +1520,7 @@ export class FileGridComponent {
1520
1520
  /**
1521
1521
  * Uploads file to the pre-authenticated URL with progress tracking
1522
1522
  */
1523
- uploadFileToUrl(file, url) {
1523
+ uploadFileToUrl(file, url, driverKey) {
1524
1524
  return new Promise((resolve, reject) => {
1525
1525
  const xhr = new XMLHttpRequest();
1526
1526
  xhr.upload.addEventListener('progress', (event) => {
@@ -1542,11 +1542,18 @@ export class FileGridComponent {
1542
1542
  xhr.addEventListener('abort', () => {
1543
1543
  reject(new Error('Upload cancelled'));
1544
1544
  });
1545
- // Use POST for Dropbox temporary upload links (required by Dropbox API)
1546
- // Use PUT for other providers like S3
1547
- // Dropbox requires POST with application/octet-stream
1548
- xhr.open('POST', url, true);
1549
- xhr.setRequestHeader('Content-Type', 'application/octet-stream');
1545
+ // Provider-specific upload semantics for the pre-authenticated URL:
1546
+ // - Dropbox temporary upload links require POST.
1547
+ // - Azure Blob "Put Blob" requires PUT and the `x-ms-blob-type: BlockBlob` header;
1548
+ // without the header Azure rejects the request and the upload silently no-ops.
1549
+ // - S3 and other pre-signed-PUT providers require PUT.
1550
+ const isDropbox = driverKey === 'Dropbox Storage';
1551
+ const isAzure = driverKey === 'Azure Blob Storage';
1552
+ xhr.open(isDropbox ? 'POST' : 'PUT', url, true);
1553
+ xhr.setRequestHeader('Content-Type', file.type || 'application/octet-stream');
1554
+ if (isAzure) {
1555
+ xhr.setRequestHeader('x-ms-blob-type', 'BlockBlob');
1556
+ }
1550
1557
  xhr.send(file);
1551
1558
  });
1552
1559
  }