@memberjunction/ng-dashboards 5.22.0 → 5.24.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.
- package/README.md +51 -0
- package/dist/AI/components/agents/agent-configuration.component.d.ts.map +1 -1
- package/dist/AI/components/agents/agent-configuration.component.js +364 -362
- package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
- package/dist/AI/components/agents/agent-editor.component.js +2 -2
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts +947 -64
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts.map +1 -1
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js +7645 -430
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js.map +1 -1
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts +285 -6
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts.map +1 -1
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.js +2454 -277
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.js.map +1 -1
- package/dist/AI/components/execution-monitoring.component.d.ts.map +1 -1
- package/dist/AI/components/execution-monitoring.component.js +191 -197
- package/dist/AI/components/execution-monitoring.component.js.map +1 -1
- package/dist/AI/components/models/model-management.component.js +9 -8
- package/dist/AI/components/models/model-management.component.js.map +1 -1
- package/dist/AI/components/prompts/prompt-management.component.js +305 -299
- package/dist/AI/components/prompts/prompt-management.component.js.map +1 -1
- package/dist/AI/components/system/system-configuration.component.js +319 -313
- package/dist/AI/components/system/system-configuration.component.js.map +1 -1
- package/dist/AI/components/vectors/vector-management-resource.component.d.ts +20 -2
- package/dist/AI/components/vectors/vector-management-resource.component.d.ts.map +1 -1
- package/dist/AI/components/vectors/vector-management-resource.component.js +419 -232
- package/dist/AI/components/vectors/vector-management-resource.component.js.map +1 -1
- package/dist/APIKeys/api-applications-panel.component.js +10 -12
- package/dist/APIKeys/api-applications-panel.component.js.map +1 -1
- package/dist/APIKeys/api-key-create-dialog.component.js +13 -19
- package/dist/APIKeys/api-key-create-dialog.component.js.map +1 -1
- package/dist/APIKeys/api-key-edit-panel.component.js +12 -14
- package/dist/APIKeys/api-key-edit-panel.component.js.map +1 -1
- package/dist/APIKeys/api-scopes-panel.component.js +61 -68
- package/dist/APIKeys/api-scopes-panel.component.js.map +1 -1
- package/dist/APIKeys/api-usage-panel.component.js +10 -11
- package/dist/APIKeys/api-usage-panel.component.js.map +1 -1
- package/dist/Actions/components/actions-list-view.component.js +82 -96
- package/dist/Actions/components/actions-list-view.component.js.map +1 -1
- package/dist/Actions/components/actions-overview.component.js +130 -134
- package/dist/Actions/components/actions-overview.component.js.map +1 -1
- package/dist/Actions/components/categories-list-view.component.d.ts.map +1 -1
- package/dist/Actions/components/categories-list-view.component.js +40 -46
- package/dist/Actions/components/categories-list-view.component.js.map +1 -1
- package/dist/Actions/components/code-management.component.js +2 -2
- package/dist/Actions/components/code-management.component.js.map +1 -1
- package/dist/Actions/components/entity-integration.component.js +2 -2
- package/dist/Actions/components/entity-integration.component.js.map +1 -1
- package/dist/Actions/components/execution-monitoring.component.js +127 -132
- package/dist/Actions/components/execution-monitoring.component.js.map +1 -1
- package/dist/Actions/components/executions-list-view.component.js +2 -2
- package/dist/Actions/components/executions-list-view.component.js.map +1 -1
- package/dist/Actions/components/explorer/action-card.component.js +11 -17
- package/dist/Actions/components/explorer/action-card.component.js.map +1 -1
- package/dist/Actions/components/explorer/action-explorer.component.js +5 -11
- package/dist/Actions/components/explorer/action-explorer.component.js.map +1 -1
- package/dist/Actions/components/explorer/action-list-item.component.js +8 -10
- package/dist/Actions/components/explorer/action-list-item.component.js.map +1 -1
- package/dist/Actions/components/explorer/action-toolbar.component.js +112 -133
- package/dist/Actions/components/explorer/action-toolbar.component.js.map +1 -1
- package/dist/Actions/components/explorer/action-tree-panel.component.js +63 -83
- package/dist/Actions/components/explorer/action-tree-panel.component.js.map +1 -1
- package/dist/Actions/components/explorer/new-action-panel.component.js +17 -21
- package/dist/Actions/components/explorer/new-action-panel.component.js.map +1 -1
- package/dist/Actions/components/explorer/new-category-panel.component.js +17 -21
- package/dist/Actions/components/explorer/new-category-panel.component.js.map +1 -1
- package/dist/Actions/components/scheduled-actions.component.js +2 -2
- package/dist/Actions/components/scheduled-actions.component.js.map +1 -1
- package/dist/Actions/components/security-permissions.component.js +2 -2
- package/dist/Actions/components/security-permissions.component.js.map +1 -1
- package/dist/ComponentStudio/component-studio-dashboard.component.d.ts +13 -5
- package/dist/ComponentStudio/component-studio-dashboard.component.d.ts.map +1 -1
- package/dist/ComponentStudio/component-studio-dashboard.component.js +168 -145
- package/dist/ComponentStudio/component-studio-dashboard.component.js.map +1 -1
- package/dist/ComponentStudio/components/artifact-load-dialog.component.d.ts +4 -5
- package/dist/ComponentStudio/components/artifact-load-dialog.component.d.ts.map +1 -1
- package/dist/ComponentStudio/components/artifact-load-dialog.component.js +197 -200
- package/dist/ComponentStudio/components/artifact-load-dialog.component.js.map +1 -1
- package/dist/ComponentStudio/components/artifact-selection-dialog.component.d.ts +5 -7
- package/dist/ComponentStudio/components/artifact-selection-dialog.component.d.ts.map +1 -1
- package/dist/ComponentStudio/components/artifact-selection-dialog.component.js +142 -148
- package/dist/ComponentStudio/components/artifact-selection-dialog.component.js.map +1 -1
- package/dist/ComponentStudio/components/browser/component-browser.component.js +153 -166
- package/dist/ComponentStudio/components/browser/component-browser.component.js.map +1 -1
- package/dist/ComponentStudio/components/editors/code-editor-panel.component.js +15 -20
- package/dist/ComponentStudio/components/editors/code-editor-panel.component.js.map +1 -1
- package/dist/ComponentStudio/components/editors/data-requirements-editor.component.js +16 -21
- package/dist/ComponentStudio/components/editors/data-requirements-editor.component.js.map +1 -1
- package/dist/ComponentStudio/components/editors/requirements-editor.component.js +18 -23
- package/dist/ComponentStudio/components/editors/requirements-editor.component.js.map +1 -1
- package/dist/ComponentStudio/components/editors/spec-editor.component.js +25 -30
- package/dist/ComponentStudio/components/editors/spec-editor.component.js.map +1 -1
- package/dist/ComponentStudio/components/new-component-dialog/new-component-dialog.component.js +10 -11
- package/dist/ComponentStudio/components/new-component-dialog/new-component-dialog.component.js.map +1 -1
- package/dist/ComponentStudio/components/save-version-dialog/save-version-dialog.component.d.ts.map +1 -1
- package/dist/ComponentStudio/components/save-version-dialog/save-version-dialog.component.js +24 -35
- package/dist/ComponentStudio/components/save-version-dialog/save-version-dialog.component.js.map +1 -1
- package/dist/ComponentStudio/components/text-import-dialog.component.js +15 -17
- package/dist/ComponentStudio/components/text-import-dialog.component.js.map +1 -1
- package/dist/Credentials/components/credentials-categories-resource.component.js +7 -6
- package/dist/Credentials/components/credentials-categories-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-list-resource.component.js +6 -5
- package/dist/Credentials/components/credentials-list-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-types-resource.component.js +7 -6
- package/dist/Credentials/components/credentials-types-resource.component.js.map +1 -1
- package/dist/DashboardBrowser/dashboard-share-dialog.component.js +9 -9
- package/dist/DashboardBrowser/dashboard-share-dialog.component.js.map +1 -1
- package/dist/DataExplorer/data-explorer-dashboard.component.d.ts.map +1 -1
- package/dist/DataExplorer/data-explorer-dashboard.component.js +17 -17
- package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
- package/dist/Home/home-dashboard.component.js +4 -4
- package/dist/Home/home-dashboard.component.js.map +1 -1
- package/dist/Integration/components/activity/activity.component.d.ts.map +1 -1
- package/dist/Integration/components/activity/activity.component.js +1 -0
- package/dist/Integration/components/activity/activity.component.js.map +1 -1
- package/dist/Integration/components/connections/connections.component.d.ts.map +1 -1
- package/dist/Integration/components/connections/connections.component.js +5 -4
- package/dist/Integration/components/connections/connections.component.js.map +1 -1
- package/dist/Integration/components/mapping-workspace/mapping-workspace.component.d.ts.map +1 -1
- package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js +247 -259
- package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js.map +1 -1
- package/dist/Integration/components/overview/overview.component.d.ts.map +1 -1
- package/dist/Integration/components/overview/overview.component.js +1 -0
- package/dist/Integration/components/overview/overview.component.js.map +1 -1
- package/dist/Integration/components/pipelines/pipelines.component.d.ts.map +1 -1
- package/dist/Integration/components/pipelines/pipelines.component.js +1 -0
- package/dist/Integration/components/pipelines/pipelines.component.js.map +1 -1
- package/dist/Integration/components/schedules/schedules.component.d.ts.map +1 -1
- package/dist/Integration/components/schedules/schedules.component.js +1 -0
- package/dist/Integration/components/schedules/schedules.component.js.map +1 -1
- package/dist/Integration/components/widgets/integration-card.component.js +7 -9
- package/dist/Integration/components/widgets/integration-card.component.js.map +1 -1
- package/dist/Integration/integration.module.d.ts +6 -10
- package/dist/Integration/integration.module.d.ts.map +1 -1
- package/dist/Integration/integration.module.js +12 -20
- package/dist/Integration/integration.module.js.map +1 -1
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.d.ts +411 -0
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.d.ts.map +1 -0
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js +4266 -0
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js.map +1 -0
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.d.ts +140 -0
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.d.ts.map +1 -0
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js +780 -0
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js.map +1 -0
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.d.ts +8 -2
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.d.ts.map +1 -1
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js +246 -195
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.d.ts +75 -0
- package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.d.ts.map +1 -0
- package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js +601 -0
- package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js.map +1 -0
- package/dist/KnowledgeHub/components/search/knowledge-search-resource.component.d.ts +93 -12
- package/dist/KnowledgeHub/components/search/knowledge-search-resource.component.d.ts.map +1 -1
- package/dist/KnowledgeHub/components/search/knowledge-search-resource.component.js +637 -107
- package/dist/KnowledgeHub/components/search/knowledge-search-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/index.d.ts +3 -0
- package/dist/KnowledgeHub/index.d.ts.map +1 -1
- package/dist/KnowledgeHub/index.js +3 -0
- package/dist/KnowledgeHub/index.js.map +1 -1
- package/dist/Lists/components/lists-browse-resource.component.d.ts.map +1 -1
- package/dist/Lists/components/lists-browse-resource.component.js +9 -7
- package/dist/Lists/components/lists-browse-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-my-lists-resource.component.js +5 -4
- package/dist/Lists/components/lists-my-lists-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-operations-resource.component.js +10 -9
- package/dist/Lists/components/lists-operations-resource.component.js.map +1 -1
- package/dist/MCP/components/mcp-connection-dialog.component.js +141 -132
- package/dist/MCP/components/mcp-connection-dialog.component.js.map +1 -1
- package/dist/MCP/components/mcp-log-detail-panel.component.js +4 -4
- package/dist/MCP/components/mcp-log-detail-panel.component.js.map +1 -1
- package/dist/MCP/components/mcp-server-dialog.component.js +141 -128
- package/dist/MCP/components/mcp-server-dialog.component.js.map +1 -1
- package/dist/MCP/components/mcp-test-tool-dialog.component.js +210 -218
- package/dist/MCP/components/mcp-test-tool-dialog.component.js.map +1 -1
- package/dist/MCP/mcp-dashboard.component.js +2 -2
- package/dist/MCP/mcp-dashboard.component.js.map +1 -1
- package/dist/MCP/mcp.module.d.ts +6 -9
- package/dist/MCP/mcp.module.d.ts.map +1 -1
- package/dist/MCP/mcp.module.js +20 -22
- package/dist/MCP/mcp.module.js.map +1 -1
- package/dist/Scheduling/components/scheduling-activity.component.js +5 -4
- package/dist/Scheduling/components/scheduling-activity.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-jobs.component.js +6 -5
- package/dist/Scheduling/components/scheduling-jobs.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-overview.component.js +93 -92
- package/dist/Scheduling/components/scheduling-overview.component.js.map +1 -1
- package/dist/Testing/testing-dashboard.component.js +9 -10
- package/dist/Testing/testing-dashboard.component.js.map +1 -1
- package/dist/__tests__/analytics-resource.test.d.ts +2 -0
- package/dist/__tests__/analytics-resource.test.d.ts.map +1 -0
- package/dist/__tests__/analytics-resource.test.js +181 -0
- package/dist/__tests__/analytics-resource.test.js.map +1 -0
- package/dist/__tests__/scheduling.test.d.ts +2 -0
- package/dist/__tests__/scheduling.test.d.ts.map +1 -0
- package/dist/__tests__/scheduling.test.js +205 -0
- package/dist/__tests__/scheduling.test.js.map +1 -0
- package/dist/actions-dashboards.module.d.ts +8 -13
- package/dist/actions-dashboards.module.d.ts.map +1 -1
- package/dist/actions-dashboards.module.js +6 -27
- package/dist/actions-dashboards.module.js.map +1 -1
- package/dist/ai-dashboards.module.d.ts +20 -20
- package/dist/ai-dashboards.module.d.ts.map +1 -1
- package/dist/ai-dashboards.module.js +43 -44
- package/dist/ai-dashboards.module.js.map +1 -1
- package/dist/communication-dashboards.module.d.ts +4 -8
- package/dist/communication-dashboards.module.d.ts.map +1 -1
- package/dist/communication-dashboards.module.js +0 -19
- package/dist/communication-dashboards.module.js.map +1 -1
- package/dist/component-studio-dashboards.module.d.ts +7 -11
- package/dist/component-studio-dashboards.module.d.ts.map +1 -1
- package/dist/component-studio-dashboards.module.js +22 -34
- package/dist/component-studio-dashboards.module.js.map +1 -1
- package/dist/core-dashboards.module.d.ts +12 -18
- package/dist/core-dashboards.module.d.ts.map +1 -1
- package/dist/core-dashboards.module.js +15 -31
- package/dist/core-dashboards.module.js.map +1 -1
- package/dist/credentials-dashboards.module.d.ts +5 -8
- package/dist/credentials-dashboards.module.d.ts.map +1 -1
- package/dist/credentials-dashboards.module.js +3 -19
- package/dist/credentials-dashboards.module.js.map +1 -1
- package/dist/data-explorer-dashboards.module.d.ts +7 -13
- package/dist/data-explorer-dashboards.module.d.ts.map +1 -1
- package/dist/data-explorer-dashboards.module.js +0 -27
- package/dist/data-explorer-dashboards.module.js.map +1 -1
- package/dist/lists-dashboards.module.d.ts +5 -8
- package/dist/lists-dashboards.module.d.ts.map +1 -1
- package/dist/lists-dashboards.module.js +3 -19
- package/dist/lists-dashboards.module.js.map +1 -1
- package/dist/public-api.d.ts +2 -0
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +2 -0
- package/dist/public-api.js.map +1 -1
- package/dist/scheduling-dashboards.module.d.ts +6 -10
- package/dist/scheduling-dashboards.module.d.ts.map +1 -1
- package/dist/scheduling-dashboards.module.js +3 -23
- package/dist/scheduling-dashboards.module.js.map +1 -1
- package/dist/shared/entity-field-display.d.ts +44 -0
- package/dist/shared/entity-field-display.d.ts.map +1 -0
- package/dist/shared/entity-field-display.js +118 -0
- package/dist/shared/entity-field-display.js.map +1 -0
- package/dist/testing-dashboards.module.d.ts +7 -13
- package/dist/testing-dashboards.module.d.ts.map +1 -1
- package/dist/testing-dashboards.module.js +0 -27
- package/dist/testing-dashboards.module.js.map +1 -1
- package/package.json +48 -55
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"knowledge-search-resource.component.js","sourceRoot":"","sources":["../../../../src/KnowledgeHub/components/search/knowledge-search-resource.component.ts","../../../../src/KnowledgeHub/components/search/knowledge-search-resource.component.html"],"names":[],"mappings":"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","sourcesContent":["/**\n * @fileoverview Knowledge Hub Search Dashboard (Task 2)\n *\n * Google-style clean search experience with centered search bar,\n * grouped results, faceted sidebar filters, and \"Ask Knowledge Agent\" CTA.\n * Registered as BaseResourceComponent for the Knowledge Hub app.\n */\n\nimport { Component, ChangeDetectorRef, OnDestroy, AfterViewInit, inject, Injector } from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { CompositeKey, Metadata } from '@memberjunction/core';\nimport { ResourceData } from '@memberjunction/core-entities';\nimport { RegisterClass } from '@memberjunction/global';\nimport { BaseResourceComponent, NavigationService } from '@memberjunction/ng-shared';\nimport {\n SearchResultItem,\n SearchResultGroup,\n SearchFilter,\n SearchRequest,\n SearchResponse,\n SearchResultSelectedEvent,\n SearchFilterChangeEvent\n} from '@memberjunction/ng-search';\nimport { SearchService, RecentSearch } from '@memberjunction/ng-search';\nimport { ConversationBridgeService } from '@memberjunction/ng-conversations';\n\n/** Saved search entry */\ninterface SavedSearch {\n Query: string;\n FilterCount: number;\n SavedAt: Date;\n}\n\n@RegisterClass(BaseResourceComponent, 'KnowledgeSearchResource')\n@Component({\n standalone: false,\n selector: 'app-knowledge-search-resource',\n templateUrl: './knowledge-search-resource.component.html',\n styleUrls: ['./knowledge-search-resource.component.css']\n})\nexport class KnowledgeSearchResourceComponent extends BaseResourceComponent implements AfterViewInit, OnDestroy {\n private cdr = inject(ChangeDetectorRef);\n private searchService = inject(SearchService);\n private injector = inject(Injector);\n private navigationService = inject(NavigationService);\n private destroy$ = new Subject<void>();\n\n // --- State ---\n public Query = '';\n public IsSearching = false;\n public HasSearched = false;\n public ShowFilters = false;\n public ShowResultDetail = false;\n public DetailResult: SearchResultItem | null = null;\n\n // --- Results ---\n public AllResults: SearchResultItem[] = [];\n public ResultGroups: SearchResultGroup[] = [];\n public Filters: SearchFilter[] = [];\n public ActiveFilters: Record<string, string[]> = {};\n public TotalCount = 0;\n public ElapsedMs = 0;\n /** Minimum relevance score threshold (0-1). Results below this are hidden. */\n public MinScoreThreshold = 0.35;\n\n // --- Recent & Saved ---\n public RecentSearches: RecentSearch[] = [];\n public SavedSearches: SavedSearch[] = [];\n\n async GetResourceDisplayName(_data: ResourceData): Promise<string> {\n return 'Knowledge Search';\n }\n\n async GetResourceIconClass(_data: ResourceData): Promise<string> {\n return 'fa-solid fa-magnifying-glass';\n }\n\n ngAfterViewInit(): void {\n this.subscribeToSearchState();\n this.parseUrlParameters();\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n /** Execute a search query */\n public async RunSearch(): Promise<void> {\n const query = this.Query.trim();\n if (!query) return;\n\n const request: SearchRequest = {\n Query: query,\n MaxResults: 50,\n ActiveFilters: this.ActiveFilters,\n IncludeSources: ['vector', 'fulltext', 'entity'],\n MinScore: this.MinScoreThreshold,\n };\n\n const response = await this.searchService.ExecuteSearch(request);\n this.applySearchResponse(response);\n }\n\n /** Handle pressing Enter in the search box */\n public OnSearchKeydown(event: KeyboardEvent): void {\n if (event.key === 'Enter') {\n event.preventDefault();\n this.RunSearch();\n }\n }\n\n /** Handle selecting a result */\n public OnResultSelected(event: SearchResultSelectedEvent): void {\n this.DetailResult = event.Result;\n this.ShowResultDetail = true;\n this.cdr.detectChanges();\n }\n\n /** Handle \"Open Record\" — navigate to the entity record via NavigationService */\n public OnOpenRecord(event: { EntityName: string; RecordID: string }): void {\n const md = new Metadata();\n const entityInfo = md.Entities.find(e => e.Name === event.EntityName);\n const pkey = new CompositeKey();\n if (entityInfo) {\n pkey.LoadFromURLSegment(entityInfo, event.RecordID);\n } else {\n // Fallback: treat as simple single-field PK\n pkey.KeyValuePairs = [{ FieldName: 'ID', Value: event.RecordID }];\n }\n this.navigationService.OpenEntityRecord(event.EntityName, pkey);\n }\n\n /** Close the result detail view */\n public CloseResultDetail(): void {\n this.ShowResultDetail = false;\n this.DetailResult = null;\n this.cdr.detectChanges();\n }\n\n /** Toggle the filter sidebar */\n public ToggleFilters(): void {\n this.ShowFilters = !this.ShowFilters;\n this.cdr.detectChanges();\n }\n\n /** Handle a filter change from the filter component */\n public OnFilterChanged(event: SearchFilterChangeEvent): void {\n this.ActiveFilters[event.Category] = event.SelectedValues;\n this.RunSearch();\n }\n\n /** Handle clearing all filters */\n public OnFiltersCleared(): void {\n this.ActiveFilters = {};\n this.MinScoreThreshold = 0.35;\n this.RunSearch();\n }\n\n /** Handle relevance threshold slider change */\n public OnThresholdChanged(value: number): void {\n this.MinScoreThreshold = value;\n this.RunSearch();\n }\n\n /** Open the chat overlay with Knowledge Agent context */\n public OnAskAgent(): void {\n try {\n const bridge = this.injector.get(ConversationBridgeService, null);\n if (bridge) {\n bridge.SwitchToOverlay(null);\n } else {\n console.warn('[KnowledgeSearch] ConversationBridgeService not available');\n }\n } catch {\n console.warn('[KnowledgeSearch] ConversationBridgeService not available');\n }\n }\n\n /** Apply a recent search */\n public ApplyRecentSearch(recent: RecentSearch): void {\n this.Query = recent.Query;\n this.RunSearch();\n }\n\n /** Clear the current search */\n public ClearSearch(): void {\n this.Query = '';\n this.AllResults = [];\n this.ResultGroups = [];\n this.Filters = [];\n this.ActiveFilters = {};\n this.TotalCount = 0;\n this.HasSearched = false;\n this.ShowFilters = false;\n this.cdr.detectChanges();\n }\n\n /** Check if any filters are active */\n public HasActiveFilters(): boolean {\n return Object.values(this.ActiveFilters).some(v => v.length > 0);\n }\n\n // --- Private Methods ---\n\n /** Parse URL parameters for deep links (e.g., ?conversationId=xxx or ?q=search+term) */\n private parseUrlParameters(): void {\n try {\n const urlParams = new URLSearchParams(window.location.search);\n const conversationId = urlParams.get('conversationId');\n if (conversationId) {\n // Deep link to conversation - open the agent chat\n this.OnAskAgent();\n }\n\n const searchQuery = urlParams.get('q');\n if (searchQuery) {\n this.Query = searchQuery;\n this.RunSearch();\n }\n } catch {\n // Ignore URL parsing errors\n }\n }\n\n private subscribeToSearchState(): void {\n this.searchService.IsSearching$\n .pipe(takeUntil(this.destroy$))\n .subscribe((val: boolean) => {\n this.IsSearching = val;\n this.cdr.detectChanges();\n });\n\n this.searchService.RecentSearches$\n .pipe(takeUntil(this.destroy$))\n .subscribe((val: RecentSearch[]) => {\n this.RecentSearches = val;\n this.cdr.detectChanges();\n });\n }\n\n private applySearchResponse(response: SearchResponse): void {\n this.AllResults = response.Results;\n this.ResultGroups = response.Groups;\n this.Filters = response.Filters;\n this.TotalCount = response.TotalCount;\n this.ElapsedMs = response.ElapsedMs;\n this.HasSearched = true;\n this.ShowFilters = response.Filters.length > 0;\n this.cdr.detectChanges();\n }\n}\n\n/** Tree-shaking prevention */\nexport function LoadKnowledgeSearchResource(): void {\n // Prevents tree-shaking of the component\n}\n","@if (!ShowResultDetail) {\n <div class=\"search-page\" [class.search-page-has-results]=\"HasSearched\">\n <!-- Search Hero Section -->\n <div class=\"search-hero\" [class.search-hero-compact]=\"HasSearched\">\n @if (!HasSearched) {\n <div class=\"search-logo\">\n <i class=\"fa-solid fa-brain\"></i>\n Knowledge Hub\n </div>\n <p class=\"search-subtitle\">Search across all your knowledge -- entities, documents, content, and more</p>\n }\n\n <!-- Search Bar -->\n <div class=\"search-container\">\n <div class=\"search-box\">\n <i class=\"fa-solid fa-magnifying-glass search-box-icon\"></i>\n <input\n type=\"text\"\n class=\"search-box-input\"\n placeholder=\"Search across all your knowledge...\"\n [(ngModel)]=\"Query\"\n (keydown)=\"OnSearchKeydown($event)\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n />\n @if (Query.length > 0) {\n <button class=\"search-clear-btn\" (click)=\"ClearSearch()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n }\n <button class=\"search-submit-btn\" (click)=\"RunSearch()\" [disabled]=\"IsSearching || !Query.trim()\">\n @if (IsSearching) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n } @else {\n Search\n }\n </button>\n </div>\n\n <!-- Quick filters row -->\n @if (!HasSearched) {\n <div class=\"search-quick-actions\">\n <button class=\"quick-action-btn\" (click)=\"OnAskAgent()\">\n <i class=\"fa-solid fa-robot\"></i>\n Ask Knowledge Agent\n </button>\n </div>\n }\n </div>\n </div>\n\n @if (HasSearched) {\n <!-- Results Area -->\n <div class=\"search-results-layout\">\n <!-- Sidebar Filters -->\n @if (ShowFilters && Filters.length > 0) {\n <aside class=\"search-sidebar\">\n <mj-search-filter\n [Filters]=\"Filters\"\n [ActiveFilters]=\"ActiveFilters\"\n (FilterChanged)=\"OnFilterChanged($event)\"\n (FiltersCleared)=\"OnFiltersCleared()\"\n ></mj-search-filter>\n\n <!-- Relevance Threshold Slider -->\n <div class=\"threshold-section\">\n <label class=\"threshold-label\">\n Min Relevance\n <span class=\"threshold-value\">{{ (MinScoreThreshold * 100) | number:'1.0-0' }}%</span>\n </label>\n <input\n type=\"range\"\n class=\"threshold-slider\"\n [min]=\"0\"\n [max]=\"100\"\n [step]=\"5\"\n [value]=\"MinScoreThreshold * 100\"\n (input)=\"OnThresholdChanged($any($event.target).value / 100)\"\n />\n <div class=\"threshold-range-labels\">\n <span>All</span>\n <span>Strict</span>\n </div>\n </div>\n </aside>\n }\n\n <!-- Results Main -->\n <div class=\"search-results-main\">\n <!-- Results Header -->\n <div class=\"search-results-header\">\n <span class=\"search-results-count\">\n {{ TotalCount }} results\n @if (ElapsedMs > 0) {\n <span class=\"search-results-time\">in {{ ElapsedMs }}ms</span>\n }\n </span>\n <div class=\"search-results-actions\">\n @if (Filters.length > 0) {\n <button class=\"toggle-filters-btn\" (click)=\"ToggleFilters()\">\n <i class=\"fa-solid fa-filter\"></i>\n @if (HasActiveFilters()) {\n Filters Active\n } @else {\n Filters\n }\n </button>\n }\n </div>\n </div>\n\n <!-- Results List -->\n <mj-search-results\n [ResultGroups]=\"ResultGroups\"\n [IsLoading]=\"IsSearching\"\n [TotalCount]=\"TotalCount\"\n [ElapsedMs]=\"ElapsedMs\"\n (ResultSelected)=\"OnResultSelected($event)\"\n (OpenRecordRequested)=\"OnOpenRecord($event)\"\n ></mj-search-results>\n\n <!-- Agent CTA at bottom -->\n @if (TotalCount === 0 && !IsSearching) {\n <div class=\"search-agent-cta\">\n <i class=\"fa-solid fa-robot cta-icon\"></i>\n <div class=\"cta-text\">\n <strong>Can't find what you're looking for?</strong>\n <p>Ask the Knowledge Agent for a deeper analysis</p>\n </div>\n <button class=\"cta-btn\" (click)=\"OnAskAgent()\">\n Ask Agent\n </button>\n </div>\n }\n </div>\n </div>\n } @else if (!IsSearching) {\n <!-- Empty state: recent searches -->\n <div class=\"search-recent-area\">\n @if (RecentSearches.length > 0) {\n <h3 class=\"recent-title\">Recent Searches</h3>\n <div class=\"recent-list\">\n @for (recent of RecentSearches; track recent.Query; let i = $index) {\n @if (i < 8) {\n <div class=\"recent-item\" (click)=\"ApplyRecentSearch(recent)\">\n <i class=\"fa-solid fa-clock recent-icon\"></i>\n <span class=\"recent-query\">{{ recent.Query }}</span>\n <span class=\"recent-count\">{{ recent.ResultCount }} results</span>\n </div>\n }\n }\n </div>\n }\n </div>\n }\n </div>\n} @else {\n <!-- Result Detail View (Task 8) -->\n <app-search-result-detail\n [Result]=\"DetailResult\"\n (BackClicked)=\"CloseResultDetail()\"\n (NavigateToRecord)=\"OnOpenRecord($event)\"\n ></app-search-result-detail>\n}\n"]}
|
|
1
|
+
{"version":3,"file":"knowledge-search-resource.component.js","sourceRoot":"","sources":["../../../../src/KnowledgeHub/components/search/knowledge-search-resource.component.ts","../../../../src/KnowledgeHub/components/search/knowledge-search-resource.component.html"],"names":[],"mappings":"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","sourcesContent":["/**\n * @fileoverview Knowledge Hub Search Dashboard (Task 2)\n *\n * Google-style clean search experience with centered search bar,\n * grouped results, faceted sidebar filters, and \"Ask Knowledge Agent\" CTA.\n * Registered as BaseResourceComponent for the Knowledge Hub app.\n */\n\nimport { Component, ChangeDetectorRef, OnDestroy, AfterViewInit, inject, Injector } from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { CompositeKey, Metadata, RunView } from '@memberjunction/core';\nimport { MJKnowledgeHubSavedSearchEntity, ResourceData, UserInfoEngine } from '@memberjunction/core-entities';\nimport { RegisterClass, UUIDsEqual } from '@memberjunction/global';\nimport { BaseResourceComponent, NavigationService } from '@memberjunction/ng-shared';\nimport {\n SearchResultItem,\n SearchResultGroup,\n SearchFilter,\n SearchRequest,\n SearchResponse,\n SearchResultSelectedEvent,\n SearchFilterChangeEvent\n} from '@memberjunction/ng-search';\nimport { SearchService, RecentSearch } from '@memberjunction/ng-search';\nimport { ConversationBridgeService } from '@memberjunction/ng-conversations';\n\n@RegisterClass(BaseResourceComponent, 'KnowledgeSearchResource')\n@Component({\n standalone: false,\n selector: 'app-knowledge-search-resource',\n templateUrl: './knowledge-search-resource.component.html',\n styleUrls: ['./knowledge-search-resource.component.css']\n})\nexport class KnowledgeSearchResourceComponent extends BaseResourceComponent implements AfterViewInit, OnDestroy {\n private cdr = inject(ChangeDetectorRef);\n private searchService = inject(SearchService);\n private injector = inject(Injector);\n private navigationService = inject(NavigationService);\n private destroy$ = new Subject<void>();\n\n // --- State ---\n public Query = '';\n public IsSearching = false;\n public HasSearched = false;\n public ShowFilters = false;\n public ShowResultDetail = false;\n public DetailResult: SearchResultItem | null = null;\n\n // --- Results ---\n public AllResults: SearchResultItem[] = [];\n public ResultGroups: SearchResultGroup[] = [];\n public Filters: SearchFilter[] = [];\n public ActiveFilters: Record<string, string[]> = {};\n public TotalCount = 0;\n public ElapsedMs = 0;\n /** Minimum relevance score threshold (0-1). Results below this are hidden. */\n public MinScoreThreshold = 0.35;\n\n /**\n * The minimum relevance threshold that was last sent to the server.\n * When the slider moves above this, we filter client-side.\n * When it moves below, we must re-fetch from the server.\n */\n public ServerMinRelevance = 0.35;\n\n /** Count of server-side results before any client-side filtering */\n public ServerResultCount = 0;\n\n // --- Recent & Saved ---\n public RecentSearches: RecentSearch[] = [];\n public SavedSearches: MJKnowledgeHubSavedSearchEntity[] = [];\n\n /** Popular tags for \"Filter by Tag\" preset buttons, sized by relative frequency */\n public PopularTags: { Name: string; Count: number; FontSize: number }[] = [];\n\n // --- Save Search Dialog ---\n public ShowSaveDialog = false;\n public SaveSearchName = '';\n\n async GetResourceDisplayName(_data: ResourceData): Promise<string> {\n return 'Knowledge Search';\n }\n\n async GetResourceIconClass(_data: ResourceData): Promise<string> {\n return 'fa-solid fa-magnifying-glass';\n }\n\n async ngAfterViewInit(): Promise<void> {\n await UserInfoEngine.Instance.Config(false);\n this.LoadSearchPreferences();\n this.subscribeToSearchState();\n this.parseUrlParameters();\n this.registerAgentTools();\n this.emitAgentContext();\n this.loadSavedSearches();\n this.loadPopularTags();\n this.NotifyLoadComplete();\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n /** Report current search state to the agent via NavigationService */\n private emitAgentContext(): void {\n this.navigationService.SetAgentContext(this, {\n CurrentQuery: this.Query || null,\n ResultCount: this.TotalCount,\n ElapsedMs: this.ElapsedMs,\n HasSearched: this.HasSearched,\n ShowFilters: this.ShowFilters,\n MinScoreThreshold: this.MinScoreThreshold,\n ActiveFilterCount: this.GetActiveFilterCount(),\n TopResults: this.AllResults.slice(0, 5).map(r => ({\n Title: r.Title,\n EntityName: r.EntityName,\n Score: Math.round(r.Score * 100),\n })),\n });\n }\n\n /** Register client tools the agent can invoke on this dashboard */\n private registerAgentTools(): void {\n this.navigationService.SetAgentClientTools(this, [\n {\n Name: 'RunKnowledgeSearch',\n Description: 'Execute a knowledge search query across all indexed content',\n ParameterSchema: {\n type: 'object',\n properties: {\n query: { type: 'string', description: 'The search query text' },\n minScore: { type: 'number', description: 'Minimum relevance score 0-1 (default 0.35)' },\n },\n required: ['query'],\n },\n Handler: async (params: Record<string, unknown>) => {\n this.Query = String(params['query'] ?? '');\n if (params['minScore'] != null) this.MinScoreThreshold = Number(params['minScore']);\n await this.RunSearch();\n return { Success: true, Data: { ResultCount: this.TotalCount, ElapsedMs: this.ElapsedMs } };\n },\n },\n {\n Name: 'ClearKnowledgeSearch',\n Description: 'Clear the current search query and results',\n ParameterSchema: { type: 'object', properties: {} },\n Handler: async () => {\n this.ClearSearch();\n return { Success: true };\n },\n },\n {\n Name: 'ToggleSearchFilters',\n Description: 'Show or hide the search filter panel',\n ParameterSchema: { type: 'object', properties: {} },\n Handler: async () => {\n this.ToggleFilters();\n return { Success: true, Data: { ShowFilters: this.ShowFilters } };\n },\n },\n ]);\n }\n\n /** Execute a search query */\n public async RunSearch(): Promise<void> {\n const query = this.Query.trim();\n if (!query) return;\n\n this.ServerMinRelevance = this.MinScoreThreshold;\n\n const request: SearchRequest = {\n Query: query,\n MaxResults: 50,\n ActiveFilters: this.ActiveFilters,\n IncludeSources: ['vector', 'fulltext', 'entity'],\n MinScore: this.MinScoreThreshold,\n };\n\n const response = await this.searchService.ExecuteSearch(request);\n this.applySearchResponse(response);\n }\n\n /** Handle pressing Enter in the search box */\n public OnSearchKeydown(event: KeyboardEvent): void {\n if (event.key === 'Enter') {\n event.preventDefault();\n this.RunSearch();\n }\n }\n\n /** Handle selecting a result */\n public OnResultSelected(event: SearchResultSelectedEvent): void {\n this.DetailResult = event.Result;\n this.ShowResultDetail = true;\n this.cdr.detectChanges();\n }\n\n /** Handle \"Open Record\" — navigate to the entity record via NavigationService */\n public OnOpenRecord(event: { EntityName: string; RecordID: string }): void {\n const md = new Metadata();\n const entityInfo = md.Entities.find(e => e.Name === event.EntityName);\n const pkey = new CompositeKey();\n if (entityInfo) {\n pkey.LoadFromURLSegment(entityInfo, event.RecordID);\n } else {\n // Fallback: treat as simple single-field PK\n pkey.KeyValuePairs = [{ FieldName: 'ID', Value: event.RecordID }];\n }\n this.navigationService.OpenEntityRecord(event.EntityName, pkey);\n }\n\n /** Close the result detail view */\n public CloseResultDetail(): void {\n this.ShowResultDetail = false;\n this.DetailResult = null;\n this.cdr.detectChanges();\n }\n\n /** Toggle the filter sidebar */\n public ToggleFilters(): void {\n this.ShowFilters = !this.ShowFilters;\n this.PersistSearchPreferences();\n this.cdr.detectChanges();\n }\n\n /**\n * Handle a filter change from the filter component.\n * Uses client-side filtering on the cached full result set — no server re-query.\n */\n public OnFilterChanged(event: SearchFilterChangeEvent): void {\n this.ActiveFilters[event.Category] = event.SelectedValues;\n this.applyClientSideFilters();\n this.PersistSearchPreferences();\n }\n\n /** Handle clearing all filters */\n public OnFiltersCleared(): void {\n this.ActiveFilters = {};\n this.MinScoreThreshold = 0.35;\n this.applyClientSideFilters();\n this.PersistSearchPreferences();\n }\n\n /**\n * Handle relevance threshold slider change.\n * - Moving UP (narrowing): filter client-side from cached server results.\n * - Moving DOWN past ServerMinRelevance (widening): re-fetch from server.\n */\n public OnThresholdChanged(value: number): void {\n this.MinScoreThreshold = value;\n if (value >= this.ServerMinRelevance) {\n // Narrowing — client-side filter is sufficient\n this.applyClientSideFilters();\n } else {\n // Widening past what the server returned — need fresh data\n this.RunSearchWithThreshold(value);\n }\n }\n\n /**\n * Re-fetch from the server with a new minimum relevance threshold,\n * then update the server baseline so future narrowing stays client-side.\n */\n private async RunSearchWithThreshold(threshold: number): Promise<void> {\n const query = this.Query.trim();\n if (!query) return;\n\n const request: SearchRequest = {\n Query: query,\n MaxResults: 50,\n ActiveFilters: this.ActiveFilters,\n IncludeSources: ['vector', 'fulltext', 'entity'],\n MinScore: threshold,\n };\n\n const response = await this.searchService.ExecuteSearch(request);\n this.ServerMinRelevance = threshold;\n this.applySearchResponse(response);\n }\n\n /** Toggle select all / unselect all for a filter category (Kayak-style) */\n public ToggleSelectAll(category: string): void {\n const filter = this.Filters.find(f => f.Category === category);\n if (!filter) return;\n\n const currentSelection = this.ActiveFilters[category] ?? [];\n if (currentSelection.length === filter.Options.length) {\n // All selected → unselect all\n this.ActiveFilters[category] = [];\n } else {\n // Some or none selected → select all\n this.ActiveFilters[category] = filter.Options.map(o => o.Value);\n }\n this.applyClientSideFilters();\n }\n\n /** Check if all options in a category are selected */\n public IsAllSelected(category: string): boolean {\n const filter = this.Filters.find(f => f.Category === category);\n if (!filter) return false;\n const selection = this.ActiveFilters[category] ?? [];\n return selection.length === filter.Options.length;\n }\n\n /** Open the chat overlay with Knowledge Agent context */\n public OnAskAgent(): void {\n try {\n const bridge = this.injector.get(ConversationBridgeService, null);\n if (bridge) {\n bridge.SwitchToOverlay(null);\n } else {\n console.warn('[KnowledgeSearch] ConversationBridgeService not available');\n }\n } catch {\n console.warn('[KnowledgeSearch] ConversationBridgeService not available');\n }\n }\n\n /**\n * Handle \"See Similar Items\" — re-runs the search using the result's title as the query.\n * This provides a lightweight \"more like this\" experience without needing raw vector access.\n */\n public OnMoreLikeThis(result: SearchResultItem): void {\n this.ActiveFilters = {};\n this.Query = result.RecordName ?? result.Title;\n this.RunSearch();\n }\n\n /** Apply a recent search */\n public ApplyRecentSearch(recent: RecentSearch): void {\n this.Query = recent.Query;\n this.RunSearch();\n }\n\n // --- Saved Searches ---\n\n /** Open the save search dialog */\n public OpenSaveDialog(): void {\n this.SaveSearchName = this.Query;\n this.ShowSaveDialog = true;\n this.cdr.detectChanges();\n }\n\n /** Cancel the save dialog */\n public CancelSaveDialog(): void {\n this.ShowSaveDialog = false;\n this.SaveSearchName = '';\n this.cdr.detectChanges();\n }\n\n /**\n * Save the current search as a named saved search using MJKnowledgeHubSavedSearchEntity.\n * Persists query, active filters, min score, and max results.\n */\n public async ConfirmSaveSearch(): Promise<void> {\n const name = this.SaveSearchName.trim();\n if (!name || !this.Query.trim()) return;\n\n try {\n const md = new Metadata();\n const entity = await md.GetEntityObject<MJKnowledgeHubSavedSearchEntity>('MJ: Knowledge Hub Saved Searches');\n entity.Name = name;\n entity.Query = this.Query;\n entity.Filters = Object.keys(this.ActiveFilters).length > 0\n ? JSON.stringify(this.ActiveFilters)\n : null;\n entity.MinScore = this.MinScoreThreshold > 0 ? this.MinScoreThreshold : null;\n entity.MaxResults = 50;\n entity.NotifyOnNewResults = false;\n\n const saved = await entity.Save();\n if (saved) {\n this.SavedSearches = [entity, ...this.SavedSearches];\n }\n } catch (error) {\n console.error('[KnowledgeSearch] Failed to save search:', error);\n }\n\n this.ShowSaveDialog = false;\n this.SaveSearchName = '';\n this.cdr.detectChanges();\n }\n\n /**\n * Apply a saved search — populates query, filters, and threshold, then executes.\n */\n public ApplySavedSearch(saved: MJKnowledgeHubSavedSearchEntity): void {\n this.Query = saved.Query;\n if (saved.Filters) {\n try {\n this.ActiveFilters = JSON.parse(saved.Filters) as Record<string, string[]>;\n } catch {\n this.ActiveFilters = {};\n }\n } else {\n this.ActiveFilters = {};\n }\n if (saved.MinScore != null) {\n this.MinScoreThreshold = saved.MinScore;\n }\n this.RunSearch();\n }\n\n /**\n * Delete a saved search by ID and remove it from the local list.\n */\n public async DeleteSavedSearch(saved: MJKnowledgeHubSavedSearchEntity, event: MouseEvent): Promise<void> {\n event.stopPropagation();\n try {\n const success = await saved.Delete();\n if (success) {\n this.SavedSearches = this.SavedSearches.filter(s => !UUIDsEqual(s.ID, saved.ID));\n this.cdr.detectChanges();\n }\n } catch (error) {\n console.error('[KnowledgeSearch] Failed to delete saved search:', error);\n }\n }\n\n /**\n * Search by a popular tag: sets the query text and runs a search.\n * Does NOT add a sticky filter — just a simple text search.\n */\n public FilterByTag(tagName: string): void {\n this.Query = tagName;\n this.RunSearch();\n }\n\n /** Clear the current search */\n public ClearSearch(): void {\n this.Query = '';\n this.AllResults = [];\n this.ResultGroups = [];\n this.Filters = [];\n this.ActiveFilters = {};\n this.TotalCount = 0;\n this.ServerResultCount = 0;\n this.ServerMinRelevance = 0.35;\n this.HasSearched = false;\n this.ShowFilters = false;\n this.cdr.detectChanges();\n }\n\n /** Check if any filters are active */\n public HasActiveFilters(): boolean {\n return Object.values(this.ActiveFilters).some(v => v.length > 0);\n }\n\n public GetActiveFilterCount(): number {\n return Object.values(this.ActiveFilters).reduce((sum, v) => sum + v.length, 0);\n }\n\n // --- Private Methods ---\n\n /** Parse URL parameters for deep links (e.g., ?conversationId=xxx or ?q=search+term) */\n private parseUrlParameters(): void {\n try {\n const urlParams = new URLSearchParams(window.location.search);\n const conversationId = urlParams.get('conversationId');\n if (conversationId) {\n // Deep link to conversation - open the agent chat\n this.OnAskAgent();\n }\n\n const searchQuery = urlParams.get('q');\n if (searchQuery) {\n this.Query = searchQuery;\n this.RunSearch();\n }\n } catch {\n // Ignore URL parsing errors\n }\n }\n\n /**\n * Load saved searches for the current user from the database.\n * Runs in the background — does not block initialization.\n */\n private async loadSavedSearches(): Promise<void> {\n try {\n const rv = new RunView();\n const result = await rv.RunView<MJKnowledgeHubSavedSearchEntity>({\n EntityName: 'MJ: Knowledge Hub Saved Searches',\n OrderBy: '__mj_CreatedAt DESC',\n MaxRows: 50,\n ResultType: 'entity_object'\n });\n if (result.Success) {\n this.SavedSearches = result.Results;\n this.cdr.detectChanges();\n }\n } catch (error) {\n console.error('[KnowledgeSearch] Failed to load saved searches:', error);\n }\n }\n\n /**\n * Load the top 10 most-used tags for the \"Filter by Tag\" preset buttons.\n * Loads TaggedItems (TagID only), aggregates counts client-side, resolves\n * display names from Tags, then sizes each tag by relative frequency.\n * Font sizes range from 0.8rem (least used in top 10) to 1.3rem (most used).\n */\n private async loadPopularTags(): Promise<void> {\n try {\n const rv = new RunView();\n const [taggedResult, tagResult] = await rv.RunViews([\n {\n EntityName: 'MJ: Tagged Items',\n Fields: ['TagID'],\n ResultType: 'simple'\n },\n {\n EntityName: 'MJ: Tags',\n Fields: ['ID', 'DisplayName'],\n ResultType: 'simple'\n }\n ]);\n\n if (!taggedResult.Success || !tagResult.Success) return;\n\n // Count occurrences per TagID\n const counts = new Map<string, number>();\n for (const row of taggedResult.Results as { TagID: string }[]) {\n counts.set(row.TagID, (counts.get(row.TagID) ?? 0) + 1);\n }\n\n // Build name lookup\n const tagNames = new Map<string, string>();\n for (const row of tagResult.Results as { ID: string; DisplayName: string }[]) {\n tagNames.set(row.ID, row.DisplayName);\n }\n\n // Sort by count descending, take top 10\n const sorted = [...counts.entries()]\n .sort((a, b) => b[1] - a[1])\n .slice(0, 10);\n\n if (sorted.length === 0) return;\n\n const maxCount = sorted[0][1];\n const minCount = sorted[sorted.length - 1][1];\n const range = maxCount - minCount || 1;\n const minFont = 0.8;\n const maxFont = 1.3;\n\n this.PopularTags = sorted\n .map(([tagID, count]) => ({\n Name: tagNames.get(tagID) ?? '',\n Count: count,\n FontSize: minFont + ((count - minCount) / range) * (maxFont - minFont)\n }))\n .filter(t => t.Name.length > 0);\n\n this.cdr.detectChanges();\n } catch {\n // Non-critical — tags are a convenience, not a blocker\n }\n }\n\n private subscribeToSearchState(): void {\n this.searchService.IsSearching$\n .pipe(takeUntil(this.destroy$))\n .subscribe((val: boolean) => {\n this.IsSearching = val;\n this.cdr.detectChanges();\n });\n\n this.searchService.RecentSearches$\n .pipe(takeUntil(this.destroy$))\n .subscribe((val: RecentSearch[]) => {\n this.RecentSearches = val;\n this.cdr.detectChanges();\n });\n }\n\n /** Full unfiltered result set from the last server query */\n private cachedFullResults: SearchResultItem[] = [];\n\n /**\n * Apply filters client-side on the cached full result set.\n * This avoids re-querying the server when entity/tag checkboxes change.\n */\n private applyClientSideFilters(): void {\n let filtered = [...this.cachedFullResults];\n\n // Apply entity filter\n const entityFilter = this.ActiveFilters['Entity'];\n if (entityFilter?.length > 0) {\n filtered = filtered.filter(r => entityFilter.includes(r.EntityName));\n }\n\n // Apply tag filter\n const tagFilter = this.ActiveFilters['Tags'];\n if (tagFilter?.length > 0) {\n filtered = filtered.filter(r =>\n r.Tags?.some(t => tagFilter.includes(t))\n );\n }\n\n // Apply score threshold\n if (this.MinScoreThreshold > 0) {\n filtered = filtered.filter(r => r.Score >= this.MinScoreThreshold);\n }\n\n // Rebuild groups and update counts\n this.AllResults = filtered;\n this.ResultGroups = this.searchService.GroupResults(filtered);\n this.TotalCount = filtered.length;\n\n // SR-3 fix: Build filters from FULL result set so options don't disappear\n // when a filter is checked. Counts reflect the filtered results for context.\n this.Filters = this.searchService.BuildFilters(this.cachedFullResults);\n // Remove Source Type filter — it confuses users\n this.Filters = this.Filters.filter(f => f.Category !== 'Source Type');\n\n this.cdr.detectChanges();\n this.emitAgentContext();\n }\n\n private static readonly PREFS_KEY = 'KH_Search_Preferences';\n\n /** Persist user search preferences via UserInfoEngine */\n private PersistSearchPreferences(): void {\n const prefs = JSON.stringify({\n ShowFilters: this.ShowFilters,\n MinScoreThreshold: this.MinScoreThreshold,\n });\n UserInfoEngine.Instance.SetSettingDebounced(KnowledgeSearchResourceComponent.PREFS_KEY, prefs);\n }\n\n /** Load persisted search preferences from UserInfoEngine */\n private LoadSearchPreferences(): void {\n const raw = UserInfoEngine.Instance.GetSetting(KnowledgeSearchResourceComponent.PREFS_KEY);\n if (raw) {\n try {\n const prefs = JSON.parse(raw);\n if (prefs.ShowFilters != null) this.ShowFilters = prefs.ShowFilters;\n if (prefs.MinScoreThreshold != null) this.MinScoreThreshold = prefs.MinScoreThreshold;\n } catch { /* ignore parse errors */ }\n }\n }\n\n private applySearchResponse(response: SearchResponse): void {\n // Cache full results (sorted by score descending) for client-side filtering\n this.cachedFullResults = response.Results.sort((a, b) => b.Score - a.Score);\n this.ServerResultCount = this.cachedFullResults.length;\n\n // Apply current threshold client-side (may be higher than server threshold)\n let filtered = this.cachedFullResults;\n if (this.MinScoreThreshold > 0) {\n filtered = filtered.filter(r => r.Score >= this.MinScoreThreshold);\n }\n\n this.AllResults = [...filtered];\n this.ResultGroups = this.searchService.GroupResults(filtered);\n // Remove Source Type filter — confuses users\n this.Filters = response.Filters.filter(f => f.Category !== 'Source Type');\n this.TotalCount = filtered.length;\n this.ElapsedMs = response.ElapsedMs;\n this.HasSearched = true;\n // Only auto-show filters on first search if user hasn't set a preference\n const savedPref = UserInfoEngine.Instance.GetSetting(KnowledgeSearchResourceComponent.PREFS_KEY);\n if (!savedPref) {\n this.ShowFilters = response.Filters.length > 0;\n }\n this.cdr.detectChanges();\n this.emitAgentContext();\n }\n}\n\n/** Tree-shaking prevention */\nexport function LoadKnowledgeSearchResource(): void {\n // Prevents tree-shaking of the component\n}\n","@if (!ShowResultDetail) {\n <div class=\"search-page\" [class.search-page-has-results]=\"HasSearched\">\n <!-- Search Hero Section -->\n <div class=\"search-hero\" [class.search-hero-compact]=\"HasSearched\">\n @if (!HasSearched) {\n <div class=\"search-logo\">\n <i class=\"fa-solid fa-brain\"></i>\n Knowledge Hub\n </div>\n <p class=\"search-subtitle\">Search across all your knowledge -- entities, documents, content, and more</p>\n }\n\n <!-- Search Bar -->\n <div class=\"search-container\">\n <div class=\"search-box\">\n <i class=\"fa-solid fa-magnifying-glass search-box-icon\"></i>\n <input\n type=\"text\"\n class=\"search-box-input\"\n placeholder=\"Search across all your knowledge...\"\n [(ngModel)]=\"Query\"\n (keydown)=\"OnSearchKeydown($event)\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n />\n @if (Query.length > 0) {\n <button class=\"search-clear-btn\" (click)=\"ClearSearch()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n }\n <button class=\"search-submit-btn\" (click)=\"RunSearch()\" [disabled]=\"IsSearching || !Query.trim()\">\n @if (IsSearching) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n } @else {\n Search\n }\n </button>\n </div>\n\n <!-- Quick filters row -->\n @if (!HasSearched) {\n <div class=\"search-quick-actions\">\n <button class=\"quick-action-btn\" (click)=\"OnAskAgent()\">\n <i class=\"fa-solid fa-robot\"></i>\n Ask Knowledge Agent\n </button>\n </div>\n @if (PopularTags.length > 0) {\n <div class=\"search-tag-presets\">\n <span class=\"tag-presets-label\">\n <i class=\"fa-solid fa-tags\"></i> Popular tags:\n </span>\n @for (tag of PopularTags; track tag.Name) {\n <button class=\"tag-preset-btn\"\n [style.fontSize.rem]=\"tag.FontSize\"\n [title]=\"tag.Name + ' (' + tag.Count + ')'\"\n (click)=\"FilterByTag(tag.Name)\">\n {{ tag.Name }}\n </button>\n }\n </div>\n }\n }\n </div>\n </div>\n\n @if (HasSearched) {\n <!-- Results Area -->\n <div class=\"search-results-layout\">\n <!-- Sidebar Filters -->\n @if (ShowFilters && Filters.length > 0) {\n <aside class=\"search-sidebar\">\n <mj-search-filter\n [Filters]=\"Filters\"\n [ActiveFilters]=\"ActiveFilters\"\n (FilterChanged)=\"OnFilterChanged($event)\"\n (FiltersCleared)=\"OnFiltersCleared()\"\n (CloseRequested)=\"ToggleFilters()\"\n ></mj-search-filter>\n\n <!-- Relevance Threshold Slider -->\n <div class=\"threshold-section\">\n <label class=\"threshold-label\">\n Min Relevance\n <span class=\"threshold-value\">{{ (MinScoreThreshold * 100) | number:'1.0-0' }}%</span>\n </label>\n <input\n type=\"range\"\n class=\"threshold-slider\"\n [min]=\"0\"\n [max]=\"100\"\n [step]=\"5\"\n [value]=\"MinScoreThreshold * 100\"\n (input)=\"OnThresholdChanged($any($event.target).value / 100)\"\n />\n <div class=\"threshold-range-labels\">\n <span>All</span>\n <span>Strict</span>\n </div>\n <div class=\"threshold-stats\">\n <span class=\"threshold-stats-shown\">{{ TotalCount }} of {{ ServerResultCount }} results shown</span>\n <span class=\"threshold-stats-range\">Server range: {{ (ServerMinRelevance * 100) | number:'1.0-0' }}%–100%</span>\n </div>\n </div>\n </aside>\n }\n\n <!-- Results Main -->\n <div class=\"search-results-main\">\n <!-- Results Header -->\n <div class=\"search-results-header\">\n <!-- Show Filters button on left (visible when panel is hidden) -->\n @if (!ShowFilters && Filters.length > 0) {\n <button class=\"show-filters-btn\" (click)=\"ToggleFilters()\">\n <i class=\"fa-solid fa-filter\"></i>\n Filters\n @if (HasActiveFilters()) {\n <span class=\"filter-active-badge\">{{ GetActiveFilterCount() }}</span>\n }\n </button>\n }\n <span class=\"search-results-count\">\n {{ TotalCount }} results\n @if (ElapsedMs > 0) {\n <span class=\"search-results-time\">in {{ ElapsedMs }}ms</span>\n }\n </span>\n <button class=\"save-search-btn\" (click)=\"OpenSaveDialog()\" title=\"Save this search\">\n <i class=\"fa-solid fa-bookmark\"></i>\n Save Search\n </button>\n </div>\n\n <!-- Results List (flat blended list sorted by relevance) -->\n <mj-search-results\n DisplayMode=\"flat\"\n [ShowSummary]=\"false\"\n [FlatResults]=\"AllResults\"\n [ResultGroups]=\"ResultGroups\"\n [IsLoading]=\"IsSearching\"\n [TotalCount]=\"TotalCount\"\n [ElapsedMs]=\"ElapsedMs\"\n (ResultSelected)=\"OnResultSelected($event)\"\n (OpenRecordRequested)=\"OnOpenRecord($event)\"\n (MoreLikeThisRequested)=\"OnMoreLikeThis($event)\"\n ></mj-search-results>\n\n <!-- Agent CTA at bottom -->\n @if (TotalCount === 0 && !IsSearching) {\n <div class=\"search-agent-cta\">\n <i class=\"fa-solid fa-robot cta-icon\"></i>\n <div class=\"cta-text\">\n <strong>Can't find what you're looking for?</strong>\n <p>Ask the Knowledge Agent for a deeper analysis</p>\n </div>\n <button class=\"cta-btn\" (click)=\"OnAskAgent()\">\n Ask Agent\n </button>\n </div>\n }\n </div>\n </div>\n } @else if (!IsSearching) {\n <!-- Empty state: recent & saved searches -->\n <div class=\"search-recent-area\">\n @if (SavedSearches.length > 0) {\n <h3 class=\"recent-title\">Saved Searches</h3>\n <div class=\"recent-list\">\n @for (saved of SavedSearches; track saved.ID; let i = $index) {\n @if (i < 8) {\n <div class=\"recent-item saved-item\" (click)=\"ApplySavedSearch(saved)\">\n <i class=\"fa-solid fa-bookmark saved-icon\"></i>\n <span class=\"recent-query\">{{ saved.Name }}</span>\n <span class=\"saved-query-text\">{{ saved.Query }}</span>\n <button class=\"saved-delete-btn\" (click)=\"DeleteSavedSearch(saved, $event)\" title=\"Delete saved search\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n }\n }\n </div>\n }\n\n @if (RecentSearches.length > 0) {\n <h3 class=\"recent-title\">Recent Searches</h3>\n <div class=\"recent-list\">\n @for (recent of RecentSearches; track recent.Query; let i = $index) {\n @if (i < 8) {\n <div class=\"recent-item\" (click)=\"ApplyRecentSearch(recent)\">\n <i class=\"fa-solid fa-clock recent-icon\"></i>\n <span class=\"recent-query\">{{ recent.Query }}</span>\n <span class=\"recent-count\">{{ recent.ResultCount }} results</span>\n </div>\n }\n }\n </div>\n }\n </div>\n }\n </div>\n\n <!-- Save Search Dialog Overlay -->\n @if (ShowSaveDialog) {\n <div class=\"save-dialog-overlay\" (click)=\"CancelSaveDialog()\">\n <div class=\"save-dialog\" (click)=\"$event.stopPropagation()\">\n <h3 class=\"save-dialog-title\">Save Search</h3>\n <p class=\"save-dialog-subtitle\">Save \"{{ Query }}\" for quick access later</p>\n <label class=\"save-dialog-label\">Name</label>\n <input\n type=\"text\"\n class=\"mj-input save-dialog-input\"\n [(ngModel)]=\"SaveSearchName\"\n placeholder=\"Give this search a name...\"\n (keydown.enter)=\"ConfirmSaveSearch()\"\n autofocus\n />\n <div class=\"save-dialog-actions\">\n <button class=\"save-dialog-confirm\" (click)=\"ConfirmSaveSearch()\" [disabled]=\"!SaveSearchName.trim()\">\n <i class=\"fa-solid fa-bookmark\"></i> Save\n </button>\n <button class=\"save-dialog-cancel\" (click)=\"CancelSaveDialog()\">Cancel</button>\n </div>\n </div>\n </div>\n }\n} @else {\n <!-- Result Detail View (Task 8) -->\n <app-search-result-detail\n [Result]=\"DetailResult\"\n (BackClicked)=\"CloseResultDetail()\"\n (NavigateToRecord)=\"OnOpenRecord($event)\"\n ></app-search-result-detail>\n}\n"]}
|
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
export * from './components/search/knowledge-search-resource.component';
|
|
2
2
|
export * from './components/config/knowledge-config-resource.component';
|
|
3
3
|
export * from './components/results-detail/search-result-detail.component';
|
|
4
|
+
export * from './components/clusters/cluster-visualization-resource.component';
|
|
5
|
+
export * from './components/scheduling/scheduling-resource.component';
|
|
6
|
+
export * from './components/analytics/analytics-resource.component';
|
|
4
7
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/KnowledgeHub/index.ts"],"names":[],"mappings":"AACA,cAAc,yDAAyD,CAAC;AACxE,cAAc,yDAAyD,CAAC;AACxE,cAAc,4DAA4D,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/KnowledgeHub/index.ts"],"names":[],"mappings":"AACA,cAAc,yDAAyD,CAAC;AACxE,cAAc,yDAAyD,CAAC;AACxE,cAAc,4DAA4D,CAAC;AAC3E,cAAc,gEAAgE,CAAC;AAC/E,cAAc,uDAAuD,CAAC;AACtE,cAAc,qDAAqD,CAAC"}
|
|
@@ -2,4 +2,7 @@
|
|
|
2
2
|
export * from './components/search/knowledge-search-resource.component';
|
|
3
3
|
export * from './components/config/knowledge-config-resource.component';
|
|
4
4
|
export * from './components/results-detail/search-result-detail.component';
|
|
5
|
+
export * from './components/clusters/cluster-visualization-resource.component';
|
|
6
|
+
export * from './components/scheduling/scheduling-resource.component';
|
|
7
|
+
export * from './components/analytics/analytics-resource.component';
|
|
5
8
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/KnowledgeHub/index.ts"],"names":[],"mappings":"AAAA,2BAA2B;AAC3B,cAAc,yDAAyD,CAAC;AACxE,cAAc,yDAAyD,CAAC;AACxE,cAAc,4DAA4D,CAAC","sourcesContent":["// Knowledge Hub components\nexport * from './components/search/knowledge-search-resource.component';\nexport * from './components/config/knowledge-config-resource.component';\nexport * from './components/results-detail/search-result-detail.component';\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/KnowledgeHub/index.ts"],"names":[],"mappings":"AAAA,2BAA2B;AAC3B,cAAc,yDAAyD,CAAC;AACxE,cAAc,yDAAyD,CAAC;AACxE,cAAc,4DAA4D,CAAC;AAC3E,cAAc,gEAAgE,CAAC;AAC/E,cAAc,uDAAuD,CAAC;AACtE,cAAc,qDAAqD,CAAC","sourcesContent":["// Knowledge Hub components\nexport * from './components/search/knowledge-search-resource.component';\nexport * from './components/config/knowledge-config-resource.component';\nexport * from './components/results-detail/search-result-detail.component';\nexport * from './components/clusters/cluster-visualization-resource.component';\nexport * from './components/scheduling/scheduling-resource.component';\nexport * from './components/analytics/analytics-resource.component';\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lists-browse-resource.component.d.ts","sourceRoot":"","sources":["../../../src/Lists/components/lists-browse-resource.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgC,iBAAiB,EAAE,SAAS,EAAE,UAAU,EAAgB,MAAM,eAAe,CAAC;AAErH,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AACnF,OAAO,EAAE,YAAY,EAAsB,MAAM,+BAA+B,CAAC;AAGjF,OAAO,EAAE,UAAU,EAAE,MAAM,qCAAqC,CAAC;AACjE,OAAO,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AACzE,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,oCAAoC,CAAC;;AAC1I,UAAU,cAAc;IACtB,IAAI,EAAE,YAAY,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,CAAC,EAAE,kBAAkB,CAAC;CAClC;AAED,UAAU,YAAY;IACpB,QAAQ,EAAE,oBAAoB,GAAG,IAAI,CAAC;IACtC,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,QAAQ,EAAE,YAAY,EAAE,CAAC;IACzB,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,KAAK,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,WAAW,CAAC;AAE/C,
|
|
1
|
+
{"version":3,"file":"lists-browse-resource.component.d.ts","sourceRoot":"","sources":["../../../src/Lists/components/lists-browse-resource.component.ts"],"names":[],"mappings":"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"}
|
|
@@ -15,7 +15,8 @@ import * as i2 from "@memberjunction/ng-notifications";
|
|
|
15
15
|
import * as i3 from "@memberjunction/ng-list-management";
|
|
16
16
|
import * as i4 from "@angular/common";
|
|
17
17
|
import * as i5 from "@angular/forms";
|
|
18
|
-
import * as i6 from "@memberjunction/ng-
|
|
18
|
+
import * as i6 from "@memberjunction/ng-ui-components";
|
|
19
|
+
import * as i7 from "@memberjunction/ng-shared-generic";
|
|
19
20
|
const _c0 = a0 => ({ node: a0, depth: 0 });
|
|
20
21
|
const _c1 = (a0, a1) => ({ node: a0, depth: a1 });
|
|
21
22
|
function ListsBrowseResource_Conditional_15_Template(rf, ctx) { if (rf & 1) {
|
|
@@ -1401,7 +1402,7 @@ let ListsBrowseResource = class ListsBrowseResource extends BaseResourceComponen
|
|
|
1401
1402
|
static ɵfac = function ListsBrowseResource_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || ListsBrowseResource)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef), i0.ɵɵdirectiveInject(i1.TabService), i0.ɵɵdirectiveInject(i2.MJNotificationService), i0.ɵɵdirectiveInject(i0.ElementRef), i0.ɵɵdirectiveInject(i3.ListSharingService)); };
|
|
1402
1403
|
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ListsBrowseResource, selectors: [["mj-lists-browse-resource"]], hostBindings: function ListsBrowseResource_HostBindings(rf, ctx) { if (rf & 1) {
|
|
1403
1404
|
i0.ɵɵlistener("click", function ListsBrowseResource_click_HostBindingHandler($event) { return ctx.onDocumentClick($event); }, i0.ɵɵresolveDocument)("keydown.escape", function ListsBrowseResource_keydown_escape_HostBindingHandler() { return ctx.onEscapeKey(); }, i0.ɵɵresolveDocument);
|
|
1404
|
-
} }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 45, vars: 22, consts: [["categoryNodeTemplate", ""], ["entityInput", ""], [1, "lists-browse-container"], [1, "browse-header"], [1, "header-row"], [1, "header-title"], [1, "fa-solid", "fa-list-check"], [1, "btn-create", 3, "click"], [1, "fa-solid", "fa-plus"], [1, "header-actions"], [1, "search-box"], [1, "fa-solid", "fa-search"], ["type", "text", "placeholder", "Search lists...", 3, "ngModelChange", "ngModel"], [1, "clear-search"], [1, "filter-group"], ["title", "Filter by owner", 1, "filter-select", 3, "ngModelChange", "ngModel"], [3, "value"], ["title", "Filter by entity", 1, "filter-select", 3, "ngModelChange", "ngModel"], [1, "view-toggle-group"], ["title", "Table view", 1, "view-toggle", 3, "click"], [1, "fa-solid", "fa-table-list"], ["title", "Card view", 1, "view-toggle", 3, "click"], [1, "fa-solid", "fa-grip"], ["title", "Category view", 1, "view-toggle", 3, "click"], [1, "fa-solid", "fa-folder-tree"], [1, "loading-container"], [1, "empty-state"], [1, "empty-state", "search-empty"], [1, "browse-content"], [1, "context-menu-overlay"], [1, "context-menu", 3, "top", "left"], [1, "modal-overlay"], [1, "modal-dialog"], [1, "modal-dialog", "confirm-dialog"], [3, "config", "visible"], [1, "entity-dropdown-portal", 3, "top", "left", "width", "dropdown-above"], [1, "clear-search", 3, "click"], [1, "fa-solid", "fa-times"], ["text", "Loading lists...", "size", "medium"], [1, "empty-state-icon-wrapper"], [1, "icon-bg"], [1, "empty-state-features"], [1, "feature-item"], [1, "fa-solid", "fa-check-circle"], [1, "btn-create-large", 3, "click"], [1, "empty-state-icon-wrapper", "search"], [1, "fa-solid", "fa-filter-circle-xmark"], [1, "empty-hint"], [1, "btn-clear", 3, "click"], [1, "results-header"], [1, "result-count"], [1, "sort-options"], [1, "filter-select", "sort-select", 3, "ngModelChange", "ngModel"], [1, "lists-table"], ["role", "list", "aria-label", "Lists", 1, "lists-grid"], [1, "category-tree"], ["role", "grid", "aria-label", "Lists table"], ["scope", "col", 1, "col-name"], ["scope", "col", 1, "col-entity"], ["scope", "col", 1, "col-items"], ["scope", "col", 1, "col-sharing"], ["scope", "col", 1, "col-owner"], ["scope", "col", 1, "col-updated"], ["scope", "col", 1, "col-actions"], [1, "sr-only"], ["tabindex", "0", "role", "row", 1, "list-row"], ["tabindex", "0", "role", "row", 1, "list-row", 3, "click", "keydown.enter"], ["role", "gridcell", 1, "col-name"], [1, "name-cell"], ["aria-hidden", "true", 1, "list-icon"], [1, "name-content"], [1, "list-name"], [1, "list-desc"], ["role", "gridcell", 1, "col-entity"], [1, "entity-badge"], ["role", "gridcell", 1, "col-items"], ["role", "gridcell", 1, "col-sharing"], [1, "sharing-private"], ["role", "gridcell", 1, "col-owner"], [1, "owner-name"], ["role", "gridcell", 1, "col-updated"], ["role", "gridcell", 1, "col-actions"], ["
|
|
1405
|
+
} }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 45, vars: 22, consts: [["categoryNodeTemplate", ""], ["entityInput", ""], [1, "lists-browse-container"], [1, "browse-header"], [1, "header-row"], [1, "header-title"], [1, "fa-solid", "fa-list-check"], [1, "btn-create", 3, "click"], [1, "fa-solid", "fa-plus"], [1, "header-actions"], [1, "search-box"], [1, "fa-solid", "fa-search"], ["type", "text", "placeholder", "Search lists...", 3, "ngModelChange", "ngModel"], [1, "clear-search"], [1, "filter-group"], ["title", "Filter by owner", 1, "filter-select", 3, "ngModelChange", "ngModel"], [3, "value"], ["title", "Filter by entity", 1, "filter-select", 3, "ngModelChange", "ngModel"], [1, "view-toggle-group"], ["title", "Table view", 1, "view-toggle", 3, "click"], [1, "fa-solid", "fa-table-list"], ["title", "Card view", 1, "view-toggle", 3, "click"], [1, "fa-solid", "fa-grip"], ["title", "Category view", 1, "view-toggle", 3, "click"], [1, "fa-solid", "fa-folder-tree"], [1, "loading-container"], [1, "empty-state"], [1, "empty-state", "search-empty"], [1, "browse-content"], [1, "context-menu-overlay"], [1, "context-menu", 3, "top", "left"], [1, "modal-overlay"], [1, "modal-dialog"], [1, "modal-dialog", "confirm-dialog"], [3, "config", "visible"], [1, "entity-dropdown-portal", 3, "top", "left", "width", "dropdown-above"], [1, "clear-search", 3, "click"], [1, "fa-solid", "fa-times"], ["text", "Loading lists...", "size", "medium"], [1, "empty-state-icon-wrapper"], [1, "icon-bg"], [1, "empty-state-features"], [1, "feature-item"], [1, "fa-solid", "fa-check-circle"], [1, "btn-create-large", 3, "click"], [1, "empty-state-icon-wrapper", "search"], [1, "fa-solid", "fa-filter-circle-xmark"], [1, "empty-hint"], [1, "btn-clear", 3, "click"], [1, "results-header"], [1, "result-count"], [1, "sort-options"], [1, "filter-select", "sort-select", 3, "ngModelChange", "ngModel"], [1, "lists-table"], ["role", "list", "aria-label", "Lists", 1, "lists-grid"], [1, "category-tree"], ["role", "grid", "aria-label", "Lists table"], ["scope", "col", 1, "col-name"], ["scope", "col", 1, "col-entity"], ["scope", "col", 1, "col-items"], ["scope", "col", 1, "col-sharing"], ["scope", "col", 1, "col-owner"], ["scope", "col", 1, "col-updated"], ["scope", "col", 1, "col-actions"], [1, "sr-only"], ["tabindex", "0", "role", "row", 1, "list-row"], ["tabindex", "0", "role", "row", 1, "list-row", 3, "click", "keydown.enter"], ["role", "gridcell", 1, "col-name"], [1, "name-cell"], ["aria-hidden", "true", 1, "list-icon"], [1, "name-content"], [1, "list-name"], [1, "list-desc"], ["role", "gridcell", 1, "col-entity"], [1, "entity-badge"], ["role", "gridcell", 1, "col-items"], ["role", "gridcell", 1, "col-sharing"], [1, "sharing-private"], ["role", "gridcell", 1, "col-owner"], [1, "owner-name"], ["role", "gridcell", 1, "col-updated"], ["role", "gridcell", 1, "col-actions"], ["mjButton", "", "variant", "flat", "size", "sm", "title", "More options"], [1, "sharing-indicator"], [1, "fa-solid", "fa-share-nodes"], [1, "share-count"], [1, "fa-solid", "fa-lock"], ["mjButton", "", "variant", "flat", "size", "sm", "title", "More options", 3, "click"], ["aria-hidden", "true", 1, "fa-solid", "fa-ellipsis-v"], ["tabindex", "0", "role", "listitem", 1, "list-card"], ["tabindex", "0", "role", "listitem", 1, "list-card", 3, "click", "keydown.enter"], [1, "card-header"], ["aria-hidden", "true", 1, "card-icon"], [1, "card-menu"], [1, "card-body"], [1, "card-title"], [1, "card-description"], [1, "card-meta"], [1, "meta-item"], [1, "fa-solid", "fa-database"], [1, "fa-solid", "fa-hashtag"], [1, "card-footer"], [1, "owner-tag"], [1, "fa-solid", "fa-user"], [1, "card-footer-right"], [1, "date-info"], [1, "menu-btn", 3, "click"], [1, "sharing-badge", 3, "title"], [4, "ngTemplateOutlet", "ngTemplateOutletContext"], [1, "category-section"], [1, "category-header"], [1, "category-header", "uncategorized"], ["role", "list", 1, "category-lists"], [1, "category-header", 3, "click"], [1, "fa-solid", "fa-folder"], [1, "category-name"], [1, "category-count"], [1, "category-header", "uncategorized", 3, "click"], [1, "fa-solid", "fa-inbox"], ["tabindex", "0", "role", "listitem", 1, "list-row", "hierarchy-row"], ["tabindex", "0", "role", "listitem", 1, "list-row", "hierarchy-row", 3, "click", "keydown.enter"], [1, "list-info"], [1, "list-meta"], [1, "list-actions"], ["mjButton", "", "variant", "flat", "size", "sm", 3, "click"], [1, "context-menu-overlay", 3, "click"], [1, "context-menu"], [1, "menu-item", 3, "click"], [1, "fa-solid", "fa-pen"], [1, "fa-solid", "fa-copy"], [1, "menu-divider"], [1, "menu-item", "danger", 3, "click"], [1, "fa-solid", "fa-trash"], [1, "modal-overlay", 3, "click"], [1, "modal-header"], [1, "modal-close", 3, "click"], [1, "modal-body"], [1, "form-group"], ["type", "text", "placeholder", "Enter list name", 1, "form-input", 3, "ngModelChange", "ngModel"], ["placeholder", "Optional description", "rows", "3", 1, "form-input", 3, "ngModelChange", "ngModel"], [1, "form-input", 3, "ngModelChange", "ngModel"], [3, "ngValue"], [1, "modal-footer"], [1, "btn-primary", 3, "click", "disabled"], [1, "fa-solid", "fa-spinner", "fa-spin"], [1, "btn-secondary", 3, "click", "disabled"], [1, "custom-select-wrapper"], ["type", "text", "placeholder", "Search and select an entity", 1, "form-input", 3, "ngModelChange", "focus", "ngModel"], ["type", "text", "disabled", "", 1, "form-input", 3, "value"], [1, "warning-text"], [1, "btn-danger", 3, "click", "disabled"], [3, "complete", "cancel", "config", "visible"], [1, "entity-dropdown-portal"], [1, "entity-dropdown-content"], [1, "dropdown-item"], [1, "dropdown-empty"], [1, "dropdown-item", 3, "mousedown"]], template: function ListsBrowseResource_Template(rf, ctx) { if (rf & 1) {
|
|
1405
1406
|
const _r1 = i0.ɵɵgetCurrentView();
|
|
1406
1407
|
i0.ɵɵelementStart(0, "div", 2)(1, "div", 3)(2, "div", 4)(3, "div", 5);
|
|
1407
1408
|
i0.ɵɵelement(4, "i", 6);
|
|
@@ -1501,7 +1502,7 @@ let ListsBrowseResource = class ListsBrowseResource extends BaseResourceComponen
|
|
|
1501
1502
|
i0.ɵɵconditional(ctx.shareDialogConfig ? 43 : -1);
|
|
1502
1503
|
i0.ɵɵadvance();
|
|
1503
1504
|
i0.ɵɵconditional(ctx.showEntityDropdown && !ctx.editingList ? 44 : -1);
|
|
1504
|
-
} }, dependencies: [i4.NgTemplateOutlet, i5.NgSelectOption, i5.ɵNgSelectMultipleOption, i5.DefaultValueAccessor, i5.SelectControlValueAccessor, i5.NgControlStatus, i5.NgModel, i6.LoadingComponent, i3.ListShareDialogComponent], styles: ["\n :host {\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n }\n\n .lists-browse-container {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: var(--mj-bg-surface);\n overflow: hidden;\n }\n\n /* Header */\n .browse-header {\n display: flex;\n flex-direction: column;\n gap: 12px;\n padding: 16px 24px;\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n }\n\n .header-row {\n display: flex;\n justify-content: space-between;\n align-items: center;\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: var(--mj-brand-primary);\n }\n\n .header-title h2 {\n margin: 0;\n font-size: 20px;\n font-weight: 600;\n color: var(--mj-text-primary);\n }\n\n .header-actions {\n display: flex;\n align-items: center;\n gap: 12px;\n flex-wrap: wrap;\n }\n\n .search-box {\n position: relative;\n display: flex;\n align-items: center;\n flex: 1;\n min-width: 200px;\n max-width: 300px;\n }\n\n .search-box i.fa-search {\n position: absolute;\n left: 12px;\n color: var(--mj-text-muted);\n }\n\n .search-box input {\n padding: 8px 36px;\n border: 1px solid var(--mj-border-default);\n border-radius: 20px;\n font-size: 14px;\n width: 100%;\n transition: border-color 0.2s, box-shadow 0.2s;\n }\n\n .search-box input:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n }\n\n .clear-search {\n position: absolute;\n right: 8px;\n background: none;\n border: none;\n color: var(--mj-text-muted);\n cursor: pointer;\n }\n\n .filter-group {\n display: flex;\n align-items: center;\n gap: 6px;\n }\n\n .filter-group label {\n font-size: 13px;\n color: var(--mj-text-secondary);\n }\n\n .filter-select {\n padding: 8px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 14px;\n background: var(--mj-bg-surface-card);\n cursor: pointer;\n min-width: 120px;\n }\n\n .filter-select:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n }\n\n .sort-select {\n min-width: 140px;\n }\n\n .view-toggle-group {\n display: flex;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n overflow: hidden;\n }\n\n .view-toggle {\n padding: 8px 12px;\n background: var(--mj-bg-surface-card);\n border: none;\n border-right: 1px solid var(--mj-border-default);\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.2s;\n }\n\n .view-toggle:last-child {\n border-right: none;\n }\n\n .view-toggle:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n .view-toggle.active {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n }\n\n .btn-create {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 16px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\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: var(--mj-brand-primary-hover);\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: 480px;\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: 120px;\n height: 120px;\n border-radius: 50%;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n }\n\n .empty-state-icon-wrapper > i {\n position: relative;\n font-size: 56px;\n color: var(--mj-brand-primary);\n z-index: 1;\n }\n\n .empty-state-icon-wrapper.search > i {\n font-size: 48px;\n color: var(--mj-text-disabled);\n }\n\n .empty-state h3 {\n margin: 0 0 12px;\n font-size: 22px;\n font-weight: 600;\n color: var(--mj-text-primary);\n }\n\n .empty-state p {\n margin: 0 0 8px;\n color: var(--mj-text-secondary);\n font-size: 15px;\n line-height: 1.5;\n }\n\n .empty-state p:last-of-type {\n margin-bottom: 24px;\n }\n\n .empty-hint {\n color: var(--mj-text-muted) !important;\n font-size: 13px !important;\n }\n\n .empty-state-features {\n display: flex;\n flex-direction: column;\n gap: 8px;\n margin-bottom: 28px;\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: var(--mj-text-secondary);\n }\n\n .feature-item i {\n font-size: 14px !important;\n color: var(--mj-status-success) !important;\n }\n\n .btn-create-large {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 14px 28px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\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 color-mix(in srgb, var(--mj-brand-primary) 30%, transparent);\n }\n\n .btn-create-large:hover {\n background: var(--mj-brand-primary-hover);\n transform: translateY(-1px);\n box-shadow: 0 4px 12px color-mix(in srgb, var(--mj-brand-primary) 40%, transparent);\n }\n\n .btn-clear {\n padding: 10px 20px;\n background: var(--mj-bg-surface-sunken);\n border: none;\n border-radius: 6px;\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: background 0.2s;\n }\n\n .btn-clear:hover {\n background: var(--mj-border-default);\n }\n\n /* Content */\n .browse-content {\n flex: 1;\n overflow-y: auto;\n padding: 16px 24px;\n }\n\n .results-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 16px;\n }\n\n .result-count {\n font-size: 14px;\n color: var(--mj-text-secondary);\n }\n\n .sort-options {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .sort-options label {\n font-size: 13px;\n color: var(--mj-text-secondary);\n }\n\n /* Table View */\n .lists-table {\n background: var(--mj-bg-surface-card);\n border-radius: 8px;\n overflow: hidden;\n box-shadow: var(--mj-shadow-sm);\n }\n\n .lists-table table {\n width: 100%;\n border-collapse: collapse;\n }\n\n .lists-table th {\n text-align: left;\n padding: 12px 16px;\n font-size: 12px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n background: var(--mj-bg-surface-sunken);\n border-bottom: 1px solid var(--mj-border-default);\n }\n\n .lists-table td {\n padding: 12px 16px;\n border-bottom: 1px solid var(--mj-border-default);\n font-size: 14px;\n color: var(--mj-text-primary);\n }\n\n .list-row {\n cursor: pointer;\n transition: background 0.15s;\n outline: none;\n }\n\n .list-row:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n .list-row:focus {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n }\n\n .list-row:focus-visible {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n box-shadow: inset 3px 0 0 var(--mj-brand-primary);\n }\n\n .list-row:last-child td {\n border-bottom: none;\n }\n\n .sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n }\n\n .col-name { width: 30%; }\n .col-entity { width: 15%; }\n .col-items { width: 8%; text-align: center; }\n .col-sharing { width: 8%; text-align: center; }\n .col-owner { width: 14%; }\n .col-updated { width: 15%; }\n .col-actions { width: 10%; text-align: right; }\n\n /* Sharing indicators */\n .sharing-indicator {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n color: var(--mj-brand-primary);\n font-size: 13px;\n }\n\n .sharing-indicator i {\n font-size: 14px;\n }\n\n .share-count {\n font-weight: 500;\n }\n\n .sharing-private {\n color: var(--mj-text-muted);\n font-size: 13px;\n }\n\n .sharing-badge {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n border-radius: 50%;\n color: var(--mj-brand-primary);\n font-size: 11px;\n }\n\n .card-footer-right {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .name-cell {\n display: flex;\n align-items: center;\n gap: 12px;\n }\n\n .list-icon {\n width: 36px;\n height: 36px;\n border-radius: 6px;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-inverse);\n font-size: 14px;\n flex-shrink: 0;\n }\n\n .name-content {\n display: flex;\n flex-direction: column;\n min-width: 0;\n }\n\n .list-name {\n font-weight: 500;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .list-desc {\n font-size: 12px;\n color: var(--mj-text-muted);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .entity-badge {\n display: inline-block;\n padding: 2px 8px;\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n border-radius: 4px;\n font-size: 12px;\n color: var(--mj-brand-primary-hover);\n }\n\n .owner-name {\n color: var(--mj-text-secondary);\n }\n\n .owner-name.is-me {\n color: var(--mj-brand-primary);\n font-weight: 500;\n }\n\n .action-btn {\n background: none;\n border: none;\n padding: 6px 10px;\n color: var(--mj-text-muted);\n cursor: pointer;\n border-radius: 4px;\n transition: all 0.15s;\n }\n\n .action-btn:hover {\n background: var(--mj-border-default);\n color: var(--mj-text-secondary);\n }\n\n /* Card View */\n .lists-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));\n gap: 16px;\n }\n\n .list-card {\n background: var(--mj-bg-surface-card);\n border-radius: 8px;\n box-shadow: var(--mj-shadow-sm);\n overflow: hidden;\n cursor: pointer;\n transition: transform 0.2s, box-shadow 0.2s, outline 0.1s;\n outline: 2px solid transparent;\n }\n\n .list-card:hover {\n transform: translateY(-2px);\n box-shadow: var(--mj-shadow-md);\n }\n\n .list-card:focus {\n outline: 2px solid var(--mj-brand-primary);\n outline-offset: 2px;\n }\n\n .list-card:focus:not(:focus-visible) {\n outline: none;\n }\n\n .list-card:focus-visible {\n outline: 2px solid var(--mj-brand-primary);\n outline-offset: 2px;\n }\n\n .card-header {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n padding: 16px 16px 0;\n }\n\n .card-icon {\n width: 40px;\n height: 40px;\n border-radius: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-inverse);\n font-size: 18px;\n }\n\n .menu-btn {\n background: none;\n border: none;\n padding: 4px 8px;\n color: var(--mj-text-muted);\n cursor: pointer;\n border-radius: 4px;\n }\n\n .menu-btn:hover {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n }\n\n .card-body {\n padding: 12px 16px;\n }\n\n .card-title {\n margin: 0 0 4px;\n font-size: 16px;\n font-weight: 600;\n color: var(--mj-text-primary);\n }\n\n .card-description {\n margin: 0 0 12px;\n font-size: 13px;\n color: var(--mj-text-secondary);\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n }\n\n .card-meta {\n display: flex;\n gap: 16px;\n }\n\n .meta-item {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 12px;\n color: var(--mj-text-muted);\n }\n\n .card-footer {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 12px 16px;\n border-top: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-sunken);\n }\n\n .owner-tag {\n display: flex;\n align-items: center;\n gap: 4px;\n font-size: 12px;\n color: var(--mj-text-secondary);\n }\n\n .owner-tag.is-me {\n color: var(--mj-brand-primary);\n }\n\n .date-info {\n font-size: 12px;\n color: var(--mj-text-muted);\n }\n\n /* Hierarchy View */\n .category-tree {\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n\n .category-section {\n background: var(--mj-bg-surface-card);\n border-radius: 8px;\n overflow: hidden;\n }\n\n .category-header {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 16px;\n cursor: pointer;\n transition: background 0.2s;\n }\n\n .category-header:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n .category-header i:first-child {\n width: 16px;\n text-align: center;\n color: var(--mj-text-muted);\n }\n\n .category-header .fa-folder,\n .category-header .fa-folder-open {\n color: var(--mj-status-warning);\n }\n\n .category-header.uncategorized .fa-inbox {\n color: var(--mj-text-muted);\n }\n\n .category-name {\n flex: 1;\n font-weight: 500;\n color: var(--mj-text-primary);\n }\n\n .category-count {\n font-size: 12px;\n color: var(--mj-text-muted);\n background: var(--mj-bg-surface-sunken);\n padding: 2px 8px;\n border-radius: 10px;\n }\n\n .category-lists {\n border-top: 1px solid var(--mj-border-default);\n }\n\n .hierarchy-row {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px 16px 12px 40px;\n cursor: pointer;\n transition: background 0.2s;\n outline: none;\n }\n\n .hierarchy-row:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n .hierarchy-row:focus {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n }\n\n .hierarchy-row:focus-visible {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n box-shadow: inset 3px 0 0 var(--mj-brand-primary);\n }\n\n .list-info {\n flex: 1;\n min-width: 0;\n }\n\n .list-meta {\n font-size: 12px;\n color: var(--mj-text-muted);\n }\n\n .list-actions {\n display: flex;\n gap: 4px;\n opacity: 0;\n transition: opacity 0.2s;\n }\n\n .hierarchy-row:hover .list-actions {\n opacity: 1;\n }\n\n /* Context Menu */\n .context-menu-overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n z-index: 999;\n }\n\n .context-menu {\n position: fixed;\n background: var(--mj-bg-surface-card);\n border-radius: 8px;\n box-shadow: var(--mj-shadow-md);\n min-width: 160px;\n padding: 4px 0;\n z-index: 1000;\n }\n\n .menu-item {\n display: flex;\n align-items: center;\n gap: 10px;\n width: 100%;\n padding: 10px 16px;\n background: none;\n border: none;\n text-align: left;\n font-size: 14px;\n color: var(--mj-text-primary);\n cursor: pointer;\n transition: background 0.15s;\n }\n\n .menu-item:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n .menu-item.danger {\n color: var(--mj-status-error);\n }\n\n .menu-item.danger:hover {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n }\n\n .menu-divider {\n height: 1px;\n background: var(--mj-border-default);\n margin: 4px 0;\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: var(--mj-bg-overlay);\n z-index: 1000;\n }\n\n .modal-dialog {\n position: fixed;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n background: var(--mj-bg-surface-card);\n border-radius: 12px;\n box-shadow: var(--mj-shadow-lg);\n width: 500px;\n max-width: 90vw;\n max-height: 90vh;\n overflow: hidden;\n z-index: 1001;\n }\n\n .confirm-dialog {\n width: 400px;\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 var(--mj-border-default);\n }\n\n .modal-header h3 {\n margin: 0;\n font-size: 18px;\n font-weight: 600;\n color: var(--mj-text-primary);\n }\n\n .modal-close {\n background: none;\n border: none;\n padding: 4px 8px;\n color: var(--mj-text-muted);\n cursor: pointer;\n border-radius: 4px;\n }\n\n .modal-close:hover {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n }\n\n .modal-body {\n padding: 20px;\n max-height: 60vh;\n overflow-y: auto;\n }\n\n .modal-body p {\n margin: 0 0 8px;\n color: var(--mj-text-primary);\n }\n\n .warning-text {\n color: var(--mj-status-error) !important;\n font-size: 13px;\n }\n\n .modal-footer {\n display: flex;\n gap: 12px;\n padding: 16px 20px;\n border-top: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-sunken);\n }\n\n .btn-primary {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 20px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\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-primary:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover);\n }\n\n .btn-primary:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n\n .btn-secondary {\n padding: 10px 20px;\n background: var(--mj-bg-surface-card);\n color: var(--mj-text-secondary);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 14px;\n cursor: pointer;\n transition: background 0.2s;\n }\n\n .btn-secondary:hover:not(:disabled) {\n background: var(--mj-bg-surface-sunken);\n }\n\n .btn-danger {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 20px;\n background: var(--mj-status-error);\n color: var(--mj-text-inverse);\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-danger:hover:not(:disabled) {\n background: color-mix(in srgb, var(--mj-status-error) 85%, black);\n }\n\n /* Form Styles */\n .form-group {\n margin-bottom: 16px;\n }\n\n .form-group:last-child {\n margin-bottom: 0;\n }\n\n .form-group label {\n display: block;\n margin-bottom: 6px;\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n }\n\n .form-input {\n width: 100%;\n padding: 10px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 14px;\n transition: border-color 0.2s, box-shadow 0.2s;\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 3px color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n }\n\n .form-input:disabled {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n }\n\n textarea.form-input {\n resize: vertical;\n min-height: 80px;\n }\n\n select.form-input {\n cursor: pointer;\n }\n\n .custom-select-wrapper {\n position: relative;\n }\n\n /* Portal Dropdown */\n .entity-dropdown-portal {\n position: fixed;\n z-index: 10002;\n }\n\n .entity-dropdown-content {\n max-height: 200px;\n overflow-y: auto;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n box-shadow: var(--mj-shadow-md);\n }\n\n .entity-dropdown-content.open-above {\n position: absolute;\n bottom: 0;\n }\n\n .dropdown-item {\n padding: 10px 12px;\n cursor: pointer;\n transition: background 0.15s;\n font-size: 14px;\n color: var(--mj-text-primary);\n }\n\n .dropdown-item:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n }\n\n .dropdown-item:first-child {\n border-radius: 6px 6px 0 0;\n }\n\n .dropdown-item:last-child {\n border-radius: 0 0 6px 6px;\n }\n\n .dropdown-empty {\n padding: 10px 12px;\n color: var(--mj-text-muted);\n font-style: italic;\n }\n\n /* Responsive */\n @media (max-width: 768px) {\n .header-row {\n flex-direction: column;\n gap: 12px;\n align-items: stretch;\n }\n\n .btn-create {\n width: 100%;\n justify-content: center;\n }\n\n .header-actions {\n flex-direction: column;\n align-items: stretch;\n }\n\n .search-box {\n max-width: none;\n }\n\n .filter-group {\n width: 100%;\n }\n\n .filter-select {\n flex: 1;\n width: 100%;\n }\n\n .view-toggle-group {\n justify-content: center;\n }\n\n .lists-table {\n overflow-x: auto;\n }\n\n .col-entity, .col-items, .col-updated {\n display: none;\n }\n\n .lists-grid {\n grid-template-columns: 1fr;\n }\n\n .modal-dialog {\n width: 95vw;\n }\n }\n "], encapsulation: 2 });
|
|
1505
|
+
} }, dependencies: [i4.NgTemplateOutlet, i5.NgSelectOption, i5.ɵNgSelectMultipleOption, i5.DefaultValueAccessor, i5.SelectControlValueAccessor, i5.NgControlStatus, i5.NgModel, i6.MJButtonDirective, i7.LoadingComponent, i3.ListShareDialogComponent], styles: ["\n :host {\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n }\n\n .lists-browse-container {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: var(--mj-bg-surface);\n overflow: hidden;\n }\n\n /* Header */\n .browse-header {\n display: flex;\n flex-direction: column;\n gap: 12px;\n padding: 16px 24px;\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n }\n\n .header-row {\n display: flex;\n justify-content: space-between;\n align-items: center;\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: var(--mj-brand-primary);\n }\n\n .header-title h2 {\n margin: 0;\n font-size: 20px;\n font-weight: 600;\n color: var(--mj-text-primary);\n }\n\n .header-actions {\n display: flex;\n align-items: center;\n gap: 12px;\n flex-wrap: wrap;\n }\n\n .search-box {\n position: relative;\n display: flex;\n align-items: center;\n flex: 1;\n min-width: 200px;\n max-width: 300px;\n }\n\n .search-box i.fa-search {\n position: absolute;\n left: 12px;\n color: var(--mj-text-muted);\n }\n\n .search-box input {\n padding: 8px 36px;\n border: 1px solid var(--mj-border-default);\n border-radius: 20px;\n font-size: 14px;\n width: 100%;\n transition: border-color 0.2s, box-shadow 0.2s;\n }\n\n .search-box input:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n }\n\n .clear-search {\n position: absolute;\n right: 8px;\n background: none;\n border: none;\n color: var(--mj-text-muted);\n cursor: pointer;\n }\n\n .filter-group {\n display: flex;\n align-items: center;\n gap: 6px;\n }\n\n .filter-group label {\n font-size: 13px;\n color: var(--mj-text-secondary);\n }\n\n .filter-select {\n padding: 8px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 14px;\n background: var(--mj-bg-surface-card);\n cursor: pointer;\n min-width: 120px;\n }\n\n .filter-select:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n }\n\n .sort-select {\n min-width: 140px;\n }\n\n .view-toggle-group {\n display: flex;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n overflow: hidden;\n }\n\n .view-toggle {\n padding: 8px 12px;\n background: var(--mj-bg-surface-card);\n border: none;\n border-right: 1px solid var(--mj-border-default);\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.2s;\n }\n\n .view-toggle:last-child {\n border-right: none;\n }\n\n .view-toggle:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n .view-toggle.active {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n }\n\n .btn-create {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 16px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\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: var(--mj-brand-primary-hover);\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: 480px;\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: 120px;\n height: 120px;\n border-radius: 50%;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n }\n\n .empty-state-icon-wrapper > i {\n position: relative;\n font-size: 56px;\n color: var(--mj-brand-primary);\n z-index: 1;\n }\n\n .empty-state-icon-wrapper.search > i {\n font-size: 48px;\n color: var(--mj-text-disabled);\n }\n\n .empty-state h3 {\n margin: 0 0 12px;\n font-size: 22px;\n font-weight: 600;\n color: var(--mj-text-primary);\n }\n\n .empty-state p {\n margin: 0 0 8px;\n color: var(--mj-text-secondary);\n font-size: 15px;\n line-height: 1.5;\n }\n\n .empty-state p:last-of-type {\n margin-bottom: 24px;\n }\n\n .empty-hint {\n color: var(--mj-text-muted) !important;\n font-size: 13px !important;\n }\n\n .empty-state-features {\n display: flex;\n flex-direction: column;\n gap: 8px;\n margin-bottom: 28px;\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: var(--mj-text-secondary);\n }\n\n .feature-item i {\n font-size: 14px !important;\n color: var(--mj-status-success) !important;\n }\n\n .btn-create-large {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 14px 28px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\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 color-mix(in srgb, var(--mj-brand-primary) 30%, transparent);\n }\n\n .btn-create-large:hover {\n background: var(--mj-brand-primary-hover);\n transform: translateY(-1px);\n box-shadow: 0 4px 12px color-mix(in srgb, var(--mj-brand-primary) 40%, transparent);\n }\n\n .btn-clear {\n padding: 10px 20px;\n background: var(--mj-bg-surface-sunken);\n border: none;\n border-radius: 6px;\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: background 0.2s;\n }\n\n .btn-clear:hover {\n background: var(--mj-border-default);\n }\n\n /* Content */\n .browse-content {\n flex: 1;\n overflow-y: auto;\n padding: 16px 24px;\n }\n\n .results-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 16px;\n }\n\n .result-count {\n font-size: 14px;\n color: var(--mj-text-secondary);\n }\n\n .sort-options {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .sort-options label {\n font-size: 13px;\n color: var(--mj-text-secondary);\n }\n\n /* Table View */\n .lists-table {\n background: var(--mj-bg-surface-card);\n border-radius: 8px;\n overflow: hidden;\n box-shadow: var(--mj-shadow-sm);\n }\n\n .lists-table table {\n width: 100%;\n border-collapse: collapse;\n }\n\n .lists-table th {\n text-align: left;\n padding: 12px 16px;\n font-size: 12px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n background: var(--mj-bg-surface-sunken);\n border-bottom: 1px solid var(--mj-border-default);\n }\n\n .lists-table td {\n padding: 12px 16px;\n border-bottom: 1px solid var(--mj-border-default);\n font-size: 14px;\n color: var(--mj-text-primary);\n }\n\n .list-row {\n cursor: pointer;\n transition: background 0.15s;\n outline: none;\n }\n\n .list-row:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n .list-row:focus {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n }\n\n .list-row:focus-visible {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n box-shadow: inset 3px 0 0 var(--mj-brand-primary);\n }\n\n .list-row:last-child td {\n border-bottom: none;\n }\n\n .sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n }\n\n .col-name { width: 30%; }\n .col-entity { width: 15%; }\n .col-items { width: 8%; text-align: center; }\n .col-sharing { width: 8%; text-align: center; }\n .col-owner { width: 14%; }\n .col-updated { width: 15%; }\n .col-actions { width: 10%; text-align: right; }\n\n /* Sharing indicators */\n .sharing-indicator {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n color: var(--mj-brand-primary);\n font-size: 13px;\n }\n\n .sharing-indicator i {\n font-size: 14px;\n }\n\n .share-count {\n font-weight: 500;\n }\n\n .sharing-private {\n color: var(--mj-text-muted);\n font-size: 13px;\n }\n\n .sharing-badge {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n border-radius: 50%;\n color: var(--mj-brand-primary);\n font-size: 11px;\n }\n\n .card-footer-right {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .name-cell {\n display: flex;\n align-items: center;\n gap: 12px;\n }\n\n .list-icon {\n width: 36px;\n height: 36px;\n border-radius: 6px;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-inverse);\n font-size: 14px;\n flex-shrink: 0;\n }\n\n .name-content {\n display: flex;\n flex-direction: column;\n min-width: 0;\n }\n\n .list-name {\n font-weight: 500;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .list-desc {\n font-size: 12px;\n color: var(--mj-text-muted);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .entity-badge {\n display: inline-block;\n padding: 2px 8px;\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n border-radius: 4px;\n font-size: 12px;\n color: var(--mj-brand-primary-hover);\n }\n\n .owner-name {\n color: var(--mj-text-secondary);\n }\n\n .owner-name.is-me {\n color: var(--mj-brand-primary);\n font-weight: 500;\n }\n\n .action-btn {\n background: none;\n border: none;\n padding: 6px 10px;\n color: var(--mj-text-muted);\n cursor: pointer;\n border-radius: 4px;\n transition: all 0.15s;\n }\n\n .action-btn:hover {\n background: var(--mj-border-default);\n color: var(--mj-text-secondary);\n }\n\n /* Card View */\n .lists-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));\n gap: 16px;\n }\n\n .list-card {\n background: var(--mj-bg-surface-card);\n border-radius: 8px;\n box-shadow: var(--mj-shadow-sm);\n overflow: hidden;\n cursor: pointer;\n transition: transform 0.2s, box-shadow 0.2s, outline 0.1s;\n outline: 2px solid transparent;\n }\n\n .list-card:hover {\n transform: translateY(-2px);\n box-shadow: var(--mj-shadow-md);\n }\n\n .list-card:focus {\n outline: 2px solid var(--mj-brand-primary);\n outline-offset: 2px;\n }\n\n .list-card:focus:not(:focus-visible) {\n outline: none;\n }\n\n .list-card:focus-visible {\n outline: 2px solid var(--mj-brand-primary);\n outline-offset: 2px;\n }\n\n .card-header {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n padding: 16px 16px 0;\n }\n\n .card-icon {\n width: 40px;\n height: 40px;\n border-radius: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-inverse);\n font-size: 18px;\n }\n\n .menu-btn {\n background: none;\n border: none;\n padding: 4px 8px;\n color: var(--mj-text-muted);\n cursor: pointer;\n border-radius: 4px;\n }\n\n .menu-btn:hover {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n }\n\n .card-body {\n padding: 12px 16px;\n }\n\n .card-title {\n margin: 0 0 4px;\n font-size: 16px;\n font-weight: 600;\n color: var(--mj-text-primary);\n }\n\n .card-description {\n margin: 0 0 12px;\n font-size: 13px;\n color: var(--mj-text-secondary);\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n }\n\n .card-meta {\n display: flex;\n gap: 16px;\n }\n\n .meta-item {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 12px;\n color: var(--mj-text-muted);\n }\n\n .card-footer {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 12px 16px;\n border-top: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-sunken);\n }\n\n .owner-tag {\n display: flex;\n align-items: center;\n gap: 4px;\n font-size: 12px;\n color: var(--mj-text-secondary);\n }\n\n .owner-tag.is-me {\n color: var(--mj-brand-primary);\n }\n\n .date-info {\n font-size: 12px;\n color: var(--mj-text-muted);\n }\n\n /* Hierarchy View */\n .category-tree {\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n\n .category-section {\n background: var(--mj-bg-surface-card);\n border-radius: 8px;\n overflow: hidden;\n }\n\n .category-header {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 16px;\n cursor: pointer;\n transition: background 0.2s;\n }\n\n .category-header:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n .category-header i:first-child {\n width: 16px;\n text-align: center;\n color: var(--mj-text-muted);\n }\n\n .category-header .fa-folder,\n .category-header .fa-folder-open {\n color: var(--mj-status-warning);\n }\n\n .category-header.uncategorized .fa-inbox {\n color: var(--mj-text-muted);\n }\n\n .category-name {\n flex: 1;\n font-weight: 500;\n color: var(--mj-text-primary);\n }\n\n .category-count {\n font-size: 12px;\n color: var(--mj-text-muted);\n background: var(--mj-bg-surface-sunken);\n padding: 2px 8px;\n border-radius: 10px;\n }\n\n .category-lists {\n border-top: 1px solid var(--mj-border-default);\n }\n\n .hierarchy-row {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px 16px 12px 40px;\n cursor: pointer;\n transition: background 0.2s;\n outline: none;\n }\n\n .hierarchy-row:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n .hierarchy-row:focus {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n }\n\n .hierarchy-row:focus-visible {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n box-shadow: inset 3px 0 0 var(--mj-brand-primary);\n }\n\n .list-info {\n flex: 1;\n min-width: 0;\n }\n\n .list-meta {\n font-size: 12px;\n color: var(--mj-text-muted);\n }\n\n .list-actions {\n display: flex;\n gap: 4px;\n opacity: 0;\n transition: opacity 0.2s;\n }\n\n .hierarchy-row:hover .list-actions {\n opacity: 1;\n }\n\n /* Context Menu */\n .context-menu-overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n z-index: 999;\n }\n\n .context-menu {\n position: fixed;\n background: var(--mj-bg-surface-card);\n border-radius: 8px;\n box-shadow: var(--mj-shadow-md);\n min-width: 160px;\n padding: 4px 0;\n z-index: 1000;\n }\n\n .menu-item {\n display: flex;\n align-items: center;\n gap: 10px;\n width: 100%;\n padding: 10px 16px;\n background: none;\n border: none;\n text-align: left;\n font-size: 14px;\n color: var(--mj-text-primary);\n cursor: pointer;\n transition: background 0.15s;\n }\n\n .menu-item:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n .menu-item.danger {\n color: var(--mj-status-error);\n }\n\n .menu-item.danger:hover {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n }\n\n .menu-divider {\n height: 1px;\n background: var(--mj-border-default);\n margin: 4px 0;\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: var(--mj-bg-overlay);\n z-index: 1000;\n }\n\n .modal-dialog {\n position: fixed;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n background: var(--mj-bg-surface-card);\n border-radius: 12px;\n box-shadow: var(--mj-shadow-lg);\n width: 500px;\n max-width: 90vw;\n max-height: 90vh;\n overflow: hidden;\n z-index: 1001;\n }\n\n .confirm-dialog {\n width: 400px;\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 var(--mj-border-default);\n }\n\n .modal-header h3 {\n margin: 0;\n font-size: 18px;\n font-weight: 600;\n color: var(--mj-text-primary);\n }\n\n .modal-close {\n background: none;\n border: none;\n padding: 4px 8px;\n color: var(--mj-text-muted);\n cursor: pointer;\n border-radius: 4px;\n }\n\n .modal-close:hover {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n }\n\n .modal-body {\n padding: 20px;\n max-height: 60vh;\n overflow-y: auto;\n }\n\n .modal-body p {\n margin: 0 0 8px;\n color: var(--mj-text-primary);\n }\n\n .warning-text {\n color: var(--mj-status-error) !important;\n font-size: 13px;\n }\n\n .modal-footer {\n display: flex;\n gap: 12px;\n padding: 16px 20px;\n border-top: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-sunken);\n }\n\n .btn-primary {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 20px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\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-primary:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover);\n }\n\n .btn-primary:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n\n .btn-secondary {\n padding: 10px 20px;\n background: var(--mj-bg-surface-card);\n color: var(--mj-text-secondary);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 14px;\n cursor: pointer;\n transition: background 0.2s;\n }\n\n .btn-secondary:hover:not(:disabled) {\n background: var(--mj-bg-surface-sunken);\n }\n\n .btn-danger {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 20px;\n background: var(--mj-status-error);\n color: var(--mj-text-inverse);\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-danger:hover:not(:disabled) {\n background: color-mix(in srgb, var(--mj-status-error) 85%, black);\n }\n\n /* Form Styles */\n .form-group {\n margin-bottom: 16px;\n }\n\n .form-group:last-child {\n margin-bottom: 0;\n }\n\n .form-group label {\n display: block;\n margin-bottom: 6px;\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n }\n\n .form-input {\n width: 100%;\n padding: 10px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 14px;\n transition: border-color 0.2s, box-shadow 0.2s;\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 3px color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n }\n\n .form-input:disabled {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n }\n\n textarea.form-input {\n resize: vertical;\n min-height: 80px;\n }\n\n select.form-input {\n cursor: pointer;\n }\n\n .custom-select-wrapper {\n position: relative;\n }\n\n /* Portal Dropdown */\n .entity-dropdown-portal {\n position: fixed;\n z-index: 10002;\n }\n\n .entity-dropdown-content {\n max-height: 200px;\n overflow-y: auto;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n box-shadow: var(--mj-shadow-md);\n }\n\n .entity-dropdown-content.open-above {\n position: absolute;\n bottom: 0;\n }\n\n .dropdown-item {\n padding: 10px 12px;\n cursor: pointer;\n transition: background 0.15s;\n font-size: 14px;\n color: var(--mj-text-primary);\n }\n\n .dropdown-item:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n }\n\n .dropdown-item:first-child {\n border-radius: 6px 6px 0 0;\n }\n\n .dropdown-item:last-child {\n border-radius: 0 0 6px 6px;\n }\n\n .dropdown-empty {\n padding: 10px 12px;\n color: var(--mj-text-muted);\n font-style: italic;\n }\n\n /* Responsive */\n @media (max-width: 768px) {\n .header-row {\n flex-direction: column;\n gap: 12px;\n align-items: stretch;\n }\n\n .btn-create {\n width: 100%;\n justify-content: center;\n }\n\n .header-actions {\n flex-direction: column;\n align-items: stretch;\n }\n\n .search-box {\n max-width: none;\n }\n\n .filter-group {\n width: 100%;\n }\n\n .filter-select {\n flex: 1;\n width: 100%;\n }\n\n .view-toggle-group {\n justify-content: center;\n }\n\n .lists-table {\n overflow-x: auto;\n }\n\n .col-entity, .col-items, .col-updated {\n display: none;\n }\n\n .lists-grid {\n grid-template-columns: 1fr;\n }\n\n .modal-dialog {\n width: 95vw;\n }\n }\n "], encapsulation: 2 });
|
|
1505
1506
|
};
|
|
1506
1507
|
ListsBrowseResource = __decorate([
|
|
1507
1508
|
RegisterClass(BaseResourceComponent, 'ListsBrowseResource')
|
|
@@ -1724,8 +1725,9 @@ export { ListsBrowseResource };
|
|
|
1724
1725
|
<td class="col-updated" role="gridcell">{{formatDate(item.list.__mj_UpdatedAt)}}</td>
|
|
1725
1726
|
<td class="col-actions" role="gridcell">
|
|
1726
1727
|
@if (item.isOwner) {
|
|
1727
|
-
<button
|
|
1728
|
-
|
|
1728
|
+
<button mjButton
|
|
1729
|
+
variant="flat"
|
|
1730
|
+
size="sm"
|
|
1729
1731
|
(click)="openListMenu($event, item)"
|
|
1730
1732
|
title="More options">
|
|
1731
1733
|
<i class="fa-solid fa-ellipsis-v" aria-hidden="true"></i>
|
|
@@ -1858,7 +1860,7 @@ export { ListsBrowseResource };
|
|
|
1858
1860
|
</div>
|
|
1859
1861
|
@if (item.isOwner) {
|
|
1860
1862
|
<div class="list-actions">
|
|
1861
|
-
<button
|
|
1863
|
+
<button mjButton variant="flat" size="sm" (click)="openListMenu($event, item)">
|
|
1862
1864
|
<i class="fa-solid fa-ellipsis-v" aria-hidden="true"></i>
|
|
1863
1865
|
</button>
|
|
1864
1866
|
</div>
|
|
@@ -2049,5 +2051,5 @@ export { ListsBrowseResource };
|
|
|
2049
2051
|
type: HostListener,
|
|
2050
2052
|
args: ['document:keydown.escape']
|
|
2051
2053
|
}] }); })();
|
|
2052
|
-
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ListsBrowseResource, { className: "ListsBrowseResource", filePath: "src/Lists/components/lists-browse-resource.component.ts", lineNumber:
|
|
2054
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ListsBrowseResource, { className: "ListsBrowseResource", filePath: "src/Lists/components/lists-browse-resource.component.ts", lineNumber: 1666 }); })();
|
|
2053
2055
|
//# sourceMappingURL=lists-browse-resource.component.js.map
|