@memberjunction/ng-dashboard-viewer 6.2.0-edge.3 → 6.2.0-edge.4

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 (99) hide show
  1. package/README.md +165 -17
  2. package/dist/lib/config-dialogs/confirm-dialog.component.d.ts +3 -4
  3. package/dist/lib/config-dialogs/confirm-dialog.component.d.ts.map +1 -1
  4. package/dist/lib/config-dialogs/confirm-dialog.component.js +3 -2
  5. package/dist/lib/config-dialogs/confirm-dialog.component.js.map +1 -1
  6. package/dist/lib/config-panels/artifact-config-panel.component.d.ts.map +1 -1
  7. package/dist/lib/config-panels/artifact-config-panel.component.js +59 -50
  8. package/dist/lib/config-panels/artifact-config-panel.component.js.map +1 -1
  9. package/dist/lib/config-panels/base-config-panel.d.ts +8 -3
  10. package/dist/lib/config-panels/base-config-panel.d.ts.map +1 -1
  11. package/dist/lib/config-panels/base-config-panel.js +10 -3
  12. package/dist/lib/config-panels/base-config-panel.js.map +1 -1
  13. package/dist/lib/config-panels/query-config-panel.component.js +124 -99
  14. package/dist/lib/config-panels/query-config-panel.component.js.map +1 -1
  15. package/dist/lib/config-panels/view-config-panel.component.js +111 -103
  16. package/dist/lib/config-panels/view-config-panel.component.js.map +1 -1
  17. package/dist/lib/config-panels/weburl-config-panel.component.js +89 -80
  18. package/dist/lib/config-panels/weburl-config-panel.component.js.map +1 -1
  19. package/dist/lib/dashboard-browser/dashboard-browser.component.d.ts +79 -28
  20. package/dist/lib/dashboard-browser/dashboard-browser.component.d.ts.map +1 -1
  21. package/dist/lib/dashboard-browser/dashboard-browser.component.js +446 -447
  22. package/dist/lib/dashboard-browser/dashboard-browser.component.js.map +1 -1
  23. package/dist/lib/dashboard-card/dashboard-card.component.d.ts +69 -0
  24. package/dist/lib/dashboard-card/dashboard-card.component.d.ts.map +1 -0
  25. package/dist/lib/dashboard-card/dashboard-card.component.js +281 -0
  26. package/dist/lib/dashboard-card/dashboard-card.component.js.map +1 -0
  27. package/dist/lib/dashboard-card/dashboard-card.helpers.d.ts +18 -0
  28. package/dist/lib/dashboard-card/dashboard-card.helpers.d.ts.map +1 -0
  29. package/dist/lib/dashboard-card/dashboard-card.helpers.js +43 -0
  30. package/dist/lib/dashboard-card/dashboard-card.helpers.js.map +1 -0
  31. package/dist/lib/dashboard-card/layout-preview-cache.d.ts +15 -0
  32. package/dist/lib/dashboard-card/layout-preview-cache.d.ts.map +1 -0
  33. package/dist/lib/dashboard-card/layout-preview-cache.js +22 -0
  34. package/dist/lib/dashboard-card/layout-preview-cache.js.map +1 -0
  35. package/dist/lib/dashboard-viewer/dashboard-viewer.component.d.ts +69 -12
  36. package/dist/lib/dashboard-viewer/dashboard-viewer.component.d.ts.map +1 -1
  37. package/dist/lib/dashboard-viewer/dashboard-viewer.component.js +173 -145
  38. package/dist/lib/dashboard-viewer/dashboard-viewer.component.js.map +1 -1
  39. package/dist/lib/dashboard-viewer.module.d.ts +24 -20
  40. package/dist/lib/dashboard-viewer.module.d.ts.map +1 -1
  41. package/dist/lib/dashboard-viewer.module.js +42 -5
  42. package/dist/lib/dashboard-viewer.module.js.map +1 -1
  43. package/dist/lib/dialogs/add-panel-dialog/add-panel-dialog.component.d.ts +7 -12
  44. package/dist/lib/dialogs/add-panel-dialog/add-panel-dialog.component.d.ts.map +1 -1
  45. package/dist/lib/dialogs/add-panel-dialog/add-panel-dialog.component.js +3 -1
  46. package/dist/lib/dialogs/add-panel-dialog/add-panel-dialog.component.js.map +1 -1
  47. package/dist/lib/dialogs/dashboard-name-dialog/dashboard-name-dialog.component.d.ts +54 -0
  48. package/dist/lib/dialogs/dashboard-name-dialog/dashboard-name-dialog.component.d.ts.map +1 -0
  49. package/dist/lib/dialogs/dashboard-name-dialog/dashboard-name-dialog.component.js +156 -0
  50. package/dist/lib/dialogs/dashboard-name-dialog/dashboard-name-dialog.component.js.map +1 -0
  51. package/dist/lib/dialogs/edit-part-dialog/edit-part-dialog.component.d.ts +5 -11
  52. package/dist/lib/dialogs/edit-part-dialog/edit-part-dialog.component.d.ts.map +1 -1
  53. package/dist/lib/dialogs/edit-part-dialog/edit-part-dialog.component.js +3 -1
  54. package/dist/lib/dialogs/edit-part-dialog/edit-part-dialog.component.js.map +1 -1
  55. package/dist/lib/dialogs/part-dialog/dashboard-part-dialog.component.d.ts +147 -0
  56. package/dist/lib/dialogs/part-dialog/dashboard-part-dialog.component.d.ts.map +1 -0
  57. package/dist/lib/dialogs/part-dialog/dashboard-part-dialog.component.js +536 -0
  58. package/dist/lib/dialogs/part-dialog/dashboard-part-dialog.component.js.map +1 -0
  59. package/dist/lib/layout-preview/dashboard-layout-preview-node.component.d.ts +20 -0
  60. package/dist/lib/layout-preview/dashboard-layout-preview-node.component.d.ts.map +1 -0
  61. package/dist/lib/layout-preview/dashboard-layout-preview-node.component.js +80 -0
  62. package/dist/lib/layout-preview/dashboard-layout-preview-node.component.js.map +1 -0
  63. package/dist/lib/layout-preview/dashboard-layout-preview.component.d.ts +28 -0
  64. package/dist/lib/layout-preview/dashboard-layout-preview.component.d.ts.map +1 -0
  65. package/dist/lib/layout-preview/dashboard-layout-preview.component.js +62 -0
  66. package/dist/lib/layout-preview/dashboard-layout-preview.component.js.map +1 -0
  67. package/dist/lib/layout-preview/dashboard-layout-preview.d.ts +33 -0
  68. package/dist/lib/layout-preview/dashboard-layout-preview.d.ts.map +1 -0
  69. package/dist/lib/layout-preview/dashboard-layout-preview.js +138 -0
  70. package/dist/lib/layout-preview/dashboard-layout-preview.js.map +1 -0
  71. package/dist/lib/models/dashboard-layout-editor.d.ts +78 -0
  72. package/dist/lib/models/dashboard-layout-editor.d.ts.map +1 -0
  73. package/dist/lib/models/dashboard-layout-editor.js +374 -0
  74. package/dist/lib/models/dashboard-layout-editor.js.map +1 -0
  75. package/dist/lib/models/remove-part-confirm.d.ts +8 -0
  76. package/dist/lib/models/remove-part-confirm.d.ts.map +1 -0
  77. package/dist/lib/models/remove-part-confirm.js +23 -0
  78. package/dist/lib/models/remove-part-confirm.js.map +1 -0
  79. package/dist/lib/parts/artifact-part.component.js +2 -2
  80. package/dist/lib/parts/artifact-part.component.js.map +1 -1
  81. package/dist/lib/parts/query-part.component.js +2 -2
  82. package/dist/lib/parts/query-part.component.js.map +1 -1
  83. package/dist/lib/parts/view-part.component.js +2 -2
  84. package/dist/lib/parts/view-part.component.js.map +1 -1
  85. package/dist/lib/parts/weburl-part.component.js +2 -2
  86. package/dist/lib/parts/weburl-part.component.js.map +1 -1
  87. package/dist/lib/services/golden-layout-wrapper.service.d.ts +40 -0
  88. package/dist/lib/services/golden-layout-wrapper.service.d.ts.map +1 -1
  89. package/dist/lib/services/golden-layout-wrapper.service.js +117 -9
  90. package/dist/lib/services/golden-layout-wrapper.service.js.map +1 -1
  91. package/dist/lib/services/stack-part-actions.d.ts +11 -0
  92. package/dist/lib/services/stack-part-actions.d.ts.map +1 -0
  93. package/dist/lib/services/stack-part-actions.js +41 -0
  94. package/dist/lib/services/stack-part-actions.js.map +1 -0
  95. package/dist/public-api.d.ts +9 -0
  96. package/dist/public-api.d.ts.map +1 -1
  97. package/dist/public-api.js +13 -0
  98. package/dist/public-api.js.map +1 -1
  99. package/package.json +13 -13
