@memberjunction/ng-dashboards 6.2.0-edge.4 → 6.2.0-edge.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/AI/components/vectors/sensitive-fields.d.ts +53 -0
- package/dist/AI/components/vectors/sensitive-fields.d.ts.map +1 -0
- package/dist/AI/components/vectors/sensitive-fields.js +226 -0
- package/dist/AI/components/vectors/sensitive-fields.js.map +1 -0
- package/dist/AI/components/vectors/vector-document-rules.d.ts +126 -0
- package/dist/AI/components/vectors/vector-document-rules.d.ts.map +1 -0
- package/dist/AI/components/vectors/vector-document-rules.js +168 -0
- package/dist/AI/components/vectors/vector-document-rules.js.map +1 -0
- package/dist/AI/components/vectors/vector-management-resource.component.d.ts +49 -0
- package/dist/AI/components/vectors/vector-management-resource.component.d.ts.map +1 -1
- package/dist/AI/components/vectors/vector-management-resource.component.js +428 -230
- package/dist/AI/components/vectors/vector-management-resource.component.js.map +1 -1
- package/dist/Communication/communication-agent-context.d.ts +11 -1
- package/dist/Communication/communication-agent-context.d.ts.map +1 -1
- package/dist/Communication/communication-agent-context.js +15 -0
- package/dist/Communication/communication-agent-context.js.map +1 -1
- package/dist/Communication/communication-dashboard.component.d.ts.map +1 -1
- package/dist/Communication/communication-dashboard.component.js +5 -0
- package/dist/Communication/communication-dashboard.component.js.map +1 -1
- package/dist/Communication/communication-providers-resource.component.d.ts +27 -1
- package/dist/Communication/communication-providers-resource.component.d.ts.map +1 -1
- package/dist/Communication/communication-providers-resource.component.js +722 -78
- package/dist/Communication/communication-providers-resource.component.js.map +1 -1
- package/dist/DataExplorer/data-explorer-dashboard.component.d.ts +25 -0
- package/dist/DataExplorer/data-explorer-dashboard.component.d.ts.map +1 -1
- package/dist/DataExplorer/data-explorer-dashboard.component.js +74 -5
- package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
- package/dist/DevTools/app-state-inspector.component.d.ts.map +1 -1
- package/dist/DevTools/app-state-inspector.component.js +1 -0
- package/dist/DevTools/app-state-inspector.component.js.map +1 -1
- package/dist/DevTools/class-registry.component.d.ts.map +1 -1
- package/dist/DevTools/class-registry.component.js +1 -0
- package/dist/DevTools/class-registry.component.js.map +1 -1
- package/dist/DevTools/event-monitor.component.d.ts.map +1 -1
- package/dist/DevTools/event-monitor.component.js +2 -0
- package/dist/DevTools/event-monitor.component.js.map +1 -1
- package/dist/DevTools/graphql-console.component.d.ts.map +1 -1
- package/dist/DevTools/graphql-console.component.js.map +1 -1
- package/dist/DevTools/grid-width-lab.component.d.ts.map +1 -1
- package/dist/DevTools/grid-width-lab.component.js +1 -0
- package/dist/DevTools/grid-width-lab.component.js.map +1 -1
- package/dist/DevTools/layout-inspector.component.d.ts.map +1 -1
- package/dist/DevTools/layout-inspector.component.js +1 -0
- package/dist/DevTools/layout-inspector.component.js.map +1 -1
- package/dist/DevTools/lazy-module-status.component.d.ts.map +1 -1
- package/dist/DevTools/lazy-module-status.component.js +1 -0
- package/dist/DevTools/lazy-module-status.component.js.map +1 -1
- package/dist/DevTools/settings-explorer.component.d.ts.map +1 -1
- package/dist/DevTools/settings-explorer.component.js +1 -0
- package/dist/DevTools/settings-explorer.component.js.map +1 -1
- package/dist/DevTools/tab-strip-lab.component.d.ts.map +1 -1
- package/dist/DevTools/tab-strip-lab.component.js +1 -0
- package/dist/DevTools/tab-strip-lab.component.js.map +1 -1
- package/dist/EntityAdmin/entity-admin-dashboard.component.d.ts +5 -0
- package/dist/EntityAdmin/entity-admin-dashboard.component.d.ts.map +1 -1
- package/dist/EntityAdmin/entity-admin-dashboard.component.js +8 -5
- package/dist/EntityAdmin/entity-admin-dashboard.component.js.map +1 -1
- package/dist/Integration/components/overview/overview.component.js +2 -2
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js +2 -2
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/components/feature-pipelines/feature-pipeline.engine.d.ts +11 -1
- package/dist/KnowledgeHub/components/feature-pipelines/feature-pipeline.engine.d.ts.map +1 -1
- package/dist/KnowledgeHub/components/feature-pipelines/feature-pipeline.engine.js +24 -2
- package/dist/KnowledgeHub/components/feature-pipelines/feature-pipeline.engine.js.map +1 -1
- package/dist/KnowledgeHub/components/feature-pipelines/feature-pipelines-resource.component.d.ts +16 -2
- package/dist/KnowledgeHub/components/feature-pipelines/feature-pipelines-resource.component.d.ts.map +1 -1
- package/dist/KnowledgeHub/components/feature-pipelines/feature-pipelines-resource.component.js +87 -33
- package/dist/KnowledgeHub/components/feature-pipelines/feature-pipelines-resource.component.js.map +1 -1
- package/dist/LoginStudio/login-studio-inspector.component.d.ts +130 -0
- package/dist/LoginStudio/login-studio-inspector.component.d.ts.map +1 -0
- package/dist/LoginStudio/login-studio-inspector.component.js +781 -0
- package/dist/LoginStudio/login-studio-inspector.component.js.map +1 -0
- package/dist/LoginStudio/login-studio-resource.component.d.ts +153 -0
- package/dist/LoginStudio/login-studio-resource.component.d.ts.map +1 -0
- package/dist/LoginStudio/login-studio-resource.component.js +857 -0
- package/dist/LoginStudio/login-studio-resource.component.js.map +1 -0
- package/dist/Workflows/components/workflow-runs-resource.component.js +4 -4
- package/dist/Workflows/components/workflow-runs-resource.component.js.map +1 -1
- package/dist/core-dashboards.module.d.ts +2 -1
- package/dist/core-dashboards.module.d.ts.map +1 -1
- package/dist/core-dashboards.module.js +11 -3
- package/dist/core-dashboards.module.js.map +1 -1
- package/dist/public-api.d.ts +1 -0
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +1 -0
- package/dist/public-api.js.map +1 -1
- package/package.json +72 -69
package/dist/KnowledgeHub/components/feature-pipelines/feature-pipelines-resource.component.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"feature-pipelines-resource.component.js","sourceRoot":"","sources":["../../../../src/KnowledgeHub/components/feature-pipelines/feature-pipelines-resource.component.ts","../../../../src/KnowledgeHub/components/feature-pipelines/feature-pipelines-resource.component.html"],"names":[],"mappings":"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","sourcesContent":["/**\n * @fileoverview Knowledge Hub — Feature Pipelines dashboard tab.\n *\n * Full-page resource component listing the **Feature Pipelines** (Predictive\n * Studio SP6 / `plans/predictive-studio.md` §5.4). A Feature Pipeline has no\n * dedicated entity: it IS an `MJ: Record Processes` row categorized into the\n * seeded \"Feature Pipeline\" category (Infer / Action / Agent + a write-back\n * `OutputMapping`). This surface makes them first-class + discoverable +\n * monitorable inside Knowledge Hub:\n *\n * - lists the feature-pipeline Record Processes (from {@link FeaturePipelineEngine}),\n * - shows each one's target entity, written attribute, and last-run / freshness,\n * - offers **Run** (invokes the existing `PredictiveStudio.RunFeaturePipeline`\n * Remote Operation via the provider's `RouteOperation` seam — the same\n * hardened Record Set Processing run path), and\n * - an **authoring** entry that opens the reusable `mj-record-process-editor`\n * (from `@memberjunction/ng-record-process-studio`) in a dialog — we do NOT\n * rebuild the authoring surface.\n *\n * Registered as `BaseResourceComponent` driver `FeaturePipelinesResource`; wired\n * into the Knowledge Hub application's nav via metadata (`DriverClass`).\n */\n\nimport {\n Component,\n ChangeDetectorRef,\n OnDestroy,\n AfterViewInit,\n inject,\n} from '@angular/core';\nimport { Subject, takeUntil } from 'rxjs';\nimport { CompositeKey, type RemoteOpResult, type IRemoteOperationProvider } from '@memberjunction/core';\nimport {\n ResourceData,\n MJRecordProcessEntity,\n type PredictiveStudioRunFeaturePipelineInput,\n type PredictiveStudioRunFeaturePipelineOutput,\n} from '@memberjunction/core-entities';\nimport { RegisterClass } from '@memberjunction/global';\nimport { BaseResourceComponent, NavigationService } from '@memberjunction/ng-shared';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\n\nimport {\n FeaturePipelineEngine,\n type FeaturePipelineSummary,\n type FeaturePipelineRunStatus,\n} from './feature-pipeline.engine';\nimport {\n BuildFeaturePipelinesAgentContext,\n ResolvePipeline,\n BuildPipelineNotFoundError,\n} from './feature-pipelines-agent-context';\nimport { ValidateStringParam, AgentToolResult } from '../../../shared/agent-tool-validation';\n\n/** Stable operation key of the Run Feature Pipeline Remote Operation. */\nconst RUN_FEATURE_PIPELINE_OP = 'PredictiveStudio.RunFeaturePipeline';\n\n@RegisterClass(BaseResourceComponent, 'FeaturePipelinesResource')\n@Component({\n standalone: false,\n selector: 'app-feature-pipelines-resource',\n templateUrl: './feature-pipelines-resource.component.html',\n styleUrls: ['./feature-pipelines-resource.component.css'],\n})\nexport class FeaturePipelinesResourceComponent\n extends BaseResourceComponent\n implements AfterViewInit, OnDestroy\n{\n private cdr = inject(ChangeDetectorRef);\n protected override navigationService = inject(NavigationService);\n protected override destroy$ = new Subject<void>();\n\n // ================================================================\n // Resource overrides\n // ================================================================\n\n async GetResourceDisplayName(_data: ResourceData): Promise<string> {\n return 'Feature Pipelines';\n }\n\n async GetResourceIconClass(_data: ResourceData): Promise<string> {\n return 'fa-solid fa-diagram-project';\n }\n\n // ================================================================\n // State\n // ================================================================\n\n /** True while the engine is loading its caches. */\n public IsLoading = true;\n\n /** All feature-pipeline summaries (unfiltered). */\n public AllPipelines: FeaturePipelineSummary[] = [];\n\n /** Pipelines after the search filter is applied (what the cards render). */\n public FilteredPipelines: FeaturePipelineSummary[] = [];\n\n /** Free-text search over name / target entity / output attribute. */\n public SearchQuery = '';\n\n /** Ids of pipelines with a Run currently in flight (disables their Run button). */\n public RunningIDs = new Set<string>();\n\n // ================================================================\n // Computed\n // ================================================================\n\n /** Count of pipelines whose underlying Record Process is Active. */\n public get ActiveCount(): number {\n return this.AllPipelines.filter((p) => p.Status === 'Active').length;\n }\n\n /** Count of pipelines that have never run. */\n public get NeverRunCount(): number {\n return this.AllPipelines.filter((p) => p.LastRunStatus === 'Never').length;\n }\n\n /** Count of pipelines whose most recent run failed. */\n public get FailedCount(): number {\n return this.AllPipelines.filter((p) => p.LastRunStatus === 'Failed').length;\n }\n\n // ================================================================\n // Lifecycle\n // ================================================================\n\n async ngAfterViewInit(): Promise<void> {\n await this.loadData();\n this.subscribeToEngine();\n this.emitAgentContext();\n this.registerAgentTools();\n this.NotifyLoadComplete();\n }\n\n ngOnDestroy(): void {\n super.ngOnDestroy();\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n // ================================================================\n // Public Methods — Toolbar\n // ================================================================\n\n /** Reload the engine caches from the server. */\n public async Refresh(): Promise<void> {\n await this.loadData(true);\n }\n\n /** Apply the search filter (called on every keystroke). */\n public OnSearchChanged(): void {\n this.applyFilter();\n this.emitAgentContext();\n this.cdr.detectChanges();\n }\n\n /** Open the entity record form to create a new record process. */\n public OnNewPipeline(): void {\n this.navigationService.OpenEntityRecord('MJ: Record Processes', new CompositeKey());\n }\n\n // ================================================================\n // Public Methods — Card Actions\n // ================================================================\n\n /** Open the entity record form in a new tab for an existing feature pipeline. */\n public OnViewPipeline(pipeline: FeaturePipelineSummary): void {\n this.navigationService.OpenEntityRecord('MJ: Record Processes', CompositeKey.FromID(pipeline.ID));\n }\n\n /**\n * Run a feature pipeline on demand by invoking the\n * `PredictiveStudio.RunFeaturePipeline` Remote Operation through the active\n * provider. The op delegates to the Record Set Processing substrate — the same\n * batching/resume/audit path the rest of the platform uses.\n */\n public async OnRunPipeline(pipeline: FeaturePipelineSummary): Promise<void> {\n if (this.RunningIDs.has(pipeline.ID)) return;\n\n this.RunningIDs.add(pipeline.ID);\n this.cdr.detectChanges();\n\n try {\n const input: PredictiveStudioRunFeaturePipelineInput = { featurePipelineID: pipeline.ID };\n // RouteOperation lives on IRemoteOperationProvider, which every concrete\n // provider (the browser's GraphQLDataProvider here) implements via ProviderBase.\n // The narrowing cast is the documented \"power-tool seam\" entry point.\n const opProvider = this.ProviderToUse as unknown as IRemoteOperationProvider;\n const result = await opProvider.RouteOperation<\n PredictiveStudioRunFeaturePipelineInput,\n PredictiveStudioRunFeaturePipelineOutput\n >(RUN_FEATURE_PIPELINE_OP, input, { provider: this.ProviderToUse });\n\n this.notifyRunResult(pipeline, result);\n } catch (error) {\n MJNotificationService.Instance.CreateSimpleNotification(\n `Failed to run \"${pipeline.Name}\": ${error instanceof Error ? error.message : String(error)}`,\n 'error',\n 5000,\n );\n } finally {\n this.RunningIDs.delete(pipeline.ID);\n // Refresh so the card reflects the new run / freshness.\n await this.loadData(true);\n }\n }\n\n /** Whether a given pipeline currently has a Run in flight. */\n public IsRunning(pipelineID: string): boolean {\n return this.RunningIDs.has(pipelineID);\n }\n\n // ================================================================\n // Public Methods — Display Helpers\n // ================================================================\n\n /** Font Awesome icon for a pipeline's work type. */\n public WorkTypeIcon(workType: FeaturePipelineSummary['WorkType']): string {\n switch (workType) {\n case 'Infer':\n return 'fa-solid fa-wand-magic-sparkles';\n case 'Agent':\n return 'fa-solid fa-robot';\n case 'Action':\n return 'fa-solid fa-bolt';\n case 'FieldRules':\n return 'fa-solid fa-list-check';\n case 'ML Model':\n return 'fa-solid fa-brain';\n default:\n // Keeps the function total against future CodeGen-added work types.\n return 'fa-solid fa-gear';\n }\n }\n\n /** CSS modifier class for a run-status pill. */\n public RunStatusClass(status: FeaturePipelineRunStatus): string {\n return `status--${status.toLowerCase()}`;\n }\n\n /** Human-readable label for a run status. */\n public RunStatusLabel(status: FeaturePipelineRunStatus): string {\n return status === 'Never' ? 'Never run' : status;\n }\n\n /** Relative \"x ago\" string for the last-run timestamp. */\n public TimeAgo(date: Date | null): string {\n if (!date) return 'Never';\n const diffMs = Date.now() - new Date(date).getTime();\n const minutes = Math.floor(diffMs / 60000);\n const hours = Math.floor(minutes / 60);\n const days = Math.floor(hours / 24);\n if (days > 0) return `${days}d ago`;\n if (hours > 0) return `${hours}h ago`;\n if (minutes > 0) return `${minutes}m ago`;\n return 'Just now';\n }\n\n // ================================================================\n // Private Methods\n // ================================================================\n\n /** The engine instance scoped to the active provider (multi-provider safe). */\n private get engine(): FeaturePipelineEngine {\n return <FeaturePipelineEngine>(\n FeaturePipelineEngine.GetProviderInstance(this.ProviderToUse, FeaturePipelineEngine)\n );\n }\n\n private async loadData(forceRefresh = false): Promise<void> {\n this.IsLoading = true;\n this.cdr.detectChanges();\n try {\n const p = this.ProviderToUse;\n await this.engine.Config(forceRefresh, p.CurrentUser, p);\n this.AllPipelines = this.engine.GetSummaries();\n this.applyFilter();\n } catch (error) {\n console.error('[FeaturePipelinesResource] Error loading data:', error);\n this.AllPipelines = [];\n this.FilteredPipelines = [];\n } finally {\n this.IsLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Re-derive the summaries whenever the engine's cached Record Processes or\n * Process Runs change (save / delete / remote-invalidate elsewhere) — reactivity\n * for free from the BaseEngine streams.\n */\n private subscribeToEngine(): void {\n this.engine.Pipelines$.pipe(takeUntil(this.destroy$)).subscribe(() => {\n this.AllPipelines = this.engine.GetSummaries();\n this.applyFilter();\n this.emitAgentContext();\n this.cdr.detectChanges();\n });\n }\n\n private applyFilter(): void {\n const q = this.SearchQuery.trim().toLowerCase();\n if (!q) {\n this.FilteredPipelines = this.AllPipelines;\n return;\n }\n this.FilteredPipelines = this.AllPipelines.filter(\n (p) =>\n p.Name.toLowerCase().includes(q) ||\n p.TargetEntity.toLowerCase().includes(q) ||\n (p.OutputAttribute ?? '').toLowerCase().includes(q),\n );\n }\n\n private notifyRunResult(\n pipeline: FeaturePipelineSummary,\n result: RemoteOpResult<PredictiveStudioRunFeaturePipelineOutput>,\n ): void {\n if (result.Success && result.Output) {\n const out = result.Output;\n MJNotificationService.Instance.CreateSimpleNotification(\n `\"${pipeline.Name}\" finished: ${out.written} written, ${out.processed} processed, ${out.error} error(s).`,\n out.error > 0 ? 'warning' : 'success',\n 5000,\n );\n } else {\n MJNotificationService.Instance.CreateSimpleNotification(\n `\"${pipeline.Name}\" did not complete: ${result.ErrorMessage ?? 'unknown error'}`,\n 'error',\n 5000,\n );\n }\n }\n\n // ---- Agent context + client tools (required for every dashboard) ----\n //\n // 🔒 SAFETY BOUNDARY (Feature Pipelines surface)\n // ----------------------------------------------\n // EXPOSED to the agent: idempotent refresh, read-only search/filter, selection,\n // opening a pipeline's authoring editor (UI — no auto-save), and the existing\n // on-demand RUN (RunFeaturePipeline). Running a feature pipeline is intentionally\n // exposed: it is an idempotent, hardened Record-Set-Processing pass that derives\n // and writes feature values back via the pipeline's own OutputMapping — the same\n // run path the platform uses everywhere, with no agent-supplied parameters.\n //\n // NEVER EXPOSED: there is no agent tool that saves/deletes a pipeline definition\n // or its OutputMapping (authoring is a deliberate UI action via the editor\n // dialog). The agent may *open* the editor, never commit it.\n\n private emitAgentContext(): void {\n this.navigationService.SetAgentContext(this, BuildFeaturePipelinesAgentContext({\n AllPipelines: this.AllPipelines,\n FilteredPipelines: this.FilteredPipelines,\n SearchQuery: this.SearchQuery,\n RunningIDs: this.RunningIDs,\n IsLoading: this.IsLoading,\n }));\n }\n\n /** Resolve a pipeline reference (id/name/contains) or return a tolerant failure. */\n private resolvePipelineOrFail(\n raw: unknown,\n ): { ok: true; pipeline: FeaturePipelineSummary } | { ok: false; result: AgentToolResult } {\n const v = ValidateStringParam(raw, 'pipeline');\n if (!v.ok) return { ok: false, result: v.result };\n const match = ResolvePipeline(v.value, this.AllPipelines);\n if (!match) {\n return {\n ok: false,\n result: {\n Success: false,\n ErrorMessage: BuildPipelineNotFoundError(v.value, this.AllPipelines.map((p) => p.Name)),\n },\n };\n }\n return { ok: true, pipeline: match };\n }\n\n private registerAgentTools(): void {\n this.navigationService.SetAgentClientTools(this, [\n {\n Name: 'RunFeaturePipeline',\n Description:\n 'Run a Feature Pipeline on demand by its id or name. Derives + persists feature values back to the target entity via the pipeline OutputMapping (idempotent Record-Set-Processing pass; no agent-supplied parameters).',\n ParameterSchema: {\n type: 'object',\n properties: { pipeline: { type: 'string', description: 'The feature pipeline id or name' } },\n required: ['pipeline'],\n },\n Handler: async (params: Record<string, unknown>) => {\n const r = this.resolvePipelineOrFail(params['pipeline'] ?? params['name']);\n if (!r.ok) return r.result;\n if (!r.pipeline.OnDemandEnabled) {\n return { Success: false, ErrorMessage: `\"${r.pipeline.Name}\" is not enabled for on-demand runs.` };\n }\n await this.OnRunPipeline(r.pipeline);\n return { Success: true, Data: { Pipeline: r.pipeline.Name } };\n },\n },\n {\n Name: 'SearchFeaturePipelines',\n Description: 'Filter the feature pipeline list by a search term (name / target entity / attribute). Pass empty to clear. Read-only.',\n ParameterSchema: {\n type: 'object',\n properties: { query: { type: 'string' } },\n required: ['query'],\n },\n Handler: async (params: Record<string, unknown>) => {\n const v = ValidateStringParam(params['query'], 'query');\n if (!v.ok) return v.result;\n this.SearchQuery = v.value;\n this.OnSearchChanged();\n return { Success: true, Data: { FilteredCount: this.FilteredPipelines.length } };\n },\n },\n {\n Name: 'RefreshFeaturePipelines',\n Description: 'Reload the feature pipelines and their latest run/freshness from the server. Idempotent.',\n ParameterSchema: { type: 'object', properties: {} },\n Handler: async () => {\n await this.Refresh();\n this.emitAgentContext();\n return { Success: true, Data: { PipelineCount: this.AllPipelines.length } };\n },\n },\n {\n Name: 'OpenFeaturePipelineEditor',\n Description: 'Open the entity record form for a feature pipeline by id or name to inspect or edit its definition.',\n ParameterSchema: {\n type: 'object',\n properties: { pipeline: { type: 'string', description: 'The feature pipeline id or name' } },\n required: ['pipeline'],\n },\n Handler: async (params: Record<string, unknown>) => {\n const r = this.resolvePipelineOrFail(params['pipeline'] ?? params['name']);\n if (!r.ok) return r.result;\n this.OnViewPipeline(r.pipeline);\n return { Success: true, Data: { Pipeline: r.pipeline.Name } };\n },\n },\n ]);\n }\n}\n\n/** Tree-shaking prevention — keeps the component in the bundle. */\nexport function LoadFeaturePipelinesResource(): void {\n // Prevents tree-shaking of the component.\n}\n","<mj-page-layout>\n <mj-page-header\n Title=\"Feature Pipelines\"\n Icon=\"fa-solid fa-diagram-project\"\n Subtitle=\"Derive feature attributes from your data and persist them back to entities\">\n <div meta>\n @if (FailedCount > 0) {\n <mj-stat-badge [Count]=\"FailedCount\" Label=\"last run failed\" Variant=\"error\"></mj-stat-badge>\n } @else {\n <mj-stat-badge\n [Count]=\"FilteredPipelines.length\"\n [Total]=\"AllPipelines.length\"\n Label=\"pipelines\">\n </mj-stat-badge>\n }\n </div>\n <div actions>\n <mj-refresh-button [Loading]=\"IsLoading\" (Clicked)=\"Refresh()\"></mj-refresh-button>\n <button mjButton variant=\"primary\" size=\"sm\" (click)=\"OnNewPipeline()\">\n <i class=\"fa-solid fa-plus\"></i> New Pipeline\n </button>\n </div>\n <div toolbar>\n <mj-page-search\n [Value]=\"SearchQuery\"\n Placeholder=\"Search by name, entity, or attribute…\"\n (ValueChange)=\"SearchQuery = $event; OnSearchChanged()\">\n </mj-page-search>\n </div>\n </mj-page-header>\n\n <mj-page-body [Flex]=\"true\">\n @if (IsLoading) {\n <div class=\"fp-loading\">\n <mj-loading text=\"Loading feature pipelines…\" size=\"medium\"></mj-loading>\n </div>\n } @else if (AllPipelines.length === 0) {\n <mj-empty-state\n Icon=\"fa-solid fa-diagram-project\"\n Title=\"No feature pipelines yet\"\n Message=\"A Feature Pipeline derives an attribute per record (e.g. an LLM summary or score) and writes it back to your data — reusable analytics, independent of any model.\"\n ActionText=\"New Pipeline\"\n ActionIcon=\"fa-solid fa-plus\"\n (Action)=\"OnNewPipeline()\">\n </mj-empty-state>\n } @else if (FilteredPipelines.length === 0) {\n <mj-empty-state\n Variant=\"no-results\"\n Icon=\"fa-solid fa-magnifying-glass\"\n Title=\"No matching pipelines\"\n Message=\"No feature pipelines match your search.\">\n </mj-empty-state>\n } @else {\n <div class=\"fp-grid\">\n @for (pipeline of FilteredPipelines; track pipeline.ID) {\n <div class=\"fp-card\" [class.fp-card--disabled]=\"pipeline.Status !== 'Active'\">\n <div class=\"fp-card__head\">\n <i class=\"fp-card__icon\" [class]=\"WorkTypeIcon(pipeline.WorkType)\"></i>\n <div class=\"fp-card__title\">\n <h3 [title]=\"pipeline.Name\">{{ pipeline.Name }}</h3>\n <div class=\"fp-card__subhead\">\n <span class=\"fp-card__worktype\">{{ pipeline.WorkType }}</span>\n <span class=\"fp-type-badge\" [class.fp-type-badge--decision]=\"pipeline.PipelineType === 'Decision'\">{{ pipeline.PipelineType }}</span>\n </div>\n </div>\n <span class=\"fp-status\" [class]=\"RunStatusClass(pipeline.LastRunStatus)\">\n {{ RunStatusLabel(pipeline.LastRunStatus) }}\n </span>\n </div>\n\n @if (pipeline.Description) {\n <p class=\"fp-card__desc\" [title]=\"pipeline.Description\">{{ pipeline.Description }}</p>\n }\n\n <div class=\"fp-card__meta\">\n <div class=\"fp-meta-row\">\n <span class=\"fp-meta-row__k\"><i class=\"fa-solid fa-table\"></i> Target</span>\n <span class=\"fp-meta-row__v\">{{ pipeline.TargetEntity }}</span>\n </div>\n <div class=\"fp-meta-row\">\n <span class=\"fp-meta-row__k\"><i class=\"fa-solid fa-pen-to-square\"></i> Writes</span>\n <span class=\"fp-meta-row__v\">{{ pipeline.OutputAttribute || '—' }}</span>\n </div>\n <div class=\"fp-meta-row\">\n <span class=\"fp-meta-row__k\"><i class=\"fa-solid fa-clock-rotate-left\"></i> Last run</span>\n <span class=\"fp-meta-row__v\">\n {{ TimeAgo(pipeline.LastRunAt) }}\n @if (pipeline.LastRunProcessed != null) {\n <span class=\"fp-meta-row__sub\">· {{ pipeline.LastRunSuccess }}/{{ pipeline.LastRunProcessed }} written</span>\n }\n </span>\n </div>\n </div>\n\n <div class=\"fp-card__actions\">\n <button\n mjButton\n variant=\"primary\"\n size=\"sm\"\n [disabled]=\"!pipeline.OnDemandEnabled || pipeline.Status !== 'Active' || IsRunning(pipeline.ID)\"\n (click)=\"OnRunPipeline(pipeline)\">\n @if (IsRunning(pipeline.ID)) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Running…\n } @else {\n <i class=\"fa-solid fa-play\"></i> Run\n }\n </button>\n <button mjButton variant=\"secondary\" size=\"sm\" (click)=\"OnViewPipeline(pipeline)\">\n <i class=\"fa-solid fa-eye\"></i> View\n </button>\n </div>\n </div>\n }\n </div>\n }\n </mj-page-body>\n</mj-page-layout>\n"]}
|
|
1
|
+
{"version":3,"file":"feature-pipelines-resource.component.js","sourceRoot":"","sources":["../../../../src/KnowledgeHub/components/feature-pipelines/feature-pipelines-resource.component.ts","../../../../src/KnowledgeHub/components/feature-pipelines/feature-pipelines-resource.component.html"],"names":[],"mappings":"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","sourcesContent":["/**\n * @fileoverview Knowledge Hub — Feature Pipelines dashboard tab.\n *\n * Full-page resource component listing the **Feature Pipelines** (Predictive\n * Studio SP6 / `plans/predictive-studio.md` §5.4). A Feature Pipeline has no\n * dedicated entity: it IS an `MJ: Record Processes` row categorized into the\n * seeded \"Feature Pipeline\" category (Infer / Action / Agent + a write-back\n * `OutputMapping`). This surface makes them first-class + discoverable +\n * monitorable inside Knowledge Hub:\n *\n * - lists the feature-pipeline Record Processes (from {@link FeaturePipelineEngine}),\n * - shows each one's target entity, written attribute, and last-run / freshness,\n * - offers **Run** (invokes the existing `PredictiveStudio.RunFeaturePipeline`\n * Remote Operation via the provider's `RouteOperation` seam — the same\n * hardened Record Set Processing run path), and\n * - an **authoring** entry that opens the reusable `mj-record-process-editor`\n * (from `@memberjunction/ng-record-process-studio`) in a dialog — we do NOT\n * rebuild the authoring surface.\n *\n * Registered as `BaseResourceComponent` driver `FeaturePipelinesResource`; wired\n * into the Knowledge Hub application's nav via metadata (`DriverClass`).\n */\n\nimport {\n Component,\n ChangeDetectorRef,\n OnDestroy,\n AfterViewInit,\n inject,\n} from '@angular/core';\nimport { Subject, takeUntil } from 'rxjs';\nimport { CompositeKey, type RemoteOpResult, type IRemoteOperationProvider } from '@memberjunction/core';\nimport {\n ResourceData,\n MJRecordProcessEntity,\n type PredictiveStudioRunFeaturePipelineInput,\n type PredictiveStudioRunFeaturePipelineOutput,\n} from '@memberjunction/core-entities';\nimport { RegisterClass } from '@memberjunction/global';\nimport { BaseResourceComponent, NavigationService } from '@memberjunction/ng-shared';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\n\nimport {\n FeaturePipelineEngine,\n type FeaturePipelineSummary,\n type FeaturePipelineRunStatus,\n} from './feature-pipeline.engine';\nimport {\n BuildFeaturePipelinesAgentContext,\n ResolvePipeline,\n BuildPipelineNotFoundError,\n} from './feature-pipelines-agent-context';\nimport { ValidateStringParam, AgentToolResult } from '../../../shared/agent-tool-validation';\n\n/** Stable operation key of the Run Feature Pipeline Remote Operation. */\nconst RUN_FEATURE_PIPELINE_OP = 'PredictiveStudio.RunFeaturePipeline';\n\n/** The toast a finished Run shows. */\nexport interface FeaturePipelineRunNotice {\n Message: string;\n Style: 'success' | 'warning' | 'error';\n /** True only when the run's status is `Completed`. */\n Completed: boolean;\n}\n\n@RegisterClass(BaseResourceComponent, 'FeaturePipelinesResource')\n@Component({\n standalone: false,\n selector: 'app-feature-pipelines-resource',\n templateUrl: './feature-pipelines-resource.component.html',\n styleUrls: ['./feature-pipelines-resource.component.css'],\n})\nexport class FeaturePipelinesResourceComponent\n extends BaseResourceComponent\n implements AfterViewInit, OnDestroy\n{\n private cdr = inject(ChangeDetectorRef);\n protected override navigationService = inject(NavigationService);\n protected override destroy$ = new Subject<void>();\n\n // ================================================================\n // Resource overrides\n // ================================================================\n\n async GetResourceDisplayName(_data: ResourceData): Promise<string> {\n return 'Feature Pipelines';\n }\n\n async GetResourceIconClass(_data: ResourceData): Promise<string> {\n return 'fa-solid fa-diagram-project';\n }\n\n // ================================================================\n // State\n // ================================================================\n\n /** True while the engine is loading its caches. */\n public IsLoading = true;\n\n /** All feature-pipeline summaries (unfiltered). */\n public AllPipelines: FeaturePipelineSummary[] = [];\n\n /** Pipelines after the search filter is applied (what the cards render). */\n public FilteredPipelines: FeaturePipelineSummary[] = [];\n\n /** Free-text search over name / target entity / output attribute. */\n public SearchQuery = '';\n\n /** Ids of pipelines with a Run currently in flight (disables their Run button). */\n public RunningIDs = new Set<string>();\n\n // ================================================================\n // Computed\n // ================================================================\n\n /** Count of pipelines whose underlying Record Process is Active. */\n public get ActiveCount(): number {\n return this.AllPipelines.filter((p) => p.Status === 'Active').length;\n }\n\n /** Count of pipelines that have never run. */\n public get NeverRunCount(): number {\n return this.AllPipelines.filter((p) => p.LastRunStatus === 'Never').length;\n }\n\n /** Count of pipelines whose most recent run failed. */\n public get FailedCount(): number {\n return this.AllPipelines.filter((p) => p.LastRunStatus === 'Failed').length;\n }\n\n // ================================================================\n // Lifecycle\n // ================================================================\n\n async ngAfterViewInit(): Promise<void> {\n await this.loadData();\n this.subscribeToEngine();\n this.emitAgentContext();\n this.registerAgentTools();\n this.NotifyLoadComplete();\n }\n\n ngOnDestroy(): void {\n super.ngOnDestroy();\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n // ================================================================\n // Public Methods — Toolbar\n // ================================================================\n\n /** Reload the engine caches from the server. */\n public async Refresh(): Promise<void> {\n await this.loadData(true);\n }\n\n /** Apply the search filter (called on every keystroke). */\n public OnSearchChanged(): void {\n this.applyFilter();\n this.emitAgentContext();\n this.cdr.detectChanges();\n }\n\n /** Open the entity record form to create a new record process. */\n public OnNewPipeline(): void {\n this.navigationService.OpenEntityRecord('MJ: Record Processes', new CompositeKey());\n }\n\n // ================================================================\n // Public Methods — Card Actions\n // ================================================================\n\n /** Open the entity record form in a new tab for an existing feature pipeline. */\n public OnViewPipeline(pipeline: FeaturePipelineSummary): void {\n this.navigationService.OpenEntityRecord('MJ: Record Processes', CompositeKey.FromID(pipeline.ID));\n }\n\n /**\n * Run a feature pipeline on demand by invoking the\n * `PredictiveStudio.RunFeaturePipeline` Remote Operation through the active\n * provider. The op delegates to the Record Set Processing substrate — the same\n * batching/resume/audit path the rest of the platform uses.\n * @returns the notice the run showed, or null when a run of the pipeline was already in flight\n */\n public async OnRunPipeline(pipeline: FeaturePipelineSummary): Promise<FeaturePipelineRunNotice | null> {\n if (this.RunningIDs.has(pipeline.ID)) return null;\n\n this.RunningIDs.add(pipeline.ID);\n this.cdr.detectChanges();\n\n try {\n const input: PredictiveStudioRunFeaturePipelineInput = { featurePipelineID: pipeline.ID };\n // RouteOperation lives on IRemoteOperationProvider, which every concrete\n // provider (the browser's GraphQLDataProvider here) implements via ProviderBase.\n // The narrowing cast is the documented \"power-tool seam\" entry point.\n const opProvider = this.ProviderToUse as unknown as IRemoteOperationProvider;\n const result = await opProvider.RouteOperation<\n PredictiveStudioRunFeaturePipelineInput,\n PredictiveStudioRunFeaturePipelineOutput\n >(RUN_FEATURE_PIPELINE_OP, input, { provider: this.ProviderToUse });\n\n return this.notifyRunResult(pipeline, result);\n } catch (error) {\n const notice: FeaturePipelineRunNotice = {\n Style: 'error',\n Completed: false,\n Message: `Failed to run \"${pipeline.Name}\": ${error instanceof Error ? error.message : String(error)}`,\n };\n MJNotificationService.Instance.CreateSimpleNotification(notice.Message, notice.Style, 5000);\n return notice;\n } finally {\n this.RunningIDs.delete(pipeline.ID);\n // Refresh so the card reflects the new run / freshness.\n await this.loadData(true);\n }\n }\n\n /** Whether a given pipeline currently has a Run in flight. */\n public IsRunning(pipelineID: string): boolean {\n return this.RunningIDs.has(pipelineID);\n }\n\n // ================================================================\n // Public Methods — Display Helpers\n // ================================================================\n\n /** Font Awesome icon for a pipeline's work type. */\n public WorkTypeIcon(workType: FeaturePipelineSummary['WorkType']): string {\n switch (workType) {\n case 'Infer':\n return 'fa-solid fa-wand-magic-sparkles';\n case 'Agent':\n return 'fa-solid fa-robot';\n case 'Action':\n return 'fa-solid fa-bolt';\n case 'FieldRules':\n return 'fa-solid fa-list-check';\n case 'ML Model':\n return 'fa-solid fa-brain';\n default:\n // Keeps the function total against future CodeGen-added work types.\n return 'fa-solid fa-gear';\n }\n }\n\n /** CSS modifier class for a run-status pill. */\n public RunStatusClass(status: FeaturePipelineRunStatus): string {\n return `status--${status.toLowerCase()}`;\n }\n\n /** Human-readable label for a run status. */\n public RunStatusLabel(status: FeaturePipelineRunStatus): string {\n return status === 'Never' ? 'Never run' : status;\n }\n\n /** Relative \"x ago\" string for the last-run timestamp. */\n public TimeAgo(date: Date | null): string {\n if (!date) return 'Never';\n const diffMs = Date.now() - new Date(date).getTime();\n const minutes = Math.floor(diffMs / 60000);\n const hours = Math.floor(minutes / 60);\n const days = Math.floor(hours / 24);\n if (days > 0) return `${days}d ago`;\n if (hours > 0) return `${hours}h ago`;\n if (minutes > 0) return `${minutes}m ago`;\n return 'Just now';\n }\n\n // ================================================================\n // Private Methods\n // ================================================================\n\n /** The engine instance scoped to the active provider (multi-provider safe). */\n private get engine(): FeaturePipelineEngine {\n return <FeaturePipelineEngine>(\n FeaturePipelineEngine.GetProviderInstance(this.ProviderToUse, FeaturePipelineEngine)\n );\n }\n\n private async loadData(forceRefresh = false): Promise<void> {\n this.IsLoading = true;\n this.cdr.detectChanges();\n try {\n const p = this.ProviderToUse;\n await this.engine.Config(forceRefresh, p.CurrentUser, p);\n this.AllPipelines = this.engine.GetSummaries();\n this.applyFilter();\n } catch (error) {\n console.error('[FeaturePipelinesResource] Error loading data:', error);\n this.AllPipelines = [];\n this.FilteredPipelines = [];\n } finally {\n this.IsLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Re-derive the summaries whenever the engine's cached Record Processes or\n * Process Runs change (save / delete / remote-invalidate elsewhere) — reactivity\n * for free from the BaseEngine streams.\n */\n private subscribeToEngine(): void {\n this.engine.Pipelines$.pipe(takeUntil(this.destroy$)).subscribe(() => {\n this.AllPipelines = this.engine.GetSummaries();\n this.applyFilter();\n this.emitAgentContext();\n this.cdr.detectChanges();\n });\n }\n\n private applyFilter(): void {\n const q = this.SearchQuery.trim().toLowerCase();\n if (!q) {\n this.FilteredPipelines = this.AllPipelines;\n return;\n }\n this.FilteredPipelines = this.AllPipelines.filter(\n (p) =>\n p.Name.toLowerCase().includes(q) ||\n p.TargetEntity.toLowerCase().includes(q) ||\n (p.OutputAttribute ?? '').toLowerCase().includes(q),\n );\n }\n\n /**\n * The toast for a Run's result. The operation succeeding only means the run was carried out; a refused or failed\n * run ends `Failed` with its error message, and a cancelled or paused run did not finish.\n */\n public static RunResultNotice(\n pipelineName: string,\n result: RemoteOpResult<PredictiveStudioRunFeaturePipelineOutput>,\n ): FeaturePipelineRunNotice {\n const out = result.Output;\n if (!result.Success || !out) {\n return { Style: 'error', Completed: false, Message: `\"${pipelineName}\" did not complete: ${result.ErrorMessage ?? 'unknown error'}` };\n }\n const reason = out.errorMessage || `the run ended with status ${out.status}`;\n if (out.status === 'Failed') {\n return { Style: 'error', Completed: false, Message: `\"${pipelineName}\" failed: ${reason}` };\n }\n if (out.status !== 'Completed') {\n return { Style: 'warning', Completed: false, Message: `\"${pipelineName}\" did not finish: ${reason}` };\n }\n return {\n Style: out.error > 0 ? 'warning' : 'success',\n Completed: true,\n Message: `\"${pipelineName}\" finished: ${out.processed} processed, ${out.written} succeeded, ${out.skipped} skipped unchanged, ${out.error} error(s).`,\n };\n }\n\n private notifyRunResult(\n pipeline: FeaturePipelineSummary,\n result: RemoteOpResult<PredictiveStudioRunFeaturePipelineOutput>,\n ): FeaturePipelineRunNotice {\n const notice = FeaturePipelinesResourceComponent.RunResultNotice(pipeline.Name, result);\n MJNotificationService.Instance.CreateSimpleNotification(notice.Message, notice.Style, 5000);\n return notice;\n }\n\n // ---- Agent context + client tools (required for every dashboard) ----\n //\n // 🔒 SAFETY BOUNDARY (Feature Pipelines surface)\n // ----------------------------------------------\n // EXPOSED to the agent: idempotent refresh, read-only search/filter, selection,\n // opening a pipeline's authoring editor (UI — no auto-save), and the existing\n // on-demand RUN (RunFeaturePipeline). Running a feature pipeline is intentionally\n // exposed: it is an idempotent, hardened Record-Set-Processing pass that derives\n // and writes feature values back via the pipeline's own OutputMapping — the same\n // run path the platform uses everywhere, with no agent-supplied parameters.\n //\n // NEVER EXPOSED: there is no agent tool that saves/deletes a pipeline definition\n // or its OutputMapping (authoring is a deliberate UI action via the editor\n // dialog). The agent may *open* the editor, never commit it.\n\n private emitAgentContext(): void {\n this.navigationService.SetAgentContext(this, BuildFeaturePipelinesAgentContext({\n AllPipelines: this.AllPipelines,\n FilteredPipelines: this.FilteredPipelines,\n SearchQuery: this.SearchQuery,\n RunningIDs: this.RunningIDs,\n IsLoading: this.IsLoading,\n }));\n }\n\n /** Resolve a pipeline reference (id/name/contains) or return a tolerant failure. */\n private resolvePipelineOrFail(\n raw: unknown,\n ): { ok: true; pipeline: FeaturePipelineSummary } | { ok: false; result: AgentToolResult } {\n const v = ValidateStringParam(raw, 'pipeline');\n if (!v.ok) return { ok: false, result: v.result };\n const match = ResolvePipeline(v.value, this.AllPipelines);\n if (!match) {\n return {\n ok: false,\n result: {\n Success: false,\n ErrorMessage: BuildPipelineNotFoundError(v.value, this.AllPipelines.map((p) => p.Name)),\n },\n };\n }\n return { ok: true, pipeline: match };\n }\n\n private registerAgentTools(): void {\n this.navigationService.SetAgentClientTools(this, [\n {\n Name: 'RunFeaturePipeline',\n Description:\n 'Run a Feature Pipeline on demand by its id or name. Derives + persists feature values back to the target entity via the pipeline OutputMapping (idempotent Record-Set-Processing pass; no agent-supplied parameters).',\n ParameterSchema: {\n type: 'object',\n properties: { pipeline: { type: 'string', description: 'The feature pipeline id or name' } },\n required: ['pipeline'],\n },\n Handler: async (params: Record<string, unknown>) => {\n const r = this.resolvePipelineOrFail(params['pipeline'] ?? params['name']);\n if (!r.ok) return r.result;\n if (!r.pipeline.OnDemandEnabled) {\n return { Success: false, ErrorMessage: `\"${r.pipeline.Name}\" is not enabled for on-demand runs.` };\n }\n const notice = await this.OnRunPipeline(r.pipeline);\n if (!notice?.Completed) {\n return { Success: false, ErrorMessage: notice?.Message ?? `\"${r.pipeline.Name}\" is already running.` };\n }\n return { Success: true, Data: { Pipeline: r.pipeline.Name, Message: notice.Message } };\n },\n },\n {\n Name: 'SearchFeaturePipelines',\n Description: 'Filter the feature pipeline list by a search term (name / target entity / attribute). Pass empty to clear. Read-only.',\n ParameterSchema: {\n type: 'object',\n properties: { query: { type: 'string' } },\n required: ['query'],\n },\n Handler: async (params: Record<string, unknown>) => {\n const v = ValidateStringParam(params['query'], 'query');\n if (!v.ok) return v.result;\n this.SearchQuery = v.value;\n this.OnSearchChanged();\n return { Success: true, Data: { FilteredCount: this.FilteredPipelines.length } };\n },\n },\n {\n Name: 'RefreshFeaturePipelines',\n Description: 'Reload the feature pipelines and their latest run/freshness from the server. Idempotent.',\n ParameterSchema: { type: 'object', properties: {} },\n Handler: async () => {\n await this.Refresh();\n this.emitAgentContext();\n return { Success: true, Data: { PipelineCount: this.AllPipelines.length } };\n },\n },\n {\n Name: 'OpenFeaturePipelineEditor',\n Description: 'Open the entity record form for a feature pipeline by id or name to inspect or edit its definition.',\n ParameterSchema: {\n type: 'object',\n properties: { pipeline: { type: 'string', description: 'The feature pipeline id or name' } },\n required: ['pipeline'],\n },\n Handler: async (params: Record<string, unknown>) => {\n const r = this.resolvePipelineOrFail(params['pipeline'] ?? params['name']);\n if (!r.ok) return r.result;\n this.OnViewPipeline(r.pipeline);\n return { Success: true, Data: { Pipeline: r.pipeline.Name } };\n },\n },\n ]);\n }\n}\n\n/** Tree-shaking prevention — keeps the component in the bundle. */\nexport function LoadFeaturePipelinesResource(): void {\n // Prevents tree-shaking of the component.\n}\n","<mj-page-layout>\n <mj-page-header\n Title=\"Feature Pipelines\"\n Icon=\"fa-solid fa-diagram-project\"\n Subtitle=\"Derive feature attributes from your data and persist them back to entities\">\n <div meta>\n @if (FailedCount > 0) {\n <mj-stat-badge [Count]=\"FailedCount\" Label=\"last run failed\" Variant=\"error\"></mj-stat-badge>\n } @else {\n <mj-stat-badge\n [Count]=\"FilteredPipelines.length\"\n [Total]=\"AllPipelines.length\"\n Label=\"pipelines\">\n </mj-stat-badge>\n }\n </div>\n <div actions>\n <mj-refresh-button [Loading]=\"IsLoading\" (Clicked)=\"Refresh()\"></mj-refresh-button>\n <button mjButton variant=\"primary\" size=\"sm\" (click)=\"OnNewPipeline()\">\n <i class=\"fa-solid fa-plus\"></i> New Pipeline\n </button>\n </div>\n <div toolbar>\n <mj-page-search\n [Value]=\"SearchQuery\"\n Placeholder=\"Search by name, entity, or attribute…\"\n (ValueChange)=\"SearchQuery = $event; OnSearchChanged()\">\n </mj-page-search>\n </div>\n </mj-page-header>\n\n <mj-page-body [Flex]=\"true\">\n @if (IsLoading) {\n <div class=\"fp-loading\">\n <mj-loading text=\"Loading feature pipelines…\" size=\"medium\"></mj-loading>\n </div>\n } @else if (AllPipelines.length === 0) {\n <mj-empty-state\n Icon=\"fa-solid fa-diagram-project\"\n Title=\"No feature pipelines yet\"\n Message=\"A Feature Pipeline derives an attribute per record (e.g. an LLM summary or score) and writes it back to your data — reusable analytics, independent of any model.\"\n ActionText=\"New Pipeline\"\n ActionIcon=\"fa-solid fa-plus\"\n (Action)=\"OnNewPipeline()\">\n </mj-empty-state>\n } @else if (FilteredPipelines.length === 0) {\n <mj-empty-state\n Variant=\"no-results\"\n Icon=\"fa-solid fa-magnifying-glass\"\n Title=\"No matching pipelines\"\n Message=\"No feature pipelines match your search.\">\n </mj-empty-state>\n } @else {\n <div class=\"fp-grid\">\n @for (pipeline of FilteredPipelines; track pipeline.ID) {\n <div class=\"fp-card\" [class.fp-card--disabled]=\"pipeline.Status !== 'Active'\">\n <div class=\"fp-card__head\">\n <i class=\"fp-card__icon\" [class]=\"WorkTypeIcon(pipeline.WorkType)\"></i>\n <div class=\"fp-card__title\">\n <h3 [title]=\"pipeline.Name\">{{ pipeline.Name }}</h3>\n <div class=\"fp-card__subhead\">\n <span class=\"fp-card__worktype\">{{ pipeline.WorkType }}</span>\n <span class=\"fp-type-badge\" [class.fp-type-badge--decision]=\"pipeline.PipelineType === 'Decision'\">{{ pipeline.PipelineType }}</span>\n </div>\n </div>\n <span class=\"fp-status\" [class]=\"RunStatusClass(pipeline.LastRunStatus)\">\n {{ RunStatusLabel(pipeline.LastRunStatus) }}\n </span>\n </div>\n\n @if (pipeline.Description) {\n <p class=\"fp-card__desc\" [title]=\"pipeline.Description\">{{ pipeline.Description }}</p>\n }\n\n <div class=\"fp-card__meta\">\n <div class=\"fp-meta-row\">\n <span class=\"fp-meta-row__k\"><i class=\"fa-solid fa-table\"></i> Target</span>\n <span class=\"fp-meta-row__v\">{{ pipeline.TargetEntity }}</span>\n </div>\n <div class=\"fp-meta-row\">\n <span class=\"fp-meta-row__k\"><i class=\"fa-solid fa-pen-to-square\"></i> Writes</span>\n <span class=\"fp-meta-row__v\">{{ pipeline.OutputAttribute || '—' }}</span>\n </div>\n <div class=\"fp-meta-row\">\n <span class=\"fp-meta-row__k\"><i class=\"fa-solid fa-clock-rotate-left\"></i> Last run</span>\n <span class=\"fp-meta-row__v\">\n {{ TimeAgo(pipeline.LastRunAt) }}\n @if (pipeline.LastRunOutcomeText) {\n <span class=\"fp-meta-row__sub\">· {{ pipeline.LastRunOutcomeText }}</span>\n } @else if (pipeline.LastRunProcessed != null) {\n <span class=\"fp-meta-row__sub\">· {{ pipeline.LastRunSuccess }}/{{ pipeline.LastRunProcessed }} processed</span>\n }\n </span>\n </div>\n @if (pipeline.LastRunErrorMessage) {\n <p class=\"fp-card__error\" [title]=\"pipeline.LastRunErrorMessage\">\n <i class=\"fa-solid fa-circle-exclamation\"></i> {{ pipeline.LastRunErrorMessage }}\n </p>\n }\n </div>\n\n <div class=\"fp-card__actions\">\n <button\n mjButton\n variant=\"primary\"\n size=\"sm\"\n [disabled]=\"!pipeline.OnDemandEnabled || pipeline.Status !== 'Active' || IsRunning(pipeline.ID)\"\n (click)=\"OnRunPipeline(pipeline)\">\n @if (IsRunning(pipeline.ID)) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Running…\n } @else {\n <i class=\"fa-solid fa-play\"></i> Run\n }\n </button>\n <button mjButton variant=\"secondary\" size=\"sm\" (click)=\"OnViewPipeline(pipeline)\">\n <i class=\"fa-solid fa-eye\"></i> View\n </button>\n </div>\n </div>\n }\n </div>\n }\n </mj-page-body>\n</mj-page-layout>\n"]}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import { EventEmitter } from '@angular/core';
|
|
2
|
+
import { type ViewToggleOption } from '@memberjunction/ng-ui-components';
|
|
3
|
+
import type { MJLoginRegionCommand } from '@memberjunction/ng-auth-services';
|
|
4
|
+
import { type LoginBlock, type LoginCardBlock, type LoginColorKey, type LoginDesign, type LoginHeadlineBlock, type LoginImageBlock, type LoginLayout, type LoginLinksBlock, type LoginLogoBlock, type LoginRegion, type LoginSize, type LoginTextBlock } from '@memberjunction/theme-engine';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
/** A block field the inspector can change. */
|
|
7
|
+
export type LoginBlockField = 'Source' | 'Size' | 'Width' | 'Text' | 'Muted' | 'Icon' | 'Title' | 'Href' | 'NewTab' | 'URL' | 'Alt' | 'HideWhenStacked';
|
|
8
|
+
/** A page-level field the inspector can change. */
|
|
9
|
+
export type LoginPageField = 'Layout' | 'Alignment' | 'PanelWidth' | 'Tone' | 'CardRadius' | 'BannerShare';
|
|
10
|
+
export type LoginBackgroundField = 'Kind' | 'Color' | 'Color2' | 'ImageURL' | 'Overlay';
|
|
11
|
+
/** One change the inspector asks for. The studio applies it, so every change is one undoable step. */
|
|
12
|
+
export type LoginEdit = {
|
|
13
|
+
Kind: 'Block';
|
|
14
|
+
Field: LoginBlockField;
|
|
15
|
+
Value: string | boolean | null;
|
|
16
|
+
} | {
|
|
17
|
+
Kind: 'Link';
|
|
18
|
+
Index: number;
|
|
19
|
+
Field: 'Label' | 'Href';
|
|
20
|
+
Value: string;
|
|
21
|
+
} | {
|
|
22
|
+
Kind: 'AddLink';
|
|
23
|
+
} | {
|
|
24
|
+
Kind: 'RemoveLink';
|
|
25
|
+
Index: number;
|
|
26
|
+
} | {
|
|
27
|
+
Kind: 'Page';
|
|
28
|
+
Field: LoginPageField;
|
|
29
|
+
Value: string;
|
|
30
|
+
} | {
|
|
31
|
+
Kind: 'Heading';
|
|
32
|
+
Value: string;
|
|
33
|
+
} | {
|
|
34
|
+
Kind: 'Background';
|
|
35
|
+
Field: LoginBackgroundField;
|
|
36
|
+
Value: string | number | null;
|
|
37
|
+
} | {
|
|
38
|
+
Kind: 'Color';
|
|
39
|
+
Key: LoginColorKey;
|
|
40
|
+
Value: string | null;
|
|
41
|
+
};
|
|
42
|
+
/** The two parts of the page that are not blocks: each opens its own settings when clicked. */
|
|
43
|
+
export type LoginSurface = 'Banner' | 'Panel';
|
|
44
|
+
interface Option {
|
|
45
|
+
Label: string;
|
|
46
|
+
Value: string;
|
|
47
|
+
}
|
|
48
|
+
interface ColorRow {
|
|
49
|
+
Key: LoginColorKey;
|
|
50
|
+
Name: string;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Login Studio's settings column: the selected block's fields, the selected surface's, or the page's.
|
|
54
|
+
* A color appears with the thing it paints. Owns no state: every change goes out as a {@link LoginEdit}
|
|
55
|
+
* the studio applies, so undo, the preview and the unsaved state live in one place.
|
|
56
|
+
*/
|
|
57
|
+
export declare class LoginStudioInspectorComponent {
|
|
58
|
+
Design: LoginDesign;
|
|
59
|
+
Selected: LoginBlock | null;
|
|
60
|
+
/** The region the selected block sits in: a card's colors depend on which side of the page it is on. */
|
|
61
|
+
SelectedRegion: LoginRegion | null;
|
|
62
|
+
/** The selected surface, when no block is selected. */
|
|
63
|
+
Surface: LoginSurface | null;
|
|
64
|
+
/** A published page or a draft exists, so "Use the stock sign-in page" applies. */
|
|
65
|
+
CanReset: boolean;
|
|
66
|
+
Saving: boolean;
|
|
67
|
+
EditRequested: EventEmitter<LoginEdit>;
|
|
68
|
+
CommandRequested: EventEmitter<MJLoginRegionCommand>;
|
|
69
|
+
StockPageRequested: EventEmitter<void>;
|
|
70
|
+
SurfaceSelectRequested: EventEmitter<LoginSurface>;
|
|
71
|
+
readonly Limits: {
|
|
72
|
+
readonly BlocksPerRegion: 12;
|
|
73
|
+
readonly Heading: 60;
|
|
74
|
+
readonly Headline: 120;
|
|
75
|
+
readonly Text: 600;
|
|
76
|
+
readonly CardTitle: 80;
|
|
77
|
+
readonly CardText: 240;
|
|
78
|
+
readonly LinkLabel: 60;
|
|
79
|
+
readonly Links: 8;
|
|
80
|
+
readonly Alt: 160;
|
|
81
|
+
readonly URL: 2048;
|
|
82
|
+
readonly OverlayMax: 85;
|
|
83
|
+
};
|
|
84
|
+
readonly Layouts: readonly ["split", "split-reverse", "centered"];
|
|
85
|
+
readonly LayoutLabel: Record<LoginLayout, string>;
|
|
86
|
+
readonly SizeOptions: ViewToggleOption[];
|
|
87
|
+
readonly WidthOptions: ViewToggleOption[];
|
|
88
|
+
readonly RadiusOptions: ViewToggleOption[];
|
|
89
|
+
readonly BackgroundOptions: ViewToggleOption[];
|
|
90
|
+
readonly ToneOptions: ViewToggleOption[];
|
|
91
|
+
readonly AlignmentOptions: ViewToggleOption[];
|
|
92
|
+
readonly BannerShareOptions: ViewToggleOption[];
|
|
93
|
+
readonly PanelWidthOptions: ViewToggleOption[];
|
|
94
|
+
readonly ColorLabel: Record<"BannerText" | "BannerCardBg" | "BannerCardText" | "PanelBg" | "PanelText" | "CardBg" | "CardText" | "CardBorder", string>;
|
|
95
|
+
readonly LogoSourceOptions: Option[];
|
|
96
|
+
readonly IconOptions: Option[];
|
|
97
|
+
get SelectedProblems(): string[];
|
|
98
|
+
/** Only the warnings about the colors on screen. */
|
|
99
|
+
get ContrastWarnings(): string[];
|
|
100
|
+
/** The colors of what is selected. Each is one --mj-login-* token, so it is shared across that side of the page. */
|
|
101
|
+
get Colors(): ColorRow[];
|
|
102
|
+
/** Says who else a color change reaches, so one card's color repainting the others is no surprise. */
|
|
103
|
+
get ColorScope(): string | null;
|
|
104
|
+
get AsLogo(): LoginLogoBlock | null;
|
|
105
|
+
get AsHeadline(): LoginHeadlineBlock | null;
|
|
106
|
+
get AsText(): LoginTextBlock | null;
|
|
107
|
+
get AsCard(): LoginCardBlock | null;
|
|
108
|
+
get AsLinks(): LoginLinksBlock | null;
|
|
109
|
+
get AsImage(): LoginImageBlock | null;
|
|
110
|
+
/** The selected block's size, when its kind comes in sizes (logo, headline, image, spacer). */
|
|
111
|
+
get SelectedSize(): LoginSize | null;
|
|
112
|
+
SetBlock(field: LoginBlockField, value: string | boolean | null): void;
|
|
113
|
+
/** Text that may be cleared: an empty field is stored as null, not ''. */
|
|
114
|
+
SetBlockOptional(field: LoginBlockField, value: string): void;
|
|
115
|
+
SetLink(index: number, field: 'Label' | 'Href', value: string): void;
|
|
116
|
+
AddLink(): void;
|
|
117
|
+
RemoveLink(index: number): void;
|
|
118
|
+
SetPage(field: LoginPageField, value: string): void;
|
|
119
|
+
SetHeading(value: string): void;
|
|
120
|
+
SetBackground(field: LoginBackgroundField, value: string | number | null): void;
|
|
121
|
+
SetColor(key: LoginColorKey, value: string | null): void;
|
|
122
|
+
StartColor(key: LoginColorKey): void;
|
|
123
|
+
Run(kind: MJLoginRegionCommand['Kind']): void;
|
|
124
|
+
/** A text input's value, typed, so the template never needs a cast to read it. */
|
|
125
|
+
ValueOf(e: Event): string;
|
|
126
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<LoginStudioInspectorComponent, never>;
|
|
127
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<LoginStudioInspectorComponent, "mj-login-studio-inspector", never, { "Design": { "alias": "Design"; "required": false; }; "Selected": { "alias": "Selected"; "required": false; }; "SelectedRegion": { "alias": "SelectedRegion"; "required": false; }; "Surface": { "alias": "Surface"; "required": false; }; "CanReset": { "alias": "CanReset"; "required": false; }; "Saving": { "alias": "Saving"; "required": false; }; }, { "EditRequested": "EditRequested"; "CommandRequested": "CommandRequested"; "StockPageRequested": "StockPageRequested"; "SurfaceSelectRequested": "SurfaceSelectRequested"; }, never, never, true, never>;
|
|
128
|
+
}
|
|
129
|
+
export {};
|
|
130
|
+
//# sourceMappingURL=login-studio-inspector.component.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"login-studio-inspector.component.d.ts","sourceRoot":"","sources":["../../src/LoginStudio/login-studio-inspector.component.ts"],"names":[],"mappings":"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"}
|