@memberjunction/ng-dashboards 5.47.0 → 5.49.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/dist/DataExplorer/data-explorer-dashboard.component.d.ts +15 -4
- package/dist/DataExplorer/data-explorer-dashboard.component.d.ts.map +1 -1
- package/dist/DataExplorer/data-explorer-dashboard.component.js +45 -35
- package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
- package/dist/DataExplorer/models/explorer-state.interface.d.ts +7 -0
- package/dist/DataExplorer/models/explorer-state.interface.d.ts.map +1 -1
- package/dist/DataExplorer/models/explorer-state.interface.js.map +1 -1
- package/dist/KnowledgeHub/components/feature-pipelines/feature-pipelines-resource.component.js +2 -2
- package/dist/KnowledgeHub/components/feature-pipelines/feature-pipelines-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-browse-resource.component.d.ts +4 -0
- package/dist/Lists/components/lists-browse-resource.component.d.ts.map +1 -1
- package/dist/Lists/components/lists-browse-resource.component.js +39 -30
- package/dist/Lists/components/lists-browse-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-my-lists-resource.component.d.ts.map +1 -1
- package/dist/Lists/components/lists-my-lists-resource.component.js +14 -12
- package/dist/Lists/components/lists-my-lists-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-operations-resource.component.d.ts.map +1 -1
- package/dist/Lists/components/lists-operations-resource.component.js +6 -1
- package/dist/Lists/components/lists-operations-resource.component.js.map +1 -1
- package/dist/Lists/services/list-set-operations.service.d.ts +11 -0
- package/dist/Lists/services/list-set-operations.service.d.ts.map +1 -1
- package/dist/Lists/services/list-set-operations.service.js +56 -14
- package/dist/Lists/services/list-set-operations.service.js.map +1 -1
- package/dist/PredictiveStudio/components/ps-pipelines.component.d.ts +7 -1
- package/dist/PredictiveStudio/components/ps-pipelines.component.d.ts.map +1 -1
- package/dist/PredictiveStudio/components/ps-pipelines.component.js +11 -4
- package/dist/PredictiveStudio/components/ps-pipelines.component.js.map +1 -1
- package/dist/Testing/components/testing-runs.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-runs.component.js +35 -25
- package/dist/Testing/components/testing-runs.component.js.map +1 -1
- package/dist/Testing/services/testing-instrumentation.service.d.ts +5 -0
- package/dist/Testing/services/testing-instrumentation.service.d.ts.map +1 -1
- package/dist/Testing/services/testing-instrumentation.service.js +8 -2
- package/dist/Testing/services/testing-instrumentation.service.js.map +1 -1
- package/dist/ThemeStudio/theme-agent-context.d.ts +64 -0
- package/dist/ThemeStudio/theme-agent-context.d.ts.map +1 -0
- package/dist/ThemeStudio/theme-agent-context.js +129 -0
- package/dist/ThemeStudio/theme-agent-context.js.map +1 -0
- package/dist/ThemeStudio/theme-manager-dashboard.component.d.ts +62 -0
- package/dist/ThemeStudio/theme-manager-dashboard.component.d.ts.map +1 -0
- package/dist/ThemeStudio/theme-manager-dashboard.component.js +464 -0
- package/dist/ThemeStudio/theme-manager-dashboard.component.js.map +1 -0
- package/dist/ThemeStudio/theme-manager-resource.component.d.ts +31 -0
- package/dist/ThemeStudio/theme-manager-resource.component.d.ts.map +1 -0
- package/dist/ThemeStudio/theme-manager-resource.component.js +97 -0
- package/dist/ThemeStudio/theme-manager-resource.component.js.map +1 -0
- package/dist/ThemeStudio/theme-studio-dashboard.component.d.ts +351 -0
- package/dist/ThemeStudio/theme-studio-dashboard.component.d.ts.map +1 -0
- package/dist/ThemeStudio/theme-studio-dashboard.component.js +2931 -0
- package/dist/ThemeStudio/theme-studio-dashboard.component.js.map +1 -0
- package/dist/ThemeStudio/theme-studio-resource.component.d.ts +28 -0
- package/dist/ThemeStudio/theme-studio-resource.component.d.ts.map +1 -0
- package/dist/ThemeStudio/theme-studio-resource.component.js +96 -0
- package/dist/ThemeStudio/theme-studio-resource.component.js.map +1 -0
- package/dist/ThemeStudio/theme-studio.constants.d.ts +79 -0
- package/dist/ThemeStudio/theme-studio.constants.d.ts.map +1 -0
- package/dist/ThemeStudio/theme-studio.constants.js +217 -0
- package/dist/ThemeStudio/theme-studio.constants.js.map +1 -0
- package/dist/core-dashboards.module.d.ts +56 -52
- package/dist/core-dashboards.module.d.ts.map +1 -1
- package/dist/core-dashboards.module.js +24 -1
- package/dist/core-dashboards.module.js.map +1 -1
- package/dist/public-api.d.ts +4 -0
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +4 -0
- package/dist/public-api.js.map +1 -1
- package/package.json +63 -60
|
@@ -104,6 +104,13 @@ export interface RecentRecordAccess {
|
|
|
104
104
|
recordName?: string;
|
|
105
105
|
latestAt: Date;
|
|
106
106
|
totalCount: number;
|
|
107
|
+
/**
|
|
108
|
+
* Pre-computed "N ago" relative-time label for display. Populated by the dashboard when the
|
|
109
|
+
* record set loads and refreshed on a timer, so the template binds a STABLE field instead of
|
|
110
|
+
* calling a `Date.now()`-based method during change detection (which triggers NG0100). See the
|
|
111
|
+
* DataExplorerDashboardComponent relative-time handling.
|
|
112
|
+
*/
|
|
113
|
+
relativeTime?: string;
|
|
107
114
|
}
|
|
108
115
|
/**
|
|
109
116
|
* Favorite record for home screen (from User Favorites, excluding entity favorites)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"explorer-state.interface.d.ts","sourceRoot":"","sources":["../../../src/DataExplorer/models/explorer-state.interface.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAE5D;;;GAGG;AACH,MAAM,WAAW,kBAAkB;IACjC;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB;;OAEG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IAEvB;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IAEvB;;;OAGG;IACH,qBAAqB,CAAC,EAAE,OAAO,CAAC;CACjC;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,aAAa,GAAG,QAAQ,GAAG,QAAQ,CAAC;IAC1C,wCAAwC;IACxC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iDAAiD;IACjD,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,oCAAoC;IACpC,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,MAAM,MAAM,oBAAoB,GAAG,MAAM,GAAG,OAAO,GAAG,UAAU,GAAG,KAAK,CAAC;AAEzE;;GAEG;AACH,MAAM,MAAM,uBAAuB,GAAG,UAAU,GAAG,YAAY,CAAC;AAEhE;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IACnC,iCAAiC;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,kDAAkD;IAClD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,0FAA0F;IAC1F,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iDAAiD;IACjD,QAAQ,CAAC,EAAE,oBAAoB,CAAC;IAChC,kEAAkE;IAClE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,wFAAwF;IACxF,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,IAAI,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,IAAI,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"explorer-state.interface.d.ts","sourceRoot":"","sources":["../../../src/DataExplorer/models/explorer-state.interface.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"explorer-state.interface.js","sourceRoot":"","sources":["../../../src/DataExplorer/models/explorer-state.interface.ts"],"names":[],"mappings":"AAmRA;;GAEG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAsB;IACvD,oBAAoB,EAAE,GAAG;IACzB,wBAAwB,EAAE,IAAI;IAC9B,kBAAkB,EAAE,IAAI;IACxB,cAAc,EAAE,IAAI;IACpB,YAAY,EAAE,KAAK;IACnB,mBAAmB,EAAE,KAAK;IAC1B,iBAAiB,EAAE,EAAE;IACrB,kBAAkB,EAAE,IAAI;IACxB,WAAW,EAAE,EAAE;IACf,QAAQ,EAAE,MAAM;IAChB,mBAAmB,EAAE,UAAU;IAC/B,qBAAqB,EAAE,IAAI;IAC3B,iBAAiB,EAAE,MAAM;IACzB,aAAa,EAAE,OAAO;IACtB,OAAO,EAAE,IAAI;IACb,YAAY,EAAE,IAAI;IAClB,YAAY,EAAE,IAAI;IAClB,eAAe,EAAE,KAAK;IACtB,gBAAgB,EAAE,GAAG;IACrB,gBAAgB,EAAE,IAAI;IACtB,kBAAkB,EAAE,IAAI;IACxB,wBAAwB,EAAE,IAAI;IAC9B,qBAAqB,EAAE,IAAI;IAC3B,uBAAuB,EAAE,IAAI;IAC7B,oBAAoB,EAAE,IAAI;IAC1B,WAAW,EAAE,EAAE;IACf,SAAS,EAAE,EAAE;IACb,oBAAoB;IACpB,eAAe,EAAE,KAAK,EAAG,0CAA0C;IACnE,oBAAoB,EAAE,EAAE;IACxB,gBAAgB,EAAE,EAAE;IACpB,eAAe,EAAE,EAAE;IACnB,+CAA+C;IAC/C,iBAAiB,EAAE,EAAE;IACrB,oBAAoB,EAAE,KAAK;IAC3B,mBAAmB,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE;IACzF,YAAY,EAAE,KAAK;CACpB,CAAC","sourcesContent":["import { EntityInfo } from '@memberjunction/core';\nimport { MapRenderMode } from '@memberjunction/ng-map-view';\n\n/**\n * Filter configuration for the Data Explorer\n * Allows constraining which entities are shown in the explorer\n */\nexport interface DataExplorerFilter {\n /**\n * Application ID to filter entities by.\n * Only entities linked via ApplicationEntities will be shown.\n */\n applicationId?: string;\n\n /**\n * Application name for display purposes (breadcrumbs, titles)\n */\n applicationName?: string;\n\n /**\n * Schema names to filter by (e.g., ['dbo', 'sales'])\n * Only entities in these schemas will be shown.\n */\n schemaNames?: string[];\n\n /**\n * Explicit entity names to include (e.g., ['Accounts', 'Contacts'])\n * If provided, only these entities will be shown.\n */\n entityNames?: string[];\n\n /**\n * Whether to show system entities (entities starting with __ or system schemas)\n * Default: false\n */\n includeSystemEntities?: boolean;\n}\n\n/**\n * Breadcrumb item for navigation display\n */\nexport interface BreadcrumbItem {\n label: string;\n type: 'application' | 'entity' | 'record';\n /** For entity type - the entity name */\n entityName?: string;\n /** For record type - the composite key string */\n compositeKeyString?: string;\n /** Icon class for the breadcrumb */\n icon?: string;\n}\n\n/**\n * View mode options for the Data Explorer\n */\nexport type DataExplorerViewMode = 'grid' | 'cards' | 'timeline' | 'map';\n\n/**\n * Timeline orientation options\n */\nexport type TimelineOrientationType = 'vertical' | 'horizontal';\n\n/**\n * Initial navigation state from URL query parameters.\n * Used for deep linking into the Data Explorer.\n */\nexport interface DataExplorerDeepLink {\n /** Entity name to navigate to */\n entity?: string;\n /** Record ID or composite key string to select */\n record?: string;\n /** Filter text to apply (omitted when viewId is present — view carries its own filter) */\n filter?: string;\n /** View mode to use (grid/cards/timeline/map) */\n viewMode?: DataExplorerViewMode;\n /** Saved view ID to load (uses view's filters/sort/grid state) */\n viewId?: string;\n /** Map render mode (point/choropleth/heatmap) — only relevant when viewMode is 'map' */\n mapMode?: string;\n}\n\n/**\n * Per-entity cached state (filters, scroll position, etc.)\n */\nexport interface EntityCacheEntry {\n filterText: string;\n scrollPosition?: number;\n lastAccessed: number; // timestamp for LRU eviction\n}\n\n/**\n * Recent entity access tracking for home screen\n */\nexport interface RecentEntityAccess {\n entityName: string;\n entityId: string;\n lastAccessed: Date;\n accessCount: number;\n}\n\n/**\n * Favorite entity for home screen (using User Favorites entity)\n */\nexport interface FavoriteEntity {\n userFavoriteId: string; // ID from User Favorites entity\n entityName: string;\n entityId: string;\n}\n\n/**\n * Recent record access for home screen (from User Record Logs)\n */\nexport interface RecentRecordAccess {\n entityName: string;\n entityId: string;\n recordId: string;\n recordName?: string;\n latestAt: Date;\n totalCount: number;\n}\n\n/**\n * Favorite record for home screen (from User Favorites, excluding entity favorites)\n */\nexport interface FavoriteRecord {\n userFavoriteId: string; // ID from User Favorites entity\n entityName: string;\n entityId: string;\n recordId: string;\n recordName?: string;\n}\n\n/**\n * Represents an application group with its entities for the home view.\n * Used by Concept D to organize entities by their first Application membership.\n */\nexport interface AppEntityGroup {\n applicationId: string;\n applicationName: string;\n applicationIcon: string;\n applicationColor: string | null;\n entities: EntityInfo[];\n isExpanded: boolean;\n}\n\n/**\n * Home view mode for the All/Favorites toggle\n */\nexport type HomeViewMode = 'all' | 'favorites';\n\n/**\n * State interface for the Data Explorer dashboard\n */\nexport interface DataExplorerState {\n // Navigation panel\n navigationPanelWidth: number;\n navigationPanelCollapsed: boolean;\n\n // Current context\n selectedEntityName: string | null;\n selectedViewId: string | null;\n\n // View modification tracking\n /** Whether the current view configuration has unsaved changes */\n viewModified: boolean;\n\n // View configuration panel\n /** Whether the view configuration panel is open */\n viewConfigPanelOpen: boolean;\n\n // Smart filter (current entity's filter - also cached in entityCache)\n smartFilterPrompt: string;\n smartFilterEnabled: boolean;\n\n // Per-entity cache for filters and state\n entityCache: Record<string, EntityCacheEntry>;\n\n // View mode\n viewMode: DataExplorerViewMode;\n\n // Timeline configuration (per-entity, but stored here for simplicity)\n timelineOrientation: TimelineOrientationType;\n timelineDateFieldName: string | null;\n timelineSortOrder: 'asc' | 'desc';\n\n // Map configuration (persisted across page reloads)\n mapRenderMode: MapRenderMode;\n mapZoom: number | null;\n mapCenterLat: number | null;\n mapCenterLng: number | null;\n\n // Detail panel\n detailPanelOpen: boolean;\n detailPanelWidth: number;\n selectedRecordId: string | null;\n /** Display name of the currently selected record (for breadcrumbs) */\n selectedRecordName: string | null;\n\n // Section states\n favoritesSectionExpanded: boolean;\n recentSectionExpanded: boolean;\n entitiesSectionExpanded: boolean;\n viewsSectionExpanded: boolean;\n\n // Recent items (legacy - records within current explorer context)\n recentItems: RecentItem[];\n\n // Favorites (legacy - records within current explorer context)\n favorites: FavoriteItem[];\n\n // Home screen state\n /** Whether to show all entities or just DefaultForNewUser entities */\n showAllEntities: boolean;\n /** Recent entity access tracking for home screen */\n recentEntityAccesses: RecentEntityAccess[];\n /** Favorite entities for home screen */\n favoriteEntities: FavoriteEntity[];\n /** Favorite records for home screen (non-entity favorites) */\n favoriteRecords: FavoriteRecord[];\n\n // Concept D: Application Groups + Search-First\n /** Which application group IDs are currently expanded */\n expandedAppGroups: string[];\n /** Whether the right-side quick access panel is open */\n quickAccessPanelOpen: boolean;\n /** Collapse state per section in the quick access panel (key = section id, value = expanded) */\n quickAccessSections: Record<string, boolean>;\n /** Home view mode toggle: show all entities or favorites only */\n homeViewMode: HomeViewMode;\n}\n\nexport interface RecentItem {\n entityName: string;\n /** Serialized CompositeKey using ToConcatenatedString format (Field1|Value1||Field2|Value2) */\n compositeKeyString: string;\n displayName: string;\n timestamp: Date;\n}\n\nexport interface FavoriteItem {\n type: 'record' | 'view' | 'entity';\n entityName?: string;\n /** Serialized CompositeKey using ToConcatenatedString format (Field1|Value1||Field2|Value2) */\n compositeKeyString?: string;\n viewId?: string;\n displayName: string;\n}\n\n/**\n * Field display type for smart rendering in cards\n */\nexport type CardFieldType = 'number' | 'boolean' | 'text' | 'date';\n\n/**\n * Metadata for a field to display in a card\n */\nexport interface CardDisplayField {\n name: string;\n type: CardFieldType;\n label: string;\n}\n\n/**\n * Auto-generated card template based on entity metadata\n */\nexport interface AutoCardTemplate {\n titleField: string;\n subtitleField: string | null;\n descriptionField: string | null;\n /** Display fields with type information for smart rendering */\n displayFields: CardDisplayField[];\n thumbnailField: string | null;\n badgeField: string | null;\n}\n\n/**\n * Default state for the Data Explorer\n */\nexport const DEFAULT_EXPLORER_STATE: DataExplorerState = {\n navigationPanelWidth: 280,\n navigationPanelCollapsed: true,\n selectedEntityName: null,\n selectedViewId: null,\n viewModified: false,\n viewConfigPanelOpen: false,\n smartFilterPrompt: '',\n smartFilterEnabled: true,\n entityCache: {},\n viewMode: 'grid',\n timelineOrientation: 'vertical',\n timelineDateFieldName: null,\n timelineSortOrder: 'desc',\n mapRenderMode: 'point',\n mapZoom: null,\n mapCenterLat: null,\n mapCenterLng: null,\n detailPanelOpen: false,\n detailPanelWidth: 400,\n selectedRecordId: null,\n selectedRecordName: null,\n favoritesSectionExpanded: true,\n recentSectionExpanded: true,\n entitiesSectionExpanded: true,\n viewsSectionExpanded: true,\n recentItems: [],\n favorites: [],\n // Home screen state\n showAllEntities: false, // Default to showing only common entities\n recentEntityAccesses: [],\n favoriteEntities: [],\n favoriteRecords: [],\n // Concept D: Application Groups + Search-First\n expandedAppGroups: [],\n quickAccessPanelOpen: false,\n quickAccessSections: { recentRecords: true, recentEntities: true, favoriteRecords: true },\n homeViewMode: 'all',\n};\n"]}
|
|
1
|
+
{"version":3,"file":"explorer-state.interface.js","sourceRoot":"","sources":["../../../src/DataExplorer/models/explorer-state.interface.ts"],"names":[],"mappings":"AA0RA;;GAEG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAsB;IACvD,oBAAoB,EAAE,GAAG;IACzB,wBAAwB,EAAE,IAAI;IAC9B,kBAAkB,EAAE,IAAI;IACxB,cAAc,EAAE,IAAI;IACpB,YAAY,EAAE,KAAK;IACnB,mBAAmB,EAAE,KAAK;IAC1B,iBAAiB,EAAE,EAAE;IACrB,kBAAkB,EAAE,IAAI;IACxB,WAAW,EAAE,EAAE;IACf,QAAQ,EAAE,MAAM;IAChB,mBAAmB,EAAE,UAAU;IAC/B,qBAAqB,EAAE,IAAI;IAC3B,iBAAiB,EAAE,MAAM;IACzB,aAAa,EAAE,OAAO;IACtB,OAAO,EAAE,IAAI;IACb,YAAY,EAAE,IAAI;IAClB,YAAY,EAAE,IAAI;IAClB,eAAe,EAAE,KAAK;IACtB,gBAAgB,EAAE,GAAG;IACrB,gBAAgB,EAAE,IAAI;IACtB,kBAAkB,EAAE,IAAI;IACxB,wBAAwB,EAAE,IAAI;IAC9B,qBAAqB,EAAE,IAAI;IAC3B,uBAAuB,EAAE,IAAI;IAC7B,oBAAoB,EAAE,IAAI;IAC1B,WAAW,EAAE,EAAE;IACf,SAAS,EAAE,EAAE;IACb,oBAAoB;IACpB,eAAe,EAAE,KAAK,EAAG,0CAA0C;IACnE,oBAAoB,EAAE,EAAE;IACxB,gBAAgB,EAAE,EAAE;IACpB,eAAe,EAAE,EAAE;IACnB,+CAA+C;IAC/C,iBAAiB,EAAE,EAAE;IACrB,oBAAoB,EAAE,KAAK;IAC3B,mBAAmB,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE;IACzF,YAAY,EAAE,KAAK;CACpB,CAAC","sourcesContent":["import { EntityInfo } from '@memberjunction/core';\nimport { MapRenderMode } from '@memberjunction/ng-map-view';\n\n/**\n * Filter configuration for the Data Explorer\n * Allows constraining which entities are shown in the explorer\n */\nexport interface DataExplorerFilter {\n /**\n * Application ID to filter entities by.\n * Only entities linked via ApplicationEntities will be shown.\n */\n applicationId?: string;\n\n /**\n * Application name for display purposes (breadcrumbs, titles)\n */\n applicationName?: string;\n\n /**\n * Schema names to filter by (e.g., ['dbo', 'sales'])\n * Only entities in these schemas will be shown.\n */\n schemaNames?: string[];\n\n /**\n * Explicit entity names to include (e.g., ['Accounts', 'Contacts'])\n * If provided, only these entities will be shown.\n */\n entityNames?: string[];\n\n /**\n * Whether to show system entities (entities starting with __ or system schemas)\n * Default: false\n */\n includeSystemEntities?: boolean;\n}\n\n/**\n * Breadcrumb item for navigation display\n */\nexport interface BreadcrumbItem {\n label: string;\n type: 'application' | 'entity' | 'record';\n /** For entity type - the entity name */\n entityName?: string;\n /** For record type - the composite key string */\n compositeKeyString?: string;\n /** Icon class for the breadcrumb */\n icon?: string;\n}\n\n/**\n * View mode options for the Data Explorer\n */\nexport type DataExplorerViewMode = 'grid' | 'cards' | 'timeline' | 'map';\n\n/**\n * Timeline orientation options\n */\nexport type TimelineOrientationType = 'vertical' | 'horizontal';\n\n/**\n * Initial navigation state from URL query parameters.\n * Used for deep linking into the Data Explorer.\n */\nexport interface DataExplorerDeepLink {\n /** Entity name to navigate to */\n entity?: string;\n /** Record ID or composite key string to select */\n record?: string;\n /** Filter text to apply (omitted when viewId is present — view carries its own filter) */\n filter?: string;\n /** View mode to use (grid/cards/timeline/map) */\n viewMode?: DataExplorerViewMode;\n /** Saved view ID to load (uses view's filters/sort/grid state) */\n viewId?: string;\n /** Map render mode (point/choropleth/heatmap) — only relevant when viewMode is 'map' */\n mapMode?: string;\n}\n\n/**\n * Per-entity cached state (filters, scroll position, etc.)\n */\nexport interface EntityCacheEntry {\n filterText: string;\n scrollPosition?: number;\n lastAccessed: number; // timestamp for LRU eviction\n}\n\n/**\n * Recent entity access tracking for home screen\n */\nexport interface RecentEntityAccess {\n entityName: string;\n entityId: string;\n lastAccessed: Date;\n accessCount: number;\n}\n\n/**\n * Favorite entity for home screen (using User Favorites entity)\n */\nexport interface FavoriteEntity {\n userFavoriteId: string; // ID from User Favorites entity\n entityName: string;\n entityId: string;\n}\n\n/**\n * Recent record access for home screen (from User Record Logs)\n */\nexport interface RecentRecordAccess {\n entityName: string;\n entityId: string;\n recordId: string;\n recordName?: string;\n latestAt: Date;\n totalCount: number;\n /**\n * Pre-computed \"N ago\" relative-time label for display. Populated by the dashboard when the\n * record set loads and refreshed on a timer, so the template binds a STABLE field instead of\n * calling a `Date.now()`-based method during change detection (which triggers NG0100). See the\n * DataExplorerDashboardComponent relative-time handling.\n */\n relativeTime?: string;\n}\n\n/**\n * Favorite record for home screen (from User Favorites, excluding entity favorites)\n */\nexport interface FavoriteRecord {\n userFavoriteId: string; // ID from User Favorites entity\n entityName: string;\n entityId: string;\n recordId: string;\n recordName?: string;\n}\n\n/**\n * Represents an application group with its entities for the home view.\n * Used by Concept D to organize entities by their first Application membership.\n */\nexport interface AppEntityGroup {\n applicationId: string;\n applicationName: string;\n applicationIcon: string;\n applicationColor: string | null;\n entities: EntityInfo[];\n isExpanded: boolean;\n}\n\n/**\n * Home view mode for the All/Favorites toggle\n */\nexport type HomeViewMode = 'all' | 'favorites';\n\n/**\n * State interface for the Data Explorer dashboard\n */\nexport interface DataExplorerState {\n // Navigation panel\n navigationPanelWidth: number;\n navigationPanelCollapsed: boolean;\n\n // Current context\n selectedEntityName: string | null;\n selectedViewId: string | null;\n\n // View modification tracking\n /** Whether the current view configuration has unsaved changes */\n viewModified: boolean;\n\n // View configuration panel\n /** Whether the view configuration panel is open */\n viewConfigPanelOpen: boolean;\n\n // Smart filter (current entity's filter - also cached in entityCache)\n smartFilterPrompt: string;\n smartFilterEnabled: boolean;\n\n // Per-entity cache for filters and state\n entityCache: Record<string, EntityCacheEntry>;\n\n // View mode\n viewMode: DataExplorerViewMode;\n\n // Timeline configuration (per-entity, but stored here for simplicity)\n timelineOrientation: TimelineOrientationType;\n timelineDateFieldName: string | null;\n timelineSortOrder: 'asc' | 'desc';\n\n // Map configuration (persisted across page reloads)\n mapRenderMode: MapRenderMode;\n mapZoom: number | null;\n mapCenterLat: number | null;\n mapCenterLng: number | null;\n\n // Detail panel\n detailPanelOpen: boolean;\n detailPanelWidth: number;\n selectedRecordId: string | null;\n /** Display name of the currently selected record (for breadcrumbs) */\n selectedRecordName: string | null;\n\n // Section states\n favoritesSectionExpanded: boolean;\n recentSectionExpanded: boolean;\n entitiesSectionExpanded: boolean;\n viewsSectionExpanded: boolean;\n\n // Recent items (legacy - records within current explorer context)\n recentItems: RecentItem[];\n\n // Favorites (legacy - records within current explorer context)\n favorites: FavoriteItem[];\n\n // Home screen state\n /** Whether to show all entities or just DefaultForNewUser entities */\n showAllEntities: boolean;\n /** Recent entity access tracking for home screen */\n recentEntityAccesses: RecentEntityAccess[];\n /** Favorite entities for home screen */\n favoriteEntities: FavoriteEntity[];\n /** Favorite records for home screen (non-entity favorites) */\n favoriteRecords: FavoriteRecord[];\n\n // Concept D: Application Groups + Search-First\n /** Which application group IDs are currently expanded */\n expandedAppGroups: string[];\n /** Whether the right-side quick access panel is open */\n quickAccessPanelOpen: boolean;\n /** Collapse state per section in the quick access panel (key = section id, value = expanded) */\n quickAccessSections: Record<string, boolean>;\n /** Home view mode toggle: show all entities or favorites only */\n homeViewMode: HomeViewMode;\n}\n\nexport interface RecentItem {\n entityName: string;\n /** Serialized CompositeKey using ToConcatenatedString format (Field1|Value1||Field2|Value2) */\n compositeKeyString: string;\n displayName: string;\n timestamp: Date;\n}\n\nexport interface FavoriteItem {\n type: 'record' | 'view' | 'entity';\n entityName?: string;\n /** Serialized CompositeKey using ToConcatenatedString format (Field1|Value1||Field2|Value2) */\n compositeKeyString?: string;\n viewId?: string;\n displayName: string;\n}\n\n/**\n * Field display type for smart rendering in cards\n */\nexport type CardFieldType = 'number' | 'boolean' | 'text' | 'date';\n\n/**\n * Metadata for a field to display in a card\n */\nexport interface CardDisplayField {\n name: string;\n type: CardFieldType;\n label: string;\n}\n\n/**\n * Auto-generated card template based on entity metadata\n */\nexport interface AutoCardTemplate {\n titleField: string;\n subtitleField: string | null;\n descriptionField: string | null;\n /** Display fields with type information for smart rendering */\n displayFields: CardDisplayField[];\n thumbnailField: string | null;\n badgeField: string | null;\n}\n\n/**\n * Default state for the Data Explorer\n */\nexport const DEFAULT_EXPLORER_STATE: DataExplorerState = {\n navigationPanelWidth: 280,\n navigationPanelCollapsed: true,\n selectedEntityName: null,\n selectedViewId: null,\n viewModified: false,\n viewConfigPanelOpen: false,\n smartFilterPrompt: '',\n smartFilterEnabled: true,\n entityCache: {},\n viewMode: 'grid',\n timelineOrientation: 'vertical',\n timelineDateFieldName: null,\n timelineSortOrder: 'desc',\n mapRenderMode: 'point',\n mapZoom: null,\n mapCenterLat: null,\n mapCenterLng: null,\n detailPanelOpen: false,\n detailPanelWidth: 400,\n selectedRecordId: null,\n selectedRecordName: null,\n favoritesSectionExpanded: true,\n recentSectionExpanded: true,\n entitiesSectionExpanded: true,\n viewsSectionExpanded: true,\n recentItems: [],\n favorites: [],\n // Home screen state\n showAllEntities: false, // Default to showing only common entities\n recentEntityAccesses: [],\n favoriteEntities: [],\n favoriteRecords: [],\n // Concept D: Application Groups + Search-First\n expandedAppGroups: [],\n quickAccessPanelOpen: false,\n quickAccessSections: { recentRecords: true, recentEntities: true, favoriteRecords: true },\n homeViewMode: 'all',\n};\n"]}
|
package/dist/KnowledgeHub/components/feature-pipelines/feature-pipelines-resource.component.js
CHANGED
|
@@ -570,7 +570,7 @@ let FeaturePipelinesResourceComponent = class FeaturePipelinesResourceComponent
|
|
|
570
570
|
i0.ɵɵconditional(ctx.IsLoading ? 13 : ctx.AllPipelines.length === 0 ? 14 : ctx.FilteredPipelines.length === 0 ? 15 : 16);
|
|
571
571
|
i0.ɵɵadvance(4);
|
|
572
572
|
i0.ɵɵconditional(ctx.ShowEditor ? 17 : -1);
|
|
573
|
-
} }, dependencies: [i1.LoadingComponent, i2.MJButtonDirective, i2.MJPageHeaderComponent, i2.MJPageLayoutComponent, i2.MJPageBodyComponent, i2.MJPageSearchComponent, i2.MJStatBadgeComponent, i2.MJRefreshButtonComponent, i2.MJDialogComponent, i2.MJEmptyStateComponent, i3.RecordProcessEditorComponent], styles: ["\n\n\n\n\n\n.fp-loading[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 240px;\n width: 100%;\n}\n\n.fp-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(320px, 1fr));\n gap: 16px;\n padding: 4px;\n align-content: start;\n}\n\n.fp-card[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 12px;\n padding: 16px;\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-lg, 10px);\n background: var(--mj-bg-surface-card);\n transition: border-color 0.15s ease, box-shadow 0.15s ease;\n\n
|
|
573
|
+
} }, dependencies: [i1.LoadingComponent, i2.MJButtonDirective, i2.MJPageHeaderComponent, i2.MJPageLayoutComponent, i2.MJPageBodyComponent, i2.MJPageSearchComponent, i2.MJStatBadgeComponent, i2.MJRefreshButtonComponent, i2.MJDialogComponent, i2.MJEmptyStateComponent, i3.RecordProcessEditorComponent], styles: ["\n\n\n\n\n\n\n\n\n\n\n\n.fp-loading[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 240px;\n width: 100%;\n}\n\n.fp-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(320px, 1fr));\n gap: 16px;\n padding: 4px;\n align-content: start;\n}\n\n.fp-card[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 12px;\n padding: 16px;\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-lg, 10px);\n background: var(--mj-bg-surface-card);\n transition: border-color 0.15s ease, box-shadow 0.15s ease;\n}\n\n.fp-card[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-border-strong);\n box-shadow: 0 2px 8px color-mix(in srgb, var(--mj-brand-primary) 8%, transparent);\n}\n\n.fp-card--disabled[_ngcontent-%COMP%] {\n opacity: 0.65;\n}\n\n.fp-card__head[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n}\n\n.fp-card__icon[_ngcontent-%COMP%] {\n flex: 0 0 auto;\n width: 36px;\n height: 36px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: var(--mj-radius-md, 8px);\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-size: 16px;\n}\n\n.fp-card__title[_ngcontent-%COMP%] {\n flex: 1 1 auto;\n min-width: 0;\n}\n\n.fp-card__title[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 15px;\n font-weight: 600;\n color: var(--mj-text-primary);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.fp-card__worktype[_ngcontent-%COMP%] {\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n color: var(--mj-text-muted);\n}\n\n.fp-card__desc[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 13px;\n line-height: 1.4;\n color: var(--mj-text-secondary);\n display: -webkit-box;\n -webkit-line-clamp: 2;\n line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n}\n\n.fp-card__meta[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 6px;\n padding: 10px 0;\n border-top: 1px solid var(--mj-border-subtle);\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.fp-meta-row[_ngcontent-%COMP%] {\n display: flex;\n align-items: baseline;\n justify-content: space-between;\n gap: 12px;\n font-size: 13px;\n}\n\n.fp-meta-row__k[_ngcontent-%COMP%] {\n flex: 0 0 auto;\n color: var(--mj-text-muted);\n}\n\n.fp-meta-row__k[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n width: 14px;\n margin-right: 4px;\n}\n\n.fp-meta-row__v[_ngcontent-%COMP%] {\n flex: 1 1 auto;\n text-align: right;\n color: var(--mj-text-primary);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.fp-meta-row__sub[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n font-size: 12px;\n}\n\n.fp-card__actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n margin-top: auto;\n}\n\n\n\n.fp-status[_ngcontent-%COMP%] {\n flex: 0 0 auto;\n align-self: flex-start;\n padding: 2px 10px;\n border-radius: var(--mj-radius-full, 999px);\n font-size: 11px;\n font-weight: 600;\n white-space: nowrap;\n}\n\n.fp-status.status--never[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n}\n\n.fp-status.status--running[_ngcontent-%COMP%] {\n background: var(--mj-status-info-bg);\n color: var(--mj-status-info-text);\n}\n\n.fp-status.status--completed[_ngcontent-%COMP%] {\n background: var(--mj-status-success-bg);\n color: var(--mj-status-success-text);\n}\n\n.fp-status.status--failed[_ngcontent-%COMP%] {\n background: var(--mj-status-error-bg);\n color: var(--mj-status-error-text);\n}\n\n.fp-status.status--cancelled[_ngcontent-%COMP%] {\n background: var(--mj-status-warning-bg);\n color: var(--mj-status-warning-text);\n}"] });
|
|
574
574
|
};
|
|
575
575
|
FeaturePipelinesResourceComponent = __decorate([
|
|
576
576
|
RegisterClass(BaseResourceComponent, 'FeaturePipelinesResource')
|
|
@@ -578,7 +578,7 @@ FeaturePipelinesResourceComponent = __decorate([
|
|
|
578
578
|
export { FeaturePipelinesResourceComponent };
|
|
579
579
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(FeaturePipelinesResourceComponent, [{
|
|
580
580
|
type: Component,
|
|
581
|
-
args: [{ standalone: false, selector: 'app-feature-pipelines-resource', template: "<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\u2026\"\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\u2026\" 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 \u2014 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 <span class=\"fp-card__worktype\">{{ pipeline.WorkType }}</span>\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 || '\u2014' }}</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\">\u00B7 {{ 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\u2026\n } @else {\n <i class=\"fa-solid fa-play\"></i> Run\n }\n </button>\n <button mjButton variant=\"secondary\" size=\"sm\" (click)=\"OnEditPipeline(pipeline)\">\n <i class=\"fa-solid fa-sliders\"></i> Edit\n </button>\n </div>\n </div>\n }\n </div>\n }\n </mj-page-body>\n</mj-page-layout>\n\n@if (ShowEditor) {\n <mj-dialog [Visible]=\"ShowEditor\" Title=\"Feature Pipeline\" [Width]=\"900\" (Close)=\"OnEditorCancelled()\">\n <mj-record-process-editor\n [RecordProcessID]=\"EditingPipelineID\"\n (Saved)=\"OnEditorSaved($event)\"\n (Cancelled)=\"OnEditorCancelled()\">\n </mj-record-process-editor>\n </mj-dialog>\n}\n", styles: ["/**\n * Feature Pipelines (Knowledge Hub) \u2014 card-grid layout.\n * All colors use semantic design tokens (dark-mode + white-label safe).\n */\n\n.fp-loading {\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 240px;\n width: 100%;\n}\n\n.fp-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(320px, 1fr));\n gap: 16px;\n padding: 4px;\n align-content: start;\n}\n\n.fp-card {\n display: flex;\n flex-direction: column;\n gap: 12px;\n padding: 16px;\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-lg, 10px);\n background: var(--mj-bg-surface-card);\n transition: border-color 0.15s ease, box-shadow 0.15s ease;\n\n
|
|
581
|
+
args: [{ standalone: false, selector: 'app-feature-pipelines-resource', template: "<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\u2026\"\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\u2026\" 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 \u2014 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 <span class=\"fp-card__worktype\">{{ pipeline.WorkType }}</span>\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 || '\u2014' }}</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\">\u00B7 {{ 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\u2026\n } @else {\n <i class=\"fa-solid fa-play\"></i> Run\n }\n </button>\n <button mjButton variant=\"secondary\" size=\"sm\" (click)=\"OnEditPipeline(pipeline)\">\n <i class=\"fa-solid fa-sliders\"></i> Edit\n </button>\n </div>\n </div>\n }\n </div>\n }\n </mj-page-body>\n</mj-page-layout>\n\n@if (ShowEditor) {\n <mj-dialog [Visible]=\"ShowEditor\" Title=\"Feature Pipeline\" [Width]=\"900\" (Close)=\"OnEditorCancelled()\">\n <mj-record-process-editor\n [RecordProcessID]=\"EditingPipelineID\"\n (Saved)=\"OnEditorSaved($event)\"\n (Cancelled)=\"OnEditorCancelled()\">\n </mj-record-process-editor>\n </mj-dialog>\n}\n", styles: ["/**\n * Feature Pipelines (Knowledge Hub) \u2014 card-grid layout.\n * All colors use semantic design tokens (dark-mode + white-label safe).\n *\n * NOTE: this package builds with bare `ngc` (no Sass step) \u2014 component styles\n * are embedded RAW into the compiled JS. Keep this file FLAT, plain CSS.\n * Sass nesting / BEM selector concatenation would be silently dropped by the\n * browser and the rules would be DEAD. See .github/scripts/check-ngc-scss.sh\n * (CI gate) and MemberJunction/MJ#3105.\n */\n\n.fp-loading {\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 240px;\n width: 100%;\n}\n\n.fp-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(320px, 1fr));\n gap: 16px;\n padding: 4px;\n align-content: start;\n}\n\n.fp-card {\n display: flex;\n flex-direction: column;\n gap: 12px;\n padding: 16px;\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-lg, 10px);\n background: var(--mj-bg-surface-card);\n transition: border-color 0.15s ease, box-shadow 0.15s ease;\n}\n\n.fp-card:hover {\n border-color: var(--mj-border-strong);\n box-shadow: 0 2px 8px color-mix(in srgb, var(--mj-brand-primary) 8%, transparent);\n}\n\n.fp-card--disabled {\n opacity: 0.65;\n}\n\n.fp-card__head {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n}\n\n.fp-card__icon {\n flex: 0 0 auto;\n width: 36px;\n height: 36px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: var(--mj-radius-md, 8px);\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-size: 16px;\n}\n\n.fp-card__title {\n flex: 1 1 auto;\n min-width: 0;\n}\n\n.fp-card__title h3 {\n margin: 0;\n font-size: 15px;\n font-weight: 600;\n color: var(--mj-text-primary);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.fp-card__worktype {\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n color: var(--mj-text-muted);\n}\n\n.fp-card__desc {\n margin: 0;\n font-size: 13px;\n line-height: 1.4;\n color: var(--mj-text-secondary);\n display: -webkit-box;\n -webkit-line-clamp: 2;\n line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n}\n\n.fp-card__meta {\n display: flex;\n flex-direction: column;\n gap: 6px;\n padding: 10px 0;\n border-top: 1px solid var(--mj-border-subtle);\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.fp-meta-row {\n display: flex;\n align-items: baseline;\n justify-content: space-between;\n gap: 12px;\n font-size: 13px;\n}\n\n.fp-meta-row__k {\n flex: 0 0 auto;\n color: var(--mj-text-muted);\n}\n\n.fp-meta-row__k i {\n width: 14px;\n margin-right: 4px;\n}\n\n.fp-meta-row__v {\n flex: 1 1 auto;\n text-align: right;\n color: var(--mj-text-primary);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.fp-meta-row__sub {\n color: var(--mj-text-muted);\n font-size: 12px;\n}\n\n.fp-card__actions {\n display: flex;\n gap: 8px;\n margin-top: auto;\n}\n\n/* Run-status pill \u2014 semantic status tokens */\n.fp-status {\n flex: 0 0 auto;\n align-self: flex-start;\n padding: 2px 10px;\n border-radius: var(--mj-radius-full, 999px);\n font-size: 11px;\n font-weight: 600;\n white-space: nowrap;\n}\n\n.fp-status.status--never {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n}\n\n.fp-status.status--running {\n background: var(--mj-status-info-bg);\n color: var(--mj-status-info-text);\n}\n\n.fp-status.status--completed {\n background: var(--mj-status-success-bg);\n color: var(--mj-status-success-text);\n}\n\n.fp-status.status--failed {\n background: var(--mj-status-error-bg);\n color: var(--mj-status-error-text);\n}\n\n.fp-status.status--cancelled {\n background: var(--mj-status-warning-bg);\n color: var(--mj-status-warning-text);\n}\n"] }]
|
|
582
582
|
}], null, null); })();
|
|
583
583
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(FeaturePipelinesResourceComponent, { className: "FeaturePipelinesResourceComponent", filePath: "src/KnowledgeHub/components/feature-pipelines/feature-pipelines-resource.component.ts", lineNumber: 65 }); })();
|
|
584
584
|
/** Tree-shaking prevention — keeps the component in the bundle. */
|
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 type { RemoteOpResult, 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.scss'],\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 /** Authoring dialog state. */\n public ShowEditor = false;\n\n /** Record Process id being authored, or null for a new draft. */\n public EditingPipelineID: string | null = null;\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 authoring editor for a brand-new feature pipeline draft. */\n public OnNewPipeline(): void {\n this.EditingPipelineID = null;\n this.ShowEditor = true;\n this.cdr.detectChanges();\n }\n\n // ================================================================\n // Public Methods — Card Actions\n // ================================================================\n\n /** Open the authoring editor for an existing feature pipeline. */\n public OnEditPipeline(pipeline: FeaturePipelineSummary): void {\n this.EditingPipelineID = pipeline.ID;\n this.ShowEditor = true;\n this.cdr.detectChanges();\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 — Authoring Dialog\n // ================================================================\n\n /** Called when the editor saves — refresh and close. */\n public async OnEditorSaved(_record: MJRecordProcessEntity): Promise<void> {\n this.ShowEditor = false;\n this.EditingPipelineID = null;\n await this.loadData(true);\n }\n\n /** Called when the editor is cancelled — just close. */\n public OnEditorCancelled(): void {\n this.ShowEditor = false;\n this.EditingPipelineID = null;\n this.cdr.detectChanges();\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 authoring editor for a feature pipeline by id or name (UI dialog — does NOT auto-save). Use to inspect or edit a pipeline 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.OnEditPipeline(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 <span class=\"fp-card__worktype\">{{ pipeline.WorkType }}</span>\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)=\"OnEditPipeline(pipeline)\">\n <i class=\"fa-solid fa-sliders\"></i> Edit\n </button>\n </div>\n </div>\n }\n </div>\n }\n </mj-page-body>\n</mj-page-layout>\n\n@if (ShowEditor) {\n <mj-dialog [Visible]=\"ShowEditor\" Title=\"Feature Pipeline\" [Width]=\"900\" (Close)=\"OnEditorCancelled()\">\n <mj-record-process-editor\n [RecordProcessID]=\"EditingPipelineID\"\n (Saved)=\"OnEditorSaved($event)\"\n (Cancelled)=\"OnEditorCancelled()\">\n </mj-record-process-editor>\n </mj-dialog>\n}\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 type { RemoteOpResult, 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 /** Authoring dialog state. */\n public ShowEditor = false;\n\n /** Record Process id being authored, or null for a new draft. */\n public EditingPipelineID: string | null = null;\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 authoring editor for a brand-new feature pipeline draft. */\n public OnNewPipeline(): void {\n this.EditingPipelineID = null;\n this.ShowEditor = true;\n this.cdr.detectChanges();\n }\n\n // ================================================================\n // Public Methods — Card Actions\n // ================================================================\n\n /** Open the authoring editor for an existing feature pipeline. */\n public OnEditPipeline(pipeline: FeaturePipelineSummary): void {\n this.EditingPipelineID = pipeline.ID;\n this.ShowEditor = true;\n this.cdr.detectChanges();\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 — Authoring Dialog\n // ================================================================\n\n /** Called when the editor saves — refresh and close. */\n public async OnEditorSaved(_record: MJRecordProcessEntity): Promise<void> {\n this.ShowEditor = false;\n this.EditingPipelineID = null;\n await this.loadData(true);\n }\n\n /** Called when the editor is cancelled — just close. */\n public OnEditorCancelled(): void {\n this.ShowEditor = false;\n this.EditingPipelineID = null;\n this.cdr.detectChanges();\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 authoring editor for a feature pipeline by id or name (UI dialog — does NOT auto-save). Use to inspect or edit a pipeline 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.OnEditPipeline(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 <span class=\"fp-card__worktype\">{{ pipeline.WorkType }}</span>\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)=\"OnEditPipeline(pipeline)\">\n <i class=\"fa-solid fa-sliders\"></i> Edit\n </button>\n </div>\n </div>\n }\n </div>\n }\n </mj-page-body>\n</mj-page-layout>\n\n@if (ShowEditor) {\n <mj-dialog [Visible]=\"ShowEditor\" Title=\"Feature Pipeline\" [Width]=\"900\" (Close)=\"OnEditorCancelled()\">\n <mj-record-process-editor\n [RecordProcessID]=\"EditingPipelineID\"\n (Saved)=\"OnEditorSaved($event)\"\n (Cancelled)=\"OnEditorCancelled()\">\n </mj-record-process-editor>\n </mj-dialog>\n}\n"]}
|
|
@@ -128,6 +128,10 @@ export declare class ListsBrowseResource extends BaseResourceComponent implement
|
|
|
128
128
|
constructor(cdr: ChangeDetectorRef, tabService: TabService, notificationService: MJNotificationService, elementRef: ElementRef, listSharingService: ListSharingService);
|
|
129
129
|
onDocumentClick(event: MouseEvent): void;
|
|
130
130
|
onEscapeKey(): void;
|
|
131
|
+
/** User-preference key for the favorites-only filter (F5a) — server-persisted so it survives reloads and follows the user across devices. */
|
|
132
|
+
private static readonly FAVORITES_FILTER_PREF_KEY;
|
|
133
|
+
/** Persists the current favorites-filter state as a user preference (debounced). */
|
|
134
|
+
private persistFavoritesFilter;
|
|
131
135
|
ngOnInit(): Promise<void>;
|
|
132
136
|
/**
|
|
133
137
|
* Report the Browse surface's salient state to the AI agent. Re-called
|
|
@@ -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,
|
|
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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"}
|