@memberjunction/ng-dashboards 5.4.1 → 5.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (121) hide show
  1. package/dist/AI/components/agents/agent-configuration.component.js +4 -4
  2. package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
  3. package/dist/AI/components/agents/agent-editor.component.d.ts.map +1 -1
  4. package/dist/AI/components/agents/agent-editor.component.js +5 -4
  5. package/dist/AI/components/agents/agent-editor.component.js.map +1 -1
  6. package/dist/AI/components/models/model-management.component.js +3 -3
  7. package/dist/AI/components/models/model-management.component.js.map +1 -1
  8. package/dist/AI/components/prompts/model-prompt-priority-matrix.component.d.ts.map +1 -1
  9. package/dist/AI/components/prompts/model-prompt-priority-matrix.component.js +8 -7
  10. package/dist/AI/components/prompts/model-prompt-priority-matrix.component.js.map +1 -1
  11. package/dist/AI/components/prompts/prompt-management.component.js +3 -3
  12. package/dist/AI/components/prompts/prompt-management.component.js.map +1 -1
  13. package/dist/AI/components/system/system-configuration.component.js +4 -4
  14. package/dist/AI/components/system/system-configuration.component.js.map +1 -1
  15. package/dist/APIKeys/api-applications-panel.component.d.ts.map +1 -1
  16. package/dist/APIKeys/api-applications-panel.component.js +3 -2
  17. package/dist/APIKeys/api-applications-panel.component.js.map +1 -1
  18. package/dist/APIKeys/api-keys-resource.component.js +2 -2
  19. package/dist/APIKeys/api-keys-resource.component.js.map +1 -1
  20. package/dist/APIKeys/api-scopes-panel.component.d.ts.map +1 -1
  21. package/dist/APIKeys/api-scopes-panel.component.js +4 -3
  22. package/dist/APIKeys/api-scopes-panel.component.js.map +1 -1
  23. package/dist/Actions/components/actions-overview.component.js +3 -3
  24. package/dist/Actions/components/actions-overview.component.js.map +1 -1
  25. package/dist/Actions/components/categories-list-view.component.d.ts.map +1 -1
  26. package/dist/Actions/components/categories-list-view.component.js +3 -2
  27. package/dist/Actions/components/categories-list-view.component.js.map +1 -1
  28. package/dist/Actions/components/execution-monitoring.component.js +2 -2
  29. package/dist/Actions/components/execution-monitoring.component.js.map +1 -1
  30. package/dist/Actions/components/explorer/action-explorer.component.js +2 -2
  31. package/dist/Actions/components/explorer/action-explorer.component.js.map +1 -1
  32. package/dist/Actions/components/explorer/new-action-panel.component.d.ts.map +1 -1
  33. package/dist/Actions/components/explorer/new-action-panel.component.js +3 -2
  34. package/dist/Actions/components/explorer/new-action-panel.component.js.map +1 -1
  35. package/dist/Actions/components/explorer/new-category-panel.component.d.ts.map +1 -1
  36. package/dist/Actions/components/explorer/new-category-panel.component.js +3 -2
  37. package/dist/Actions/components/explorer/new-category-panel.component.js.map +1 -1
  38. package/dist/Communication/communication-templates-resource.component.js +2 -2
  39. package/dist/Communication/communication-templates-resource.component.js.map +1 -1
  40. package/dist/ComponentStudio/components/artifact-load-dialog.component.d.ts +6 -0
  41. package/dist/ComponentStudio/components/artifact-load-dialog.component.d.ts.map +1 -1
  42. package/dist/ComponentStudio/components/artifact-load-dialog.component.js +19 -6
  43. package/dist/ComponentStudio/components/artifact-load-dialog.component.js.map +1 -1
  44. package/dist/ComponentStudio/components/artifact-selection-dialog.component.d.ts +4 -0
  45. package/dist/ComponentStudio/components/artifact-selection-dialog.component.d.ts.map +1 -1
  46. package/dist/ComponentStudio/components/artifact-selection-dialog.component.js +13 -4
  47. package/dist/ComponentStudio/components/artifact-selection-dialog.component.js.map +1 -1
  48. package/dist/Credentials/components/credentials-categories-resource.component.d.ts +2 -0
  49. package/dist/Credentials/components/credentials-categories-resource.component.d.ts.map +1 -1
  50. package/dist/Credentials/components/credentials-categories-resource.component.js +13 -9
  51. package/dist/Credentials/components/credentials-categories-resource.component.js.map +1 -1
  52. package/dist/Credentials/components/credentials-list-resource.component.js +11 -11
  53. package/dist/Credentials/components/credentials-list-resource.component.js.map +1 -1
  54. package/dist/Credentials/components/credentials-overview-resource.component.js +3 -3
  55. package/dist/Credentials/components/credentials-overview-resource.component.js.map +1 -1
  56. package/dist/Credentials/components/credentials-types-resource.component.d.ts +2 -0
  57. package/dist/Credentials/components/credentials-types-resource.component.d.ts.map +1 -1
  58. package/dist/Credentials/components/credentials-types-resource.component.js +13 -9
  59. package/dist/Credentials/components/credentials-types-resource.component.js.map +1 -1
  60. package/dist/DashboardBrowser/dashboard-browser-resource.component.js +11 -11
  61. package/dist/DashboardBrowser/dashboard-browser-resource.component.js.map +1 -1
  62. package/dist/DashboardBrowser/dashboard-share-dialog.component.d.ts.map +1 -1
  63. package/dist/DashboardBrowser/dashboard-share-dialog.component.js +4 -3
  64. package/dist/DashboardBrowser/dashboard-share-dialog.component.js.map +1 -1
  65. package/dist/DataExplorer/components/view-selector/view-selector.component.d.ts.map +1 -1
  66. package/dist/DataExplorer/components/view-selector/view-selector.component.js +4 -3
  67. package/dist/DataExplorer/components/view-selector/view-selector.component.js.map +1 -1
  68. package/dist/DataExplorer/data-explorer-dashboard.component.js +6 -6
  69. package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
  70. package/dist/DataExplorer/data-explorer-resource.component.d.ts.map +1 -1
  71. package/dist/DataExplorer/data-explorer-resource.component.js +4 -1
  72. package/dist/DataExplorer/data-explorer-resource.component.js.map +1 -1
  73. package/dist/DataExplorer/services/explorer-state.service.d.ts.map +1 -1
  74. package/dist/DataExplorer/services/explorer-state.service.js +9 -8
  75. package/dist/DataExplorer/services/explorer-state.service.js.map +1 -1
  76. package/dist/EntityAdmin/entity-admin-dashboard.component.js +2 -2
  77. package/dist/EntityAdmin/entity-admin-dashboard.component.js.map +1 -1
  78. package/dist/Home/home-application.js +2 -2
  79. package/dist/Home/home-application.js.map +1 -1
  80. package/dist/Lists/components/lists-browse-resource.component.js +3 -3
  81. package/dist/Lists/components/lists-browse-resource.component.js.map +1 -1
  82. package/dist/Lists/components/lists-categories-resource.component.d.ts +1 -0
  83. package/dist/Lists/components/lists-categories-resource.component.d.ts.map +1 -1
  84. package/dist/Lists/components/lists-categories-resource.component.js +17 -14
  85. package/dist/Lists/components/lists-categories-resource.component.js.map +1 -1
  86. package/dist/Lists/components/lists-my-lists-resource.component.js +2 -2
  87. package/dist/Lists/components/lists-my-lists-resource.component.js.map +1 -1
  88. package/dist/Lists/components/lists-operations-resource.component.d.ts +1 -0
  89. package/dist/Lists/components/lists-operations-resource.component.d.ts.map +1 -1
  90. package/dist/Lists/components/lists-operations-resource.component.js +15 -12
  91. package/dist/Lists/components/lists-operations-resource.component.js.map +1 -1
  92. package/dist/MCP/components/mcp-connection-dialog.component.d.ts.map +1 -1
  93. package/dist/MCP/components/mcp-connection-dialog.component.js +3 -2
  94. package/dist/MCP/components/mcp-connection-dialog.component.js.map +1 -1
  95. package/dist/MCP/components/mcp-test-tool-dialog.component.d.ts.map +1 -1
  96. package/dist/MCP/components/mcp-test-tool-dialog.component.js +8 -7
  97. package/dist/MCP/components/mcp-test-tool-dialog.component.js.map +1 -1
  98. package/dist/MCP/mcp-dashboard.component.js +22 -22
  99. package/dist/MCP/mcp-dashboard.component.js.map +1 -1
  100. package/dist/QueryBrowser/query-browser-resource.component.d.ts +2 -0
  101. package/dist/QueryBrowser/query-browser-resource.component.d.ts.map +1 -1
  102. package/dist/QueryBrowser/query-browser-resource.component.js +14 -10
  103. package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
  104. package/dist/Scheduling/services/scheduling-instrumentation.service.d.ts.map +1 -1
  105. package/dist/Scheduling/services/scheduling-instrumentation.service.js +2 -1
  106. package/dist/Scheduling/services/scheduling-instrumentation.service.js.map +1 -1
  107. package/dist/Testing/components/testing-explorer.component.d.ts +1 -0
  108. package/dist/Testing/components/testing-explorer.component.d.ts.map +1 -1
  109. package/dist/Testing/components/testing-explorer.component.js +22 -18
  110. package/dist/Testing/components/testing-explorer.component.js.map +1 -1
  111. package/dist/Testing/components/testing-review.component.d.ts +1 -0
  112. package/dist/Testing/components/testing-review.component.d.ts.map +1 -1
  113. package/dist/Testing/components/testing-review.component.js +14 -10
  114. package/dist/Testing/components/testing-review.component.js.map +1 -1
  115. package/dist/VersionHistory/components/diff-resource.component.js +6 -6
  116. package/dist/VersionHistory/components/diff-resource.component.js.map +1 -1
  117. package/dist/VersionHistory/components/graph-resource.component.js +2 -2
  118. package/dist/VersionHistory/components/graph-resource.component.js.map +1 -1
  119. package/dist/VersionHistory/components/labels-resource.component.js +3 -3
  120. package/dist/VersionHistory/components/labels-resource.component.js.map +1 -1
  121. package/package.json +38 -38
@@ -5,7 +5,7 @@ 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, ViewEncapsulation } from '@angular/core';
8
- import { RegisterClass } from '@memberjunction/global';
8
+ import { RegisterClass, UUIDsEqual } from '@memberjunction/global';
9
9
  import { BaseResourceComponent } from '@memberjunction/ng-shared';