@@ -1 +1 @@
1
- {"version":3,"file":"view-config-panel.component.js","sourceRoot":"","sources":["../../../src/lib/config-panels/view-config-panel.component.ts","../../../src/lib/config-panels/view-config-panel.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, ChangeDetectorRef, ViewChild } from '@angular/core';\nimport { RegisterClass } from '@memberjunction/global';\nimport { CompositeKey } from '@memberjunction/core';\nimport { BaseConfigPanel } from './base-config-panel';\nimport { PanelConfig } from '../models/dashboard-types';\nimport {\n TreeBranchConfig,\n TreeLeafConfig,\n TreeNode,\n TreeDropdownComponent\n} from '@memberjunction/ng-trees';\n\n/**\n * Configuration panel for View parts.\n * Uses tree dropdown for category-based view selection.\n */\n@RegisterClass(BaseConfigPanel, 'ViewPanelConfigDialog')\n@Component({\n standalone: false,\n selector: 'mj-dashboard-view-config-panel',\n templateUrl: './view-config-panel.component.html',\n styleUrls: ['./config-panel.component.css']\n})\nexport class ViewConfigPanelComponent extends BaseConfigPanel {\n // ViewChild reference\n @ViewChild('viewDropdown') ViewDropdown!: TreeDropdownComponent;\n\n /** @deprecated Use {@link ViewDropdown}. */\n get viewDropdown(): TreeDropdownComponent {\n return this.ViewDropdown;\n }\n /** @deprecated Use {@link ViewDropdown}. */\n set viewDropdown(value: TreeDropdownComponent) {\n this.ViewDropdown = value;\n }\n\n // Form fields\n public title = '';\n public entityName = '';\n public ViewId = '';\n\n /** @deprecated Use {@link ViewId}. */\n public get viewId() {\n return this.ViewId;\n }\n /** @deprecated Use {@link ViewId}. */\n public set viewId(value) {\n this.ViewId = value;\n }\n public ViewName = '';\n\n /** @deprecated Use {@link ViewName}. */\n public get viewName() {\n return this.ViewName;\n }\n /** @deprecated Use {@link ViewName}. */\n public set viewName(value) {\n this.ViewName = value;\n }\n public ExtraFilter = '';\n\n /** @deprecated Use {@link ExtraFilter}. */\n public get extraFilter() {\n return this.ExtraFilter;\n }\n /** @deprecated Use {@link ExtraFilter}. */\n public set extraFilter(value) {\n this.ExtraFilter = value;\n }\n public DisplayMode: 'grid' | 'cards' | 'timeline' | 'map' = 'grid';\n\n /** @deprecated Use {@link DisplayMode}. */\n public get displayMode(): 'grid' | 'cards' | 'timeline' | 'map' {\n return this.DisplayMode;\n }\n /** @deprecated Use {@link DisplayMode}. */\n public set displayMode(value: 'grid' | 'cards' | 'timeline' | 'map') {\n this.DisplayMode = value;\n }\n public MapRenderMode: 'point' | 'choropleth' | 'heatmap' = 'point';\n\n /** @deprecated Use {@link MapRenderMode}. */\n public get mapRenderMode(): 'point' | 'choropleth' | 'heatmap' {\n return this.MapRenderMode;\n }\n /** @deprecated Use {@link MapRenderMode}. */\n public set mapRenderMode(value: 'point' | 'choropleth' | 'heatmap') {\n this.MapRenderMode = value;\n }\n public AllowModeSwitch = true;\n\n /** @deprecated Use {@link AllowModeSwitch}. */\n public get allowModeSwitch() {\n return this.AllowModeSwitch;\n }\n /** @deprecated Use {@link AllowModeSwitch}. */\n public set allowModeSwitch(value) {\n this.AllowModeSwitch = value;\n }\n public EnableSelection = true;\n\n /** @deprecated Use {@link EnableSelection}. */\n public get enableSelection() {\n return this.EnableSelection;\n }\n /** @deprecated Use {@link EnableSelection}. */\n public set enableSelection(value) {\n this.EnableSelection = value;\n }\n public selectionMode: 'none' | 'single' | 'multiple' = 'single';\n\n // Track previous selection name for smart title updates\n private previousViewName = '';\n\n // Collapsible section states\n public ShowDisplayOptions = false;\n\n /** @deprecated Use {@link ShowDisplayOptions}. */\n public get showDisplayOptions() {\n return this.ShowDisplayOptions;\n }\n /** @deprecated Use {@link ShowDisplayOptions}. */\n public set showDisplayOptions(value) {\n this.ShowDisplayOptions = value;\n }\n public ShowAdvancedOptions = false;\n\n /** @deprecated Use {@link ShowAdvancedOptions}. */\n public get showAdvancedOptions() {\n return this.ShowAdvancedOptions;\n }\n /** @deprecated Use {@link ShowAdvancedOptions}. */\n public set showAdvancedOptions(value) {\n this.ShowAdvancedOptions = value;\n }\n\n // Validation\n public ViewError = '';\n\n /** @deprecated Use {@link ViewError}. */\n public get viewError() {\n return this.ViewError;\n }\n /** @deprecated Use {@link ViewError}. */\n public set viewError(value) {\n this.ViewError = value;\n }\n\n // Tree configuration for User View Categories (branches) and User Views (leaves)\n public ViewCategoryConfig: TreeBranchConfig = {\n EntityName: 'MJ: User View Categories',\n DisplayField: 'Name',\n IDField: 'ID',\n ParentIDField: 'ParentID',\n DefaultIcon: 'fa-solid fa-folder',\n DescriptionField: 'Description',\n OrderBy: 'Name ASC'\n };\n\n public ViewLeafConfig: TreeLeafConfig = {\n EntityName: 'MJ: User Views',\n DisplayField: 'Name',\n IDField: 'ID',\n ParentField: 'CategoryID',\n DefaultIcon: 'fa-solid fa-table',\n DescriptionField: 'Description',\n OrderBy: 'Name ASC'\n };\n\n constructor(cdr: ChangeDetectorRef) {\n super(cdr);\n }\n\n /**\n * Get the viewId as a CompositeKey for the tree dropdown\n */\n public get ViewIdAsKey(): CompositeKey | null {\n return this.ViewId ? CompositeKey.FromID(this.ViewId) : null; // first-pk-ok: viewId is an MJ: User Views record (ViewLeafConfig) — core entity keyed by ID\n }\n\n public initFromConfig(config: PanelConfig | null): void {\n if (config && config.type === 'View') {\n this.entityName = (config['entityName'] as string) || '';\n this.ViewId = (config['viewId'] as string) || '';\n this.ExtraFilter = (config['extraFilter'] as string) || '';\n this.DisplayMode = (config['displayMode'] as 'grid' | 'cards' | 'timeline' | 'map') || 'grid';\n this.MapRenderMode = (config['mapRenderMode'] as 'point' | 'choropleth' | 'heatmap') || 'point';\n this.AllowModeSwitch = (config['allowModeSwitch'] as boolean) ?? true;\n this.EnableSelection = (config['enableSelection'] as boolean) ?? true;\n this.selectionMode = (config['selectionMode'] as 'none' | 'single' | 'multiple') || 'single';\n } else {\n // Defaults for new View panel\n this.entityName = '';\n this.ViewId = '';\n this.ExtraFilter = '';\n this.DisplayMode = 'grid';\n this.AllowModeSwitch = true;\n this.EnableSelection = true;\n this.selectionMode = 'single';\n }\n\n this.title = this.panel?.title || '';\n this.ViewName = '';\n this.previousViewName = '';\n this.ViewError = '';\n this.cdr.detectChanges();\n }\n\n public buildConfig(): PanelConfig {\n return {\n type: 'View',\n entityName: this.entityName.trim() || undefined,\n viewId: this.ViewId.trim() || undefined,\n extraFilter: this.ExtraFilter.trim() || undefined,\n displayMode: this.DisplayMode,\n mapRenderMode: this.DisplayMode === 'map' ? this.MapRenderMode : undefined,\n allowModeSwitch: this.AllowModeSwitch,\n enableSelection: this.EnableSelection,\n selectionMode: this.selectionMode\n };\n }\n\n public override validate(): { valid: boolean; errors: string[] } {\n const errors: string[] = [];\n this.ViewError = '';\n\n // At least entity name or view ID should be provided\n if (!this.entityName.trim() && !this.ViewId.trim()) {\n this.ViewError = 'Please select a saved view or enter an entity name';\n errors.push(this.ViewError);\n }\n\n this.cdr.detectChanges();\n return { valid: errors.length === 0, errors };\n }\n\n public getDefaultTitle(): string {\n if (this.ViewName) {\n return this.ViewName;\n }\n if (this.entityName) {\n return this.entityName;\n }\n return 'View';\n }\n\n public getTitle(): string {\n return this.title || this.getDefaultTitle();\n }\n\n // Form event handlers\n public OnTitleChange(): void {\n this.emitConfigChanged();\n }\n\n /** @deprecated Use {@link OnTitleChange}. */\n public onTitleChange(): void {\n return this.OnTitleChange();\n }\n\n /**\n * Handle view selection from tree dropdown\n */\n public OnViewSelection(node: TreeNode | TreeNode[] | null): void {\n // Ignore null/empty selections (these happen during sync, not user interaction)\n if (!node || (Array.isArray(node) && node.length === 0)) {\n return;\n }\n\n this.ViewError = '';\n\n if (!Array.isArray(node)) {\n // Only accept leaf nodes (actual views, not categories)\n if (node.Type === 'leaf') {\n const oldViewName = this.ViewName;\n this.ViewId = node.ID;\n this.ViewName = node.Label;\n\n // Extract entity name from the view data if available\n if (node.Data && node.Data['Entity']) {\n this.entityName = String(node.Data['Entity']);\n }\n\n // Smart title update: if title matches old name, update to new name\n if (!this.title || this.title === oldViewName || this.title === this.previousViewName) {\n this.title = node.Label;\n }\n this.previousViewName = node.Label;\n }\n }\n\n this.emitConfigChanged();\n this.cdr.detectChanges();\n }\n\n /** @deprecated Use {@link OnViewSelection}. */\n public onViewSelection(node: TreeNode | TreeNode[] | null): void {\n return this.OnViewSelection(node);\n }\n\n public OnEntityChange(): void {\n this.ViewError = '';\n this.emitConfigChanged();\n }\n\n /** @deprecated Use {@link OnEntityChange}. */\n public onEntityChange(): void {\n return this.OnEntityChange();\n }\n\n public OnDisplayModeChange(): void {\n this.emitConfigChanged();\n }\n\n /** @deprecated Use {@link OnDisplayModeChange}. */\n public onDisplayModeChange(): void {\n return this.OnDisplayModeChange();\n }\n\n public OnOptionChange(): void {\n this.emitConfigChanged();\n }\n\n /** @deprecated Use {@link OnOptionChange}. */\n public onOptionChange(): void {\n return this.OnOptionChange();\n }\n\n public OnSelectionModeChange(): void {\n this.emitConfigChanged();\n }\n\n /** @deprecated Use {@link OnSelectionModeChange}. */\n public onSelectionModeChange(): void {\n return this.OnSelectionModeChange();\n }\n\n public onFilterChange(): void {\n this.emitConfigChanged();\n }\n\n\n public GetDisplayModeDescription(): string {\n switch (this.DisplayMode) {\n case 'cards':\n return 'Display records as cards in a responsive grid layout';\n case 'timeline':\n return 'Display records chronologically along a timeline';\n case 'map':\n return 'Display geo-coded records on an interactive map';\n default:\n return 'Display records in a traditional table/grid format';\n }\n }\n\n /** @deprecated Use {@link GetDisplayModeDescription}. */\n public getDisplayModeDescription(): string {\n return this.GetDisplayModeDescription();\n }\n}\n","<!-- View Config Panel - Compact layout with tree dropdown and collapsible sections -->\n<div class=\"config-panel config-panel--compact\">\n <!-- View Selection (Primary) -->\n <div class=\"form-group\">\n <label>\n <i class=\"fa-solid fa-table\"></i>\n Select View\n <span class=\"optional-tag\">(or enter entity below)</span>\n </label>\n <mj-tree-dropdown\n #viewDropdown\n [BranchConfig]=\"ViewCategoryConfig\"\n [LeafConfig]=\"ViewLeafConfig\"\n [Value]=\"ViewIdAsKey\"\n [SelectableTypes]=\"'leaf'\"\n [SelectionMode]=\"'single'\"\n [Placeholder]=\"'Search or browse saved views...'\"\n [EnableSearch]=\"true\"\n (SelectionChange)=\"onViewSelection($event)\"\n [class.error]=\"viewError\">\n </mj-tree-dropdown>\n @if (viewError) {\n <span class=\"form-error\">{{ viewError }}</span>\n }\n @if (!viewError && !viewId && !entityName) {\n <span class=\"form-hint\">\n Select a saved view or enter an entity name below\n </span>\n }\n @if (!viewError && viewId) {\n <span class=\"form-hint form-hint--selected\">\n <i class=\"fa-solid fa-check\"></i>\n Selected: {{ viewName }}\n </span>\n }\n </div>\n\n <!-- Entity Name (Alternative) -->\n <div class=\"form-group\">\n <label for=\"entityName\">\n <i class=\"fa-solid fa-database\"></i>\n Entity Name\n <span class=\"optional-tag\">(alternative to view)</span>\n </label>\n <input\n type=\"text\"\n id=\"entityName\"\n [(ngModel)]=\"entityName\"\n (input)=\"onEntityChange()\"\n placeholder=\"e.g., Accounts, Contacts, Users\"\n class=\"form-input\">\n <span class=\"form-hint\">\n Use this to display all records from an entity without a saved view\n </span>\n </div>\n\n <!-- Title (Optional) -->\n <div class=\"form-group\">\n <label for=\"partTitle\">\n <i class=\"fa-solid fa-heading\"></i>\n Part Title\n <span class=\"optional-tag\">(optional)</span>\n </label>\n <input\n type=\"text\"\n id=\"partTitle\"\n [(ngModel)]=\"title\"\n (input)=\"onTitleChange()\"\n [placeholder]=\"viewName || entityName ? 'Default: ' + (viewName || entityName) : 'Enter a custom title'\"\n class=\"form-input\">\n <span class=\"form-hint\">Leave empty to use view/entity name as title</span>\n </div>\n\n <!-- Display Options -->\n <mj-accordion-panel [(Expanded)]=\"showDisplayOptions\" Size=\"sm\">\n <ng-template mjAccordionTitle>\n <i class=\"fa-solid fa-grip\"></i>\n Display Options\n </ng-template>\n <div class=\"config-section-body\">\n <!-- Display Mode -->\n <div class=\"form-group\">\n <label>Display Mode</label>\n <div class=\"radio-group radio-group--horizontal\">\n <label class=\"radio-option radio-option--compact\" [class.selected]=\"displayMode === 'grid'\">\n <input\n type=\"radio\"\n name=\"displayMode\"\n value=\"grid\"\n [(ngModel)]=\"displayMode\"\n (change)=\"onDisplayModeChange()\">\n <span class=\"radio-mark\"></span>\n <span class=\"radio-label\">\n <i class=\"fa-solid fa-table-cells\"></i>\n Grid\n </span>\n </label>\n <label class=\"radio-option radio-option--compact\" [class.selected]=\"displayMode === 'cards'\">\n <input\n type=\"radio\"\n name=\"displayMode\"\n value=\"cards\"\n [(ngModel)]=\"displayMode\"\n (change)=\"onDisplayModeChange()\">\n <span class=\"radio-mark\"></span>\n <span class=\"radio-label\">\n <i class=\"fa-solid fa-id-card\"></i>\n Cards\n </span>\n </label>\n <label class=\"radio-option radio-option--compact\" [class.selected]=\"displayMode === 'timeline'\">\n <input\n type=\"radio\"\n name=\"displayMode\"\n value=\"timeline\"\n [(ngModel)]=\"displayMode\"\n (change)=\"onDisplayModeChange()\">\n <span class=\"radio-mark\"></span>\n <span class=\"radio-label\">\n <i class=\"fa-solid fa-timeline\"></i>\n Timeline\n </span>\n </label>\n <label class=\"radio-option radio-option--compact\" [class.selected]=\"displayMode === 'map'\">\n <input\n type=\"radio\"\n name=\"displayMode\"\n value=\"map\"\n [(ngModel)]=\"displayMode\"\n (change)=\"onDisplayModeChange()\">\n <span class=\"radio-mark\"></span>\n <span class=\"radio-label\">\n <i class=\"fa-solid fa-map-location-dot\"></i>\n Map\n </span>\n </label>\n </div>\n <span class=\"form-hint\">{{ getDisplayModeDescription() }}</span>\n </div>\n <!-- Map Render Mode (only shown when map is selected) -->\n @if (displayMode === 'map') {\n <div class=\"form-group\">\n <label>Map Style</label>\n <div class=\"radio-group radio-group--horizontal\">\n <label class=\"radio-option radio-option--compact\" [class.selected]=\"mapRenderMode === 'point'\">\n <input type=\"radio\" name=\"mapRenderMode\" value=\"point\"\n [(ngModel)]=\"mapRenderMode\" (change)=\"onOptionChange()\">\n <span class=\"radio-mark\"></span>\n <span class=\"radio-label\">\n <i class=\"fa-solid fa-map-pin\"></i>\n Points\n </span>\n </label>\n <label class=\"radio-option radio-option--compact\" [class.selected]=\"mapRenderMode === 'choropleth'\">\n <input type=\"radio\" name=\"mapRenderMode\" value=\"choropleth\"\n [(ngModel)]=\"mapRenderMode\" (change)=\"onOptionChange()\">\n <span class=\"radio-mark\"></span>\n <span class=\"radio-label\">\n <i class=\"fa-solid fa-earth-americas\"></i>\n Regions\n </span>\n </label>\n <label class=\"radio-option radio-option--compact\" [class.selected]=\"mapRenderMode === 'heatmap'\">\n <input type=\"radio\" name=\"mapRenderMode\" value=\"heatmap\"\n [(ngModel)]=\"mapRenderMode\" (change)=\"onOptionChange()\">\n <span class=\"radio-mark\"></span>\n <span class=\"radio-label\">\n <i class=\"fa-solid fa-fire\"></i>\n Heatmap\n </span>\n </label>\n </div>\n </div>\n }\n <!-- Selection Options -->\n <div class=\"form-group\">\n <div class=\"checkbox-group checkbox-group--compact\">\n <label class=\"checkbox-option checkbox-option--compact\">\n <input\n type=\"checkbox\"\n [(ngModel)]=\"allowModeSwitch\"\n (change)=\"onOptionChange()\">\n <span class=\"checkbox-mark\"></span>\n <span class=\"checkbox-label\">Allow Mode Switch</span>\n </label>\n <label class=\"checkbox-option checkbox-option--compact\">\n <input\n type=\"checkbox\"\n [(ngModel)]=\"enableSelection\"\n (change)=\"onOptionChange()\">\n <span class=\"checkbox-mark\"></span>\n <span class=\"checkbox-label\">Enable Selection</span>\n </label>\n </div>\n </div>\n <!-- Selection Mode -->\n @if (enableSelection) {\n <div class=\"form-group\">\n <label for=\"selectionMode\">Selection Mode</label>\n <select\n id=\"selectionMode\"\n class=\"form-select\"\n [(ngModel)]=\"selectionMode\"\n (change)=\"onSelectionModeChange()\">\n <option value=\"single\">Single Selection</option>\n <option value=\"multiple\">Multiple Selection</option>\n </select>\n </div>\n }\n </div>\n </mj-accordion-panel>\n\n <!-- Advanced Filtering -->\n <mj-accordion-panel [(Expanded)]=\"showAdvancedOptions\" Size=\"sm\">\n <ng-template mjAccordionTitle>\n <i class=\"fa-solid fa-filter\"></i>\n Advanced Filtering\n </ng-template>\n <div class=\"config-section-body\">\n <!-- Extra Filter -->\n <div class=\"form-group\">\n <label for=\"extraFilter\">\n Extra Filter\n </label>\n <input\n type=\"text\"\n id=\"extraFilter\"\n [(ngModel)]=\"extraFilter\"\n (input)=\"onFilterChange()\"\n placeholder=\"e.g., Status = 'Active'\"\n class=\"form-input\">\n <span class=\"form-hint\">\n SQL WHERE clause to filter records (applied in addition to view filters)\n </span>\n </div>\n </div>\n </mj-accordion-panel>\n</div>\n"]}
1
+ {"version":3,"file":"view-config-panel.component.js","sourceRoot":"","sources":["../../../src/lib/config-panels/view-config-panel.component.ts","../../../src/lib/config-panels/view-config-panel.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, ChangeDetectorRef, ViewChild } from '@angular/core';\nimport { RegisterClass } from '@memberjunction/global';\nimport { CompositeKey } from '@memberjunction/core';\nimport { BaseConfigPanel } from './base-config-panel';\nimport { PanelConfig } from '../models/dashboard-types';\nimport {\n TreeBranchConfig,\n TreeLeafConfig,\n TreeNode,\n TreeDropdownComponent\n} from '@memberjunction/ng-trees';\n\n/**\n * Configuration panel for View parts.\n * Uses tree dropdown for category-based view selection.\n */\n@RegisterClass(BaseConfigPanel, 'ViewPanelConfigDialog')\n@Component({\n standalone: false,\n selector: 'mj-dashboard-view-config-panel',\n templateUrl: './view-config-panel.component.html',\n styleUrls: ['./config-panel.component.css']\n})\nexport class ViewConfigPanelComponent extends BaseConfigPanel {\n // ViewChild reference\n @ViewChild('viewDropdown') ViewDropdown!: TreeDropdownComponent;\n\n /** @deprecated Use {@link ViewDropdown}. */\n get viewDropdown(): TreeDropdownComponent {\n return this.ViewDropdown;\n }\n /** @deprecated Use {@link ViewDropdown}. */\n set viewDropdown(value: TreeDropdownComponent) {\n this.ViewDropdown = value;\n }\n\n // Form fields\n public title = '';\n public entityName = '';\n public ViewId = '';\n\n /** @deprecated Use {@link ViewId}. */\n public get viewId() {\n return this.ViewId;\n }\n /** @deprecated Use {@link ViewId}. */\n public set viewId(value) {\n this.ViewId = value;\n }\n public ViewName = '';\n\n /** @deprecated Use {@link ViewName}. */\n public get viewName() {\n return this.ViewName;\n }\n /** @deprecated Use {@link ViewName}. */\n public set viewName(value) {\n this.ViewName = value;\n }\n public ExtraFilter = '';\n\n /** @deprecated Use {@link ExtraFilter}. */\n public get extraFilter() {\n return this.ExtraFilter;\n }\n /** @deprecated Use {@link ExtraFilter}. */\n public set extraFilter(value) {\n this.ExtraFilter = value;\n }\n public DisplayMode: 'grid' | 'cards' | 'timeline' | 'map' = 'grid';\n\n /** @deprecated Use {@link DisplayMode}. */\n public get displayMode(): 'grid' | 'cards' | 'timeline' | 'map' {\n return this.DisplayMode;\n }\n /** @deprecated Use {@link DisplayMode}. */\n public set displayMode(value: 'grid' | 'cards' | 'timeline' | 'map') {\n this.DisplayMode = value;\n }\n public MapRenderMode: 'point' | 'choropleth' | 'heatmap' = 'point';\n\n /** @deprecated Use {@link MapRenderMode}. */\n public get mapRenderMode(): 'point' | 'choropleth' | 'heatmap' {\n return this.MapRenderMode;\n }\n /** @deprecated Use {@link MapRenderMode}. */\n public set mapRenderMode(value: 'point' | 'choropleth' | 'heatmap') {\n this.MapRenderMode = value;\n }\n public AllowModeSwitch = true;\n\n /** @deprecated Use {@link AllowModeSwitch}. */\n public get allowModeSwitch() {\n return this.AllowModeSwitch;\n }\n /** @deprecated Use {@link AllowModeSwitch}. */\n public set allowModeSwitch(value) {\n this.AllowModeSwitch = value;\n }\n public EnableSelection = true;\n\n /** @deprecated Use {@link EnableSelection}. */\n public get enableSelection() {\n return this.EnableSelection;\n }\n /** @deprecated Use {@link EnableSelection}. */\n public set enableSelection(value) {\n this.EnableSelection = value;\n }\n public selectionMode: 'none' | 'single' | 'multiple' = 'single';\n\n // Track previous selection name for smart title updates\n private previousViewName = '';\n\n // Collapsible section states\n public ShowDisplayOptions = false;\n\n /** @deprecated Use {@link ShowDisplayOptions}. */\n public get showDisplayOptions() {\n return this.ShowDisplayOptions;\n }\n /** @deprecated Use {@link ShowDisplayOptions}. */\n public set showDisplayOptions(value) {\n this.ShowDisplayOptions = value;\n }\n public ShowAdvancedOptions = false;\n\n /** @deprecated Use {@link ShowAdvancedOptions}. */\n public get showAdvancedOptions() {\n return this.ShowAdvancedOptions;\n }\n /** @deprecated Use {@link ShowAdvancedOptions}. */\n public set showAdvancedOptions(value) {\n this.ShowAdvancedOptions = value;\n }\n\n // Validation\n public ViewError = '';\n\n /** @deprecated Use {@link ViewError}. */\n public get viewError() {\n return this.ViewError;\n }\n /** @deprecated Use {@link ViewError}. */\n public set viewError(value) {\n this.ViewError = value;\n }\n\n // Tree configuration for User View Categories (branches) and User Views (leaves)\n public ViewCategoryConfig: TreeBranchConfig = {\n EntityName: 'MJ: User View Categories',\n DisplayField: 'Name',\n IDField: 'ID',\n ParentIDField: 'ParentID',\n DefaultIcon: 'fa-solid fa-folder',\n DescriptionField: 'Description',\n OrderBy: 'Name ASC'\n };\n\n public ViewLeafConfig: TreeLeafConfig = {\n EntityName: 'MJ: User Views',\n DisplayField: 'Name',\n IDField: 'ID',\n ParentField: 'CategoryID',\n DefaultIcon: 'fa-solid fa-table',\n DescriptionField: 'Description',\n OrderBy: 'Name ASC'\n };\n\n constructor(cdr: ChangeDetectorRef) {\n super(cdr);\n }\n\n /**\n * Get the viewId as a CompositeKey for the tree dropdown\n */\n public get ViewIdAsKey(): CompositeKey | null {\n return this.ViewId ? CompositeKey.FromID(this.ViewId) : null; // first-pk-ok: viewId is an MJ: User Views record (ViewLeafConfig) — core entity keyed by ID\n }\n\n public initFromConfig(config: PanelConfig | null): void {\n if (config && config.type === 'View') {\n this.entityName = (config['entityName'] as string) || '';\n this.ViewId = (config['viewId'] as string) || '';\n this.ExtraFilter = (config['extraFilter'] as string) || '';\n this.DisplayMode = (config['displayMode'] as 'grid' | 'cards' | 'timeline' | 'map') || 'grid';\n this.MapRenderMode = (config['mapRenderMode'] as 'point' | 'choropleth' | 'heatmap') || 'point';\n this.AllowModeSwitch = (config['allowModeSwitch'] as boolean) ?? true;\n this.EnableSelection = (config['enableSelection'] as boolean) ?? true;\n this.selectionMode = (config['selectionMode'] as 'none' | 'single' | 'multiple') || 'single';\n } else {\n // Defaults for new View panel\n this.entityName = '';\n this.ViewId = '';\n this.ExtraFilter = '';\n this.DisplayMode = 'grid';\n this.AllowModeSwitch = true;\n this.EnableSelection = true;\n this.selectionMode = 'single';\n }\n\n this.title = this.panel?.title || '';\n this.ViewName = '';\n this.previousViewName = '';\n this.ViewError = '';\n this.cdr.detectChanges();\n }\n\n public buildConfig(): PanelConfig {\n return {\n type: 'View',\n entityName: this.entityName.trim() || undefined,\n viewId: this.ViewId.trim() || undefined,\n extraFilter: this.ExtraFilter.trim() || undefined,\n displayMode: this.DisplayMode,\n mapRenderMode: this.DisplayMode === 'map' ? this.MapRenderMode : undefined,\n allowModeSwitch: this.AllowModeSwitch,\n enableSelection: this.EnableSelection,\n selectionMode: this.selectionMode\n };\n }\n\n public override validate(): { valid: boolean; errors: string[] } {\n const errors: string[] = [];\n this.ViewError = '';\n\n // At least entity name or view ID should be provided\n if (!this.entityName.trim() && !this.ViewId.trim()) {\n this.ViewError = 'Please select a saved view or enter an entity name';\n errors.push(this.ViewError);\n }\n\n this.cdr.detectChanges();\n return { valid: errors.length === 0, errors };\n }\n\n public getDefaultTitle(): string {\n if (this.ViewName) {\n return this.ViewName;\n }\n if (this.entityName) {\n return this.entityName;\n }\n return 'View';\n }\n\n public getTitle(): string {\n return this.title || this.getDefaultTitle();\n }\n\n // Form event handlers\n public OnTitleChange(): void {\n this.emitConfigChanged();\n }\n\n /** @deprecated Use {@link OnTitleChange}. */\n public onTitleChange(): void {\n return this.OnTitleChange();\n }\n\n /**\n * Handle view selection from tree dropdown\n */\n public OnViewSelection(node: TreeNode | TreeNode[] | null): void {\n // Ignore null/empty selections (these happen during sync, not user interaction)\n if (!node || (Array.isArray(node) && node.length === 0)) {\n return;\n }\n\n this.ViewError = '';\n\n if (!Array.isArray(node)) {\n // Only accept leaf nodes (actual views, not categories)\n if (node.Type === 'leaf') {\n const oldViewName = this.ViewName;\n this.ViewId = node.ID;\n this.ViewName = node.Label;\n\n // Extract entity name from the view data if available\n if (node.Data && node.Data['Entity']) {\n this.entityName = String(node.Data['Entity']);\n }\n\n // Smart title update: if title matches old name, update to new name\n if (!this.title || this.title === oldViewName || this.title === this.previousViewName) {\n this.title = node.Label;\n }\n this.previousViewName = node.Label;\n }\n }\n\n this.emitConfigChanged();\n this.cdr.detectChanges();\n }\n\n /** @deprecated Use {@link OnViewSelection}. */\n public onViewSelection(node: TreeNode | TreeNode[] | null): void {\n return this.OnViewSelection(node);\n }\n\n public OnEntityChange(): void {\n this.ViewError = '';\n this.emitConfigChanged();\n }\n\n /** @deprecated Use {@link OnEntityChange}. */\n public onEntityChange(): void {\n return this.OnEntityChange();\n }\n\n public OnDisplayModeChange(): void {\n this.emitConfigChanged();\n }\n\n /** @deprecated Use {@link OnDisplayModeChange}. */\n public onDisplayModeChange(): void {\n return this.OnDisplayModeChange();\n }\n\n public OnOptionChange(): void {\n this.emitConfigChanged();\n }\n\n /** @deprecated Use {@link OnOptionChange}. */\n public onOptionChange(): void {\n return this.OnOptionChange();\n }\n\n public OnSelectionModeChange(): void {\n this.emitConfigChanged();\n }\n\n /** @deprecated Use {@link OnSelectionModeChange}. */\n public onSelectionModeChange(): void {\n return this.OnSelectionModeChange();\n }\n\n public onFilterChange(): void {\n this.emitConfigChanged();\n }\n\n\n public GetDisplayModeDescription(): string {\n switch (this.DisplayMode) {\n case 'cards':\n return 'Display records as cards in a responsive grid layout';\n case 'timeline':\n return 'Display records chronologically along a timeline';\n case 'map':\n return 'Display geo-coded records on an interactive map';\n default:\n return 'Display records in a traditional table/grid format';\n }\n }\n\n /** @deprecated Use {@link GetDisplayModeDescription}. */\n public getDisplayModeDescription(): string {\n return this.GetDisplayModeDescription();\n }\n}\n","<!-- View Config Panel - Compact layout with tree dropdown and collapsible sections -->\n<div class=\"config-panel config-panel--compact\">\n <!-- View Selection (Primary) -->\n <div class=\"form-group\">\n <label>\n <i class=\"fa-solid fa-table\"></i>\n Select View\n <span class=\"optional-tag\">(or enter entity below)</span>\n </label>\n <mj-tree-dropdown\n #viewDropdown\n [BranchConfig]=\"ViewCategoryConfig\"\n [LeafConfig]=\"ViewLeafConfig\"\n [Value]=\"ViewIdAsKey\"\n [SelectableTypes]=\"'leaf'\"\n [SelectionMode]=\"'single'\"\n [Placeholder]=\"'Search or browse saved views...'\"\n [EnableSearch]=\"true\"\n (SelectionChange)=\"onViewSelection($event)\"\n [class.error]=\"viewError\">\n </mj-tree-dropdown>\n @if (viewError) {\n <span class=\"form-error\">{{ viewError }}</span>\n }\n @if (!viewError && !viewId && !entityName) {\n <span class=\"form-hint\">\n Select a saved view or enter an entity name below\n </span>\n }\n @if (!viewError && viewId) {\n <span class=\"form-hint form-hint--selected\">\n <i class=\"fa-solid fa-check\"></i>\n Selected: {{ viewName }}\n </span>\n }\n </div>\n\n <!-- Entity Name (Alternative) -->\n <div class=\"form-group\">\n <label for=\"entityName\">\n <i class=\"fa-solid fa-database\"></i>\n Entity Name\n <span class=\"optional-tag\">(alternative to view)</span>\n </label>\n <input\n type=\"text\"\n id=\"entityName\"\n [(ngModel)]=\"entityName\"\n (input)=\"onEntityChange()\"\n placeholder=\"e.g., Accounts, Contacts, Users\"\n class=\"form-input\">\n <span class=\"form-hint\">\n Use this to display all records from an entity without a saved view\n </span>\n </div>\n\n <!-- Title (Optional) -->\n @if (ShowCommonFields) {\n <div class=\"form-group\">\n <label for=\"partTitle\">\n <i class=\"fa-solid fa-heading\"></i>\n Part Title\n <span class=\"optional-tag\">(optional)</span>\n </label>\n <input\n type=\"text\"\n id=\"partTitle\"\n [(ngModel)]=\"title\"\n (input)=\"onTitleChange()\"\n [placeholder]=\"viewName || entityName ? 'Default: ' + (viewName || entityName) : 'Enter a custom title'\"\n class=\"form-input\">\n <span class=\"form-hint\">Leave empty to use view/entity name as title</span>\n </div>\n }\n\n <!-- Display Options -->\n <mj-accordion-panel [(Expanded)]=\"showDisplayOptions\" Size=\"sm\">\n <ng-template mjAccordionTitle>\n <i class=\"fa-solid fa-grip\"></i>\n Display Options\n </ng-template>\n <div class=\"config-section-body\">\n <!-- Display Mode -->\n <div class=\"form-group\">\n <label>Display Mode</label>\n <div class=\"radio-group radio-group--horizontal\">\n <label class=\"radio-option radio-option--compact\" [class.selected]=\"displayMode === 'grid'\">\n <input\n type=\"radio\"\n name=\"displayMode\"\n value=\"grid\"\n [(ngModel)]=\"displayMode\"\n (change)=\"onDisplayModeChange()\">\n <span class=\"radio-mark\"></span>\n <span class=\"radio-label\">\n <i class=\"fa-solid fa-table-cells\"></i>\n Grid\n </span>\n </label>\n <label class=\"radio-option radio-option--compact\" [class.selected]=\"displayMode === 'cards'\">\n <input\n type=\"radio\"\n name=\"displayMode\"\n value=\"cards\"\n [(ngModel)]=\"displayMode\"\n (change)=\"onDisplayModeChange()\">\n <span class=\"radio-mark\"></span>\n <span class=\"radio-label\">\n <i class=\"fa-solid fa-id-card\"></i>\n Cards\n </span>\n </label>\n <label class=\"radio-option radio-option--compact\" [class.selected]=\"displayMode === 'timeline'\">\n <input\n type=\"radio\"\n name=\"displayMode\"\n value=\"timeline\"\n [(ngModel)]=\"displayMode\"\n (change)=\"onDisplayModeChange()\">\n <span class=\"radio-mark\"></span>\n <span class=\"radio-label\">\n <i class=\"fa-solid fa-timeline\"></i>\n Timeline\n </span>\n </label>\n <label class=\"radio-option radio-option--compact\" [class.selected]=\"displayMode === 'map'\">\n <input\n type=\"radio\"\n name=\"displayMode\"\n value=\"map\"\n [(ngModel)]=\"displayMode\"\n (change)=\"onDisplayModeChange()\">\n <span class=\"radio-mark\"></span>\n <span class=\"radio-label\">\n <i class=\"fa-solid fa-map-location-dot\"></i>\n Map\n </span>\n </label>\n </div>\n <span class=\"form-hint\">{{ getDisplayModeDescription() }}</span>\n </div>\n <!-- Map Render Mode (only shown when map is selected) -->\n @if (displayMode === 'map') {\n <div class=\"form-group\">\n <label>Map Style</label>\n <div class=\"radio-group radio-group--horizontal\">\n <label class=\"radio-option radio-option--compact\" [class.selected]=\"mapRenderMode === 'point'\">\n <input type=\"radio\" name=\"mapRenderMode\" value=\"point\"\n [(ngModel)]=\"mapRenderMode\" (change)=\"onOptionChange()\">\n <span class=\"radio-mark\"></span>\n <span class=\"radio-label\">\n <i class=\"fa-solid fa-map-pin\"></i>\n Points\n </span>\n </label>\n <label class=\"radio-option radio-option--compact\" [class.selected]=\"mapRenderMode === 'choropleth'\">\n <input type=\"radio\" name=\"mapRenderMode\" value=\"choropleth\"\n [(ngModel)]=\"mapRenderMode\" (change)=\"onOptionChange()\">\n <span class=\"radio-mark\"></span>\n <span class=\"radio-label\">\n <i class=\"fa-solid fa-earth-americas\"></i>\n Regions\n </span>\n </label>\n <label class=\"radio-option radio-option--compact\" [class.selected]=\"mapRenderMode === 'heatmap'\">\n <input type=\"radio\" name=\"mapRenderMode\" value=\"heatmap\"\n [(ngModel)]=\"mapRenderMode\" (change)=\"onOptionChange()\">\n <span class=\"radio-mark\"></span>\n <span class=\"radio-label\">\n <i class=\"fa-solid fa-fire\"></i>\n Heatmap\n </span>\n </label>\n </div>\n </div>\n }\n <!-- Selection Options -->\n <div class=\"form-group\">\n <div class=\"checkbox-group checkbox-group--compact\">\n <label class=\"checkbox-option checkbox-option--compact\">\n <input\n type=\"checkbox\"\n [(ngModel)]=\"allowModeSwitch\"\n (change)=\"onOptionChange()\">\n <span class=\"checkbox-mark\"></span>\n <span class=\"checkbox-label\">Allow Mode Switch</span>\n </label>\n <label class=\"checkbox-option checkbox-option--compact\">\n <input\n type=\"checkbox\"\n [(ngModel)]=\"enableSelection\"\n (change)=\"onOptionChange()\">\n <span class=\"checkbox-mark\"></span>\n <span class=\"checkbox-label\">Enable Selection</span>\n </label>\n </div>\n </div>\n <!-- Selection Mode -->\n @if (enableSelection) {\n <div class=\"form-group\">\n <label for=\"selectionMode\">Selection Mode</label>\n <select\n id=\"selectionMode\"\n class=\"form-select\"\n [(ngModel)]=\"selectionMode\"\n (change)=\"onSelectionModeChange()\">\n <option value=\"single\">Single Selection</option>\n <option value=\"multiple\">Multiple Selection</option>\n </select>\n </div>\n }\n </div>\n </mj-accordion-panel>\n\n <!-- Advanced Filtering -->\n <mj-accordion-panel [(Expanded)]=\"showAdvancedOptions\" Size=\"sm\">\n <ng-template mjAccordionTitle>\n <i class=\"fa-solid fa-filter\"></i>\n Advanced Filtering\n </ng-template>\n <div class=\"config-section-body\">\n <!-- Extra Filter -->\n <div class=\"form-group\">\n <label for=\"extraFilter\">\n Extra Filter\n </label>\n <input\n type=\"text\"\n id=\"extraFilter\"\n [(ngModel)]=\"extraFilter\"\n (input)=\"onFilterChange()\"\n placeholder=\"e.g., Status = 'Active'\"\n class=\"form-input\">\n <span class=\"form-hint\">\n SQL WHERE clause to filter records (applied in addition to view filters)\n </span>\n </div>\n </div>\n </mj-accordion-panel>\n</div>\n"]}
@@ -9,15 +9,30 @@ import { RegisterClass } from '@memberjunction/global';
9
9
  import { BaseConfigPanel } from './base-config-panel';