10
10
  import { Metadata, RunView } from '@memberjunction/core';
11
11
  import { Subject } from 'rxjs';
@@ -234,8 +234,8 @@ function ListsCategoriesResource_ng_template_14_Template(rf, ctx) { if (rf & 1)
234
234
  const ctx_r2 = i0.ɵɵnextContext();
235
235
  i0.ɵɵstyleProp("padding-left", vm_r9.depth * 20, "px");
236
236
  i0.ɵɵadvance();
237
- i0.ɵɵclassProp("selected", (ctx_r2.selectedCategory == null ? null : ctx_r2.selectedCategory.ID) === vm_r9.category.ID);
238
- i0.ɵɵattribute("aria-expanded", ctx_r2.hasChildren(vm_r9.category) ? vm_r9.isExpanded : null)("aria-selected", (ctx_r2.selectedCategory == null ? null : ctx_r2.selectedCategory.ID) === vm_r9.category.ID)("aria-label", vm_r9.category.Name + " - " + vm_r9.listCount + " lists");
237
+ i0.ɵɵclassProp("selected", ctx_r2.IsCategorySelected(vm_r9.category));
238
+ i0.ɵɵattribute("aria-expanded", ctx_r2.hasChildren(vm_r9.category) ? vm_r9.isExpanded : null)("aria-selected", ctx_r2.IsCategorySelected(vm_r9.category))("aria-label", vm_r9.category.Name + " - " + vm_r9.listCount + " lists");
239
239
  i0.ɵɵadvance();
240
240
  i0.ɵɵconditional(ctx_r2.hasChildren(vm_r9.category) ? 2 : -1);
241
241
  i0.ɵɵadvance();
@@ -447,7 +447,7 @@ let ListsCategoriesResource = class ListsCategoriesResource extends BaseResource
447
447
  this.categoryViewModels = [];
448
448
  const buildVm = (category, depth) => {
449
449
  const lists = this.listsByCategoryId.get(category.ID) || [];
450
- const children = this.categories.filter(c => c.ParentID === category.ID);
450
+ const children = this.categories.filter(c => UUIDsEqual(c.ParentID, category.ID));
451
451
  return {
452
452
  category,
453
453
  listCount: lists.length,
@@ -458,7 +458,7 @@ let ListsCategoriesResource = class ListsCategoriesResource extends BaseResource
458
458
  };
459
459
  const processCategory = (category, depth) => {
460
460
  this.categoryViewModels.push(buildVm(category, depth));
461
- const children = this.categories.filter(c => c.ParentID === category.ID);
461
+ const children = this.categories.filter(c => UUIDsEqual(c.ParentID, category.ID));
462
462
  for (const child of children) {
463
463
  processCategory(child, depth + 1);
464
464
  }
@@ -476,20 +476,20 @@ let ListsCategoriesResource = class ListsCategoriesResource extends BaseResource
476
476
  return;
477
477
  }
478
478
  this.availableParents.push({ ID: cat.ID, displayName: prefix + cat.Name });
479
- const children = this.categories.filter(c => c.ParentID === cat.ID);
479
+ const children = this.categories.filter(c => UUIDsEqual(c.ParentID, cat.ID));
480
480
  for (const child of children) {
481
481
  addCategory(child, prefix + '\u00A0\u00A0');
482
482
  }
483
483
  };
484
484
  const topLevel = this.categories.filter(c => !c.ParentID);
485
485
  for (const cat of topLevel) {
486
- if (this.editingCategory?.ID !== cat.ID) {
486
+ if (!UUIDsEqual(this.editingCategory?.ID, cat.ID)) {
487
487
  addCategory(cat, '');
488
488
  }
489
489
  }
490
490
  }
491
491
  isDescendantOf(category, ancestor) {
492
- if (category.ID === ancestor.ID)
492
+ if (UUIDsEqual(category.ID, ancestor.ID))
493
493
  return true;
494
494
  if (!category.ParentID)
495
495
  return false;
@@ -500,10 +500,10 @@ let ListsCategoriesResource = class ListsCategoriesResource extends BaseResource
500
500
  return this.categoryViewModels.filter(vm => !vm.category.ParentID);
501
501
  }
502
502
  getChildCategories(parent) {
503
- return this.categoryViewModels.filter(vm => vm.category.ParentID === parent.ID);
503
+ return this.categoryViewModels.filter(vm => UUIDsEqual(vm.category.ParentID, parent.ID));
504
504
  }
505
505
  hasChildren(category) {
506
- return this.categories.some(c => c.ParentID === category.ID);
506
+ return this.categories.some(c => UUIDsEqual(c.ParentID, category.ID));
507
507
  }
508
508
  toggleExpand(event, vm) {
509
509
  event.stopPropagation();
@@ -521,6 +521,9 @@ let ListsCategoriesResource = class ListsCategoriesResource extends BaseResource
521
521
  vm.isExpanded = false;
522
522
  }
523
523
  }
524
+ IsCategorySelected(category) {
525
+ return UUIDsEqual(this.selectedCategory?.ID, category.ID);
526
+ }
524
527
  selectCategory(category) {
525
528
  this.selectedCategory = category;
526
529
  this.selectedCategoryLists = this.listsByCategoryId.get(category.ID) || [];
@@ -538,7 +541,7 @@ let ListsCategoriesResource = class ListsCategoriesResource extends BaseResource
538
541
  getSelectedCategoryChildCount() {
539
542
  if (!this.selectedCategory)
540
543
  return 0;
541
- return this.categories.filter(c => c.ParentID === this.selectedCategory.ID).length;
544
+ return this.categories.filter(c => UUIDsEqual(c.ParentID, this.selectedCategory.ID)).length;
542
545
  }
543
546
  createCategory() {
544
547
  this.editingCategory = null;
@@ -564,7 +567,7 @@ let ListsCategoriesResource = class ListsCategoriesResource extends BaseResource
564
567
  this.categoryToDelete = this.selectedCategory;
565
568
  const categoryName = this.categoryToDelete.Name;
566
569
  const listsInCategory = this.listsByCategoryId.get(this.categoryToDelete.ID) || [];
567
- const childCategories = this.categories.filter(c => c.ParentID === this.categoryToDelete.ID);
570
+ const childCategories = this.categories.filter(c => UUIDsEqual(c.ParentID, this.categoryToDelete.ID));
568
571
  let message = `Are you sure you want to delete "${categoryName}"?`;
569
572
  if (listsInCategory.length > 0) {
570
573
  message += ` ${listsInCategory.length} list(s) will be uncategorized.`;
@@ -851,7 +854,7 @@ export { ListsCategoriesResource };
851
854
  <div class="category-node" [style.padding-left.px]="vm.depth * 20">
852
855
  <div
853
856
  class="node-content"
854
- [class.selected]="selectedCategory?.ID === vm.category.ID"
857
+ [class.selected]="IsCategorySelected(vm.category)"
855
858
  (click)="selectCategory(vm.category)"
856
859
  (keydown.enter)="selectCategory(vm.category)"
857
860
  (keydown.space)="selectCategory(vm.category); $event.preventDefault()"
@@ -860,7 +863,7 @@ export { ListsCategoriesResource };
860
863
  tabindex="0"
861
864
  role="treeitem"
862
865
  [attr.aria-expanded]="hasChildren(vm.category) ? vm.isExpanded : null"
863
- [attr.aria-selected]="selectedCategory?.ID === vm.category.ID"
866
+ [attr.aria-selected]="IsCategorySelected(vm.category)"
864
867
  [attr.aria-label]="vm.category.Name + ' - ' + vm.listCount + ' lists'">
865
868
  @if (hasChildren(vm.category)) {
866
869
  <button
@@ -1 +1 @@
1
- {"version":3,"file":"lists-categories-resource.component.js","sourceRoot":"","sources":["../../../src/Lists/components/lists-categories-resource.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, ViewEncapsulation, ChangeDetectorRef, OnDestroy } from '@angular/core';\nimport { RegisterClass } from '@memberjunction/global';\nimport { BaseResourceComponent } from '@memberjunction/ng-shared';\nimport { ResourceData, MJListCategoryEntity, MJListEntity } from '@memberjunction/core-entities';\nimport { Metadata, RunView } from '@memberjunction/core';\nimport { Subject } from 'rxjs';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\ninterface CategoryViewModel {\n category: MJListCategoryEntity;\n listCount: number;\n childCount: number;\n depth: number;\n isExpanded: boolean;\n}\n\n@RegisterClass(BaseResourceComponent, 'ListsCategoriesResource')\n@Component({\n standalone: false,\n selector: 'mj-lists-categories-resource',\n template: `\n <div class=\"lists-categories-container\">\n <!-- Header -->\n <div class=\"categories-header\">\n <div class=\"header-title\">\n <i class=\"fa-solid fa-tags\"></i>\n <h2>List Categories</h2>\n </div>\n <div class=\"header-actions\">\n <button class=\"btn-create\" (click)=\"createCategory()\">\n <i class=\"fa-solid fa-plus\"></i>\n <span>New Category</span>\n </button>\n </div>\n </div>\n \n <!-- Loading State -->\n @if (isLoading) {\n <div class=\"loading-container\">\n <mj-loading text=\"Loading categories...\" size=\"medium\"></mj-loading>\n </div>\n }\n \n <!-- Empty State -->\n @if (!isLoading && categoryViewModels.length === 0) {\n <div class=\"empty-state\">\n <div class=\"empty-state-icon-wrapper\">\n <div class=\"icon-bg\"></div>\n <i class=\"fa-solid fa-folder-tree\"></i>\n </div>\n <h3>No Categories Yet</h3>\n <p>Categories help you organize lists into logical groups.</p>\n <div class=\"empty-state-features\">\n <div class=\"feature-item\">\n <i class=\"fa-solid fa-check-circle\"></i>\n <span>Create hierarchical folder structures</span>\n </div>\n <div class=\"feature-item\">\n <i class=\"fa-solid fa-check-circle\"></i>\n <span>Quickly find related lists</span>\n </div>\n </div>\n <button class=\"btn-create-large\" (click)=\"createCategory()\">\n <i class=\"fa-solid fa-plus\"></i>\n Create Your First Category\n </button>\n </div>\n }\n \n <!-- Categories Content -->\n @if (!isLoading && categoryViewModels.length > 0) {\n <div class=\"categories-content\">\n <div class=\"categories-layout\">\n <!-- Category Tree -->\n <div class=\"category-tree-panel\">\n <div class=\"panel-header\">\n <h3>Categories</h3>\n <span class=\"count-badge\">{{categories.length}}</span>\n </div>\n <div class=\"tree-content\" role=\"tree\" aria-label=\"Category tree\">\n @for (vm of getTopLevelCategories(); track vm) {\n <ng-container *ngTemplateOutlet=\"categoryNodeTemplate; context: { vm: vm }\"></ng-container>\n }\n </div>\n </div>\n <!-- Category Details -->\n @if (selectedCategory) {\n <div class=\"category-detail-panel\">\n <div class=\"panel-header\">\n <h3>Category Details</h3>\n <div class=\"panel-actions\">\n <button class=\"icon-btn\" (click)=\"editCategory()\" title=\"Edit\">\n <i class=\"fa-solid fa-pen\"></i>\n </button>\n <button class=\"icon-btn danger\" (click)=\"deleteCategory()\" title=\"Delete\">\n <i class=\"fa-solid fa-trash\"></i>\n </button>\n </div>\n </div>\n <div class=\"detail-content\">\n <div class=\"detail-field\">\n <label>Name</label>\n <span class=\"field-value\">{{selectedCategory.Name}}</span>\n </div>\n @if (selectedCategory.Description) {\n <div class=\"detail-field\">\n <label>Description</label>\n <span class=\"field-value\">{{selectedCategory.Description}}</span>\n </div>\n }\n <div class=\"detail-field\">\n <label>Parent Category</label>\n <span class=\"field-value\">\n {{getParentCategoryName(selectedCategory) || '(Top Level)'}}\n </span>\n </div>\n <div class=\"detail-stats\">\n <div class=\"stat-item\">\n <span class=\"stat-value\">{{getSelectedCategoryListCount()}}</span>\n <span class=\"stat-label\">Lists</span>\n </div>\n <div class=\"stat-item\">\n <span class=\"stat-value\">{{getSelectedCategoryChildCount()}}</span>\n <span class=\"stat-label\">Subcategories</span>\n </div>\n </div>\n <!-- Lists in this category -->\n @if (selectedCategoryLists.length > 0) {\n <div class=\"category-lists\">\n <h4>Lists in this category</h4>\n <div class=\"mini-list\">\n @for (list of selectedCategoryLists; track list) {\n <div class=\"mini-list-item\">\n <i class=\"fa-solid fa-list\"></i>\n <span>{{list.Name}}</span>\n </div>\n }\n </div>\n </div>\n }\n </div>\n </div>\n }\n <!-- No Selection State -->\n @if (!selectedCategory) {\n <div class=\"category-detail-panel empty\">\n <div class=\"no-selection\">\n <i class=\"fa-solid fa-arrow-left\"></i>\n <p>Select a category to view details</p>\n </div>\n </div>\n }\n </div>\n </div>\n }\n \n <!-- Category Node Template -->\n <ng-template #categoryNodeTemplate let-vm=\"vm\">\n <div class=\"category-node\" [style.padding-left.px]=\"vm.depth * 20\">\n <div\n class=\"node-content\"\n [class.selected]=\"selectedCategory?.ID === vm.category.ID\"\n (click)=\"selectCategory(vm.category)\"\n (keydown.enter)=\"selectCategory(vm.category)\"\n (keydown.space)=\"selectCategory(vm.category); $event.preventDefault()\"\n (keydown.arrowRight)=\"expandNode($event, vm)\"\n (keydown.arrowLeft)=\"collapseNode($event, vm)\"\n tabindex=\"0\"\n role=\"treeitem\"\n [attr.aria-expanded]=\"hasChildren(vm.category) ? vm.isExpanded : null\"\n [attr.aria-selected]=\"selectedCategory?.ID === vm.category.ID\"\n [attr.aria-label]=\"vm.category.Name + ' - ' + vm.listCount + ' lists'\">\n @if (hasChildren(vm.category)) {\n <button\n class=\"expand-btn\"\n (click)=\"toggleExpand($event, vm)\"\n tabindex=\"-1\"\n aria-hidden=\"true\">\n <i [class]=\"vm.isExpanded ? 'fa-solid fa-chevron-down' : 'fa-solid fa-chevron-right'\"></i>\n </button>\n }\n @if (!hasChildren(vm.category)) {\n <span class=\"expand-placeholder\"></span>\n }\n <i class=\"fa-solid fa-folder\" [class.fa-folder-open]=\"vm.isExpanded\" aria-hidden=\"true\"></i>\n <span class=\"node-name\">{{vm.category.Name}}</span>\n <span class=\"node-count\" aria-hidden=\"true\">{{vm.listCount}}</span>\n </div>\n @if (vm.isExpanded && hasChildren(vm.category)) {\n <div class=\"node-children\" role=\"group\">\n @for (childVm of getChildCategories(vm.category); track childVm) {\n <ng-container *ngTemplateOutlet=\"categoryNodeTemplate; context: { vm: childVm }\"></ng-container>\n }\n </div>\n }\n </div>\n </ng-template>\n \n <!-- Create/Edit Dialog -->\n @if (showDialog) {\n <div class=\"modal-overlay\" (click)=\"closeDialog()\">\n <div class=\"modal-dialog\" (click)=\"$event.stopPropagation()\">\n <div class=\"modal-header\">\n <h3>{{editingCategory ? 'Edit Category' : 'Create Category'}}</h3>\n <button class=\"modal-close\" (click)=\"closeDialog()\" [disabled]=\"isSaving\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <div class=\"modal-body\">\n <div class=\"category-form\">\n <div class=\"form-group\">\n <label>Name *</label>\n <input\n type=\"text\"\n [(ngModel)]=\"dialogName\"\n placeholder=\"Enter category name\"\n class=\"form-input\" />\n </div>\n <div class=\"form-group\">\n <label>Description</label>\n <textarea\n [(ngModel)]=\"dialogDescription\"\n placeholder=\"Optional description\"\n class=\"form-input\"\n rows=\"3\"></textarea>\n </div>\n <div class=\"form-group\">\n <label>Parent Category</label>\n <select\n [(ngModel)]=\"dialogParentId\"\n class=\"form-input\">\n @for (parent of availableParents; track parent) {\n <option [ngValue]=\"parent.ID\">{{parent.displayName}}</option>\n }\n </select>\n </div>\n </div>\n </div>\n <div class=\"modal-footer\">\n <button\n class=\"btn-primary\"\n (click)=\"saveCategory()\"\n [disabled]=\"!dialogName || isSaving\">\n @if (isSaving) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n }\n {{isSaving ? 'Saving...' : (editingCategory ? 'Save' : 'Create')}}\n </button>\n <button class=\"btn-secondary\" (click)=\"closeDialog()\" [disabled]=\"isSaving\">Cancel</button>\n </div>\n </div>\n </div>\n }\n \n <!-- Delete Confirmation Dialog -->\n @if (showDeleteConfirm) {\n <div class=\"modal-overlay\" (click)=\"cancelDelete()\">\n <div class=\"modal-dialog modal-sm\" (click)=\"$event.stopPropagation()\">\n <div class=\"modal-header danger\">\n <h3>Delete Category</h3>\n <button class=\"modal-close\" (click)=\"cancelDelete()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <div class=\"modal-body\">\n <p>{{deleteConfirmMessage}}</p>\n </div>\n <div class=\"modal-footer\">\n <button class=\"btn-danger\" (click)=\"confirmDelete()\">\n Delete\n </button>\n <button class=\"btn-secondary\" (click)=\"cancelDelete()\">Cancel</button>\n </div>\n </div>\n </div>\n }\n </div>\n `,\n styles: [`\n :host {\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n }\n\n .lists-categories-container {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: #f5f7fa;\n overflow: hidden;\n }\n\n /* Header */\n .categories-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 16px 24px;\n background: white;\n border-bottom: 1px solid #e0e0e0;\n flex-shrink: 0;\n }\n\n .header-title {\n display: flex;\n align-items: center;\n gap: 12px;\n }\n\n .header-title i {\n font-size: 24px;\n color: #2196F3;\n }\n\n .header-title h2 {\n margin: 0;\n font-size: 20px;\n font-weight: 600;\n color: #333;\n }\n\n .btn-create {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 16px;\n background: #2196F3;\n color: white;\n border: none;\n border-radius: 6px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.2s;\n }\n\n .btn-create:hover {\n background: #1976D2;\n }\n\n /* Loading */\n .loading-container {\n display: flex;\n align-items: center;\n justify-content: center;\n flex: 1;\n }\n\n /* Empty State */\n .empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n flex: 1;\n padding: 48px 40px;\n text-align: center;\n max-width: 420px;\n margin: 0 auto;\n }\n\n .empty-state-icon-wrapper {\n position: relative;\n margin-bottom: 24px;\n }\n\n .empty-state-icon-wrapper .icon-bg {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: 100px;\n height: 100px;\n border-radius: 50%;\n background: linear-gradient(135deg, rgba(33, 150, 243, 0.1) 0%, rgba(33, 150, 243, 0.05) 100%);\n }\n\n .empty-state-icon-wrapper > i {\n position: relative;\n font-size: 48px;\n color: #2196F3;\n z-index: 1;\n }\n\n .empty-state h3 {\n margin: 0 0 12px;\n font-size: 22px;\n font-weight: 600;\n color: #333;\n }\n\n .empty-state p {\n margin: 0 0 8px;\n color: #666;\n font-size: 15px;\n line-height: 1.5;\n }\n\n .empty-state-features {\n display: flex;\n flex-direction: column;\n gap: 8px;\n margin: 16px 0 24px;\n text-align: left;\n }\n\n .feature-item {\n display: flex;\n align-items: center;\n gap: 10px;\n font-size: 14px;\n color: #555;\n }\n\n .feature-item i {\n font-size: 14px !important;\n color: #4CAF50 !important;\n }\n\n .btn-create-large {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 14px 28px;\n background: linear-gradient(135deg, #2196F3 0%, #1976D2 100%);\n color: white;\n border: none;\n border-radius: 8px;\n font-size: 15px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s;\n box-shadow: 0 2px 8px rgba(33, 150, 243, 0.3);\n }\n\n .btn-create-large:hover {\n background: linear-gradient(135deg, #1976D2 0%, #1565C0 100%);\n transform: translateY(-1px);\n box-shadow: 0 4px 12px rgba(33, 150, 243, 0.4);\n }\n\n /* Content Layout */\n .categories-content {\n flex: 1;\n padding: 16px 24px;\n overflow: hidden;\n }\n\n .categories-layout {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 16px;\n height: 100%;\n }\n\n .category-tree-panel,\n .category-detail-panel {\n background: white;\n border-radius: 8px;\n box-shadow: 0 1px 3px rgba(0,0,0,0.08);\n display: flex;\n flex-direction: column;\n overflow: hidden;\n }\n\n .panel-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 12px 16px;\n border-bottom: 1px solid #e0e0e0;\n background: #fafafa;\n }\n\n .panel-header h3 {\n margin: 0;\n font-size: 14px;\n font-weight: 600;\n color: #333;\n }\n\n .count-badge {\n font-size: 12px;\n color: #999;\n background: #f0f0f0;\n padding: 2px 8px;\n border-radius: 10px;\n }\n\n .panel-actions {\n display: flex;\n gap: 4px;\n }\n\n .icon-btn {\n background: none;\n border: none;\n padding: 6px 8px;\n color: #666;\n cursor: pointer;\n border-radius: 4px;\n transition: all 0.15s;\n }\n\n .icon-btn:hover {\n background: #f0f0f0;\n color: #333;\n }\n\n .icon-btn.danger:hover {\n background: #ffebee;\n color: #d32f2f;\n }\n\n /* Tree Content */\n .tree-content {\n flex: 1;\n overflow-y: auto;\n padding: 8px 0;\n }\n\n .category-node {\n user-select: none;\n }\n\n .node-content {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n cursor: pointer;\n transition: background 0.15s;\n }\n\n .node-content:hover {\n background: #f5f5f5;\n }\n\n .node-content:focus {\n outline: none;\n background: #e8f4fd;\n }\n\n .node-content:focus-visible {\n outline: 2px solid #2196F3;\n outline-offset: -2px;\n background: #e8f4fd;\n }\n\n .node-content.selected {\n background: #e3f2fd;\n }\n\n .node-content.selected:focus-visible {\n outline: 2px solid #1976D2;\n }\n\n .expand-btn {\n background: none;\n border: none;\n padding: 2px;\n color: #999;\n cursor: pointer;\n width: 20px;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .expand-btn:hover {\n color: #666;\n }\n\n .expand-placeholder {\n width: 20px;\n }\n\n .node-content .fa-folder,\n .node-content .fa-folder-open {\n color: #ffc107;\n }\n\n .node-name {\n flex: 1;\n font-size: 14px;\n color: #333;\n }\n\n .node-count {\n font-size: 12px;\n color: #999;\n background: #f0f0f0;\n padding: 1px 6px;\n border-radius: 8px;\n }\n\n /* Detail Panel */\n .detail-content {\n flex: 1;\n padding: 16px;\n overflow-y: auto;\n }\n\n .detail-field {\n margin-bottom: 16px;\n }\n\n .detail-field label {\n display: block;\n font-size: 12px;\n font-weight: 500;\n color: #999;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n margin-bottom: 4px;\n }\n\n .field-value {\n font-size: 14px;\n color: #333;\n }\n\n .detail-stats {\n display: flex;\n gap: 24px;\n margin: 24px 0;\n padding: 16px;\n background: #f5f7fa;\n border-radius: 8px;\n }\n\n .stat-item {\n display: flex;\n flex-direction: column;\n align-items: center;\n }\n\n .stat-value {\n font-size: 24px;\n font-weight: 600;\n color: #2196F3;\n }\n\n .stat-label {\n font-size: 12px;\n color: #999;\n }\n\n .category-lists h4 {\n margin: 0 0 12px;\n font-size: 13px;\n font-weight: 600;\n color: #666;\n }\n\n .mini-list {\n display: flex;\n flex-direction: column;\n gap: 4px;\n }\n\n .mini-list-item {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n background: #f5f7fa;\n border-radius: 4px;\n font-size: 13px;\n color: #333;\n }\n\n .mini-list-item i {\n color: #999;\n }\n\n /* No Selection */\n .category-detail-panel.empty {\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .no-selection {\n text-align: center;\n color: #999;\n }\n\n .no-selection i {\n font-size: 32px;\n margin-bottom: 12px;\n }\n\n .no-selection p {\n margin: 0;\n }\n\n /* Form */\n .category-form {\n display: flex;\n flex-direction: column;\n gap: 16px;\n }\n\n .form-group {\n display: flex;\n flex-direction: column;\n gap: 6px;\n }\n\n .form-group label {\n font-size: 13px;\n font-weight: 500;\n color: #666;\n }\n\n .form-input {\n padding: 8px 12px;\n border: 1px solid #ddd;\n border-radius: 4px;\n font-size: 14px;\n }\n\n .form-input:focus {\n outline: none;\n border-color: #2196F3;\n }\n\n /* Modal Styles */\n .modal-overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.5);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 10000;\n animation: fadeIn 0.15s ease-out;\n }\n\n @keyframes fadeIn {\n from { opacity: 0; }\n to { opacity: 1; }\n }\n\n .modal-dialog {\n background: white;\n border-radius: 8px;\n box-shadow: 0 8px 32px rgba(0, 0, 0, 0.2);\n width: 450px;\n max-width: 90vw;\n max-height: 90vh;\n display: flex;\n flex-direction: column;\n animation: slideIn 0.2s ease-out;\n }\n\n .modal-dialog.modal-sm {\n width: 400px;\n }\n\n @keyframes slideIn {\n from { transform: translateY(-20px); opacity: 0; }\n to { transform: translateY(0); opacity: 1; }\n }\n\n .modal-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 16px 20px;\n border-bottom: 1px solid #e0e0e0;\n }\n\n .modal-header.danger {\n background: #ffebee;\n border-bottom-color: #ffcdd2;\n }\n\n .modal-header.danger h3 {\n color: #c62828;\n }\n\n .modal-header h3 {\n margin: 0;\n font-size: 18px;\n font-weight: 600;\n color: #333;\n }\n\n .modal-close {\n background: none;\n border: none;\n padding: 4px 8px;\n color: #999;\n cursor: pointer;\n border-radius: 4px;\n transition: all 0.15s;\n }\n\n .modal-close:hover:not(:disabled) {\n background: #f0f0f0;\n color: #333;\n }\n\n .modal-close:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n\n .modal-body {\n padding: 20px;\n overflow-y: auto;\n }\n\n .modal-body p {\n margin: 0;\n color: #666;\n line-height: 1.6;\n }\n\n .modal-footer {\n display: flex;\n justify-content: flex-end;\n gap: 12px;\n padding: 16px 20px;\n border-top: 1px solid #e0e0e0;\n background: #fafafa;\n }\n\n .btn-secondary {\n padding: 8px 16px;\n background: white;\n border: 1px solid #ddd;\n border-radius: 6px;\n color: #666;\n font-size: 14px;\n cursor: pointer;\n transition: all 0.15s;\n }\n\n .btn-secondary:hover:not(:disabled) {\n background: #f5f5f5;\n border-color: #ccc;\n }\n\n .btn-secondary:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n\n .btn-primary {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 16px;\n background: #2196F3;\n border: none;\n border-radius: 6px;\n color: white;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s;\n }\n\n .btn-primary:hover:not(:disabled) {\n background: #1976D2;\n }\n\n .btn-primary:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n\n .btn-danger {\n padding: 8px 16px;\n background: #d32f2f;\n border: none;\n border-radius: 6px;\n color: white;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s;\n }\n\n .btn-danger:hover {\n background: #c62828;\n }\n\n /* Responsive */\n @media (max-width: 768px) {\n .categories-layout {\n grid-template-columns: 1fr;\n }\n\n .category-detail-panel.empty {\n display: none;\n }\n\n .modal-dialog {\n width: 95vw;\n }\n }\n `],\n encapsulation: ViewEncapsulation.None\n})\nexport class ListsCategoriesResource extends BaseResourceComponent implements OnDestroy {\n private destroy$ = new Subject<void>();\n\n isLoading = true;\n categories: MJListCategoryEntity[] = [];\n categoryViewModels: CategoryViewModel[] = [];\n selectedCategory: MJListCategoryEntity | null = null;\n selectedCategoryLists: MJListEntity[] = [];\n\n // Dialog\n showDialog = false;\n editingCategory: MJListCategoryEntity | null = null;\n dialogName = '';\n dialogDescription = '';\n dialogParentId: string | null = null;\n availableParents: Array<{ ID: string | null; displayName: string }> = [];\n\n // Operation states\n isSaving = false;\n\n // Delete confirmation dialog\n showDeleteConfirm = false;\n deleteConfirmMessage = '';\n private categoryToDelete: MJListCategoryEntity | null = null;\n\n private listsByCategoryId: Map<string, MJListEntity[]> = new Map();\n private categoryMap: Map<string, MJListCategoryEntity> = new Map();\n\n constructor(\n private cdr: ChangeDetectorRef,\n private notificationService: MJNotificationService\n ) {\n super();\n }\n\n async ngOnInit() {\n await this.loadData();\n this.NotifyLoadComplete();\n }\n\n ngOnDestroy() {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n async loadData() {\n this.isLoading = true;\n\n try {\n const md = new Metadata();\n const rv = new RunView();\n const userId = md.CurrentUser?.ID;\n\n const [categoriesResult, listsResult] = await rv.RunViews([\n {\n EntityName: 'MJ: List Categories',\n OrderBy: 'Name',\n ResultType: 'entity_object',\n CacheLocal: true // Categories rarely change, cache for performance\n },\n {\n EntityName: 'MJ: Lists',\n ExtraFilter: userId ? `UserID = '${userId}'` : '',\n ResultType: 'entity_object'\n }\n ]);\n\n if (!categoriesResult.Success) {\n console.error('Failed to load categories');\n return;\n }\n\n this.categories = categoriesResult.Results as MJListCategoryEntity[];\n const lists = listsResult.Results as MJListEntity[];\n\n // Build category map\n this.categoryMap.clear();\n for (const cat of this.categories) {\n this.categoryMap.set(cat.ID, cat);\n }\n\n // Group lists by category\n this.listsByCategoryId.clear();\n for (const list of lists) {\n if (list.CategoryID) {\n const existing = this.listsByCategoryId.get(list.CategoryID) || [];\n existing.push(list);\n this.listsByCategoryId.set(list.CategoryID, existing);\n }\n }\n\n // Build view models\n this.buildCategoryViewModels();\n this.buildAvailableParents();\n } catch (error) {\n console.error('Error loading categories:', error);\n } finally {\n this.isLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n private buildCategoryViewModels() {\n this.categoryViewModels = [];\n\n const buildVm = (category: MJListCategoryEntity, depth: number): CategoryViewModel => {\n const lists = this.listsByCategoryId.get(category.ID) || [];\n const children = this.categories.filter(c => c.ParentID === category.ID);\n\n return {\n category,\n listCount: lists.length,\n childCount: children.length,\n depth,\n isExpanded: true\n };\n };\n\n const processCategory = (category: MJListCategoryEntity, depth: number) => {\n this.categoryViewModels.push(buildVm(category, depth));\n const children = this.categories.filter(c => c.ParentID === category.ID);\n for (const child of children) {\n processCategory(child, depth + 1);\n }\n };\n\n const topLevel = this.categories.filter(c => !c.ParentID);\n for (const cat of topLevel) {\n processCategory(cat, 0);\n }\n }\n\n private buildAvailableParents() {\n this.availableParents = [{ ID: null, displayName: '(Top Level)' }];\n\n const addCategory = (cat: MJListCategoryEntity, prefix: string) => {\n // Exclude the editing category and its descendants\n if (this.editingCategory && this.isDescendantOf(cat, this.editingCategory)) {\n return;\n }\n this.availableParents.push({ ID: cat.ID, displayName: prefix + cat.Name });\n const children = this.categories.filter(c => c.ParentID === cat.ID);\n for (const child of children) {\n addCategory(child, prefix + '\\u00A0\\u00A0');\n }\n };\n\n const topLevel = this.categories.filter(c => !c.ParentID);\n for (const cat of topLevel) {\n if (this.editingCategory?.ID !== cat.ID) {\n addCategory(cat, '');\n }\n }\n }\n\n private isDescendantOf(category: MJListCategoryEntity, ancestor: MJListCategoryEntity): boolean {\n if (category.ID === ancestor.ID) return true;\n if (!category.ParentID) return false;\n const parent = this.categoryMap.get(category.ParentID);\n return parent ? this.isDescendantOf(parent, ancestor) : false;\n }\n\n getTopLevelCategories(): CategoryViewModel[] {\n return this.categoryViewModels.filter(vm => !vm.category.ParentID);\n }\n\n getChildCategories(parent: MJListCategoryEntity): CategoryViewModel[] {\n return this.categoryViewModels.filter(vm => vm.category.ParentID === parent.ID);\n }\n\n hasChildren(category: MJListCategoryEntity): boolean {\n return this.categories.some(c => c.ParentID === category.ID);\n }\n\n toggleExpand(event: Event, vm: CategoryViewModel) {\n event.stopPropagation();\n vm.isExpanded = !vm.isExpanded;\n }\n\n expandNode(event: Event, vm: CategoryViewModel) {\n event.preventDefault();\n if (this.hasChildren(vm.category) && !vm.isExpanded) {\n vm.isExpanded = true;\n }\n }\n\n collapseNode(event: Event, vm: CategoryViewModel) {\n event.preventDefault();\n if (vm.isExpanded) {\n vm.isExpanded = false;\n }\n }\n\n selectCategory(category: MJListCategoryEntity) {\n this.selectedCategory = category;\n this.selectedCategoryLists = this.listsByCategoryId.get(category.ID) || [];\n }\n\n getParentCategoryName(category: MJListCategoryEntity): string | null {\n if (!category.ParentID) return null;\n return this.categoryMap.get(category.ParentID)?.Name || null;\n }\n\n getSelectedCategoryListCount(): number {\n if (!this.selectedCategory) return 0;\n return this.listsByCategoryId.get(this.selectedCategory.ID)?.length || 0;\n }\n\n getSelectedCategoryChildCount(): number {\n if (!this.selectedCategory) return 0;\n return this.categories.filter(c => c.ParentID === this.selectedCategory!.ID).length;\n }\n\n createCategory() {\n this.editingCategory = null;\n this.dialogName = '';\n this.dialogDescription = '';\n this.dialogParentId = null;\n this.buildAvailableParents();\n this.showDialog = true;\n }\n\n editCategory() {\n if (!this.selectedCategory) return;\n this.editingCategory = this.selectedCategory;\n this.dialogName = this.selectedCategory.Name;\n this.dialogDescription = this.selectedCategory.Description || '';\n this.dialogParentId = this.selectedCategory.ParentID || null;\n this.buildAvailableParents();\n this.showDialog = true;\n }\n\n deleteCategory() {\n if (!this.selectedCategory) return;\n\n this.categoryToDelete = this.selectedCategory;\n const categoryName = this.categoryToDelete.Name;\n const listsInCategory = this.listsByCategoryId.get(this.categoryToDelete.ID) || [];\n const childCategories = this.categories.filter(c => c.ParentID === this.categoryToDelete!.ID);\n\n let message = `Are you sure you want to delete \"${categoryName}\"?`;\n if (listsInCategory.length > 0) {\n message += ` ${listsInCategory.length} list(s) will be uncategorized.`;\n }\n if (childCategories.length > 0) {\n message += ` ${childCategories.length} subcategory(ies) will become top-level.`;\n }\n\n this.deleteConfirmMessage = message;\n this.showDeleteConfirm = true;\n }\n\n cancelDelete() {\n this.showDeleteConfirm = false;\n this.categoryToDelete = null;\n this.deleteConfirmMessage = '';\n }\n\n async confirmDelete() {\n if (!this.categoryToDelete) return;\n\n const categoryName = this.categoryToDelete.Name;\n const categoryToDelete = this.categoryToDelete;\n this.showDeleteConfirm = false;\n this.isLoading = true;\n this.cdr.detectChanges();\n\n try {\n const deleted = await categoryToDelete.Delete();\n if (deleted) {\n this.notificationService.CreateSimpleNotification(`\"${categoryName}\" deleted`, 'success', 3000);\n } else {\n // Get the detailed error message from LatestResult\n const errorMessage = categoryToDelete.LatestResult?.Message || 'Unknown error occurred';\n console.error('Failed to delete category:', categoryToDelete.LatestResult);\n this.notificationService.CreateSimpleNotification(`Failed to delete category: ${errorMessage}`, 'error', 6000);\n }\n this.selectedCategory = null;\n this.categoryToDelete = null;\n await this.loadData();\n } catch (error) {\n console.error('Error deleting category:', error);\n const errorMessage = error instanceof Error ? error.message : String(error);\n this.notificationService.CreateSimpleNotification(`Error deleting category: ${errorMessage}`, 'error', 6000);\n } finally {\n this.isLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n closeDialog() {\n this.showDialog = false;\n this.editingCategory = null;\n }\n\n async saveCategory() {\n this.isSaving = true;\n this.cdr.detectChanges();\n\n const isEditing = !!this.editingCategory;\n const categoryName = this.dialogName;\n\n try {\n const md = new Metadata();\n let category: MJListCategoryEntity;\n\n if (this.editingCategory) {\n category = this.editingCategory;\n } else {\n category = await md.GetEntityObject<MJListCategoryEntity>('MJ: List Categories');\n category.UserID = md.CurrentUser!.ID;\n }\n\n category.Name = this.dialogName;\n category.Description = this.dialogDescription || null;\n category.ParentID = this.dialogParentId || null;\n\n const saved = await category.Save();\n if (saved) {\n this.notificationService.CreateSimpleNotification(\n isEditing ? `\"${categoryName}\" updated` : `\"${categoryName}\" created`,\n 'success',\n 3000\n );\n this.closeDialog();\n await this.loadData();\n\n // Re-select the saved category\n if (isEditing) {\n this.selectedCategory = category;\n this.selectedCategoryLists = this.listsByCategoryId.get(category.ID) || [];\n }\n } else {\n // Get the detailed error message from LatestResult\n const errorMessage = category.LatestResult?.Message || 'Unknown error occurred';\n const action = isEditing ? 'update' : 'create';\n console.error(`Failed to ${action} category:`, category.LatestResult);\n this.notificationService.CreateSimpleNotification(\n `Failed to ${action} category: ${errorMessage}`,\n 'error',\n 6000\n );\n }\n } catch (error) {\n console.error('Error saving category:', error);\n const errorMessage = error instanceof Error ? error.message : String(error);\n this.notificationService.CreateSimpleNotification(`Error saving category: ${errorMessage}`, 'error', 6000);\n } finally {\n this.isSaving = false;\n this.cdr.detectChanges();\n }\n }\n\n async GetResourceDisplayName(data: ResourceData): Promise<string> {\n return 'Categories';\n }\n\n async GetResourceIconClass(data: ResourceData): Promise<string> {\n return 'fa-solid fa-tags';\n }\n}\n"]}
1
+ {"version":3,"file":"lists-categories-resource.component.js","sourceRoot":"","sources":["../../../src/Lists/components/lists-categories-resource.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, ViewEncapsulation, ChangeDetectorRef, OnDestroy } from '@angular/core';\nimport { RegisterClass , UUIDsEqual } from '@memberjunction/global';\nimport { BaseResourceComponent } from '@memberjunction/ng-shared';\nimport { ResourceData, MJListCategoryEntity, MJListEntity } from '@memberjunction/core-entities';\nimport { Metadata, RunView } from '@memberjunction/core';\nimport { Subject } from 'rxjs';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\ninterface CategoryViewModel {\n category: MJListCategoryEntity;\n listCount: number;\n childCount: number;\n depth: number;\n isExpanded: boolean;\n}\n\n@RegisterClass(BaseResourceComponent, 'ListsCategoriesResource')\n@Component({\n standalone: false,\n selector: 'mj-lists-categories-resource',\n template: `\n <div class=\"lists-categories-container\">\n <!-- Header -->\n <div class=\"categories-header\">\n <div class=\"header-title\">\n <i class=\"fa-solid fa-tags\"></i>\n <h2>List Categories</h2>\n </div>\n <div class=\"header-actions\">\n <button class=\"btn-create\" (click)=\"createCategory()\">\n <i class=\"fa-solid fa-plus\"></i>\n <span>New Category</span>\n </button>\n </div>\n </div>\n \n <!-- Loading State -->\n @if (isLoading) {\n <div class=\"loading-container\">\n <mj-loading text=\"Loading categories...\" size=\"medium\"></mj-loading>\n </div>\n }\n \n <!-- Empty State -->\n @if (!isLoading && categoryViewModels.length === 0) {\n <div class=\"empty-state\">\n <div class=\"empty-state-icon-wrapper\">\n <div class=\"icon-bg\"></div>\n <i class=\"fa-solid fa-folder-tree\"></i>\n </div>\n <h3>No Categories Yet</h3>\n <p>Categories help you organize lists into logical groups.</p>\n <div class=\"empty-state-features\">\n <div class=\"feature-item\">\n <i class=\"fa-solid fa-check-circle\"></i>\n <span>Create hierarchical folder structures</span>\n </div>\n <div class=\"feature-item\">\n <i class=\"fa-solid fa-check-circle\"></i>\n <span>Quickly find related lists</span>\n </div>\n </div>\n <button class=\"btn-create-large\" (click)=\"createCategory()\">\n <i class=\"fa-solid fa-plus\"></i>\n Create Your First Category\n </button>\n </div>\n }\n \n <!-- Categories Content -->\n @if (!isLoading && categoryViewModels.length > 0) {\n <div class=\"categories-content\">\n <div class=\"categories-layout\">\n <!-- Category Tree -->\n <div class=\"category-tree-panel\">\n <div class=\"panel-header\">\n <h3>Categories</h3>\n <span class=\"count-badge\">{{categories.length}}</span>\n </div>\n <div class=\"tree-content\" role=\"tree\" aria-label=\"Category tree\">\n @for (vm of getTopLevelCategories(); track vm) {\n <ng-container *ngTemplateOutlet=\"categoryNodeTemplate; context: { vm: vm }\"></ng-container>\n }\n </div>\n </div>\n <!-- Category Details -->\n @if (selectedCategory) {\n <div class=\"category-detail-panel\">\n <div class=\"panel-header\">\n <h3>Category Details</h3>\n <div class=\"panel-actions\">\n <button class=\"icon-btn\" (click)=\"editCategory()\" title=\"Edit\">\n <i class=\"fa-solid fa-pen\"></i>\n </button>\n <button class=\"icon-btn danger\" (click)=\"deleteCategory()\" title=\"Delete\">\n <i class=\"fa-solid fa-trash\"></i>\n </button>\n </div>\n </div>\n <div class=\"detail-content\">\n <div class=\"detail-field\">\n <label>Name</label>\n <span class=\"field-value\">{{selectedCategory.Name}}</span>\n </div>\n @if (selectedCategory.Description) {\n <div class=\"detail-field\">\n <label>Description</label>\n <span class=\"field-value\">{{selectedCategory.Description}}</span>\n </div>\n }\n <div class=\"detail-field\">\n <label>Parent Category</label>\n <span class=\"field-value\">\n {{getParentCategoryName(selectedCategory) || '(Top Level)'}}\n </span>\n </div>\n <div class=\"detail-stats\">\n <div class=\"stat-item\">\n <span class=\"stat-value\">{{getSelectedCategoryListCount()}}</span>\n <span class=\"stat-label\">Lists</span>\n </div>\n <div class=\"stat-item\">\n <span class=\"stat-value\">{{getSelectedCategoryChildCount()}}</span>\n <span class=\"stat-label\">Subcategories</span>\n </div>\n </div>\n <!-- Lists in this category -->\n @if (selectedCategoryLists.length > 0) {\n <div class=\"category-lists\">\n <h4>Lists in this category</h4>\n <div class=\"mini-list\">\n @for (list of selectedCategoryLists; track list) {\n <div class=\"mini-list-item\">\n <i class=\"fa-solid fa-list\"></i>\n <span>{{list.Name}}</span>\n </div>\n }\n </div>\n </div>\n }\n </div>\n </div>\n }\n <!-- No Selection State -->\n @if (!selectedCategory) {\n <div class=\"category-detail-panel empty\">\n <div class=\"no-selection\">\n <i class=\"fa-solid fa-arrow-left\"></i>\n <p>Select a category to view details</p>\n </div>\n </div>\n }\n </div>\n </div>\n }\n \n <!-- Category Node Template -->\n <ng-template #categoryNodeTemplate let-vm=\"vm\">\n <div class=\"category-node\" [style.padding-left.px]=\"vm.depth * 20\">\n <div\n class=\"node-content\"\n [class.selected]=\"IsCategorySelected(vm.category)\"\n (click)=\"selectCategory(vm.category)\"\n (keydown.enter)=\"selectCategory(vm.category)\"\n (keydown.space)=\"selectCategory(vm.category); $event.preventDefault()\"\n (keydown.arrowRight)=\"expandNode($event, vm)\"\n (keydown.arrowLeft)=\"collapseNode($event, vm)\"\n tabindex=\"0\"\n role=\"treeitem\"\n [attr.aria-expanded]=\"hasChildren(vm.category) ? vm.isExpanded : null\"\n [attr.aria-selected]=\"IsCategorySelected(vm.category)\"\n [attr.aria-label]=\"vm.category.Name + ' - ' + vm.listCount + ' lists'\">\n @if (hasChildren(vm.category)) {\n <button\n class=\"expand-btn\"\n (click)=\"toggleExpand($event, vm)\"\n tabindex=\"-1\"\n aria-hidden=\"true\">\n <i [class]=\"vm.isExpanded ? 'fa-solid fa-chevron-down' : 'fa-solid fa-chevron-right'\"></i>\n </button>\n }\n @if (!hasChildren(vm.category)) {\n <span class=\"expand-placeholder\"></span>\n }\n <i class=\"fa-solid fa-folder\" [class.fa-folder-open]=\"vm.isExpanded\" aria-hidden=\"true\"></i>\n <span class=\"node-name\">{{vm.category.Name}}</span>\n <span class=\"node-count\" aria-hidden=\"true\">{{vm.listCount}}</span>\n </div>\n @if (vm.isExpanded && hasChildren(vm.category)) {\n <div class=\"node-children\" role=\"group\">\n @for (childVm of getChildCategories(vm.category); track childVm) {\n <ng-container *ngTemplateOutlet=\"categoryNodeTemplate; context: { vm: childVm }\"></ng-container>\n }\n </div>\n }\n </div>\n </ng-template>\n \n <!-- Create/Edit Dialog -->\n @if (showDialog) {\n <div class=\"modal-overlay\" (click)=\"closeDialog()\">\n <div class=\"modal-dialog\" (click)=\"$event.stopPropagation()\">\n <div class=\"modal-header\">\n <h3>{{editingCategory ? 'Edit Category' : 'Create Category'}}</h3>\n <button class=\"modal-close\" (click)=\"closeDialog()\" [disabled]=\"isSaving\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <div class=\"modal-body\">\n <div class=\"category-form\">\n <div class=\"form-group\">\n <label>Name *</label>\n <input\n type=\"text\"\n [(ngModel)]=\"dialogName\"\n placeholder=\"Enter category name\"\n class=\"form-input\" />\n </div>\n <div class=\"form-group\">\n <label>Description</label>\n <textarea\n [(ngModel)]=\"dialogDescription\"\n placeholder=\"Optional description\"\n class=\"form-input\"\n rows=\"3\"></textarea>\n </div>\n <div class=\"form-group\">\n <label>Parent Category</label>\n <select\n [(ngModel)]=\"dialogParentId\"\n class=\"form-input\">\n @for (parent of availableParents; track parent) {\n <option [ngValue]=\"parent.ID\">{{parent.displayName}}</option>\n }\n </select>\n </div>\n </div>\n </div>\n <div class=\"modal-footer\">\n <button\n class=\"btn-primary\"\n (click)=\"saveCategory()\"\n [disabled]=\"!dialogName || isSaving\">\n @if (isSaving) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n }\n {{isSaving ? 'Saving...' : (editingCategory ? 'Save' : 'Create')}}\n </button>\n <button class=\"btn-secondary\" (click)=\"closeDialog()\" [disabled]=\"isSaving\">Cancel</button>\n </div>\n </div>\n </div>\n }\n \n <!-- Delete Confirmation Dialog -->\n @if (showDeleteConfirm) {\n <div class=\"modal-overlay\" (click)=\"cancelDelete()\">\n <div class=\"modal-dialog modal-sm\" (click)=\"$event.stopPropagation()\">\n <div class=\"modal-header danger\">\n <h3>Delete Category</h3>\n <button class=\"modal-close\" (click)=\"cancelDelete()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <div class=\"modal-body\">\n <p>{{deleteConfirmMessage}}</p>\n </div>\n <div class=\"modal-footer\">\n <button class=\"btn-danger\" (click)=\"confirmDelete()\">\n Delete\n </button>\n <button class=\"btn-secondary\" (click)=\"cancelDelete()\">Cancel</button>\n </div>\n </div>\n </div>\n }\n </div>\n `,\n styles: [`\n :host {\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n }\n\n .lists-categories-container {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: #f5f7fa;\n overflow: hidden;\n }\n\n /* Header */\n .categories-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 16px 24px;\n background: white;\n border-bottom: 1px solid #e0e0e0;\n flex-shrink: 0;\n }\n\n .header-title {\n display: flex;\n align-items: center;\n gap: 12px;\n }\n\n .header-title i {\n font-size: 24px;\n color: #2196F3;\n }\n\n .header-title h2 {\n margin: 0;\n font-size: 20px;\n font-weight: 600;\n color: #333;\n }\n\n .btn-create {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 16px;\n background: #2196F3;\n color: white;\n border: none;\n border-radius: 6px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.2s;\n }\n\n .btn-create:hover {\n background: #1976D2;\n }\n\n /* Loading */\n .loading-container {\n display: flex;\n align-items: center;\n justify-content: center;\n flex: 1;\n }\n\n /* Empty State */\n .empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n flex: 1;\n padding: 48px 40px;\n text-align: center;\n max-width: 420px;\n margin: 0 auto;\n }\n\n .empty-state-icon-wrapper {\n position: relative;\n margin-bottom: 24px;\n }\n\n .empty-state-icon-wrapper .icon-bg {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: 100px;\n height: 100px;\n border-radius: 50%;\n background: linear-gradient(135deg, rgba(33, 150, 243, 0.1) 0%, rgba(33, 150, 243, 0.05) 100%);\n }\n\n .empty-state-icon-wrapper > i {\n position: relative;\n font-size: 48px;\n color: #2196F3;\n z-index: 1;\n }\n\n .empty-state h3 {\n margin: 0 0 12px;\n font-size: 22px;\n font-weight: 600;\n color: #333;\n }\n\n .empty-state p {\n margin: 0 0 8px;\n color: #666;\n font-size: 15px;\n line-height: 1.5;\n }\n\n .empty-state-features {\n display: flex;\n flex-direction: column;\n gap: 8px;\n margin: 16px 0 24px;\n text-align: left;\n }\n\n .feature-item {\n display: flex;\n align-items: center;\n gap: 10px;\n font-size: 14px;\n color: #555;\n }\n\n .feature-item i {\n font-size: 14px !important;\n color: #4CAF50 !important;\n }\n\n .btn-create-large {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 14px 28px;\n background: linear-gradient(135deg, #2196F3 0%, #1976D2 100%);\n color: white;\n border: none;\n border-radius: 8px;\n font-size: 15px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s;\n box-shadow: 0 2px 8px rgba(33, 150, 243, 0.3);\n }\n\n .btn-create-large:hover {\n background: linear-gradient(135deg, #1976D2 0%, #1565C0 100%);\n transform: translateY(-1px);\n box-shadow: 0 4px 12px rgba(33, 150, 243, 0.4);\n }\n\n /* Content Layout */\n .categories-content {\n flex: 1;\n padding: 16px 24px;\n overflow: hidden;\n }\n\n .categories-layout {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 16px;\n height: 100%;\n }\n\n .category-tree-panel,\n .category-detail-panel {\n background: white;\n border-radius: 8px;\n box-shadow: 0 1px 3px rgba(0,0,0,0.08);\n display: flex;\n flex-direction: column;\n overflow: hidden;\n }\n\n .panel-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 12px 16px;\n border-bottom: 1px solid #e0e0e0;\n background: #fafafa;\n }\n\n .panel-header h3 {\n margin: 0;\n font-size: 14px;\n font-weight: 600;\n color: #333;\n }\n\n .count-badge {\n font-size: 12px;\n color: #999;\n background: #f0f0f0;\n padding: 2px 8px;\n border-radius: 10px;\n }\n\n .panel-actions {\n display: flex;\n gap: 4px;\n }\n\n .icon-btn {\n background: none;\n border: none;\n padding: 6px 8px;\n color: #666;\n cursor: pointer;\n border-radius: 4px;\n transition: all 0.15s;\n }\n\n .icon-btn:hover {\n background: #f0f0f0;\n color: #333;\n }\n\n .icon-btn.danger:hover {\n background: #ffebee;\n color: #d32f2f;\n }\n\n /* Tree Content */\n .tree-content {\n flex: 1;\n overflow-y: auto;\n padding: 8px 0;\n }\n\n .category-node {\n user-select: none;\n }\n\n .node-content {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n cursor: pointer;\n transition: background 0.15s;\n }\n\n .node-content:hover {\n background: #f5f5f5;\n }\n\n .node-content:focus {\n outline: none;\n background: #e8f4fd;\n }\n\n .node-content:focus-visible {\n outline: 2px solid #2196F3;\n outline-offset: -2px;\n background: #e8f4fd;\n }\n\n .node-content.selected {\n background: #e3f2fd;\n }\n\n .node-content.selected:focus-visible {\n outline: 2px solid #1976D2;\n }\n\n .expand-btn {\n background: none;\n border: none;\n padding: 2px;\n color: #999;\n cursor: pointer;\n width: 20px;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .expand-btn:hover {\n color: #666;\n }\n\n .expand-placeholder {\n width: 20px;\n }\n\n .node-content .fa-folder,\n .node-content .fa-folder-open {\n color: #ffc107;\n }\n\n .node-name {\n flex: 1;\n font-size: 14px;\n color: #333;\n }\n\n .node-count {\n font-size: 12px;\n color: #999;\n background: #f0f0f0;\n padding: 1px 6px;\n border-radius: 8px;\n }\n\n /* Detail Panel */\n .detail-content {\n flex: 1;\n padding: 16px;\n overflow-y: auto;\n }\n\n .detail-field {\n margin-bottom: 16px;\n }\n\n .detail-field label {\n display: block;\n font-size: 12px;\n font-weight: 500;\n color: #999;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n margin-bottom: 4px;\n }\n\n .field-value {\n font-size: 14px;\n color: #333;\n }\n\n .detail-stats {\n display: flex;\n gap: 24px;\n margin: 24px 0;\n padding: 16px;\n background: #f5f7fa;\n border-radius: 8px;\n }\n\n .stat-item {\n display: flex;\n flex-direction: column;\n align-items: center;\n }\n\n .stat-value {\n font-size: 24px;\n font-weight: 600;\n color: #2196F3;\n }\n\n .stat-label {\n font-size: 12px;\n color: #999;\n }\n\n .category-lists h4 {\n margin: 0 0 12px;\n font-size: 13px;\n font-weight: 600;\n color: #666;\n }\n\n .mini-list {\n display: flex;\n flex-direction: column;\n gap: 4px;\n }\n\n .mini-list-item {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n background: #f5f7fa;\n border-radius: 4px;\n font-size: 13px;\n color: #333;\n }\n\n .mini-list-item i {\n color: #999;\n }\n\n /* No Selection */\n .category-detail-panel.empty {\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .no-selection {\n text-align: center;\n color: #999;\n }\n\n .no-selection i {\n font-size: 32px;\n margin-bottom: 12px;\n }\n\n .no-selection p {\n margin: 0;\n }\n\n /* Form */\n .category-form {\n display: flex;\n flex-direction: column;\n gap: 16px;\n }\n\n .form-group {\n display: flex;\n flex-direction: column;\n gap: 6px;\n }\n\n .form-group label {\n font-size: 13px;\n font-weight: 500;\n color: #666;\n }\n\n .form-input {\n padding: 8px 12px;\n border: 1px solid #ddd;\n border-radius: 4px;\n font-size: 14px;\n }\n\n .form-input:focus {\n outline: none;\n border-color: #2196F3;\n }\n\n /* Modal Styles */\n .modal-overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.5);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 10000;\n animation: fadeIn 0.15s ease-out;\n }\n\n @keyframes fadeIn {\n from { opacity: 0; }\n to { opacity: 1; }\n }\n\n .modal-dialog {\n background: white;\n border-radius: 8px;\n box-shadow: 0 8px 32px rgba(0, 0, 0, 0.2);\n width: 450px;\n max-width: 90vw;\n max-height: 90vh;\n display: flex;\n flex-direction: column;\n animation: slideIn 0.2s ease-out;\n }\n\n .modal-dialog.modal-sm {\n width: 400px;\n }\n\n @keyframes slideIn {\n from { transform: translateY(-20px); opacity: 0; }\n to { transform: translateY(0); opacity: 1; }\n }\n\n .modal-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 16px 20px;\n border-bottom: 1px solid #e0e0e0;\n }\n\n .modal-header.danger {\n background: #ffebee;\n border-bottom-color: #ffcdd2;\n }\n\n .modal-header.danger h3 {\n color: #c62828;\n }\n\n .modal-header h3 {\n margin: 0;\n font-size: 18px;\n font-weight: 600;\n color: #333;\n }\n\n .modal-close {\n background: none;\n border: none;\n padding: 4px 8px;\n color: #999;\n cursor: pointer;\n border-radius: 4px;\n transition: all 0.15s;\n }\n\n .modal-close:hover:not(:disabled) {\n background: #f0f0f0;\n color: #333;\n }\n\n .modal-close:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n\n .modal-body {\n padding: 20px;\n overflow-y: auto;\n }\n\n .modal-body p {\n margin: 0;\n color: #666;\n line-height: 1.6;\n }\n\n .modal-footer {\n display: flex;\n justify-content: flex-end;\n gap: 12px;\n padding: 16px 20px;\n border-top: 1px solid #e0e0e0;\n background: #fafafa;\n }\n\n .btn-secondary {\n padding: 8px 16px;\n background: white;\n border: 1px solid #ddd;\n border-radius: 6px;\n color: #666;\n font-size: 14px;\n cursor: pointer;\n transition: all 0.15s;\n }\n\n .btn-secondary:hover:not(:disabled) {\n background: #f5f5f5;\n border-color: #ccc;\n }\n\n .btn-secondary:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n\n .btn-primary {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 16px;\n background: #2196F3;\n border: none;\n border-radius: 6px;\n color: white;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s;\n }\n\n .btn-primary:hover:not(:disabled) {\n background: #1976D2;\n }\n\n .btn-primary:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n\n .btn-danger {\n padding: 8px 16px;\n background: #d32f2f;\n border: none;\n border-radius: 6px;\n color: white;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s;\n }\n\n .btn-danger:hover {\n background: #c62828;\n }\n\n /* Responsive */\n @media (max-width: 768px) {\n .categories-layout {\n grid-template-columns: 1fr;\n }\n\n .category-detail-panel.empty {\n display: none;\n }\n\n .modal-dialog {\n width: 95vw;\n }\n }\n `],\n encapsulation: ViewEncapsulation.None\n})\nexport class ListsCategoriesResource extends BaseResourceComponent implements OnDestroy {\n private destroy$ = new Subject<void>();\n\n isLoading = true;\n categories: MJListCategoryEntity[] = [];\n categoryViewModels: CategoryViewModel[] = [];\n selectedCategory: MJListCategoryEntity | null = null;\n selectedCategoryLists: MJListEntity[] = [];\n\n // Dialog\n showDialog = false;\n editingCategory: MJListCategoryEntity | null = null;\n dialogName = '';\n dialogDescription = '';\n dialogParentId: string | null = null;\n availableParents: Array<{ ID: string | null; displayName: string }> = [];\n\n // Operation states\n isSaving = false;\n\n // Delete confirmation dialog\n showDeleteConfirm = false;\n deleteConfirmMessage = '';\n private categoryToDelete: MJListCategoryEntity | null = null;\n\n private listsByCategoryId: Map<string, MJListEntity[]> = new Map();\n private categoryMap: Map<string, MJListCategoryEntity> = new Map();\n\n constructor(\n private cdr: ChangeDetectorRef,\n private notificationService: MJNotificationService\n ) {\n super();\n }\n\n async ngOnInit() {\n await this.loadData();\n this.NotifyLoadComplete();\n }\n\n ngOnDestroy() {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n async loadData() {\n this.isLoading = true;\n\n try {\n const md = new Metadata();\n const rv = new RunView();\n const userId = md.CurrentUser?.ID;\n\n const [categoriesResult, listsResult] = await rv.RunViews([\n {\n EntityName: 'MJ: List Categories',\n OrderBy: 'Name',\n ResultType: 'entity_object',\n CacheLocal: true // Categories rarely change, cache for performance\n },\n {\n EntityName: 'MJ: Lists',\n ExtraFilter: userId ? `UserID = '${userId}'` : '',\n ResultType: 'entity_object'\n }\n ]);\n\n if (!categoriesResult.Success) {\n console.error('Failed to load categories');\n return;\n }\n\n this.categories = categoriesResult.Results as MJListCategoryEntity[];\n const lists = listsResult.Results as MJListEntity[];\n\n // Build category map\n this.categoryMap.clear();\n for (const cat of this.categories) {\n this.categoryMap.set(cat.ID, cat);\n }\n\n // Group lists by category\n this.listsByCategoryId.clear();\n for (const list of lists) {\n if (list.CategoryID) {\n const existing = this.listsByCategoryId.get(list.CategoryID) || [];\n existing.push(list);\n this.listsByCategoryId.set(list.CategoryID, existing);\n }\n }\n\n // Build view models\n this.buildCategoryViewModels();\n this.buildAvailableParents();\n } catch (error) {\n console.error('Error loading categories:', error);\n } finally {\n this.isLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n private buildCategoryViewModels() {\n this.categoryViewModels = [];\n\n const buildVm = (category: MJListCategoryEntity, depth: number): CategoryViewModel => {\n const lists = this.listsByCategoryId.get(category.ID) || [];\n const children = this.categories.filter(c => UUIDsEqual(c.ParentID, category.ID));\n\n return {\n category,\n listCount: lists.length,\n childCount: children.length,\n depth,\n isExpanded: true\n };\n };\n\n const processCategory = (category: MJListCategoryEntity, depth: number) => {\n this.categoryViewModels.push(buildVm(category, depth));\n const children = this.categories.filter(c => UUIDsEqual(c.ParentID, category.ID));\n for (const child of children) {\n processCategory(child, depth + 1);\n }\n };\n\n const topLevel = this.categories.filter(c => !c.ParentID);\n for (const cat of topLevel) {\n processCategory(cat, 0);\n }\n }\n\n private buildAvailableParents() {\n this.availableParents = [{ ID: null, displayName: '(Top Level)' }];\n\n const addCategory = (cat: MJListCategoryEntity, prefix: string) => {\n // Exclude the editing category and its descendants\n if (this.editingCategory && this.isDescendantOf(cat, this.editingCategory)) {\n return;\n }\n this.availableParents.push({ ID: cat.ID, displayName: prefix + cat.Name });\n const children = this.categories.filter(c => UUIDsEqual(c.ParentID, cat.ID));\n for (const child of children) {\n addCategory(child, prefix + '\\u00A0\\u00A0');\n }\n };\n\n const topLevel = this.categories.filter(c => !c.ParentID);\n for (const cat of topLevel) {\n if (!UUIDsEqual(this.editingCategory?.ID, cat.ID)) {\n addCategory(cat, '');\n }\n }\n }\n\n private isDescendantOf(category: MJListCategoryEntity, ancestor: MJListCategoryEntity): boolean {\n if (UUIDsEqual(category.ID, ancestor.ID)) return true;\n if (!category.ParentID) return false;\n const parent = this.categoryMap.get(category.ParentID);\n return parent ? this.isDescendantOf(parent, ancestor) : false;\n }\n\n getTopLevelCategories(): CategoryViewModel[] {\n return this.categoryViewModels.filter(vm => !vm.category.ParentID);\n }\n\n getChildCategories(parent: MJListCategoryEntity): CategoryViewModel[] {\n return this.categoryViewModels.filter(vm => UUIDsEqual(vm.category.ParentID, parent.ID));\n }\n\n hasChildren(category: MJListCategoryEntity): boolean {\n return this.categories.some(c => UUIDsEqual(c.ParentID, category.ID));\n }\n\n toggleExpand(event: Event, vm: CategoryViewModel) {\n event.stopPropagation();\n vm.isExpanded = !vm.isExpanded;\n }\n\n expandNode(event: Event, vm: CategoryViewModel) {\n event.preventDefault();\n if (this.hasChildren(vm.category) && !vm.isExpanded) {\n vm.isExpanded = true;\n }\n }\n\n collapseNode(event: Event, vm: CategoryViewModel) {\n event.preventDefault();\n if (vm.isExpanded) {\n vm.isExpanded = false;\n }\n }\n\n IsCategorySelected(category: MJListCategoryEntity): boolean {\n return UUIDsEqual(this.selectedCategory?.ID, category.ID);\n }\n\n selectCategory(category: MJListCategoryEntity) {\n this.selectedCategory = category;\n this.selectedCategoryLists = this.listsByCategoryId.get(category.ID) || [];\n }\n\n getParentCategoryName(category: MJListCategoryEntity): string | null {\n if (!category.ParentID) return null;\n return this.categoryMap.get(category.ParentID)?.Name || null;\n }\n\n getSelectedCategoryListCount(): number {\n if (!this.selectedCategory) return 0;\n return this.listsByCategoryId.get(this.selectedCategory.ID)?.length || 0;\n }\n\n getSelectedCategoryChildCount(): number {\n if (!this.selectedCategory) return 0;\n return this.categories.filter(c => UUIDsEqual(c.ParentID, this.selectedCategory!.ID)).length\n }\n\n createCategory() {\n this.editingCategory = null;\n this.dialogName = '';\n this.dialogDescription = '';\n this.dialogParentId = null;\n this.buildAvailableParents();\n this.showDialog = true;\n }\n\n editCategory() {\n if (!this.selectedCategory) return;\n this.editingCategory = this.selectedCategory;\n this.dialogName = this.selectedCategory.Name;\n this.dialogDescription = this.selectedCategory.Description || '';\n this.dialogParentId = this.selectedCategory.ParentID || null;\n this.buildAvailableParents();\n this.showDialog = true;\n }\n\n deleteCategory() {\n if (!this.selectedCategory) return;\n\n this.categoryToDelete = this.selectedCategory;\n const categoryName = this.categoryToDelete.Name;\n const listsInCategory = this.listsByCategoryId.get(this.categoryToDelete.ID) || [];\n const childCategories = this.categories.filter(c => UUIDsEqual(c.ParentID, this.categoryToDelete!.ID));\n\n let message = `Are you sure you want to delete \"${categoryName}\"?`;\n if (listsInCategory.length > 0) {\n message += ` ${listsInCategory.length} list(s) will be uncategorized.`;\n }\n if (childCategories.length > 0) {\n message += ` ${childCategories.length} subcategory(ies) will become top-level.`;\n }\n\n this.deleteConfirmMessage = message;\n this.showDeleteConfirm = true;\n }\n\n cancelDelete() {\n this.showDeleteConfirm = false;\n this.categoryToDelete = null;\n this.deleteConfirmMessage = '';\n }\n\n async confirmDelete() {\n if (!this.categoryToDelete) return;\n\n const categoryName = this.categoryToDelete.Name;\n const categoryToDelete = this.categoryToDelete;\n this.showDeleteConfirm = false;\n this.isLoading = true;\n this.cdr.detectChanges();\n\n try {\n const deleted = await categoryToDelete.Delete();\n if (deleted) {\n this.notificationService.CreateSimpleNotification(`\"${categoryName}\" deleted`, 'success', 3000);\n } else {\n // Get the detailed error message from LatestResult\n const errorMessage = categoryToDelete.LatestResult?.Message || 'Unknown error occurred';\n console.error('Failed to delete category:', categoryToDelete.LatestResult);\n this.notificationService.CreateSimpleNotification(`Failed to delete category: ${errorMessage}`, 'error', 6000);\n }\n this.selectedCategory = null;\n this.categoryToDelete = null;\n await this.loadData();\n } catch (error) {\n console.error('Error deleting category:', error);\n const errorMessage = error instanceof Error ? error.message : String(error);\n this.notificationService.CreateSimpleNotification(`Error deleting category: ${errorMessage}`, 'error', 6000);\n } finally {\n this.isLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n closeDialog() {\n this.showDialog = false;\n this.editingCategory = null;\n }\n\n async saveCategory() {\n this.isSaving = true;\n this.cdr.detectChanges();\n\n const isEditing = !!this.editingCategory;\n const categoryName = this.dialogName;\n\n try {\n const md = new Metadata();\n let category: MJListCategoryEntity;\n\n if (this.editingCategory) {\n category = this.editingCategory;\n } else {\n category = await md.GetEntityObject<MJListCategoryEntity>('MJ: List Categories');\n category.UserID = md.CurrentUser!.ID;\n }\n\n category.Name = this.dialogName;\n category.Description = this.dialogDescription || null;\n category.ParentID = this.dialogParentId || null;\n\n const saved = await category.Save();\n if (saved) {\n this.notificationService.CreateSimpleNotification(\n isEditing ? `\"${categoryName}\" updated` : `\"${categoryName}\" created`,\n 'success',\n 3000\n );\n this.closeDialog();\n await this.loadData();\n\n // Re-select the saved category\n if (isEditing) {\n this.selectedCategory = category;\n this.selectedCategoryLists = this.listsByCategoryId.get(category.ID) || [];\n }\n } else {\n // Get the detailed error message from LatestResult\n const errorMessage = category.LatestResult?.Message || 'Unknown error occurred';\n const action = isEditing ? 'update' : 'create';\n console.error(`Failed to ${action} category:`, category.LatestResult);\n this.notificationService.CreateSimpleNotification(\n `Failed to ${action} category: ${errorMessage}`,\n 'error',\n 6000\n );\n }\n } catch (error) {\n console.error('Error saving category:', error);\n const errorMessage = error instanceof Error ? error.message : String(error);\n this.notificationService.CreateSimpleNotification(`Error saving category: ${errorMessage}`, 'error', 6000);\n } finally {\n this.isSaving = false;\n this.cdr.detectChanges();\n }\n }\n\n async GetResourceDisplayName(data: ResourceData): Promise<string> {\n return 'Categories';\n }\n\n async GetResourceIconClass(data: ResourceData): Promise<string> {\n return 'fa-solid fa-tags';\n }\n}\n"]}
@@ -5,7 +5,7 @@ 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, ViewEncapsulation, HostListener } from '@angular/core';
8
- import { RegisterClass } from '@memberjunction/global';
8
+ import { RegisterClass, UUIDsEqual } from '@memberjunction/global';
9
9
  import { BaseResourceComponent } from '@memberjunction/ng-shared';
10
10
  import { Metadata, RunView } from '@memberjunction/core';
11
11
  import { Subject } from 'rxjs';
@@ -699,7 +699,7 @@ let ListsMyListsResource = class ListsMyListsResource extends BaseResourceCompon
699
699
  const processCategory = (cat, level) => {
700
700
  const indent = '\u00A0\u00A0'.repeat(level);
701
701
  result.push({ ID: cat.ID, displayName: `${indent}${cat.Name}` });
702
- const children = categories.filter(c => c.ParentID === cat.ID);
702
+ const children = categories.filter(c => UUIDsEqual(c.ParentID, cat.ID));
703
703
  for (const child of children) {
704
704
  processCategory(child, level + 1);
705
705
  }