10
10
  import * as i0 from "@angular/core";
11
11
  import * as i1 from "@angular/forms";
12
- function WebURLConfigPanelComponent_Conditional_14_Template(rf, ctx) { if (rf & 1) {
12
+ function WebURLConfigPanelComponent_Conditional_1_Template(rf, ctx) { if (rf & 1) {
13
13
  const _r1 = i0.ɵɵgetCurrentView();
14
+ i0.ɵɵelementStart(0, "div", 1)(1, "label", 30);
15
+ i0.ɵɵelement(2, "i", 31);
16
+ i0.ɵɵtext(3, " Part Title ");
17
+ i0.ɵɵelementEnd();
18
+ i0.ɵɵelementStart(4, "input", 32);
19
+ i0.ɵɵtwoWayListener("ngModelChange", function WebURLConfigPanelComponent_Conditional_1_Template_input_ngModelChange_4_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r1.title, $event) || (ctx_r1.title = $event); return i0.ɵɵresetView($event); });
20
+ i0.ɵɵlistener("input", function WebURLConfigPanelComponent_Conditional_1_Template_input_input_4_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onTitleChange()); });
21
+ i0.ɵɵelementEnd()();
22
+ } if (rf & 2) {
23
+ const ctx_r1 = i0.ɵɵnextContext();
24
+ i0.ɵɵadvance(4);
25
+ i0.ɵɵtwoWayProperty("ngModel", ctx_r1.title);
26
+ } }
27
+ function WebURLConfigPanelComponent_Conditional_10_Template(rf, ctx) { if (rf & 1) {
28
+ const _r3 = i0.ɵɵgetCurrentView();
14
29
  i0.ɵɵelementStart(0, "button", 33);
15
- i0.ɵɵlistener("click", function WebURLConfigPanelComponent_Conditional_14_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.previewUrl()); });
30
+ i0.ɵɵlistener("click", function WebURLConfigPanelComponent_Conditional_10_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.previewUrl()); });
16
31
  i0.ɵɵelement(1, "i", 34);
17
32
  i0.ɵɵelementEnd();
18
33
  } }
19
- function WebURLConfigPanelComponent_Conditional_15_Template(rf, ctx) { if (rf & 1) {
20
- i0.ɵɵelementStart(0, "span", 11);
34
+ function WebURLConfigPanelComponent_Conditional_11_Template(rf, ctx) { if (rf & 1) {
35
+ i0.ɵɵelementStart(0, "span", 8);
21
36
  i0.ɵɵtext(1);
22
37
  i0.ɵɵelementEnd();
23
38
  } if (rf & 2) {
@@ -25,8 +40,8 @@ function WebURLConfigPanelComponent_Conditional_15_Template(rf, ctx) { if (rf &
25
40
  i0.ɵɵadvance();
26
41
  i0.ɵɵtextInterpolate(ctx_r1.urlError);
27
42
  } }
28
- function WebURLConfigPanelComponent_Conditional_16_Template(rf, ctx) { if (rf & 1) {
29
- i0.ɵɵelementStart(0, "span", 12);
43
+ function WebURLConfigPanelComponent_Conditional_12_Template(rf, ctx) { if (rf & 1) {
44
+ i0.ɵɵelementStart(0, "span", 9);
30
45
  i0.ɵɵtext(1, " Enter the full URL including https:// ");
31
46
  i0.ɵɵelementEnd();
32
47
  } }
@@ -224,108 +239,102 @@ let WebURLConfigPanelComponent = class WebURLConfigPanelComponent extends BaseCo
224
239
  return this.GetSandboxModeDescription();
225
240
  }
226
241
  static ɵfac = function WebURLConfigPanelComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || WebURLConfigPanelComponent)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
227
- static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: WebURLConfigPanelComponent, selectors: [["mj-weburl-config-panel"]], standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 69, vars: 19, consts: [[1, "config-panel"], [1, "form-group"], ["for", "partTitle"], [1, "fa-solid", "fa-heading"], ["type", "text", "id", "partTitle", "placeholder", "Enter a title for this part", 1, "form-input", 3, "ngModelChange", "input", "ngModel"], ["for", "webUrl"], [1, "fa-solid", "fa-link"], [1, "required"], [1, "input-with-action"], ["type", "url", "id", "webUrl", "placeholder", "https://example.com", 1, "form-input", 3, "ngModelChange", "input", "ngModel"], ["title", "Preview in new tab", 1, "input-action-btn"], [1, "form-error"], [1, "form-hint"], [1, "fa-solid", "fa-shield-halved"], [1, "radio-group"], [1, "radio-option"], ["type", "radio", "name", "sandboxMode", "value", "standard", 3, "ngModelChange", "change", "ngModel"], [1, "radio-mark"], [1, "radio-content"], [1, "radio-label"], [1, "radio-badge", "recommended"], ["type", "radio", "name", "sandboxMode", "value", "strict", 3, "ngModelChange", "change", "ngModel"], [1, "radio-badge", "secure"], ["type", "radio", "name", "sandboxMode", "value", "permissive", 3, "ngModelChange", "change", "ngModel"], [1, "radio-badge", "warning"], [1, "fa-solid", "fa-sliders"], [1, "checkbox-group"], [1, "checkbox-option"], ["type", "checkbox", 3, "ngModelChange", "change", "ngModel"], [1, "checkbox-mark"], [1, "checkbox-content"], [1, "checkbox-label"], [1, "checkbox-desc"], ["title", "Preview in new tab", 1, "input-action-btn", 3, "click"], [1, "fa-solid", "fa-external-link"]], template: function WebURLConfigPanelComponent_Template(rf, ctx) { if (rf & 1) {
228
- i0.ɵɵelementStart(0, "div", 0)(1, "div", 1)(2, "label", 2);
229
- i0.ɵɵelement(3, "i", 3);
230
- i0.ɵɵtext(4, " Part Title ");
231
- i0.ɵɵelementEnd();
232
- i0.ɵɵelementStart(5, "input", 4);
233
- i0.ɵɵtwoWayListener("ngModelChange", function WebURLConfigPanelComponent_Template_input_ngModelChange_5_listener($event) { i0.ɵɵtwoWayBindingSet(ctx.title, $event) || (ctx.title = $event); return $event; });
234
- i0.ɵɵlistener("input", function WebURLConfigPanelComponent_Template_input_input_5_listener() { return ctx.onTitleChange(); });
235
- i0.ɵɵelementEnd()();
236
- i0.ɵɵelementStart(6, "div", 1)(7, "label", 5);
237
- i0.ɵɵelement(8, "i", 6);
238
- i0.ɵɵtext(9, " URL ");
239
- i0.ɵɵelementStart(10, "span", 7);
240
- i0.ɵɵtext(11, "*");
242
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: WebURLConfigPanelComponent, selectors: [["mj-weburl-config-panel"]], standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 65, vars: 19, consts: [[1, "config-panel"], [1, "form-group"], ["for", "webUrl"], [1, "fa-solid", "fa-link"], [1, "required"], [1, "input-with-action"], ["type", "url", "id", "webUrl", "placeholder", "https://example.com", 1, "form-input", 3, "ngModelChange", "input", "ngModel"], ["title", "Preview in new tab", 1, "input-action-btn"], [1, "form-error"], [1, "form-hint"], [1, "fa-solid", "fa-shield-halved"], [1, "radio-group"], [1, "radio-option"], ["type", "radio", "name", "sandboxMode", "value", "standard", 3, "ngModelChange", "change", "ngModel"], [1, "radio-mark"], [1, "radio-content"], [1, "radio-label"], [1, "radio-badge", "recommended"], ["type", "radio", "name", "sandboxMode", "value", "strict", 3, "ngModelChange", "change", "ngModel"], [1, "radio-badge", "secure"], ["type", "radio", "name", "sandboxMode", "value", "permissive", 3, "ngModelChange", "change", "ngModel"], [1, "radio-badge", "warning"], [1, "fa-solid", "fa-sliders"], [1, "checkbox-group"], [1, "checkbox-option"], ["type", "checkbox", 3, "ngModelChange", "change", "ngModel"], [1, "checkbox-mark"], [1, "checkbox-content"], [1, "checkbox-label"], [1, "checkbox-desc"], ["for", "partTitle"], [1, "fa-solid", "fa-heading"], ["type", "text", "id", "partTitle", "placeholder", "Enter a title for this part", 1, "form-input", 3, "ngModelChange", "input", "ngModel"], ["title", "Preview in new tab", 1, "input-action-btn", 3, "click"], [1, "fa-solid", "fa-external-link"]], template: function WebURLConfigPanelComponent_Template(rf, ctx) { if (rf & 1) {
243
+ i0.ɵɵelementStart(0, "div", 0);
244
+ i0.ɵɵconditionalCreate(1, WebURLConfigPanelComponent_Conditional_1_Template, 5, 1, "div", 1);
245
+ i0.ɵɵelementStart(2, "div", 1)(3, "label", 2);
246
+ i0.ɵɵelement(4, "i", 3);
247
+ i0.ɵɵtext(5, " URL ");
248
+ i0.ɵɵelementStart(6, "span", 4);
249
+ i0.ɵɵtext(7, "*");
241
250
  i0.ɵɵelementEnd()();
242
- i0.ɵɵelementStart(12, "div", 8)(13, "input", 9);
243
- i0.ɵɵtwoWayListener("ngModelChange", function WebURLConfigPanelComponent_Template_input_ngModelChange_13_listener($event) { i0.ɵɵtwoWayBindingSet(ctx.url, $event) || (ctx.url = $event); return $event; });
244
- i0.ɵɵlistener("input", function WebURLConfigPanelComponent_Template_input_input_13_listener() { return ctx.onUrlChange(); });
251
+ i0.ɵɵelementStart(8, "div", 5)(9, "input", 6);
252
+ i0.ɵɵtwoWayListener("ngModelChange", function WebURLConfigPanelComponent_Template_input_ngModelChange_9_listener($event) { i0.ɵɵtwoWayBindingSet(ctx.url, $event) || (ctx.url = $event); return $event; });
253
+ i0.ɵɵlistener("input", function WebURLConfigPanelComponent_Template_input_input_9_listener() { return ctx.onUrlChange(); });
245
254
  i0.ɵɵelementEnd();
246
- i0.ɵɵconditionalCreate(14, WebURLConfigPanelComponent_Conditional_14_Template, 2, 0, "button", 10);
255
+ i0.ɵɵconditionalCreate(10, WebURLConfigPanelComponent_Conditional_10_Template, 2, 0, "button", 7);
247
256
  i0.ɵɵelementEnd();
248
- i0.ɵɵconditionalCreate(15, WebURLConfigPanelComponent_Conditional_15_Template, 2, 1, "span", 11);
249
- i0.ɵɵconditionalCreate(16, WebURLConfigPanelComponent_Conditional_16_Template, 2, 0, "span", 12);
257
+ i0.ɵɵconditionalCreate(11, WebURLConfigPanelComponent_Conditional_11_Template, 2, 1, "span", 8);
258
+ i0.ɵɵconditionalCreate(12, WebURLConfigPanelComponent_Conditional_12_Template, 2, 0, "span", 9);
250
259
  i0.ɵɵelementEnd();
251
- i0.ɵɵelementStart(17, "div", 1)(18, "label");
252
- i0.ɵɵelement(19, "i", 13);
253
- i0.ɵɵtext(20, " Security Mode ");
260
+ i0.ɵɵelementStart(13, "div", 1)(14, "label");
261
+ i0.ɵɵelement(15, "i", 10);
262
+ i0.ɵɵtext(16, " Security Mode ");
254
263
  i0.ɵɵelementEnd();
255
- i0.ɵɵelementStart(21, "div", 14)(22, "label", 15)(23, "input", 16);
256
- i0.ɵɵtwoWayListener("ngModelChange", function WebURLConfigPanelComponent_Template_input_ngModelChange_23_listener($event) { i0.ɵɵtwoWayBindingSet(ctx.sandboxMode, $event) || (ctx.sandboxMode = $event); return $event; });
257
- i0.ɵɵlistener("change", function WebURLConfigPanelComponent_Template_input_change_23_listener() { return ctx.onSandboxModeChange(); });
264
+ i0.ɵɵelementStart(17, "div", 11)(18, "label", 12)(19, "input", 13);
265
+ i0.ɵɵtwoWayListener("ngModelChange", function WebURLConfigPanelComponent_Template_input_ngModelChange_19_listener($event) { i0.ɵɵtwoWayBindingSet(ctx.sandboxMode, $event) || (ctx.sandboxMode = $event); return $event; });
266
+ i0.ɵɵlistener("change", function WebURLConfigPanelComponent_Template_input_change_19_listener() { return ctx.onSandboxModeChange(); });
258
267
  i0.ɵɵelementEnd();
259
- i0.ɵɵelement(24, "span", 17);
260
- i0.ɵɵelementStart(25, "span", 18)(26, "span", 19);
261
- i0.ɵɵtext(27, "Standard");
268
+ i0.ɵɵelement(20, "span", 14);
269
+ i0.ɵɵelementStart(21, "span", 15)(22, "span", 16);
270
+ i0.ɵɵtext(23, "Standard");
262
271
  i0.ɵɵelementEnd();
263
- i0.ɵɵelementStart(28, "span", 20);
264
- i0.ɵɵtext(29, "Recommended");
272
+ i0.ɵɵelementStart(24, "span", 17);
273
+ i0.ɵɵtext(25, "Recommended");
265
274
  i0.ɵɵelementEnd()()();
266
- i0.ɵɵelementStart(30, "label", 15)(31, "input", 21);
267
- i0.ɵɵtwoWayListener("ngModelChange", function WebURLConfigPanelComponent_Template_input_ngModelChange_31_listener($event) { i0.ɵɵtwoWayBindingSet(ctx.sandboxMode, $event) || (ctx.sandboxMode = $event); return $event; });
268
- i0.ɵɵlistener("change", function WebURLConfigPanelComponent_Template_input_change_31_listener() { return ctx.onSandboxModeChange(); });
275
+ i0.ɵɵelementStart(26, "label", 12)(27, "input", 18);
276
+ i0.ɵɵtwoWayListener("ngModelChange", function WebURLConfigPanelComponent_Template_input_ngModelChange_27_listener($event) { i0.ɵɵtwoWayBindingSet(ctx.sandboxMode, $event) || (ctx.sandboxMode = $event); return $event; });
277
+ i0.ɵɵlistener("change", function WebURLConfigPanelComponent_Template_input_change_27_listener() { return ctx.onSandboxModeChange(); });
269
278
  i0.ɵɵelementEnd();
270
- i0.ɵɵelement(32, "span", 17);
271
- i0.ɵɵelementStart(33, "span", 18)(34, "span", 19);
272
- i0.ɵɵtext(35, "Strict");
279
+ i0.ɵɵelement(28, "span", 14);
280
+ i0.ɵɵelementStart(29, "span", 15)(30, "span", 16);
281
+ i0.ɵɵtext(31, "Strict");
273
282
  i0.ɵɵelementEnd();
274
- i0.ɵɵelementStart(36, "span", 22);
275
- i0.ɵɵtext(37, "Most Secure");
283
+ i0.ɵɵelementStart(32, "span", 19);
284
+ i0.ɵɵtext(33, "Most Secure");
276
285
  i0.ɵɵelementEnd()()();
277
- i0.ɵɵelementStart(38, "label", 15)(39, "input", 23);
278
- i0.ɵɵtwoWayListener("ngModelChange", function WebURLConfigPanelComponent_Template_input_ngModelChange_39_listener($event) { i0.ɵɵtwoWayBindingSet(ctx.sandboxMode, $event) || (ctx.sandboxMode = $event); return $event; });
279
- i0.ɵɵlistener("change", function WebURLConfigPanelComponent_Template_input_change_39_listener() { return ctx.onSandboxModeChange(); });
286
+ i0.ɵɵelementStart(34, "label", 12)(35, "input", 20);
287
+ i0.ɵɵtwoWayListener("ngModelChange", function WebURLConfigPanelComponent_Template_input_ngModelChange_35_listener($event) { i0.ɵɵtwoWayBindingSet(ctx.sandboxMode, $event) || (ctx.sandboxMode = $event); return $event; });
288
+ i0.ɵɵlistener("change", function WebURLConfigPanelComponent_Template_input_change_35_listener() { return ctx.onSandboxModeChange(); });
280
289
  i0.ɵɵelementEnd();
281
- i0.ɵɵelement(40, "span", 17);
282
- i0.ɵɵelementStart(41, "span", 18)(42, "span", 19);
283
- i0.ɵɵtext(43, "Permissive");
290
+ i0.ɵɵelement(36, "span", 14);
291
+ i0.ɵɵelementStart(37, "span", 15)(38, "span", 16);
292
+ i0.ɵɵtext(39, "Permissive");
284
293
  i0.ɵɵelementEnd();
285
- i0.ɵɵelementStart(44, "span", 24);
286
- i0.ɵɵtext(45, "Least Secure");
294
+ i0.ɵɵelementStart(40, "span", 21);
295
+ i0.ɵɵtext(41, "Least Secure");
287
296
  i0.ɵɵelementEnd()()()();
288
- i0.ɵɵelementStart(46, "span", 12);
289
- i0.ɵɵtext(47);
297
+ i0.ɵɵelementStart(42, "span", 9);
298
+ i0.ɵɵtext(43);
290
299
  i0.ɵɵelementEnd()();
291
- i0.ɵɵelementStart(48, "div", 1)(49, "label");
292
- i0.ɵɵelement(50, "i", 25);
293
- i0.ɵɵtext(51, " Options ");
300
+ i0.ɵɵelementStart(44, "div", 1)(45, "label");
301
+ i0.ɵɵelement(46, "i", 22);
302
+ i0.ɵɵtext(47, " Options ");
294
303
  i0.ɵɵelementEnd();
295
- i0.ɵɵelementStart(52, "div", 26)(53, "label", 27)(54, "input", 28);
296
- i0.ɵɵtwoWayListener("ngModelChange", function WebURLConfigPanelComponent_Template_input_ngModelChange_54_listener($event) { i0.ɵɵtwoWayBindingSet(ctx.allowFullscreen, $event) || (ctx.allowFullscreen = $event); return $event; });
297
- i0.ɵɵlistener("change", function WebURLConfigPanelComponent_Template_input_change_54_listener() { return ctx.onOptionChange(); });
304
+ i0.ɵɵelementStart(48, "div", 23)(49, "label", 24)(50, "input", 25);
305
+ i0.ɵɵtwoWayListener("ngModelChange", function WebURLConfigPanelComponent_Template_input_ngModelChange_50_listener($event) { i0.ɵɵtwoWayBindingSet(ctx.allowFullscreen, $event) || (ctx.allowFullscreen = $event); return $event; });
306
+ i0.ɵɵlistener("change", function WebURLConfigPanelComponent_Template_input_change_50_listener() { return ctx.onOptionChange(); });
298
307
  i0.ɵɵelementEnd();
299
- i0.ɵɵelement(55, "span", 29);
300
- i0.ɵɵelementStart(56, "span", 30)(57, "span", 31);
301
- i0.ɵɵtext(58, "Allow Fullscreen");
308
+ i0.ɵɵelement(51, "span", 26);
309
+ i0.ɵɵelementStart(52, "span", 27)(53, "span", 28);
310
+ i0.ɵɵtext(54, "Allow Fullscreen");
302
311
  i0.ɵɵelementEnd();
303
- i0.ɵɵelementStart(59, "span", 32);
304
- i0.ɵɵtext(60, "Enable fullscreen mode for the embedded content");
312
+ i0.ɵɵelementStart(55, "span", 29);
313
+ i0.ɵɵtext(56, "Enable fullscreen mode for the embedded content");
305
314
  i0.ɵɵelementEnd()()();
306
- i0.ɵɵelementStart(61, "label", 27)(62, "input", 28);
307
- i0.ɵɵtwoWayListener("ngModelChange", function WebURLConfigPanelComponent_Template_input_ngModelChange_62_listener($event) { i0.ɵɵtwoWayBindingSet(ctx.refreshOnResize, $event) || (ctx.refreshOnResize = $event); return $event; });
308
- i0.ɵɵlistener("change", function WebURLConfigPanelComponent_Template_input_change_62_listener() { return ctx.onOptionChange(); });
315
+ i0.ɵɵelementStart(57, "label", 24)(58, "input", 25);
316
+ i0.ɵɵtwoWayListener("ngModelChange", function WebURLConfigPanelComponent_Template_input_ngModelChange_58_listener($event) { i0.ɵɵtwoWayBindingSet(ctx.refreshOnResize, $event) || (ctx.refreshOnResize = $event); return $event; });
317
+ i0.ɵɵlistener("change", function WebURLConfigPanelComponent_Template_input_change_58_listener() { return ctx.onOptionChange(); });
309
318
  i0.ɵɵelementEnd();
310
- i0.ɵɵelement(63, "span", 29);
311
- i0.ɵɵelementStart(64, "span", 30)(65, "span", 31);
312
- i0.ɵɵtext(66, "Refresh on Resize");
319
+ i0.ɵɵelement(59, "span", 26);
320
+ i0.ɵɵelementStart(60, "span", 27)(61, "span", 28);
321
+ i0.ɵɵtext(62, "Refresh on Resize");
313
322
  i0.ɵɵelementEnd();
314
- i0.ɵɵelementStart(67, "span", 32);
315
- i0.ɵɵtext(68, "Reload the page when the part is resized");
323
+ i0.ɵɵelementStart(63, "span", 29);
324
+ i0.ɵɵtext(64, "Reload the page when the part is resized");
316
325
  i0.ɵɵelementEnd()()()()()();
317
326
  } if (rf & 2) {
318
- i0.ɵɵadvance(5);
319
- i0.ɵɵtwoWayProperty("ngModel", ctx.title);
327
+ i0.ɵɵadvance();
328
+ i0.ɵɵconditional(ctx.ShowCommonFields ? 1 : -1);
320
329
  i0.ɵɵadvance(8);
321
330
  i0.ɵɵclassProp("error", ctx.urlError);
322
331
  i0.ɵɵtwoWayProperty("ngModel", ctx.url);
323
332
  i0.ɵɵadvance();
324
- i0.ɵɵconditional(ctx.showUrlPreview ? 14 : -1);
333
+ i0.ɵɵconditional(ctx.showUrlPreview ? 10 : -1);
325
334
  i0.ɵɵadvance();
326
- i0.ɵɵconditional(ctx.urlError ? 15 : -1);
335
+ i0.ɵɵconditional(ctx.urlError ? 11 : -1);
327
336
  i0.ɵɵadvance();
328
- i0.ɵɵconditional(!ctx.urlError ? 16 : -1);
337
+ i0.ɵɵconditional(!ctx.urlError ? 12 : -1);
329
338
  i0.ɵɵadvance(6);
330
339
  i0.ɵɵclassProp("selected", ctx.sandboxMode === "standard");
331
340
  i0.ɵɵadvance();
@@ -352,7 +361,7 @@ WebURLConfigPanelComponent = __decorate([
352
361
  export { WebURLConfigPanelComponent };
353
362
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(WebURLConfigPanelComponent, [{
354
363
  type: Component,
355
- args: [{ standalone: false, selector: 'mj-weburl-config-panel', template: "<!-- WebURL Config Panel - Form content only, no dialog chrome -->\n<div class=\"config-panel\">\n <!-- Title -->\n <div class=\"form-group\">\n <label for=\"partTitle\">\n <i class=\"fa-solid fa-heading\"></i>\n Part Title\n </label>\n <input\n type=\"text\"\n id=\"partTitle\"\n [(ngModel)]=\"title\"\n (input)=\"onTitleChange()\"\n placeholder=\"Enter a title for this part\"\n class=\"form-input\">\n </div>\n\n <!-- URL -->\n <div class=\"form-group\">\n <label for=\"webUrl\">\n <i class=\"fa-solid fa-link\"></i>\n URL\n <span class=\"required\">*</span>\n </label>\n <div class=\"input-with-action\">\n <input\n type=\"url\"\n id=\"webUrl\"\n [(ngModel)]=\"url\"\n (input)=\"onUrlChange()\"\n placeholder=\"https://example.com\"\n class=\"form-input\"\n [class.error]=\"urlError\">\n @if (showUrlPreview) {\n <button\n class=\"input-action-btn\"\n (click)=\"previewUrl()\"\n title=\"Preview in new tab\">\n <i class=\"fa-solid fa-external-link\"></i>\n </button>\n }\n </div>\n @if (urlError) {\n <span class=\"form-error\">{{ urlError }}</span>\n }\n @if (!urlError) {\n <span class=\"form-hint\">\n Enter the full URL including https://\n </span>\n }\n </div>\n\n <!-- Security Mode -->\n <div class=\"form-group\">\n <label>\n <i class=\"fa-solid fa-shield-halved\"></i>\n Security Mode\n </label>\n <div class=\"radio-group\">\n <label class=\"radio-option\" [class.selected]=\"sandboxMode === 'standard'\">\n <input\n type=\"radio\"\n name=\"sandboxMode\"\n value=\"standard\"\n [(ngModel)]=\"sandboxMode\"\n (change)=\"onSandboxModeChange()\">\n <span class=\"radio-mark\"></span>\n <span class=\"radio-content\">\n <span class=\"radio-label\">Standard</span>\n <span class=\"radio-badge recommended\">Recommended</span>\n </span>\n </label>\n <label class=\"radio-option\" [class.selected]=\"sandboxMode === 'strict'\">\n <input\n type=\"radio\"\n name=\"sandboxMode\"\n value=\"strict\"\n [(ngModel)]=\"sandboxMode\"\n (change)=\"onSandboxModeChange()\">\n <span class=\"radio-mark\"></span>\n <span class=\"radio-content\">\n <span class=\"radio-label\">Strict</span>\n <span class=\"radio-badge secure\">Most Secure</span>\n </span>\n </label>\n <label class=\"radio-option\" [class.selected]=\"sandboxMode === 'permissive'\">\n <input\n type=\"radio\"\n name=\"sandboxMode\"\n value=\"permissive\"\n [(ngModel)]=\"sandboxMode\"\n (change)=\"onSandboxModeChange()\">\n <span class=\"radio-mark\"></span>\n <span class=\"radio-content\">\n <span class=\"radio-label\">Permissive</span>\n <span class=\"radio-badge warning\">Least Secure</span>\n </span>\n </label>\n </div>\n <span class=\"form-hint\">{{ getSandboxModeDescription() }}</span>\n </div>\n\n <!-- Options -->\n <div class=\"form-group\">\n <label>\n <i class=\"fa-solid fa-sliders\"></i>\n Options\n </label>\n <div class=\"checkbox-group\">\n <label class=\"checkbox-option\">\n <input\n type=\"checkbox\"\n [(ngModel)]=\"allowFullscreen\"\n (change)=\"onOptionChange()\">\n <span class=\"checkbox-mark\"></span>\n <span class=\"checkbox-content\">\n <span class=\"checkbox-label\">Allow Fullscreen</span>\n <span class=\"checkbox-desc\">Enable fullscreen mode for the embedded content</span>\n </span>\n </label>\n <label class=\"checkbox-option\">\n <input\n type=\"checkbox\"\n [(ngModel)]=\"refreshOnResize\"\n (change)=\"onOptionChange()\">\n <span class=\"checkbox-mark\"></span>\n <span class=\"checkbox-content\">\n <span class=\"checkbox-label\">Refresh on Resize</span>\n <span class=\"checkbox-desc\">Reload the page when the part is resized</span>\n </span>\n </label>\n </div>\n </div>\n</div>\n", styles: ["/**\n * Shared styles for Config Panels (form content only, no dialog chrome)\n */\n\n/* ========================================\n Panel Container\n ======================================== */\n\n.config-panel {\n display: flex;\n flex-direction: column;\n gap: 24px;\n padding: 8px 0;\n}\n\n/* ========================================\n Form Groups\n ======================================== */\n\n.form-group {\n display: flex;\n flex-direction: column;\n gap: 10px;\n}\n\n.form-group > label {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.form-group > label i {\n color: var(--mj-brand-primary);\n font-size: 14px;\n width: 16px;\n}\n\n.form-group > label .required {\n color: var(--mj-status-error);\n}\n\n/* ========================================\n Form Inputs\n ======================================== */\n\n.form-input {\n padding: 14px 16px;\n border: 2px solid var(--mj-border-default);\n border-radius: 10px;\n font-size: 15px;\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface);\n transition: all 0.2s ease;\n width: 100%;\n box-sizing: border-box;\n}\n\n.form-input:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 4px color-mix(in srgb, var(--mj-brand-primary) 12%, transparent);\n}\n\n.form-input::placeholder {\n color: var(--mj-text-disabled);\n}\n\n.form-input.error {\n border-color: var(--mj-status-error);\n}\n\n.form-input.error:focus {\n box-shadow: 0 0 0 4px color-mix(in srgb, var(--mj-status-error) 12%, transparent);\n}\n\n.input-with-action {\n display: flex;\n gap: 8px;\n}\n\n.input-with-action .form-input {\n flex: 1;\n}\n\n.input-action-btn {\n width: 48px;\n height: 48px;\n display: flex;\n align-items: center;\n justify-content: center;\n border: 2px solid var(--mj-border-default);\n border-radius: 10px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.2s ease;\n flex-shrink: 0;\n}\n\n.input-action-btn:hover {\n border-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n/* ========================================\n Form Hints & Errors\n ======================================== */\n\n.form-hint {\n font-size: 13px;\n color: var(--mj-text-muted);\n line-height: 1.4;\n}\n\n.form-error {\n font-size: 13px;\n color: var(--mj-status-error);\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.form-error::before {\n content: '\\f071';\n font-family: 'Font Awesome 6 Free';\n font-weight: 900;\n font-size: 12px;\n}\n\n/* ========================================\n Radio Group\n ======================================== */\n\n.radio-group {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.radio-option {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 14px 16px;\n border: 2px solid color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n border-radius: 10px;\n cursor: pointer;\n transition: all 0.2s ease;\n background: var(--mj-bg-surface);\n}\n\n.radio-option:hover {\n border-color: color-mix(in srgb, var(--mj-brand-primary) 30%, var(--mj-bg-surface));\n background: var(--mj-bg-surface-card);\n}\n\n.radio-option.selected {\n border-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n}\n\n.radio-option input[type=\"radio\"] {\n display: none;\n}\n\n.radio-mark {\n width: 20px;\n height: 20px;\n border: 2px solid var(--mj-border-strong);\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n transition: all 0.2s ease;\n}\n\n.radio-option.selected .radio-mark {\n border-color: var(--mj-brand-primary);\n}\n\n.radio-option.selected .radio-mark::after {\n content: '';\n width: 10px;\n height: 10px;\n background: var(--mj-brand-primary);\n border-radius: 50%;\n}\n\n.radio-content {\n flex: 1;\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n.radio-label {\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n.radio-badge {\n font-size: 11px;\n font-weight: 600;\n padding: 3px 8px;\n border-radius: 4px;\n text-transform: uppercase;\n}\n\n.radio-badge.recommended {\n background: color-mix(in srgb, var(--mj-status-success) 10%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n}\n\n.radio-badge.secure {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n.radio-badge.warning {\n background: color-mix(in srgb, var(--mj-status-warning) 10%, var(--mj-bg-surface));\n color: var(--mj-status-warning);\n}\n\n/* ========================================\n Checkbox Group\n ======================================== */\n\n.checkbox-group {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.checkbox-option {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n padding: 14px 16px;\n border: 2px solid color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n border-radius: 10px;\n cursor: pointer;\n transition: all 0.2s ease;\n background: var(--mj-bg-surface);\n}\n\n.checkbox-option:hover {\n border-color: color-mix(in srgb, var(--mj-brand-primary) 30%, var(--mj-bg-surface));\n background: var(--mj-bg-surface-card);\n}\n\n.checkbox-option input[type=\"checkbox\"] {\n display: none;\n}\n\n.checkbox-mark {\n width: 22px;\n height: 22px;\n border: 2px solid var(--mj-border-strong);\n border-radius: 6px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n transition: all 0.2s ease;\n margin-top: 2px;\n}\n\n.checkbox-option input:checked + .checkbox-mark {\n background: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n}\n\n.checkbox-option input:checked + .checkbox-mark::after {\n content: '\\f00c';\n font-family: 'Font Awesome 6 Free';\n font-weight: 900;\n font-size: 12px;\n color: var(--mj-text-inverse);\n}\n\n.checkbox-content {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.checkbox-label {\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n.checkbox-desc {\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n/* ========================================\n Select/Dropdown\n ======================================== */\n\n.form-select {\n padding: 14px 40px 14px 16px;\n border: 2px solid var(--mj-border-default);\n border-radius: 10px;\n font-size: 15px;\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface);\n transition: all 0.2s ease;\n width: 100%;\n box-sizing: border-box;\n cursor: pointer;\n appearance: none;\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%23666' d='M6 8L1 3h10z'/%3E%3C/svg%3E\");\n background-repeat: no-repeat;\n background-position: right 16px center;\n}\n\n.form-select:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 4px color-mix(in srgb, var(--mj-brand-primary) 12%, transparent);\n}\n\n/* ========================================\n Compact Panel Variant\n ======================================== */\n\n.config-panel--compact {\n gap: 16px;\n}\n\n.config-panel--compact .form-group {\n gap: 8px;\n}\n\n.config-panel--compact .form-input {\n padding: 10px 14px;\n font-size: 14px;\n}\n\n.config-panel--compact .form-select {\n padding: 10px 36px 10px 14px;\n font-size: 14px;\n}\n\n/* ========================================\n Optional Tag\n ======================================== */\n\n.optional-tag {\n font-weight: 400;\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n/* ========================================\n Selected Hint (Success State)\n ======================================== */\n\n.form-hint--selected {\n color: var(--mj-status-success);\n}\n\n.form-hint--selected i {\n color: var(--mj-status-success);\n}\n\n/* ========================================\n Config-panel accordion body\n (the collapsible sections now use <mj-accordion-panel>;\n this only lays out the form-groups inside the projected body)\n ======================================== */\n\n.config-section-body {\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n/* ========================================\n Horizontal Radio Group\n ======================================== */\n\n.radio-group--horizontal {\n flex-direction: row;\n flex-wrap: wrap;\n gap: 8px;\n}\n\n.radio-option--compact {\n padding: 10px 14px;\n flex: 1;\n min-width: 120px;\n}\n\n.radio-option--compact .radio-label {\n font-size: 13px;\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.radio-option--compact .radio-label i {\n color: var(--mj-brand-primary);\n font-size: 12px;\n}\n\n.radio-option--compact .radio-mark {\n width: 16px;\n height: 16px;\n}\n\n.radio-option--compact.selected .radio-mark::after {\n width: 8px;\n height: 8px;\n}\n\n/* ========================================\n Compact Checkbox Group\n ======================================== */\n\n.checkbox-group--compact {\n gap: 4px;\n}\n\n.checkbox-option--compact {\n padding: 10px 14px;\n}\n\n.checkbox-option--compact .checkbox-mark {\n width: 18px;\n height: 18px;\n margin-top: 0;\n}\n\n.checkbox-option--compact .checkbox-label {\n font-size: 13px;\n}\n\n/* ========================================\n Tree Dropdown Error State\n ======================================== */\n\nmj-tree-dropdown.error {\n --dropdown-border-color: var(--mj-status-error);\n}\n\nmj-tree-dropdown.error:focus-within {\n --dropdown-border-focus: var(--mj-status-error);\n}\n"] }]
364
+ args: [{ standalone: false, selector: 'mj-weburl-config-panel', template: "<!-- WebURL Config Panel - Form content only, no dialog chrome -->\n<div class=\"config-panel\">\n <!-- Title -->\n @if (ShowCommonFields) {\n <div class=\"form-group\">\n <label for=\"partTitle\">\n <i class=\"fa-solid fa-heading\"></i>\n Part Title\n </label>\n <input\n type=\"text\"\n id=\"partTitle\"\n [(ngModel)]=\"title\"\n (input)=\"onTitleChange()\"\n placeholder=\"Enter a title for this part\"\n class=\"form-input\">\n </div>\n }\n\n <!-- URL -->\n <div class=\"form-group\">\n <label for=\"webUrl\">\n <i class=\"fa-solid fa-link\"></i>\n URL\n <span class=\"required\">*</span>\n </label>\n <div class=\"input-with-action\">\n <input\n type=\"url\"\n id=\"webUrl\"\n [(ngModel)]=\"url\"\n (input)=\"onUrlChange()\"\n placeholder=\"https://example.com\"\n class=\"form-input\"\n [class.error]=\"urlError\">\n @if (showUrlPreview) {\n <button\n class=\"input-action-btn\"\n (click)=\"previewUrl()\"\n title=\"Preview in new tab\">\n <i class=\"fa-solid fa-external-link\"></i>\n </button>\n }\n </div>\n @if (urlError) {\n <span class=\"form-error\">{{ urlError }}</span>\n }\n @if (!urlError) {\n <span class=\"form-hint\">\n Enter the full URL including https://\n </span>\n }\n </div>\n\n <!-- Security Mode -->\n <div class=\"form-group\">\n <label>\n <i class=\"fa-solid fa-shield-halved\"></i>\n Security Mode\n </label>\n <div class=\"radio-group\">\n <label class=\"radio-option\" [class.selected]=\"sandboxMode === 'standard'\">\n <input\n type=\"radio\"\n name=\"sandboxMode\"\n value=\"standard\"\n [(ngModel)]=\"sandboxMode\"\n (change)=\"onSandboxModeChange()\">\n <span class=\"radio-mark\"></span>\n <span class=\"radio-content\">\n <span class=\"radio-label\">Standard</span>\n <span class=\"radio-badge recommended\">Recommended</span>\n </span>\n </label>\n <label class=\"radio-option\" [class.selected]=\"sandboxMode === 'strict'\">\n <input\n type=\"radio\"\n name=\"sandboxMode\"\n value=\"strict\"\n [(ngModel)]=\"sandboxMode\"\n (change)=\"onSandboxModeChange()\">\n <span class=\"radio-mark\"></span>\n <span class=\"radio-content\">\n <span class=\"radio-label\">Strict</span>\n <span class=\"radio-badge secure\">Most Secure</span>\n </span>\n </label>\n <label class=\"radio-option\" [class.selected]=\"sandboxMode === 'permissive'\">\n <input\n type=\"radio\"\n name=\"sandboxMode\"\n value=\"permissive\"\n [(ngModel)]=\"sandboxMode\"\n (change)=\"onSandboxModeChange()\">\n <span class=\"radio-mark\"></span>\n <span class=\"radio-content\">\n <span class=\"radio-label\">Permissive</span>\n <span class=\"radio-badge warning\">Least Secure</span>\n </span>\n </label>\n </div>\n <span class=\"form-hint\">{{ getSandboxModeDescription() }}</span>\n </div>\n\n <!-- Options -->\n <div class=\"form-group\">\n <label>\n <i class=\"fa-solid fa-sliders\"></i>\n Options\n </label>\n <div class=\"checkbox-group\">\n <label class=\"checkbox-option\">\n <input\n type=\"checkbox\"\n [(ngModel)]=\"allowFullscreen\"\n (change)=\"onOptionChange()\">\n <span class=\"checkbox-mark\"></span>\n <span class=\"checkbox-content\">\n <span class=\"checkbox-label\">Allow Fullscreen</span>\n <span class=\"checkbox-desc\">Enable fullscreen mode for the embedded content</span>\n </span>\n </label>\n <label class=\"checkbox-option\">\n <input\n type=\"checkbox\"\n [(ngModel)]=\"refreshOnResize\"\n (change)=\"onOptionChange()\">\n <span class=\"checkbox-mark\"></span>\n <span class=\"checkbox-content\">\n <span class=\"checkbox-label\">Refresh on Resize</span>\n <span class=\"checkbox-desc\">Reload the page when the part is resized</span>\n </span>\n </label>\n </div>\n </div>\n</div>\n", styles: ["/**\n * Shared styles for Config Panels (form content only, no dialog chrome)\n */\n\n/* ========================================\n Panel Container\n ======================================== */\n\n.config-panel {\n display: flex;\n flex-direction: column;\n gap: 24px;\n padding: 8px 0;\n}\n\n/* ========================================\n Form Groups\n ======================================== */\n\n.form-group {\n display: flex;\n flex-direction: column;\n gap: 10px;\n}\n\n.form-group > label {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.form-group > label i {\n color: var(--mj-brand-primary);\n font-size: 14px;\n width: 16px;\n}\n\n.form-group > label .required {\n color: var(--mj-status-error);\n}\n\n/* ========================================\n Form Inputs\n ======================================== */\n\n.form-input {\n padding: 14px 16px;\n border: 2px solid var(--mj-border-default);\n border-radius: 10px;\n font-size: 15px;\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface);\n transition: all 0.2s ease;\n width: 100%;\n box-sizing: border-box;\n}\n\n.form-input:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 4px color-mix(in srgb, var(--mj-brand-primary) 12%, transparent);\n}\n\n.form-input::placeholder {\n color: var(--mj-text-disabled);\n}\n\n.form-input.error {\n border-color: var(--mj-status-error);\n}\n\n.form-input.error:focus {\n box-shadow: 0 0 0 4px color-mix(in srgb, var(--mj-status-error) 12%, transparent);\n}\n\n.input-with-action {\n display: flex;\n gap: 8px;\n}\n\n.input-with-action .form-input {\n flex: 1;\n}\n\n.input-action-btn {\n width: 48px;\n height: 48px;\n display: flex;\n align-items: center;\n justify-content: center;\n border: 2px solid var(--mj-border-default);\n border-radius: 10px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.2s ease;\n flex-shrink: 0;\n}\n\n.input-action-btn:hover {\n border-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n/* ========================================\n Form Hints & Errors\n ======================================== */\n\n.form-hint {\n font-size: 13px;\n color: var(--mj-text-muted);\n line-height: 1.4;\n}\n\n.form-error {\n font-size: 13px;\n color: var(--mj-status-error);\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.form-error::before {\n content: '\\f071';\n font-family: 'Font Awesome 6 Free';\n font-weight: 900;\n font-size: 12px;\n}\n\n/* ========================================\n Radio Group\n ======================================== */\n\n.radio-group {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.radio-option {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 14px 16px;\n border: 2px solid color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n border-radius: 10px;\n cursor: pointer;\n transition: all 0.2s ease;\n background: var(--mj-bg-surface);\n}\n\n.radio-option:hover {\n border-color: color-mix(in srgb, var(--mj-brand-primary) 30%, var(--mj-bg-surface));\n background: var(--mj-bg-surface-card);\n}\n\n.radio-option.selected {\n border-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n}\n\n.radio-option input[type=\"radio\"] {\n display: none;\n}\n\n.radio-mark {\n width: 20px;\n height: 20px;\n border: 2px solid var(--mj-border-strong);\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n transition: all 0.2s ease;\n}\n\n.radio-option.selected .radio-mark {\n border-color: var(--mj-brand-primary);\n}\n\n.radio-option.selected .radio-mark::after {\n content: '';\n width: 10px;\n height: 10px;\n background: var(--mj-brand-primary);\n border-radius: 50%;\n}\n\n.radio-content {\n flex: 1;\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n.radio-label {\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n.radio-badge {\n font-size: 11px;\n font-weight: 600;\n padding: 3px 8px;\n border-radius: 4px;\n text-transform: uppercase;\n}\n\n.radio-badge.recommended {\n background: color-mix(in srgb, var(--mj-status-success) 10%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n}\n\n.radio-badge.secure {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n.radio-badge.warning {\n background: color-mix(in srgb, var(--mj-status-warning) 10%, var(--mj-bg-surface));\n color: var(--mj-status-warning);\n}\n\n/* ========================================\n Checkbox Group\n ======================================== */\n\n.checkbox-group {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.checkbox-option {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n padding: 14px 16px;\n border: 2px solid color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n border-radius: 10px;\n cursor: pointer;\n transition: all 0.2s ease;\n background: var(--mj-bg-surface);\n}\n\n.checkbox-option:hover {\n border-color: color-mix(in srgb, var(--mj-brand-primary) 30%, var(--mj-bg-surface));\n background: var(--mj-bg-surface-card);\n}\n\n.checkbox-option input[type=\"checkbox\"] {\n display: none;\n}\n\n.checkbox-mark {\n width: 22px;\n height: 22px;\n border: 2px solid var(--mj-border-strong);\n border-radius: 6px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n transition: all 0.2s ease;\n margin-top: 2px;\n}\n\n.checkbox-option input:checked + .checkbox-mark {\n background: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n}\n\n.checkbox-option input:checked + .checkbox-mark::after {\n content: '\\f00c';\n font-family: 'Font Awesome 6 Free';\n font-weight: 900;\n font-size: 12px;\n color: var(--mj-text-inverse);\n}\n\n.checkbox-content {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.checkbox-label {\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n.checkbox-desc {\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n/* ========================================\n Select/Dropdown\n ======================================== */\n\n.form-select {\n padding: 14px 40px 14px 16px;\n border: 2px solid var(--mj-border-default);\n border-radius: 10px;\n font-size: 15px;\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface);\n transition: all 0.2s ease;\n width: 100%;\n box-sizing: border-box;\n cursor: pointer;\n appearance: none;\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%23666' d='M6 8L1 3h10z'/%3E%3C/svg%3E\");\n background-repeat: no-repeat;\n background-position: right 16px center;\n}\n\n.form-select:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 4px color-mix(in srgb, var(--mj-brand-primary) 12%, transparent);\n}\n\n/* ========================================\n Compact Panel Variant\n ======================================== */\n\n.config-panel--compact {\n gap: 16px;\n}\n\n.config-panel--compact .form-group {\n gap: 8px;\n}\n\n.config-panel--compact .form-input {\n padding: 10px 14px;\n font-size: 14px;\n}\n\n.config-panel--compact .form-select {\n padding: 10px 36px 10px 14px;\n font-size: 14px;\n}\n\n/* ========================================\n Optional Tag\n ======================================== */\n\n.optional-tag {\n font-weight: 400;\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n/* ========================================\n Selected Hint (Success State)\n ======================================== */\n\n.form-hint--selected {\n color: var(--mj-status-success);\n}\n\n.form-hint--selected i {\n color: var(--mj-status-success);\n}\n\n/* ========================================\n Config-panel accordion body\n (the collapsible sections now use <mj-accordion-panel>;\n this only lays out the form-groups inside the projected body)\n ======================================== */\n\n.config-section-body {\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n/* ========================================\n Horizontal Radio Group\n ======================================== */\n\n.radio-group--horizontal {\n flex-direction: row;\n flex-wrap: wrap;\n gap: 8px;\n}\n\n.radio-option--compact {\n padding: 10px 14px;\n flex: 1;\n min-width: 120px;\n}\n\n.radio-option--compact .radio-label {\n font-size: 13px;\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.radio-option--compact .radio-label i {\n color: var(--mj-brand-primary);\n font-size: 12px;\n}\n\n.radio-option--compact .radio-mark {\n width: 16px;\n height: 16px;\n}\n\n.radio-option--compact.selected .radio-mark::after {\n width: 8px;\n height: 8px;\n}\n\n/* ========================================\n Compact Checkbox Group\n ======================================== */\n\n.checkbox-group--compact {\n gap: 4px;\n}\n\n.checkbox-option--compact {\n padding: 10px 14px;\n}\n\n.checkbox-option--compact .checkbox-mark {\n width: 18px;\n height: 18px;\n margin-top: 0;\n}\n\n.checkbox-option--compact .checkbox-label {\n font-size: 13px;\n}\n\n/* ========================================\n Tree Dropdown Error State\n ======================================== */\n\nmj-tree-dropdown.error {\n --dropdown-border-color: var(--mj-status-error);\n}\n\nmj-tree-dropdown.error:focus-within {\n --dropdown-border-focus: var(--mj-status-error);\n}\n"] }]
356
365
  }], () => [{ type: i0.ChangeDetectorRef }], null); })();
357
366
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(WebURLConfigPanelComponent, { className: "WebURLConfigPanelComponent", filePath: "src/lib/config-panels/weburl-config-panel.component.ts", lineNumber: 17 }); })();
358
367
  //# sourceMappingURL=weburl-config-panel.component.js.map