@memberjunction/ng-core-entity-forms 5.22.0 → 5.23.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/lib/custom/AIAgents/add-action-dialog.component.d.ts +4 -5
- package/dist/lib/custom/AIAgents/add-action-dialog.component.d.ts.map +1 -1
- package/dist/lib/custom/AIAgents/add-action-dialog.component.js +55 -59
- package/dist/lib/custom/AIAgents/add-action-dialog.component.js.map +1 -1
- package/dist/lib/custom/AIAgents/agent-advanced-settings-dialog.component.js +0 -1
- package/dist/lib/custom/AIAgents/agent-advanced-settings-dialog.component.js.map +1 -1
- package/dist/lib/custom/AIAgents/agent-prompt-advanced-settings-dialog.component.d.ts +4 -5
- package/dist/lib/custom/AIAgents/agent-prompt-advanced-settings-dialog.component.d.ts.map +1 -1
- package/dist/lib/custom/AIAgents/agent-prompt-advanced-settings-dialog.component.js +54 -71
- package/dist/lib/custom/AIAgents/agent-prompt-advanced-settings-dialog.component.js.map +1 -1
- package/dist/lib/custom/AIAgents/ai-agent-form.component.d.ts.map +1 -1
- package/dist/lib/custom/AIAgents/ai-agent-form.component.js +1053 -1096
- package/dist/lib/custom/AIAgents/ai-agent-form.component.js.map +1 -1
- package/dist/lib/custom/AIAgents/ai-agent-management.service.d.ts +2 -3
- package/dist/lib/custom/AIAgents/ai-agent-management.service.d.ts.map +1 -1
- package/dist/lib/custom/AIAgents/ai-agent-management.service.js +39 -82
- package/dist/lib/custom/AIAgents/ai-agent-management.service.js.map +1 -1
- package/dist/lib/custom/AIAgents/create-prompt-dialog.component.d.ts +4 -5
- package/dist/lib/custom/AIAgents/create-prompt-dialog.component.d.ts.map +1 -1
- package/dist/lib/custom/AIAgents/create-prompt-dialog.component.js +28 -31
- package/dist/lib/custom/AIAgents/create-prompt-dialog.component.js.map +1 -1
- package/dist/lib/custom/AIAgents/create-sub-agent-dialog.component.d.ts +4 -5
- package/dist/lib/custom/AIAgents/create-sub-agent-dialog.component.d.ts.map +1 -1
- package/dist/lib/custom/AIAgents/create-sub-agent-dialog.component.js +15 -14
- package/dist/lib/custom/AIAgents/create-sub-agent-dialog.component.js.map +1 -1
- package/dist/lib/custom/AIAgents/new-agent-dialog.component.d.ts +4 -7
- package/dist/lib/custom/AIAgents/new-agent-dialog.component.d.ts.map +1 -1
- package/dist/lib/custom/AIAgents/new-agent-dialog.component.js +77 -124
- package/dist/lib/custom/AIAgents/new-agent-dialog.component.js.map +1 -1
- package/dist/lib/custom/AIAgents/new-agent-dialog.service.d.ts +2 -2
- package/dist/lib/custom/AIAgents/new-agent-dialog.service.d.ts.map +1 -1
- package/dist/lib/custom/AIAgents/new-agent-dialog.service.js +10 -11
- package/dist/lib/custom/AIAgents/new-agent-dialog.service.js.map +1 -1
- package/dist/lib/custom/AIAgents/prompt-selector-dialog.component.d.ts +4 -5
- package/dist/lib/custom/AIAgents/prompt-selector-dialog.component.d.ts.map +1 -1
- package/dist/lib/custom/AIAgents/prompt-selector-dialog.component.js +18 -18
- package/dist/lib/custom/AIAgents/prompt-selector-dialog.component.js.map +1 -1
- package/dist/lib/custom/AIAgents/sub-agent-advanced-settings-dialog.component.d.ts +4 -5
- package/dist/lib/custom/AIAgents/sub-agent-advanced-settings-dialog.component.d.ts.map +1 -1
- package/dist/lib/custom/AIAgents/sub-agent-advanced-settings-dialog.component.js +59 -80
- package/dist/lib/custom/AIAgents/sub-agent-advanced-settings-dialog.component.js.map +1 -1
- package/dist/lib/custom/AIAgents/sub-agent-selector-dialog.component.d.ts +4 -5
- package/dist/lib/custom/AIAgents/sub-agent-selector-dialog.component.d.ts.map +1 -1
- package/dist/lib/custom/AIAgents/sub-agent-selector-dialog.component.js +23 -24
- package/dist/lib/custom/AIAgents/sub-agent-selector-dialog.component.js.map +1 -1
- package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.d.ts.map +1 -1
- package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.js +862 -906
- package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.js.map +1 -1
- package/dist/lib/custom/AIPromptRuns/chat-message-viewer.component.js +4 -5
- package/dist/lib/custom/AIPromptRuns/chat-message-viewer.component.js.map +1 -1
- package/dist/lib/custom/AIPrompts/ai-prompt-form.component.js +448 -499
- package/dist/lib/custom/AIPrompts/ai-prompt-form.component.js.map +1 -1
- package/dist/lib/custom/AIPrompts/ai-prompt-management.service.d.ts +2 -2
- package/dist/lib/custom/AIPrompts/ai-prompt-management.service.d.ts.map +1 -1
- package/dist/lib/custom/AIPrompts/ai-prompt-management.service.js +6 -11
- package/dist/lib/custom/AIPrompts/ai-prompt-management.service.js.map +1 -1
- package/dist/lib/custom/AIPrompts/template-selector-dialog.component.d.ts +4 -5
- package/dist/lib/custom/AIPrompts/template-selector-dialog.component.d.ts.map +1 -1
- package/dist/lib/custom/AIPrompts/template-selector-dialog.component.js +16 -15
- package/dist/lib/custom/AIPrompts/template-selector-dialog.component.js.map +1 -1
- package/dist/lib/custom/Actions/action-execution-log-form.component.js +160 -166
- package/dist/lib/custom/Actions/action-execution-log-form.component.js.map +1 -1
- package/dist/lib/custom/Actions/action-form.component.d.ts.map +1 -1
- package/dist/lib/custom/Actions/action-form.component.js +93 -94
- package/dist/lib/custom/Actions/action-form.component.js.map +1 -1
- package/dist/lib/custom/Entities/entity-form.component.js +2 -2
- package/dist/lib/custom/Lists/list-form.component.js +61 -63
- package/dist/lib/custom/Lists/list-form.component.js.map +1 -1
- package/dist/lib/custom/Queries/query-category-dialog.component.js +33 -59
- package/dist/lib/custom/Queries/query-category-dialog.component.js.map +1 -1
- package/dist/lib/custom/Queries/query-form.component.js +354 -360
- package/dist/lib/custom/Queries/query-form.component.js.map +1 -1
- package/dist/lib/custom/Queries/query-run-dialog.component.js +62 -71
- package/dist/lib/custom/Queries/query-run-dialog.component.js.map +1 -1
- package/dist/lib/custom/Templates/template-param-dialog.component.js +128 -124
- package/dist/lib/custom/Templates/template-param-dialog.component.js.map +1 -1
- package/dist/lib/custom/Templates/template-params-grid.component.d.ts +45 -22
- package/dist/lib/custom/Templates/template-params-grid.component.d.ts.map +1 -1
- package/dist/lib/custom/Templates/template-params-grid.component.js +380 -384
- package/dist/lib/custom/Templates/template-params-grid.component.js.map +1 -1
- package/dist/lib/custom/Templates/templates-form.component.js +34 -36
- package/dist/lib/custom/Templates/templates-form.component.js.map +1 -1
- package/dist/lib/custom/Tests/test-form.component.js +8 -9
- package/dist/lib/custom/Tests/test-form.component.js.map +1 -1
- package/dist/lib/custom/Tests/test-run-feedback-form.component.js +4 -4
- package/dist/lib/custom/Tests/test-run-feedback-form.component.js.map +1 -1
- package/dist/lib/custom/Tests/test-run-form.component.js +7 -7
- package/dist/lib/custom/Tests/test-run-form.component.js.map +1 -1
- package/dist/lib/custom/Tests/test-suite-form.component.js +6 -7
- package/dist/lib/custom/Tests/test-suite-form.component.js.map +1 -1
- package/dist/lib/custom/Tests/test-suite-run-form.component.js +6 -7
- package/dist/lib/custom/Tests/test-suite-run-form.component.js.map +1 -1
- package/dist/lib/custom/ai-agent-run/ai-agent-run-analytics.component.js +381 -409
- package/dist/lib/custom/ai-agent-run/ai-agent-run-analytics.component.js.map +1 -1
- package/dist/lib/custom/ai-agent-run/ai-agent-run-data.service.d.ts.map +1 -1
- package/dist/lib/custom/ai-agent-run/ai-agent-run-data.service.js +1 -1
- package/dist/lib/custom/ai-agent-run/ai-agent-run-data.service.js.map +1 -1
- package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.d.ts.map +1 -1
- package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.js +74 -63
- package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.js.map +1 -1
- package/dist/lib/custom/ai-agent-run/ai-agent-run-visualization.component.js +10 -10
- package/dist/lib/custom/ai-agent-run/ai-agent-run-visualization.component.js.map +1 -1
- package/dist/lib/custom/ai-agent-run/ai-agent-run.component.d.ts.map +1 -1
- package/dist/lib/custom/ai-agent-run/ai-agent-run.component.js +352 -332
- package/dist/lib/custom/ai-agent-run/ai-agent-run.component.js.map +1 -1
- package/dist/lib/custom/custom-forms.module.d.ts +22 -27
- package/dist/lib/custom/custom-forms.module.d.ts.map +1 -1
- package/dist/lib/custom/custom-forms.module.js +51 -81
- package/dist/lib/custom/custom-forms.module.js.map +1 -1
- package/dist/lib/custom/shared/entity-selector-dialog.component.d.ts +4 -5
- package/dist/lib/custom/shared/entity-selector-dialog.component.d.ts.map +1 -1
- package/dist/lib/custom/shared/entity-selector-dialog.component.js +59 -66
- package/dist/lib/custom/shared/entity-selector-dialog.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJAIAgent/mjaiagent.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJAIAgent/mjaiagent.form.component.js +176 -156
- package/dist/lib/generated/Entities/MJAIAgent/mjaiagent.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJAIAgentClientTool/mjaiagentclienttool.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/MJAIAgentClientTool/mjaiagentclienttool.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/MJAIAgentClientTool/mjaiagentclienttool.form.component.js +65 -0
- package/dist/lib/generated/Entities/MJAIAgentClientTool/mjaiagentclienttool.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/MJAIClientToolDefinition/mjaiclienttooldefinition.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/MJAIClientToolDefinition/mjaiclienttooldefinition.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/MJAIClientToolDefinition/mjaiclienttooldefinition.form.component.js +89 -0
- package/dist/lib/generated/Entities/MJAIClientToolDefinition/mjaiclienttooldefinition.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/MJAIModel/mjaimodel.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJAIModel/mjaimodel.form.component.js +80 -44
- package/dist/lib/generated/Entities/MJAIModel/mjaimodel.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJContentItemTag/mjcontentitemtag.form.component.js +11 -8
- package/dist/lib/generated/Entities/MJContentItemTag/mjcontentitemtag.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJContentSource/mjcontentsource.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJContentSource/mjcontentsource.form.component.js +39 -24
- package/dist/lib/generated/Entities/MJContentSource/mjcontentsource.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJContentType/mjcontenttype.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJContentType/mjcontenttype.form.component.js +35 -17
- package/dist/lib/generated/Entities/MJContentType/mjcontenttype.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJDuplicateRunDetail/mjduplicaterundetail.form.component.js +15 -13
- package/dist/lib/generated/Entities/MJDuplicateRunDetail/mjduplicaterundetail.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJDuplicateRunDetailMatch/mjduplicaterundetailmatch.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJDuplicateRunDetailMatch/mjduplicaterundetailmatch.form.component.js +7 -9
- package/dist/lib/generated/Entities/MJDuplicateRunDetailMatch/mjduplicaterundetailmatch.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJEntityField/mjentityfield.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJEntityField/mjentityfield.form.component.js +21 -9
- package/dist/lib/generated/Entities/MJEntityField/mjentityfield.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJVectorIndex/mjvectorindex.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJVectorIndex/mjvectorindex.form.component.js +41 -5
- package/dist/lib/generated/Entities/MJVectorIndex/mjvectorindex.form.component.js.map +1 -1
- package/dist/lib/generated/generated-forms.module.d.ts +280 -279
- package/dist/lib/generated/generated-forms.module.d.ts.map +1 -1
- package/dist/lib/generated/generated-forms.module.js +102 -142
- package/dist/lib/generated/generated-forms.module.js.map +1 -1
- package/dist/lib/shared/components/template-editor.component.js +14 -15
- package/dist/lib/shared/components/template-editor.component.js.map +1 -1
- package/package.json +34 -41
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"new-agent-dialog.service.js","sourceRoot":"","sources":["../../../../src/lib/custom/AIAgents/new-agent-dialog.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAoB,MAAM,eAAe,CAAC;AAE7D,OAAO,EAAE,uBAAuB,EAAkB,MAAM,8BAA8B,CAAC;AAEvF,OAAO,EAAc,OAAO,EAAE,MAAM,MAAM,CAAC;;;AAU3C,MAAM,OAAO,qBAAqB;IAGhC,YAAoB,
|
|
1
|
+
{"version":3,"file":"new-agent-dialog.service.js","sourceRoot":"","sources":["../../../../src/lib/custom/AIAgents/new-agent-dialog.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAoB,MAAM,eAAe,CAAC;AAE7D,OAAO,EAAE,uBAAuB,EAAkB,MAAM,8BAA8B,CAAC;AAEvF,OAAO,EAAc,OAAO,EAAE,MAAM,MAAM,CAAC;;;AAU3C,MAAM,OAAO,qBAAqB;IAGhC,YAAoB,aAA8B;QAA9B,kBAAa,GAAb,aAAa,CAAiB;QAF1C,cAAS,GAAuB,IAAI,CAAC;IAEQ,CAAC;IAEtD;;;;;OAKG;IACH,IAAI,CAAC,SAAyB,EAAE,EAAE,gBAAmC;QACnE,MAAM,aAAa,GAAG,IAAI,OAAO,EAAwB,CAAC;QAE1D,MAAM,cAAc,GAAqB;YACvC,KAAK,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,qBAAqB;YACxE,OAAO,EAAE,uBAAuB;YAChC,KAAK,EAAE,GAAG;YACV,MAAM,EAAE,GAAG;YACX,QAAQ,EAAE,GAAG;SACd,CAAC;QAEF,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAEzD,0BAA0B;QAC1B,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,OAAQ,CAAC,QAA8C,CAAC;QACzF,SAAS,CAAC,MAAM,GAAG,MAAM,CAAC;QAC1B,SAAS,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;QAErC,uBAAuB;QACvB,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,MAAe,EAAE,EAAE;YAClD,IAAI,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,OAAO,IAAI,MAAM,EAAE,CAAC;gBAC9D,aAAa,CAAC,IAAI,CAAC,EAAE,KAAK,EAAG,MAAkC,CAAC,OAAO,CAA4B,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;YAC5H,CAAC;iBAAM,CAAC;gBACN,aAAa,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;YAC9C,CAAC;YACD,aAAa,CAAC,QAAQ,EAAE,CAAC;YACzB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACxB,CAAC,CAAC,CAAC;QAEH,OAAO,aAAa,CAAC,YAAY,EAAE,CAAC;IACtC,CAAC;IAED;;OAEG;IACH,eAAe,CAAC,gBAAmC;QACjD,OAAO,IAAI,CAAC,IAAI,CAAC;YACf,cAAc,EAAE,IAAI;SACrB,EAAE,gBAAgB,CAAC,CAAC;IACvB,CAAC;IAED;;OAEG;IACH,eAAe,CAAC,aAAqB,EAAE,eAAuB,EAAE,gBAAmC;QACjG,OAAO,IAAI,CAAC,IAAI,CAAC;YACf,aAAa;YACb,eAAe;YACf,cAAc,EAAE,KAAK;SACtB,EAAE,gBAAgB,CAAC,CAAC;IACvB,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;YACvB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACxB,CAAC;IACH,CAAC;IAED;;OAEG;IACH,MAAM;QACJ,OAAO,IAAI,CAAC,SAAS,KAAK,IAAI,CAAC;IACjC,CAAC;sHA9EU,qBAAqB;uEAArB,qBAAqB,WAArB,qBAAqB,mBAFpB,MAAM;;iFAEP,qBAAqB;cAHjC,UAAU;eAAC;gBACV,UAAU,EAAE,MAAM;aACnB","sourcesContent":["import { Injectable, ViewContainerRef } from '@angular/core';\nimport { MJDialogService, MJDialogRef, MJDialogSettings } from '@memberjunction/ng-ui-components';\nimport { NewAgentDialogComponent, NewAgentConfig } from './new-agent-dialog.component';\nimport { MJAIAgentEntityExtended } from '@memberjunction/ai-core-plus';\nimport { Observable, Subject } from 'rxjs';\n\nexport interface NewAgentDialogResult {\n agent?: MJAIAgentEntityExtended;\n action: 'created' | 'cancelled';\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class NewAgentDialogService {\n private dialogRef: MJDialogRef | null = null;\n\n constructor(private dialogService: MJDialogService) {}\n\n /**\n * Opens the New Agent dialog\n * @param config Configuration for the dialog\n * @param viewContainerRef Optional ViewContainerRef for proper positioning\n * @returns Observable that emits the result when dialog closes\n */\n open(config: NewAgentConfig = {}, viewContainerRef?: ViewContainerRef): Observable<NewAgentDialogResult> {\n const resultSubject = new Subject<NewAgentDialogResult>();\n\n const dialogSettings: MJDialogSettings = {\n title: config.parentAgentId ? 'Create Sub-Agent' : 'Create New AI Agent',\n content: NewAgentDialogComponent,\n width: 600,\n height: 600,\n minWidth: 500\n };\n\n this.dialogRef = this.dialogService.open(dialogSettings);\n\n // Configure the component\n const component = this.dialogRef.Content!.instance as unknown as NewAgentDialogComponent;\n component.config = config;\n component.dialogRef = this.dialogRef;\n\n // Handle dialog result\n this.dialogRef.Result.subscribe((result: unknown) => {\n if (result && typeof result === 'object' && 'agent' in result) {\n resultSubject.next({ agent: (result as Record<string, unknown>)['agent'] as MJAIAgentEntityExtended, action: 'created' });\n } else {\n resultSubject.next({ action: 'cancelled' });\n }\n resultSubject.complete();\n this.dialogRef = null;\n });\n\n return resultSubject.asObservable();\n }\n\n /**\n * Opens the dialog to create a top-level agent\n */\n openForNewAgent(viewContainerRef?: ViewContainerRef): Observable<NewAgentDialogResult> {\n return this.open({\n redirectToForm: true\n }, viewContainerRef);\n }\n\n /**\n * Opens the dialog to create a sub-agent\n */\n openForSubAgent(parentAgentId: string, parentAgentName: string, viewContainerRef?: ViewContainerRef): Observable<NewAgentDialogResult> {\n return this.open({\n parentAgentId,\n parentAgentName,\n redirectToForm: false\n }, viewContainerRef);\n }\n\n /**\n * Closes the currently open dialog\n */\n close(): void {\n if (this.dialogRef) {\n this.dialogRef.Close();\n this.dialogRef = null;\n }\n }\n\n /**\n * Checks if a dialog is currently open\n */\n isOpen(): boolean {\n return this.dialogRef !== null;\n }\n}"]}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import { OnInit, OnDestroy, ChangeDetectorRef } from '@angular/core';
|
|
2
|
-
import { WindowRef } from '@progress/kendo-angular-dialog';
|
|
1
|
+
import { OnInit, OnDestroy, ChangeDetectorRef, EventEmitter } from '@angular/core';
|
|
3
2
|
import { Subject, BehaviorSubject } from 'rxjs';
|
|
4
3
|
import { FormControl } from '@angular/forms';
|
|
5
4
|
import { MJAIPromptEntityExtended } from '@memberjunction/ai-core-plus';
|
|
@@ -31,7 +30,6 @@ export interface PromptSelectorResult {
|
|
|
31
30
|
* - Any other prompt selection scenario
|
|
32
31
|
*/
|
|
33
32
|
export declare class PromptSelectorDialogComponent implements OnInit, OnDestroy {
|
|
34
|
-
private dialogRef;
|
|
35
33
|
private cdr;
|
|
36
34
|
config: PromptSelectorConfig;
|
|
37
35
|
private destroy$;
|
|
@@ -43,7 +41,8 @@ export declare class PromptSelectorDialogComponent implements OnInit, OnDestroy
|
|
|
43
41
|
selectedPrompts: Set<string>;
|
|
44
42
|
linkedPrompts: Set<string>;
|
|
45
43
|
viewMode: 'grid' | 'list';
|
|
46
|
-
|
|
44
|
+
DialogClose: EventEmitter<void>;
|
|
45
|
+
constructor(cdr: ChangeDetectorRef);
|
|
47
46
|
ngOnInit(): void;
|
|
48
47
|
ngOnDestroy(): void;
|
|
49
48
|
private setupSearch;
|
|
@@ -60,6 +59,6 @@ export declare class PromptSelectorDialogComponent implements OnInit, OnDestroy
|
|
|
60
59
|
createNew(): void;
|
|
61
60
|
cancel(): void;
|
|
62
61
|
static ɵfac: i0.ɵɵFactoryDeclaration<PromptSelectorDialogComponent, never>;
|
|
63
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<PromptSelectorDialogComponent, "mj-prompt-selector-dialog", never, {}, {}, never, never, false, never>;
|
|
62
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<PromptSelectorDialogComponent, "mj-prompt-selector-dialog", never, {}, { "DialogClose": "DialogClose"; }, never, never, false, never>;
|
|
64
63
|
}
|
|
65
64
|
//# sourceMappingURL=prompt-selector-dialog.component.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompt-selector-dialog.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/custom/AIAgents/prompt-selector-dialog.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,MAAM,EAAE,SAAS,EAAE,iBAAiB,
|
|
1
|
+
{"version":3,"file":"prompt-selector-dialog.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/custom/AIAgents/prompt-selector-dialog.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,MAAM,EAAE,SAAS,EAAE,iBAAiB,EAAU,YAAY,EAAE,MAAM,eAAe,CAAC;AACtG,OAAO,EAAE,OAAO,EAAE,eAAe,EAAiD,MAAM,MAAM,CAAC;AAC/F,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C,OAAO,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;;AAGxE,MAAM,WAAW,oBAAoB;IACnC,2BAA2B;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,8CAA8C;IAC9C,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,kCAAkC;IAClC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,+BAA+B;IAC/B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,8BAA8B;IAC9B,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC7B,wEAAwE;IACxE,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;CAC5B;AAED,MAAM,WAAW,oBAAoB;IACnC,uBAAuB;IACvB,eAAe,EAAE,wBAAwB,EAAE,CAAC;IAC5C,uCAAuC;IACvC,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED;;;;;GAKG;AACH,qBAMa,6BAA8B,YAAW,MAAM,EAAE,SAAS;IAyBnE,OAAO,CAAC,GAAG;IAtBb,MAAM,EAAE,oBAAoB,CAA+B;IAG3D,OAAO,CAAC,QAAQ,CAAuB;IAChC,MAAM,uCAA8C;IAG3D,UAAU,2BAAuC;IACjD,QAAQ,8CAAuD;IAC/D,gBAAgB,8CAAuD;IAGvE,aAAa,6BAAuB;IACpC,eAAe,EAAE,GAAG,CAAC,MAAM,CAAC,CAAa;IACzC,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,CAAa;IAGvC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAU;IAEzB,WAAW,qBAA4B;gBAGvC,GAAG,EAAE,iBAAiB;IAGhC,QAAQ;IAeR,WAAW;IAKX,OAAO,CAAC,WAAW;YAYL,WAAW;IAyCzB,OAAO,CAAC,aAAa;IAkBrB,qBAAqB,CAAC,MAAM,EAAE,wBAAwB;IAwBtD,gBAAgB,CAAC,MAAM,EAAE,wBAAwB,GAAG,OAAO;IAI3D,cAAc,CAAC,MAAM,EAAE,wBAAwB,GAAG,OAAO;IAIzD,wBAAwB,IAAI,wBAAwB,EAAE;IAOtD,cAAc;IAId,oBAAoB,CAAC,MAAM,EAAE,wBAAwB,GAAG,MAAM;IAS9D,mBAAmB,CAAC,MAAM,EAAE,wBAAwB,GAAG,MAAM;IAM7D,aAAa;IAoBb,SAAS;IAUT,MAAM;yCA/MK,6BAA6B;2CAA7B,6BAA6B;CAmNzC"}
|
|
@@ -1,14 +1,12 @@
|
|
|
1
|
-
import { Component } from '@angular/core';
|
|
1
|
+
import { Component, Output, EventEmitter } from '@angular/core';
|
|
2
2
|
import { Subject, BehaviorSubject, debounceTime, distinctUntilChanged, takeUntil } from 'rxjs';
|
|
3
3
|
import { FormControl } from '@angular/forms';
|
|
4
4
|
import { RunView } from '@memberjunction/core';
|
|
5
5
|
import { MJNotificationService } from '@memberjunction/ng-notifications';
|
|
6
6
|
import * as i0 from "@angular/core";
|
|
7
|
-
import * as i1 from "@
|
|
8
|
-
import * as i2 from "@
|
|
9
|
-
import * as i3 from "@
|
|
10
|
-
import * as i4 from "@progress/kendo-angular-buttons";
|
|
11
|
-
import * as i5 from "@angular/common";
|
|
7
|
+
import * as i1 from "@angular/forms";
|
|
8
|
+
import * as i2 from "@memberjunction/ng-ui-components";
|
|
9
|
+
import * as i3 from "@angular/common";
|
|
12
10
|
const _forTrack0 = ($index, $item) => $item.ID;
|
|
13
11
|
function PromptSelectorDialogComponent_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
14
12
|
i0.ɵɵelementStart(0, "div", 1)(1, "div", 8);
|
|
@@ -121,7 +119,7 @@ function PromptSelectorDialogComponent_Conditional_3_Conditional_17_Template(rf,
|
|
|
121
119
|
function PromptSelectorDialogComponent_Conditional_3_Template(rf, ctx) { if (rf & 1) {
|
|
122
120
|
const _r1 = i0.ɵɵgetCurrentView();
|
|
123
121
|
i0.ɵɵelementStart(0, "div", 10)(1, "div", 11)(2, "div", 12);
|
|
124
|
-
i0.ɵɵelement(3, "i", 13)(4, "
|
|
122
|
+
i0.ɵɵelement(3, "i", 13)(4, "input", 14);
|
|
125
123
|
i0.ɵɵelementEnd();
|
|
126
124
|
i0.ɵɵelementStart(5, "div", 15)(6, "button", 16);
|
|
127
125
|
i0.ɵɵlistener("click", function PromptSelectorDialogComponent_Conditional_3_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.toggleViewMode()); });
|
|
@@ -185,8 +183,7 @@ function PromptSelectorDialogComponent_Conditional_12_Template(rf, ctx) { if (rf
|
|
|
185
183
|
* - Any other prompt selection scenario
|
|
186
184
|
*/
|
|
187
185
|
export class PromptSelectorDialogComponent {
|
|
188
|
-
constructor(
|
|
189
|
-
this.dialogRef = dialogRef;
|
|
186
|
+
constructor(cdr) {
|
|
190
187
|
this.cdr = cdr;
|
|
191
188
|
// Input configuration
|
|
192
189
|
this.config = { title: 'Select Prompts' };
|
|
@@ -203,6 +200,7 @@ export class PromptSelectorDialogComponent {
|
|
|
203
200
|
this.linkedPrompts = new Set();
|
|
204
201
|
// View mode
|
|
205
202
|
this.viewMode = 'list';
|
|
203
|
+
this.DialogClose = new EventEmitter();
|
|
206
204
|
}
|
|
207
205
|
ngOnInit() {
|
|
208
206
|
this.setupSearch();
|
|
@@ -329,7 +327,7 @@ export class PromptSelectorDialogComponent {
|
|
|
329
327
|
selectedPrompts: selectedPromptObjects
|
|
330
328
|
};
|
|
331
329
|
this.result.next(result);
|
|
332
|
-
this.
|
|
330
|
+
this.DialogClose.emit();
|
|
333
331
|
}
|
|
334
332
|
createNew() {
|
|
335
333
|
const result = {
|
|
@@ -337,14 +335,14 @@ export class PromptSelectorDialogComponent {
|
|
|
337
335
|
createNew: true
|
|
338
336
|
};
|
|
339
337
|
this.result.next(result);
|
|
340
|
-
this.
|
|
338
|
+
this.DialogClose.emit();
|
|
341
339
|
}
|
|
342
340
|
cancel() {
|
|
343
341
|
this.result.next(null);
|
|
344
|
-
this.
|
|
342
|
+
this.DialogClose.emit();
|
|
345
343
|
}
|
|
346
|
-
static { this.ɵfac = function PromptSelectorDialogComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || PromptSelectorDialogComponent)(i0.ɵɵdirectiveInject(
|
|
347
|
-
static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: PromptSelectorDialogComponent, selectors: [["mj-prompt-selector-dialog"]], standalone: false, decls: 13, vars: 6, consts: [[1, "prompt-selector-dialog"], [1, "loading-state"], [1, "dialog-footer"], [1, "footer-left"], ["
|
|
344
|
+
static { this.ɵfac = function PromptSelectorDialogComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || PromptSelectorDialogComponent)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); }; }
|
|
345
|
+
static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: PromptSelectorDialogComponent, selectors: [["mj-prompt-selector-dialog"]], outputs: { DialogClose: "DialogClose" }, standalone: false, decls: 13, vars: 6, consts: [[1, "prompt-selector-dialog"], [1, "loading-state"], [1, "dialog-footer"], [1, "footer-left"], ["mjButton", "", "variant", "flat"], [1, "footer-right"], ["mjButton", "", "variant", "flat", 3, "click"], ["mjButton", "", "variant", "primary", 3, "click", "disabled"], [1, "loading-spinner"], [1, "fa-solid", "fa-spinner", "fa-spin", "fa-2x"], [1, "dialog-header"], [1, "search-section"], [1, "search-box"], [1, "fa-solid", "fa-search", "search-icon"], ["placeholder", "Search prompts by name or description...", 1, "mj-input", "search-input", 3, "formControl"], [1, "view-controls"], ["mjButton", "", "variant", "flat", "title", "Toggle between list and grid view", 3, "click"], [1, "fa-solid"], [1, "results-summary"], [1, "results-count"], [1, "fa-solid", "fa-comment-dots"], [1, "selected-count"], [1, "prompts-container"], [1, "no-results"], [1, "fa-solid", "fa-check-circle"], [1, "fa-solid", "fa-search", "fa-2x"], [1, "prompt-card", 3, "selected", "linked"], [1, "prompt-card", 3, "click"], [1, "selection-indicator"], ["title", "Already linked to this agent", 1, "fa-solid", "fa-link", "linked-icon"], [1, "fa-solid", "fa-check-circle", "selected-icon"], [1, "fa-regular", "fa-circle", "unselected-icon"], [1, "prompt-content"], [1, "prompt-header"], [1, "prompt-name"], [1, "prompt-badges"], [1, "linked-badge"], [1, "status-badge"], [1, "prompt-description"], [1, "prompt-metadata"], [1, "metadata-item"], [1, "fa-solid", "fa-link"], [1, "fa-solid", "fa-calendar"], [1, "fa-solid", "fa-plus"], [1, "fa-solid", "fa-check"]], template: function PromptSelectorDialogComponent_Template(rf, ctx) { if (rf & 1) {
|
|
348
346
|
i0.ɵɵelementStart(0, "div", 0);
|
|
349
347
|
i0.ɵɵconditionalCreate(1, PromptSelectorDialogComponent_Conditional_1_Template, 5, 0, "div", 1);
|
|
350
348
|
i0.ɵɵpipe(2, "async");
|
|
@@ -369,11 +367,13 @@ export class PromptSelectorDialogComponent {
|
|
|
369
367
|
i0.ɵɵproperty("disabled", ctx.selectedPrompts.size === 0);
|
|
370
368
|
i0.ɵɵadvance();
|
|
371
369
|
i0.ɵɵconditional(ctx.config.multiSelect ? 11 : 12);
|
|
372
|
-
} }, dependencies: [
|
|
370
|
+
} }, dependencies: [i1.DefaultValueAccessor, i1.NgControlStatus, i1.FormControlDirective, i2.MJButtonDirective, i3.AsyncPipe, i3.DatePipe], styles: [".prompt-selector-dialog[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100%;\n max-height: 70vh;\n}\n\n\n\n[_nghost-%COMP%] .k-dialog, \n[_nghost-%COMP%] .k-window {\n z-index: 10000 !important;\n}\n\n[_nghost-%COMP%] .k-overlay {\n z-index: 9999 !important;\n}\n\n\n\n.loading-state[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 300px;\n color: var(--mj-text-secondary);\n}\n\n.loading-spinner[_ngcontent-%COMP%] {\n margin-bottom: 16px;\n}\n\n\n\n.dialog-header[_ngcontent-%COMP%] {\n padding: 16px;\n border-bottom: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-card);\n}\n\n.search-section[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n.search-box[_ngcontent-%COMP%] {\n flex: 1;\n position: relative;\n}\n\n.search-icon[_ngcontent-%COMP%] {\n position: absolute;\n left: 12px;\n top: 50%;\n transform: translateY(-50%);\n color: var(--mj-text-secondary);\n z-index: 2;\n}\n\n.search-input[_ngcontent-%COMP%] {\n width: 100%;\n}\n\n.search-input[_ngcontent-%COMP%] input[_ngcontent-%COMP%] {\n padding-left: 36px !important;\n}\n\n.view-controls[_ngcontent-%COMP%] button.active[_ngcontent-%COMP%] {\n background-color: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n}\n\n\n\n.results-summary[_ngcontent-%COMP%] {\n padding: 12px 16px;\n background: var(--mj-bg-surface-sunken);\n display: flex;\n align-items: center;\n gap: 16px;\n font-size: 14px;\n color: var(--mj-text-secondary);\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.results-count[_ngcontent-%COMP%], .selected-count[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.selected-count[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-weight: 500;\n}\n\n\n\n.prompts-container[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n padding: 16px;\n}\n\n\n\n.prompts-container.list-view[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n\n\n\n.prompts-container.grid-view[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));\n gap: 16px;\n}\n\n\n\n.prompt-card[_ngcontent-%COMP%] {\n border: 2px solid var(--mj-border-default);\n border-radius: 8px;\n padding: 16px;\n cursor: pointer;\n transition: all 0.2s ease;\n background: var(--mj-bg-surface);\n display: flex;\n gap: 12px;\n position: relative;\n}\n\n.prompt-card[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-brand-primary);\n box-shadow: 0 2px 8px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n.prompt-card.selected[_ngcontent-%COMP%] {\n border-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 4%, var(--mj-bg-surface));\n box-shadow: 0 2px 8px color-mix(in srgb, var(--mj-brand-primary) 25%, transparent);\n}\n\n.prompt-card.linked[_ngcontent-%COMP%] {\n border-color: var(--mj-text-muted);\n background: var(--mj-bg-surface-card);\n opacity: 0.7;\n cursor: not-allowed;\n}\n\n.prompt-card.linked[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-text-muted);\n box-shadow: none;\n}\n\n\n\n.selection-indicator[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n margin-top: 2px;\n}\n\n.selected-icon[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-size: 18px;\n}\n\n.unselected-icon[_ngcontent-%COMP%] {\n color: var(--mj-border-strong);\n font-size: 18px;\n}\n\n.linked-icon[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n font-size: 18px;\n}\n\n\n\n.prompt-content[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n}\n\n.prompt-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 12px;\n margin-bottom: 8px;\n}\n\n.prompt-name[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n color: var(--mj-text-primary);\n line-height: 1.4;\n flex: 1;\n}\n\n.prompt-badges[_ngcontent-%COMP%] {\n display: flex;\n gap: 6px;\n align-items: center;\n}\n\n.status-badge[_ngcontent-%COMP%] {\n padding: 4px 8px;\n border-radius: 12px;\n font-size: 12px;\n font-weight: 500;\n color: var(--mj-text-inverse);\n white-space: nowrap;\n}\n\n.linked-badge[_ngcontent-%COMP%] {\n padding: 4px 8px;\n border-radius: 12px;\n font-size: 12px;\n font-weight: 500;\n background: var(--mj-text-muted);\n color: var(--mj-text-inverse);\n white-space: nowrap;\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n.prompt-description[_ngcontent-%COMP%] {\n margin: 0 0 12px 0;\n color: var(--mj-text-secondary);\n font-size: 14px;\n line-height: 1.4;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n}\n\n\n\n.prompt-metadata[_ngcontent-%COMP%] {\n display: flex;\n gap: 16px;\n font-size: 12px;\n color: var(--mj-text-disabled);\n flex-wrap: wrap;\n}\n\n.metadata-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n.metadata-item[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n width: 12px;\n font-size: 10px;\n}\n\n\n\n.no-results[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 200px;\n color: var(--mj-text-secondary);\n text-align: center;\n}\n\n.no-results[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n margin-bottom: 16px;\n color: var(--mj-border-strong);\n}\n\n.no-results[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] {\n margin: 0 0 8px 0;\n color: var(--mj-text-primary);\n}\n\n.no-results[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n color: var(--mj-text-disabled);\n max-width: 300px;\n}\n\n\n\n.dialog-footer[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 16px;\n border-top: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-card);\n}\n\n.footer-left[_ngcontent-%COMP%] {\n display: flex;\n}\n\n.footer-right[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n}\n\n\n\n@media (max-width: 768px) {\n .prompts-container.grid-view[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n }\n\n .prompt-header[_ngcontent-%COMP%] {\n flex-direction: column;\n align-items: flex-start;\n gap: 8px;\n }\n\n .search-section[_ngcontent-%COMP%] {\n flex-direction: column;\n gap: 8px;\n }\n\n .view-controls[_ngcontent-%COMP%] {\n align-self: flex-end;\n }\n}"] }); }
|
|
373
371
|
}
|
|
374
372
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(PromptSelectorDialogComponent, [{
|
|
375
373
|
type: Component,
|
|
376
|
-
args: [{ standalone: false, selector: 'mj-prompt-selector-dialog', template: "<!-- Prompt Selector Dialog -->\n<div class=\"prompt-selector-dialog\">\n \n <!-- Loading State -->\n @if (isLoading$ | async) {\n <div class=\"loading-state\">\n <div class=\"loading-spinner\">\n <i class=\"fa-solid fa-spinner fa-spin fa-2x\"></i>\n </div>\n <p>Loading prompts...</p>\n </div>\n } @else {\n \n <!-- Search and Controls Header -->\n <div class=\"dialog-header\">\n <div class=\"search-section\">\n <div class=\"search-box\">\n <i class=\"fa-solid fa-search search-icon\"></i>\n <kendo-textbox \n [formControl]=\"searchControl\"\n placeholder=\"Search prompts by name or description...\"\n class=\"search-input\">\n </kendo-textbox>\n </div>\n \n <div class=\"view-controls\">\n <button kendoButton \n size=\"small\"\n fillMode=\"flat\"\n [class.active]=\"viewMode === 'list'\"\n (click)=\"toggleViewMode()\"\n title=\"Toggle between list and grid view\">\n <i class=\"fa-solid\" [class.fa-list]=\"viewMode === 'grid'\" [class.fa-th]=\"viewMode === 'list'\"></i>\n </button>\n </div>\n </div>\n </div>\n\n <!-- Results Summary -->\n <div class=\"results-summary\">\n <span class=\"results-count\">\n <i class=\"fa-solid fa-comment-dots\"></i>\n {{ (filteredPrompts$ | async)?.length || 0 }} prompt(s)\n </span>\n @if (config.multiSelect && selectedPrompts.size > 0) {\n <span class=\"selected-count\">\n <i class=\"fa-solid fa-check-circle\"></i>\n {{ selectedPrompts.size }} selected\n </span>\n }\n </div>\n\n <!-- Prompts List/Grid -->\n <div class=\"prompts-container\" [class.grid-view]=\"viewMode === 'grid'\" [class.list-view]=\"viewMode === 'list'\">\n @if ((filteredPrompts$ | async)?.length === 0) {\n <div class=\"no-results\">\n <i class=\"fa-solid fa-search fa-2x\"></i>\n <h4>No prompts found</h4>\n <p>Try adjusting your search criteria or check that prompts are properly configured.</p>\n </div>\n } @else {\n @for (prompt of filteredPrompts$ | async; track prompt.ID) {\n <div class=\"prompt-card\" \n [class.selected]=\"isPromptSelected(prompt)\"\n [class.linked]=\"isPromptLinked(prompt)\"\n (click)=\"togglePromptSelection(prompt)\">\n \n <!-- Selection indicator -->\n <div class=\"selection-indicator\">\n @if (isPromptLinked(prompt)) {\n <i class=\"fa-solid fa-link linked-icon\" title=\"Already linked to this agent\"></i>\n } @else if (isPromptSelected(prompt)) {\n <i class=\"fa-solid fa-check-circle selected-icon\"></i>\n } @else {\n <i class=\"fa-regular fa-circle unselected-icon\"></i>\n }\n </div>\n\n <!-- Prompt Content -->\n <div class=\"prompt-content\">\n <div class=\"prompt-header\">\n <h4 class=\"prompt-name\">{{ prompt.Name }}</h4>\n <div class=\"prompt-badges\">\n @if (isPromptLinked(prompt)) {\n <span class=\"linked-badge\">\n <i class=\"fa-solid fa-link\"></i>\n Linked\n </span>\n }\n <span class=\"status-badge\" \n [style.background-color]=\"getPromptStatusColor(prompt)\">\n {{ getPromptStatusText(prompt) }}\n </span>\n </div>\n </div>\n\n @if (prompt.Description) {\n <p class=\"prompt-description\">{{ prompt.Description }}</p>\n }\n\n <!-- Prompt Metadata -->\n <div class=\"prompt-metadata\">\n @if (prompt.__mj_CreatedAt) {\n <span class=\"metadata-item\">\n <i class=\"fa-solid fa-calendar\"></i>\n Created {{ prompt.__mj_CreatedAt | date:'short' }}\n </span>\n }\n </div>\n </div>\n </div>\n }\n }\n </div>\n }\n\n <!-- Dialog Footer -->\n <div class=\"dialog-footer\">\n <div class=\"footer-left\">\n @if (config.showCreateNew) {\n <button kendoButton \n look=\"flat\"\n (click)=\"createNew()\">\n <i class=\"fa-solid fa-plus\"></i>\n Create New Prompt\n </button>\n }\n </div>\n \n <div class=\"footer-right\">\n <button kendoButton \n look=\"flat\" \n (click)=\"cancel()\">\n Cancel\n </button>\n \n <button kendoButton \n themeColor=\"primary\" \n (click)=\"selectPrompts()\"\n [disabled]=\"selectedPrompts.size === 0\">\n @if (config.multiSelect) {\n <i class=\"fa-solid fa-check\"></i>\n Add {{ selectedPrompts.size }} Prompt{{ selectedPrompts.size === 1 ? '' : 's' }}\n } @else {\n <i class=\"fa-solid fa-check\"></i>\n Select Prompt\n }\n </button>\n </div>\n </div>\n</div>", styles: [".prompt-selector-dialog {\n display: flex;\n flex-direction: column;\n height: 100%;\n max-height: 70vh;\n}\n\n/* Ensure dialog appears above banner and other elements */\n:host ::ng-deep .k-dialog,\n:host ::ng-deep .k-window {\n z-index: 10000 !important;\n}\n\n:host ::ng-deep .k-overlay {\n z-index: 9999 !important;\n}\n\n/* === Loading State === */\n.loading-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 300px;\n color: var(--mj-text-secondary);\n}\n\n.loading-spinner {\n margin-bottom: 16px;\n}\n\n/* === Header Section === */\n.dialog-header {\n padding: 16px;\n border-bottom: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-card);\n}\n\n.search-section {\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n.search-box {\n flex: 1;\n position: relative;\n}\n\n.search-icon {\n position: absolute;\n left: 12px;\n top: 50%;\n transform: translateY(-50%);\n color: var(--mj-text-secondary);\n z-index: 2;\n}\n\n.search-input {\n width: 100%;\n}\n\n.search-input input {\n padding-left: 36px !important;\n}\n\n.view-controls button.active {\n background-color: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n}\n\n/* === Results Summary === */\n.results-summary {\n padding: 12px 16px;\n background: var(--mj-bg-surface-sunken);\n display: flex;\n align-items: center;\n gap: 16px;\n font-size: 14px;\n color: var(--mj-text-secondary);\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.results-count, .selected-count {\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.selected-count {\n color: var(--mj-brand-primary);\n font-weight: 500;\n}\n\n/* === Prompts Container === */\n.prompts-container {\n flex: 1;\n overflow-y: auto;\n padding: 16px;\n}\n\n/* List View */\n.prompts-container.list-view {\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n\n/* Grid View */\n.prompts-container.grid-view {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));\n gap: 16px;\n}\n\n/* === Prompt Cards === */\n.prompt-card {\n border: 2px solid var(--mj-border-default);\n border-radius: 8px;\n padding: 16px;\n cursor: pointer;\n transition: all 0.2s ease;\n background: var(--mj-bg-surface);\n display: flex;\n gap: 12px;\n position: relative;\n}\n\n.prompt-card:hover {\n border-color: var(--mj-brand-primary);\n box-shadow: 0 2px 8px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n.prompt-card.selected {\n border-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 4%, var(--mj-bg-surface));\n box-shadow: 0 2px 8px color-mix(in srgb, var(--mj-brand-primary) 25%, transparent);\n}\n\n.prompt-card.linked {\n border-color: var(--mj-text-muted);\n background: var(--mj-bg-surface-card);\n opacity: 0.7;\n cursor: not-allowed;\n}\n\n.prompt-card.linked:hover {\n border-color: var(--mj-text-muted);\n box-shadow: none;\n}\n\n/* === Selection Indicator === */\n.selection-indicator {\n display: flex;\n align-items: flex-start;\n margin-top: 2px;\n}\n\n.selected-icon {\n color: var(--mj-brand-primary);\n font-size: 18px;\n}\n\n.unselected-icon {\n color: var(--mj-border-strong);\n font-size: 18px;\n}\n\n.linked-icon {\n color: var(--mj-text-muted);\n font-size: 18px;\n}\n\n/* === Prompt Content === */\n.prompt-content {\n flex: 1;\n min-width: 0;\n}\n\n.prompt-header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 12px;\n margin-bottom: 8px;\n}\n\n.prompt-name {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n color: var(--mj-text-primary);\n line-height: 1.4;\n flex: 1;\n}\n\n.prompt-badges {\n display: flex;\n gap: 6px;\n align-items: center;\n}\n\n.status-badge {\n padding: 4px 8px;\n border-radius: 12px;\n font-size: 12px;\n font-weight: 500;\n color: var(--mj-text-inverse);\n white-space: nowrap;\n}\n\n.linked-badge {\n padding: 4px 8px;\n border-radius: 12px;\n font-size: 12px;\n font-weight: 500;\n background: var(--mj-text-muted);\n color: var(--mj-text-inverse);\n white-space: nowrap;\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n.prompt-description {\n margin: 0 0 12px 0;\n color: var(--mj-text-secondary);\n font-size: 14px;\n line-height: 1.4;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n}\n\n/* === Prompt Metadata === */\n.prompt-metadata {\n display: flex;\n gap: 16px;\n font-size: 12px;\n color: var(--mj-text-disabled);\n flex-wrap: wrap;\n}\n\n.metadata-item {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n.metadata-item i {\n width: 12px;\n font-size: 10px;\n}\n\n/* === No Results === */\n.no-results {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 200px;\n color: var(--mj-text-secondary);\n text-align: center;\n}\n\n.no-results i {\n margin-bottom: 16px;\n color: var(--mj-border-strong);\n}\n\n.no-results h4 {\n margin: 0 0 8px 0;\n color: var(--mj-text-primary);\n}\n\n.no-results p {\n margin: 0;\n color: var(--mj-text-disabled);\n max-width: 300px;\n}\n\n/* === Dialog Footer === */\n.dialog-footer {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 16px;\n border-top: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-card);\n}\n\n.footer-left {\n display: flex;\n}\n\n.footer-right {\n display: flex;\n gap: 8px;\n}\n\n/* === Responsive Design === */\n@media (max-width: 768px) {\n .prompts-container.grid-view {\n grid-template-columns: 1fr;\n }\n\n .prompt-header {\n flex-direction: column;\n align-items: flex-start;\n gap: 8px;\n }\n\n .search-section {\n flex-direction: column;\n gap: 8px;\n }\n\n .view-controls {\n align-self: flex-end;\n }\n}\n"] }]
|
|
377
|
-
}], () => [{ type:
|
|
378
|
-
|
|
374
|
+
args: [{ standalone: false, selector: 'mj-prompt-selector-dialog', template: "<!-- Prompt Selector Dialog -->\n<div class=\"prompt-selector-dialog\">\n \n <!-- Loading State -->\n @if (isLoading$ | async) {\n <div class=\"loading-state\">\n <div class=\"loading-spinner\">\n <i class=\"fa-solid fa-spinner fa-spin fa-2x\"></i>\n </div>\n <p>Loading prompts...</p>\n </div>\n } @else {\n \n <!-- Search and Controls Header -->\n <div class=\"dialog-header\">\n <div class=\"search-section\">\n <div class=\"search-box\">\n <i class=\"fa-solid fa-search search-icon\"></i>\n <input\n class=\"mj-input search-input\"\n [formControl]=\"searchControl\"\n placeholder=\"Search prompts by name or description...\">\n </div>\n \n <div class=\"view-controls\">\n <button mjButton\n variant=\"flat\"\n [class.active]=\"viewMode === 'list'\"\n (click)=\"toggleViewMode()\"\n title=\"Toggle between list and grid view\">\n <i class=\"fa-solid\" [class.fa-list]=\"viewMode === 'grid'\" [class.fa-th]=\"viewMode === 'list'\"></i>\n </button>\n </div>\n </div>\n </div>\n\n <!-- Results Summary -->\n <div class=\"results-summary\">\n <span class=\"results-count\">\n <i class=\"fa-solid fa-comment-dots\"></i>\n {{ (filteredPrompts$ | async)?.length || 0 }} prompt(s)\n </span>\n @if (config.multiSelect && selectedPrompts.size > 0) {\n <span class=\"selected-count\">\n <i class=\"fa-solid fa-check-circle\"></i>\n {{ selectedPrompts.size }} selected\n </span>\n }\n </div>\n\n <!-- Prompts List/Grid -->\n <div class=\"prompts-container\" [class.grid-view]=\"viewMode === 'grid'\" [class.list-view]=\"viewMode === 'list'\">\n @if ((filteredPrompts$ | async)?.length === 0) {\n <div class=\"no-results\">\n <i class=\"fa-solid fa-search fa-2x\"></i>\n <h4>No prompts found</h4>\n <p>Try adjusting your search criteria or check that prompts are properly configured.</p>\n </div>\n } @else {\n @for (prompt of filteredPrompts$ | async; track prompt.ID) {\n <div class=\"prompt-card\" \n [class.selected]=\"isPromptSelected(prompt)\"\n [class.linked]=\"isPromptLinked(prompt)\"\n (click)=\"togglePromptSelection(prompt)\">\n \n <!-- Selection indicator -->\n <div class=\"selection-indicator\">\n @if (isPromptLinked(prompt)) {\n <i class=\"fa-solid fa-link linked-icon\" title=\"Already linked to this agent\"></i>\n } @else if (isPromptSelected(prompt)) {\n <i class=\"fa-solid fa-check-circle selected-icon\"></i>\n } @else {\n <i class=\"fa-regular fa-circle unselected-icon\"></i>\n }\n </div>\n\n <!-- Prompt Content -->\n <div class=\"prompt-content\">\n <div class=\"prompt-header\">\n <h4 class=\"prompt-name\">{{ prompt.Name }}</h4>\n <div class=\"prompt-badges\">\n @if (isPromptLinked(prompt)) {\n <span class=\"linked-badge\">\n <i class=\"fa-solid fa-link\"></i>\n Linked\n </span>\n }\n <span class=\"status-badge\" \n [style.background-color]=\"getPromptStatusColor(prompt)\">\n {{ getPromptStatusText(prompt) }}\n </span>\n </div>\n </div>\n\n @if (prompt.Description) {\n <p class=\"prompt-description\">{{ prompt.Description }}</p>\n }\n\n <!-- Prompt Metadata -->\n <div class=\"prompt-metadata\">\n @if (prompt.__mj_CreatedAt) {\n <span class=\"metadata-item\">\n <i class=\"fa-solid fa-calendar\"></i>\n Created {{ prompt.__mj_CreatedAt | date:'short' }}\n </span>\n }\n </div>\n </div>\n </div>\n }\n }\n </div>\n }\n\n <!-- Dialog Footer -->\n <div class=\"dialog-footer\">\n <div class=\"footer-left\">\n @if (config.showCreateNew) {\n <button mjButton\n variant=\"flat\"\n (click)=\"createNew()\">\n <i class=\"fa-solid fa-plus\"></i>\n Create New Prompt\n </button>\n }\n </div>\n \n <div class=\"footer-right\">\n <button mjButton\n variant=\"flat\"\n (click)=\"cancel()\">\n Cancel\n </button>\n\n <button mjButton\n variant=\"primary\"\n (click)=\"selectPrompts()\"\n [disabled]=\"selectedPrompts.size === 0\">\n @if (config.multiSelect) {\n <i class=\"fa-solid fa-check\"></i>\n Add {{ selectedPrompts.size }} Prompt{{ selectedPrompts.size === 1 ? '' : 's' }}\n } @else {\n <i class=\"fa-solid fa-check\"></i>\n Select Prompt\n }\n </button>\n </div>\n </div>\n</div>", styles: [".prompt-selector-dialog {\n display: flex;\n flex-direction: column;\n height: 100%;\n max-height: 70vh;\n}\n\n/* Ensure dialog appears above banner and other elements */\n:host ::ng-deep .k-dialog,\n:host ::ng-deep .k-window {\n z-index: 10000 !important;\n}\n\n:host ::ng-deep .k-overlay {\n z-index: 9999 !important;\n}\n\n/* === Loading State === */\n.loading-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 300px;\n color: var(--mj-text-secondary);\n}\n\n.loading-spinner {\n margin-bottom: 16px;\n}\n\n/* === Header Section === */\n.dialog-header {\n padding: 16px;\n border-bottom: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-card);\n}\n\n.search-section {\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n.search-box {\n flex: 1;\n position: relative;\n}\n\n.search-icon {\n position: absolute;\n left: 12px;\n top: 50%;\n transform: translateY(-50%);\n color: var(--mj-text-secondary);\n z-index: 2;\n}\n\n.search-input {\n width: 100%;\n}\n\n.search-input input {\n padding-left: 36px !important;\n}\n\n.view-controls button.active {\n background-color: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n}\n\n/* === Results Summary === */\n.results-summary {\n padding: 12px 16px;\n background: var(--mj-bg-surface-sunken);\n display: flex;\n align-items: center;\n gap: 16px;\n font-size: 14px;\n color: var(--mj-text-secondary);\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.results-count, .selected-count {\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.selected-count {\n color: var(--mj-brand-primary);\n font-weight: 500;\n}\n\n/* === Prompts Container === */\n.prompts-container {\n flex: 1;\n overflow-y: auto;\n padding: 16px;\n}\n\n/* List View */\n.prompts-container.list-view {\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n\n/* Grid View */\n.prompts-container.grid-view {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));\n gap: 16px;\n}\n\n/* === Prompt Cards === */\n.prompt-card {\n border: 2px solid var(--mj-border-default);\n border-radius: 8px;\n padding: 16px;\n cursor: pointer;\n transition: all 0.2s ease;\n background: var(--mj-bg-surface);\n display: flex;\n gap: 12px;\n position: relative;\n}\n\n.prompt-card:hover {\n border-color: var(--mj-brand-primary);\n box-shadow: 0 2px 8px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n.prompt-card.selected {\n border-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 4%, var(--mj-bg-surface));\n box-shadow: 0 2px 8px color-mix(in srgb, var(--mj-brand-primary) 25%, transparent);\n}\n\n.prompt-card.linked {\n border-color: var(--mj-text-muted);\n background: var(--mj-bg-surface-card);\n opacity: 0.7;\n cursor: not-allowed;\n}\n\n.prompt-card.linked:hover {\n border-color: var(--mj-text-muted);\n box-shadow: none;\n}\n\n/* === Selection Indicator === */\n.selection-indicator {\n display: flex;\n align-items: flex-start;\n margin-top: 2px;\n}\n\n.selected-icon {\n color: var(--mj-brand-primary);\n font-size: 18px;\n}\n\n.unselected-icon {\n color: var(--mj-border-strong);\n font-size: 18px;\n}\n\n.linked-icon {\n color: var(--mj-text-muted);\n font-size: 18px;\n}\n\n/* === Prompt Content === */\n.prompt-content {\n flex: 1;\n min-width: 0;\n}\n\n.prompt-header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 12px;\n margin-bottom: 8px;\n}\n\n.prompt-name {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n color: var(--mj-text-primary);\n line-height: 1.4;\n flex: 1;\n}\n\n.prompt-badges {\n display: flex;\n gap: 6px;\n align-items: center;\n}\n\n.status-badge {\n padding: 4px 8px;\n border-radius: 12px;\n font-size: 12px;\n font-weight: 500;\n color: var(--mj-text-inverse);\n white-space: nowrap;\n}\n\n.linked-badge {\n padding: 4px 8px;\n border-radius: 12px;\n font-size: 12px;\n font-weight: 500;\n background: var(--mj-text-muted);\n color: var(--mj-text-inverse);\n white-space: nowrap;\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n.prompt-description {\n margin: 0 0 12px 0;\n color: var(--mj-text-secondary);\n font-size: 14px;\n line-height: 1.4;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n}\n\n/* === Prompt Metadata === */\n.prompt-metadata {\n display: flex;\n gap: 16px;\n font-size: 12px;\n color: var(--mj-text-disabled);\n flex-wrap: wrap;\n}\n\n.metadata-item {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n.metadata-item i {\n width: 12px;\n font-size: 10px;\n}\n\n/* === No Results === */\n.no-results {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 200px;\n color: var(--mj-text-secondary);\n text-align: center;\n}\n\n.no-results i {\n margin-bottom: 16px;\n color: var(--mj-border-strong);\n}\n\n.no-results h4 {\n margin: 0 0 8px 0;\n color: var(--mj-text-primary);\n}\n\n.no-results p {\n margin: 0;\n color: var(--mj-text-disabled);\n max-width: 300px;\n}\n\n/* === Dialog Footer === */\n.dialog-footer {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 16px;\n border-top: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-card);\n}\n\n.footer-left {\n display: flex;\n}\n\n.footer-right {\n display: flex;\n gap: 8px;\n}\n\n/* === Responsive Design === */\n@media (max-width: 768px) {\n .prompts-container.grid-view {\n grid-template-columns: 1fr;\n }\n\n .prompt-header {\n flex-direction: column;\n align-items: flex-start;\n gap: 8px;\n }\n\n .search-section {\n flex-direction: column;\n gap: 8px;\n }\n\n .view-controls {\n align-self: flex-end;\n }\n}\n"] }]
|
|
375
|
+
}], () => [{ type: i0.ChangeDetectorRef }], { DialogClose: [{
|
|
376
|
+
type: Output
|
|
377
|
+
}] }); })();
|
|
378
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(PromptSelectorDialogComponent, { className: "PromptSelectorDialogComponent", filePath: "src/lib/custom/AIAgents/prompt-selector-dialog.component.ts", lineNumber: 42 }); })();
|
|
379
379
|
//# sourceMappingURL=prompt-selector-dialog.component.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompt-selector-dialog.component.js","sourceRoot":"","sources":["../../../../src/lib/custom/AIAgents/prompt-selector-dialog.component.ts","../../../../src/lib/custom/AIAgents/prompt-selector-dialog.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, OnDestroy, ChangeDetectorRef } from '@angular/core';\nimport { WindowRef } from '@progress/kendo-angular-dialog';\nimport { Subject, BehaviorSubject, debounceTime, distinctUntilChanged, takeUntil } from 'rxjs';\nimport { FormControl } from '@angular/forms';\nimport { RunView } from '@memberjunction/core';\nimport { MJAIPromptEntityExtended } from '@memberjunction/ai-core-plus';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\n\nexport interface PromptSelectorConfig {\n /** Title for the dialog */\n title: string;\n /** Whether to show the \"Create New\" option */\n showCreateNew?: boolean;\n /** Filter criteria for prompts */\n extraFilter?: string;\n /** Allow multiple selection */\n multiSelect?: boolean;\n /** Pre-selected prompt IDs */\n selectedPromptIds?: string[];\n /** Already linked prompt IDs (will be grayed out and not selectable) */\n linkedPromptIds?: string[];\n}\n\nexport interface PromptSelectorResult {\n /** Selected prompts */\n selectedPrompts: MJAIPromptEntityExtended[];\n /** Whether user chose to create new */\n createNew?: boolean;\n}\n\n/**\n * Unified prompt selector dialog that can be used for:\n * - Selecting context compression prompts (single select)\n * - Adding general prompts to agents (multi-select)\n * - Any other prompt selection scenario\n */\n@Component({\n standalone: false,\n selector: 'mj-prompt-selector-dialog',\n templateUrl: './prompt-selector-dialog.component.html',\n styleUrls: ['./prompt-selector-dialog.component.css']\n})\nexport class PromptSelectorDialogComponent implements OnInit, OnDestroy {\n \n // Input configuration\n config: PromptSelectorConfig = { title: 'Select Prompts' };\n \n // State management\n private destroy$ = new Subject<void>();\n public result = new Subject<PromptSelectorResult | null>();\n \n // Data and UI state\n isLoading$ = new BehaviorSubject<boolean>(false);\n prompts$ = new BehaviorSubject<MJAIPromptEntityExtended[]>([]);\n filteredPrompts$ = new BehaviorSubject<MJAIPromptEntityExtended[]>([]);\n \n // Search and selection\n searchControl = new FormControl('');\n selectedPrompts: Set<string> = new Set();\n linkedPrompts: Set<string> = new Set();\n \n // View mode\n viewMode: 'grid' | 'list' = 'list';\n\n constructor(\n private dialogRef: WindowRef,\n private cdr: ChangeDetectorRef\n ) {}\n\n ngOnInit() {\n this.setupSearch();\n this.loadPrompts();\n \n // Initialize selected prompts if provided\n if (this.config.selectedPromptIds) {\n this.selectedPrompts = new Set(this.config.selectedPromptIds);\n }\n \n // Initialize linked prompts if provided\n if (this.config.linkedPromptIds) {\n this.linkedPrompts = new Set(this.config.linkedPromptIds);\n }\n }\n\n ngOnDestroy() {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n private setupSearch() {\n this.searchControl.valueChanges\n .pipe(\n debounceTime(300),\n distinctUntilChanged(),\n takeUntil(this.destroy$)\n )\n .subscribe(searchTerm => {\n this.filterPrompts(searchTerm || '');\n });\n }\n\n private async loadPrompts() {\n this.isLoading$.next(true);\n \n try {\n const rv = new RunView();\n \n // Build filter - default to active prompts\n let filter = \"Status = 'Active'\";\n if (this.config.extraFilter) {\n filter += ` AND ${this.config.extraFilter}`;\n }\n \n const result = await rv.RunView<MJAIPromptEntityExtended>({\n EntityName: 'MJ: AI Prompts',\n ExtraFilter: filter,\n OrderBy: 'Name ASC',\n ResultType: 'entity_object',\n MaxRows: 1000\n });\n\n if (result.Success) {\n const prompts = result.Results || [];\n this.prompts$.next(prompts);\n this.filteredPrompts$.next(prompts);\n } else {\n throw new Error(result.ErrorMessage || 'Failed to load prompts');\n }\n } catch (error) {\n console.error('Error loading prompts:', error);\n MJNotificationService.Instance.CreateSimpleNotification(\n 'Error loading prompts. Please try again.',\n 'error',\n 3000\n );\n this.prompts$.next([]);\n this.filteredPrompts$.next([]);\n } finally {\n this.isLoading$.next(false);\n }\n }\n\n private filterPrompts(searchTerm: string) {\n const allPrompts = this.prompts$.value;\n \n if (!searchTerm.trim()) {\n this.filteredPrompts$.next(allPrompts);\n return;\n }\n\n const filtered = allPrompts.filter(prompt => \n prompt.Name?.toLowerCase().includes(searchTerm.toLowerCase()) ||\n prompt.Description?.toLowerCase().includes(searchTerm.toLowerCase())\n );\n \n this.filteredPrompts$.next(filtered);\n }\n\n // === Selection Management ===\n\n togglePromptSelection(prompt: MJAIPromptEntityExtended) {\n // Prevent selection of already linked prompts\n if (this.isPromptLinked(prompt)) {\n MJNotificationService.Instance.CreateSimpleNotification(\n `\"${prompt.Name}\" is already linked to this agent`,\n 'info',\n 2000\n );\n return;\n }\n \n if (this.config.multiSelect) {\n if (this.selectedPrompts.has(prompt.ID)) {\n this.selectedPrompts.delete(prompt.ID);\n } else {\n this.selectedPrompts.add(prompt.ID);\n }\n } else {\n // Single select - replace current selection\n this.selectedPrompts.clear();\n this.selectedPrompts.add(prompt.ID);\n }\n }\n\n isPromptSelected(prompt: MJAIPromptEntityExtended): boolean {\n return this.selectedPrompts.has(prompt.ID);\n }\n\n isPromptLinked(prompt: MJAIPromptEntityExtended): boolean {\n return this.linkedPrompts.has(prompt.ID);\n }\n\n getSelectedPromptObjects(): MJAIPromptEntityExtended[] {\n const allPrompts = this.prompts$.value;\n return allPrompts.filter(prompt => this.selectedPrompts.has(prompt.ID));\n }\n\n // === UI Helpers ===\n\n toggleViewMode() {\n this.viewMode = this.viewMode === 'grid' ? 'list' : 'grid';\n }\n\n getPromptStatusColor(prompt: MJAIPromptEntityExtended): string {\n switch (prompt.Status) {\n case 'Active': return 'var(--mj-status-success)';\n case 'Pending': return 'var(--mj-status-warning)';\n case 'Disabled': return 'var(--mj-text-muted)';\n default: return 'var(--mj-text-muted)';\n }\n }\n\n getPromptStatusText(prompt: MJAIPromptEntityExtended): string {\n return prompt.Status || 'Unknown';\n }\n\n // === Dialog Actions ===\n\n selectPrompts() {\n const selectedPromptObjects = this.getSelectedPromptObjects();\n \n if (selectedPromptObjects.length === 0) {\n MJNotificationService.Instance.CreateSimpleNotification(\n 'Please select at least one prompt',\n 'warning',\n 2000\n );\n return;\n }\n\n const result: PromptSelectorResult = {\n selectedPrompts: selectedPromptObjects\n };\n\n this.result.next(result);\n this.dialogRef.close();\n }\n\n createNew() {\n const result: PromptSelectorResult = {\n selectedPrompts: [],\n createNew: true\n };\n\n this.result.next(result);\n this.dialogRef.close();\n }\n\n cancel() {\n this.result.next(null);\n this.dialogRef.close();\n }\n}","<!-- Prompt Selector Dialog -->\n<div class=\"prompt-selector-dialog\">\n \n <!-- Loading State -->\n @if (isLoading$ | async) {\n <div class=\"loading-state\">\n <div class=\"loading-spinner\">\n <i class=\"fa-solid fa-spinner fa-spin fa-2x\"></i>\n </div>\n <p>Loading prompts...</p>\n </div>\n } @else {\n \n <!-- Search and Controls Header -->\n <div class=\"dialog-header\">\n <div class=\"search-section\">\n <div class=\"search-box\">\n <i class=\"fa-solid fa-search search-icon\"></i>\n <kendo-textbox \n [formControl]=\"searchControl\"\n placeholder=\"Search prompts by name or description...\"\n class=\"search-input\">\n </kendo-textbox>\n </div>\n \n <div class=\"view-controls\">\n <button kendoButton \n size=\"small\"\n fillMode=\"flat\"\n [class.active]=\"viewMode === 'list'\"\n (click)=\"toggleViewMode()\"\n title=\"Toggle between list and grid view\">\n <i class=\"fa-solid\" [class.fa-list]=\"viewMode === 'grid'\" [class.fa-th]=\"viewMode === 'list'\"></i>\n </button>\n </div>\n </div>\n </div>\n\n <!-- Results Summary -->\n <div class=\"results-summary\">\n <span class=\"results-count\">\n <i class=\"fa-solid fa-comment-dots\"></i>\n {{ (filteredPrompts$ | async)?.length || 0 }} prompt(s)\n </span>\n @if (config.multiSelect && selectedPrompts.size > 0) {\n <span class=\"selected-count\">\n <i class=\"fa-solid fa-check-circle\"></i>\n {{ selectedPrompts.size }} selected\n </span>\n }\n </div>\n\n <!-- Prompts List/Grid -->\n <div class=\"prompts-container\" [class.grid-view]=\"viewMode === 'grid'\" [class.list-view]=\"viewMode === 'list'\">\n @if ((filteredPrompts$ | async)?.length === 0) {\n <div class=\"no-results\">\n <i class=\"fa-solid fa-search fa-2x\"></i>\n <h4>No prompts found</h4>\n <p>Try adjusting your search criteria or check that prompts are properly configured.</p>\n </div>\n } @else {\n @for (prompt of filteredPrompts$ | async; track prompt.ID) {\n <div class=\"prompt-card\" \n [class.selected]=\"isPromptSelected(prompt)\"\n [class.linked]=\"isPromptLinked(prompt)\"\n (click)=\"togglePromptSelection(prompt)\">\n \n <!-- Selection indicator -->\n <div class=\"selection-indicator\">\n @if (isPromptLinked(prompt)) {\n <i class=\"fa-solid fa-link linked-icon\" title=\"Already linked to this agent\"></i>\n } @else if (isPromptSelected(prompt)) {\n <i class=\"fa-solid fa-check-circle selected-icon\"></i>\n } @else {\n <i class=\"fa-regular fa-circle unselected-icon\"></i>\n }\n </div>\n\n <!-- Prompt Content -->\n <div class=\"prompt-content\">\n <div class=\"prompt-header\">\n <h4 class=\"prompt-name\">{{ prompt.Name }}</h4>\n <div class=\"prompt-badges\">\n @if (isPromptLinked(prompt)) {\n <span class=\"linked-badge\">\n <i class=\"fa-solid fa-link\"></i>\n Linked\n </span>\n }\n <span class=\"status-badge\" \n [style.background-color]=\"getPromptStatusColor(prompt)\">\n {{ getPromptStatusText(prompt) }}\n </span>\n </div>\n </div>\n\n @if (prompt.Description) {\n <p class=\"prompt-description\">{{ prompt.Description }}</p>\n }\n\n <!-- Prompt Metadata -->\n <div class=\"prompt-metadata\">\n @if (prompt.__mj_CreatedAt) {\n <span class=\"metadata-item\">\n <i class=\"fa-solid fa-calendar\"></i>\n Created {{ prompt.__mj_CreatedAt | date:'short' }}\n </span>\n }\n </div>\n </div>\n </div>\n }\n }\n </div>\n }\n\n <!-- Dialog Footer -->\n <div class=\"dialog-footer\">\n <div class=\"footer-left\">\n @if (config.showCreateNew) {\n <button kendoButton \n look=\"flat\"\n (click)=\"createNew()\">\n <i class=\"fa-solid fa-plus\"></i>\n Create New Prompt\n </button>\n }\n </div>\n \n <div class=\"footer-right\">\n <button kendoButton \n look=\"flat\" \n (click)=\"cancel()\">\n Cancel\n </button>\n \n <button kendoButton \n themeColor=\"primary\" \n (click)=\"selectPrompts()\"\n [disabled]=\"selectedPrompts.size === 0\">\n @if (config.multiSelect) {\n <i class=\"fa-solid fa-check\"></i>\n Add {{ selectedPrompts.size }} Prompt{{ selectedPrompts.size === 1 ? '' : 's' }}\n } @else {\n <i class=\"fa-solid fa-check\"></i>\n Select Prompt\n }\n </button>\n </div>\n </div>\n</div>"]}
|
|
1
|
+
{"version":3,"file":"prompt-selector-dialog.component.js","sourceRoot":"","sources":["../../../../src/lib/custom/AIAgents/prompt-selector-dialog.component.ts","../../../../src/lib/custom/AIAgents/prompt-selector-dialog.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, OnDestroy, ChangeDetectorRef, Output, EventEmitter } from '@angular/core';\nimport { Subject, BehaviorSubject, debounceTime, distinctUntilChanged, takeUntil } from 'rxjs';\nimport { FormControl } from '@angular/forms';\nimport { RunView } from '@memberjunction/core';\nimport { MJAIPromptEntityExtended } from '@memberjunction/ai-core-plus';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\n\nexport interface PromptSelectorConfig {\n /** Title for the dialog */\n title: string;\n /** Whether to show the \"Create New\" option */\n showCreateNew?: boolean;\n /** Filter criteria for prompts */\n extraFilter?: string;\n /** Allow multiple selection */\n multiSelect?: boolean;\n /** Pre-selected prompt IDs */\n selectedPromptIds?: string[];\n /** Already linked prompt IDs (will be grayed out and not selectable) */\n linkedPromptIds?: string[];\n}\n\nexport interface PromptSelectorResult {\n /** Selected prompts */\n selectedPrompts: MJAIPromptEntityExtended[];\n /** Whether user chose to create new */\n createNew?: boolean;\n}\n\n/**\n * Unified prompt selector dialog that can be used for:\n * - Selecting context compression prompts (single select)\n * - Adding general prompts to agents (multi-select)\n * - Any other prompt selection scenario\n */\n@Component({\n standalone: false,\n selector: 'mj-prompt-selector-dialog',\n templateUrl: './prompt-selector-dialog.component.html',\n styleUrls: ['./prompt-selector-dialog.component.css']\n})\nexport class PromptSelectorDialogComponent implements OnInit, OnDestroy {\n \n // Input configuration\n config: PromptSelectorConfig = { title: 'Select Prompts' };\n \n // State management\n private destroy$ = new Subject<void>();\n public result = new Subject<PromptSelectorResult | null>();\n \n // Data and UI state\n isLoading$ = new BehaviorSubject<boolean>(false);\n prompts$ = new BehaviorSubject<MJAIPromptEntityExtended[]>([]);\n filteredPrompts$ = new BehaviorSubject<MJAIPromptEntityExtended[]>([]);\n \n // Search and selection\n searchControl = new FormControl('');\n selectedPrompts: Set<string> = new Set();\n linkedPrompts: Set<string> = new Set();\n \n // View mode\n viewMode: 'grid' | 'list' = 'list';\n\n @Output() DialogClose = new EventEmitter<void>();\n\n constructor(\n private cdr: ChangeDetectorRef\n ) {}\n\n ngOnInit() {\n this.setupSearch();\n this.loadPrompts();\n \n // Initialize selected prompts if provided\n if (this.config.selectedPromptIds) {\n this.selectedPrompts = new Set(this.config.selectedPromptIds);\n }\n \n // Initialize linked prompts if provided\n if (this.config.linkedPromptIds) {\n this.linkedPrompts = new Set(this.config.linkedPromptIds);\n }\n }\n\n ngOnDestroy() {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n private setupSearch() {\n this.searchControl.valueChanges\n .pipe(\n debounceTime(300),\n distinctUntilChanged(),\n takeUntil(this.destroy$)\n )\n .subscribe(searchTerm => {\n this.filterPrompts(searchTerm || '');\n });\n }\n\n private async loadPrompts() {\n this.isLoading$.next(true);\n \n try {\n const rv = new RunView();\n \n // Build filter - default to active prompts\n let filter = \"Status = 'Active'\";\n if (this.config.extraFilter) {\n filter += ` AND ${this.config.extraFilter}`;\n }\n \n const result = await rv.RunView<MJAIPromptEntityExtended>({\n EntityName: 'MJ: AI Prompts',\n ExtraFilter: filter,\n OrderBy: 'Name ASC',\n ResultType: 'entity_object',\n MaxRows: 1000\n });\n\n if (result.Success) {\n const prompts = result.Results || [];\n this.prompts$.next(prompts);\n this.filteredPrompts$.next(prompts);\n } else {\n throw new Error(result.ErrorMessage || 'Failed to load prompts');\n }\n } catch (error) {\n console.error('Error loading prompts:', error);\n MJNotificationService.Instance.CreateSimpleNotification(\n 'Error loading prompts. Please try again.',\n 'error',\n 3000\n );\n this.prompts$.next([]);\n this.filteredPrompts$.next([]);\n } finally {\n this.isLoading$.next(false);\n }\n }\n\n private filterPrompts(searchTerm: string) {\n const allPrompts = this.prompts$.value;\n \n if (!searchTerm.trim()) {\n this.filteredPrompts$.next(allPrompts);\n return;\n }\n\n const filtered = allPrompts.filter(prompt => \n prompt.Name?.toLowerCase().includes(searchTerm.toLowerCase()) ||\n prompt.Description?.toLowerCase().includes(searchTerm.toLowerCase())\n );\n \n this.filteredPrompts$.next(filtered);\n }\n\n // === Selection Management ===\n\n togglePromptSelection(prompt: MJAIPromptEntityExtended) {\n // Prevent selection of already linked prompts\n if (this.isPromptLinked(prompt)) {\n MJNotificationService.Instance.CreateSimpleNotification(\n `\"${prompt.Name}\" is already linked to this agent`,\n 'info',\n 2000\n );\n return;\n }\n \n if (this.config.multiSelect) {\n if (this.selectedPrompts.has(prompt.ID)) {\n this.selectedPrompts.delete(prompt.ID);\n } else {\n this.selectedPrompts.add(prompt.ID);\n }\n } else {\n // Single select - replace current selection\n this.selectedPrompts.clear();\n this.selectedPrompts.add(prompt.ID);\n }\n }\n\n isPromptSelected(prompt: MJAIPromptEntityExtended): boolean {\n return this.selectedPrompts.has(prompt.ID);\n }\n\n isPromptLinked(prompt: MJAIPromptEntityExtended): boolean {\n return this.linkedPrompts.has(prompt.ID);\n }\n\n getSelectedPromptObjects(): MJAIPromptEntityExtended[] {\n const allPrompts = this.prompts$.value;\n return allPrompts.filter(prompt => this.selectedPrompts.has(prompt.ID));\n }\n\n // === UI Helpers ===\n\n toggleViewMode() {\n this.viewMode = this.viewMode === 'grid' ? 'list' : 'grid';\n }\n\n getPromptStatusColor(prompt: MJAIPromptEntityExtended): string {\n switch (prompt.Status) {\n case 'Active': return 'var(--mj-status-success)';\n case 'Pending': return 'var(--mj-status-warning)';\n case 'Disabled': return 'var(--mj-text-muted)';\n default: return 'var(--mj-text-muted)';\n }\n }\n\n getPromptStatusText(prompt: MJAIPromptEntityExtended): string {\n return prompt.Status || 'Unknown';\n }\n\n // === Dialog Actions ===\n\n selectPrompts() {\n const selectedPromptObjects = this.getSelectedPromptObjects();\n \n if (selectedPromptObjects.length === 0) {\n MJNotificationService.Instance.CreateSimpleNotification(\n 'Please select at least one prompt',\n 'warning',\n 2000\n );\n return;\n }\n\n const result: PromptSelectorResult = {\n selectedPrompts: selectedPromptObjects\n };\n\n this.result.next(result);\n this.DialogClose.emit();\n }\n\n createNew() {\n const result: PromptSelectorResult = {\n selectedPrompts: [],\n createNew: true\n };\n\n this.result.next(result);\n this.DialogClose.emit();\n }\n\n cancel() {\n this.result.next(null);\n this.DialogClose.emit();\n }\n}","<!-- Prompt Selector Dialog -->\n<div class=\"prompt-selector-dialog\">\n \n <!-- Loading State -->\n @if (isLoading$ | async) {\n <div class=\"loading-state\">\n <div class=\"loading-spinner\">\n <i class=\"fa-solid fa-spinner fa-spin fa-2x\"></i>\n </div>\n <p>Loading prompts...</p>\n </div>\n } @else {\n \n <!-- Search and Controls Header -->\n <div class=\"dialog-header\">\n <div class=\"search-section\">\n <div class=\"search-box\">\n <i class=\"fa-solid fa-search search-icon\"></i>\n <input\n class=\"mj-input search-input\"\n [formControl]=\"searchControl\"\n placeholder=\"Search prompts by name or description...\">\n </div>\n \n <div class=\"view-controls\">\n <button mjButton\n variant=\"flat\"\n [class.active]=\"viewMode === 'list'\"\n (click)=\"toggleViewMode()\"\n title=\"Toggle between list and grid view\">\n <i class=\"fa-solid\" [class.fa-list]=\"viewMode === 'grid'\" [class.fa-th]=\"viewMode === 'list'\"></i>\n </button>\n </div>\n </div>\n </div>\n\n <!-- Results Summary -->\n <div class=\"results-summary\">\n <span class=\"results-count\">\n <i class=\"fa-solid fa-comment-dots\"></i>\n {{ (filteredPrompts$ | async)?.length || 0 }} prompt(s)\n </span>\n @if (config.multiSelect && selectedPrompts.size > 0) {\n <span class=\"selected-count\">\n <i class=\"fa-solid fa-check-circle\"></i>\n {{ selectedPrompts.size }} selected\n </span>\n }\n </div>\n\n <!-- Prompts List/Grid -->\n <div class=\"prompts-container\" [class.grid-view]=\"viewMode === 'grid'\" [class.list-view]=\"viewMode === 'list'\">\n @if ((filteredPrompts$ | async)?.length === 0) {\n <div class=\"no-results\">\n <i class=\"fa-solid fa-search fa-2x\"></i>\n <h4>No prompts found</h4>\n <p>Try adjusting your search criteria or check that prompts are properly configured.</p>\n </div>\n } @else {\n @for (prompt of filteredPrompts$ | async; track prompt.ID) {\n <div class=\"prompt-card\" \n [class.selected]=\"isPromptSelected(prompt)\"\n [class.linked]=\"isPromptLinked(prompt)\"\n (click)=\"togglePromptSelection(prompt)\">\n \n <!-- Selection indicator -->\n <div class=\"selection-indicator\">\n @if (isPromptLinked(prompt)) {\n <i class=\"fa-solid fa-link linked-icon\" title=\"Already linked to this agent\"></i>\n } @else if (isPromptSelected(prompt)) {\n <i class=\"fa-solid fa-check-circle selected-icon\"></i>\n } @else {\n <i class=\"fa-regular fa-circle unselected-icon\"></i>\n }\n </div>\n\n <!-- Prompt Content -->\n <div class=\"prompt-content\">\n <div class=\"prompt-header\">\n <h4 class=\"prompt-name\">{{ prompt.Name }}</h4>\n <div class=\"prompt-badges\">\n @if (isPromptLinked(prompt)) {\n <span class=\"linked-badge\">\n <i class=\"fa-solid fa-link\"></i>\n Linked\n </span>\n }\n <span class=\"status-badge\" \n [style.background-color]=\"getPromptStatusColor(prompt)\">\n {{ getPromptStatusText(prompt) }}\n </span>\n </div>\n </div>\n\n @if (prompt.Description) {\n <p class=\"prompt-description\">{{ prompt.Description }}</p>\n }\n\n <!-- Prompt Metadata -->\n <div class=\"prompt-metadata\">\n @if (prompt.__mj_CreatedAt) {\n <span class=\"metadata-item\">\n <i class=\"fa-solid fa-calendar\"></i>\n Created {{ prompt.__mj_CreatedAt | date:'short' }}\n </span>\n }\n </div>\n </div>\n </div>\n }\n }\n </div>\n }\n\n <!-- Dialog Footer -->\n <div class=\"dialog-footer\">\n <div class=\"footer-left\">\n @if (config.showCreateNew) {\n <button mjButton\n variant=\"flat\"\n (click)=\"createNew()\">\n <i class=\"fa-solid fa-plus\"></i>\n Create New Prompt\n </button>\n }\n </div>\n \n <div class=\"footer-right\">\n <button mjButton\n variant=\"flat\"\n (click)=\"cancel()\">\n Cancel\n </button>\n\n <button mjButton\n variant=\"primary\"\n (click)=\"selectPrompts()\"\n [disabled]=\"selectedPrompts.size === 0\">\n @if (config.multiSelect) {\n <i class=\"fa-solid fa-check\"></i>\n Add {{ selectedPrompts.size }} Prompt{{ selectedPrompts.size === 1 ? '' : 's' }}\n } @else {\n <i class=\"fa-solid fa-check\"></i>\n Select Prompt\n }\n </button>\n </div>\n </div>\n</div>"]}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
import { OnInit, OnDestroy, ChangeDetectorRef } from '@angular/core';
|
|
1
|
+
import { OnInit, OnDestroy, ChangeDetectorRef, EventEmitter } from '@angular/core';
|
|
2
2
|
import { FormGroup, FormBuilder } from '@angular/forms';
|
|
3
|
-
import { WindowRef } from '@progress/kendo-angular-dialog';
|
|
4
3
|
import { Subject, BehaviorSubject } from 'rxjs';
|
|
5
4
|
import { MJAIAgentTypeEntity } from '@memberjunction/core-entities';
|
|
6
5
|
import { MJAIAgentEntityExtended } from '@memberjunction/ai-core-plus';
|
|
@@ -17,7 +16,6 @@ export interface SubAgentAdvancedSettingsFormData {
|
|
|
17
16
|
* Manages execution order, execution mode, and other advanced sub-agent configurations.
|
|
18
17
|
*/
|
|
19
18
|
export declare class SubAgentAdvancedSettingsDialogComponent implements OnInit, OnDestroy {
|
|
20
|
-
private dialogRef;
|
|
21
19
|
private fb;
|
|
22
20
|
private cdr;
|
|
23
21
|
subAgent: MJAIAgentEntityExtended;
|
|
@@ -39,7 +37,8 @@ export declare class SubAgentAdvancedSettingsDialogComponent implements OnInit,
|
|
|
39
37
|
value: string;
|
|
40
38
|
}[];
|
|
41
39
|
executionOrderError: string | null;
|
|
42
|
-
|
|
40
|
+
DialogClose: EventEmitter<void>;
|
|
41
|
+
constructor(fb: FormBuilder, cdr: ChangeDetectorRef);
|
|
43
42
|
ngOnInit(): void;
|
|
44
43
|
ngOnDestroy(): void;
|
|
45
44
|
private initializeForm;
|
|
@@ -54,6 +53,6 @@ export declare class SubAgentAdvancedSettingsDialogComponent implements OnInit,
|
|
|
54
53
|
cancel(): void;
|
|
55
54
|
save(): Promise<void>;
|
|
56
55
|
static ɵfac: i0.ɵɵFactoryDeclaration<SubAgentAdvancedSettingsDialogComponent, never>;
|
|
57
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<SubAgentAdvancedSettingsDialogComponent, "mj-sub-agent-advanced-settings-dialog", never, {}, {}, never, never, false, never>;
|
|
56
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<SubAgentAdvancedSettingsDialogComponent, "mj-sub-agent-advanced-settings-dialog", never, {}, { "DialogClose": "DialogClose"; }, never, never, false, never>;
|
|
58
57
|
}
|
|
59
58
|
//# sourceMappingURL=sub-agent-advanced-settings-dialog.component.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sub-agent-advanced-settings-dialog.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/custom/AIAgents/sub-agent-advanced-settings-dialog.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,MAAM,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"sub-agent-advanced-settings-dialog.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/custom/AIAgents/sub-agent-advanced-settings-dialog.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,MAAM,EAAE,SAAS,EAAE,iBAAiB,EAAU,YAAY,EAAE,MAAM,eAAe,CAAC;AACtG,OAAO,EAAE,SAAS,EAAE,WAAW,EAAc,MAAM,gBAAgB,CAAC;AACpE,OAAO,EAAE,OAAO,EAAE,eAAe,EAAa,MAAM,MAAM,CAAC;AAE3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AAEpE,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;;AAGvE,MAAM,WAAW,gCAAgC;IAC/C,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,YAAY,GAAG,UAAU,CAAC;IACzC,MAAM,EAAE,QAAQ,GAAG,UAAU,GAAG,SAAS,CAAC;IAC1C,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,cAAc,EAAE,OAAO,CAAC;CACzB;AAED;;;GAGG;AACH,qBAMa,uCAAwC,YAAW,MAAM,EAAE,SAAS;IA8C7E,OAAO,CAAC,EAAE;IACV,OAAO,CAAC,GAAG;IA5Cb,QAAQ,EAAG,uBAAuB,CAAC;IACnC,YAAY,EAAE,uBAAuB,EAAE,CAAM;IAG7C,OAAO,CAAC,QAAQ,CAAuB;IAChC,MAAM,mDAA0D;IAGvE,YAAY,EAAG,SAAS,CAAC;IACzB,UAAU,2BAAuC;IACjD,SAAS,2BAAuC;IAGhD,WAAW,yCAAkD;IAG7D,oBAAoB;;;;;QAalB;IAEF,aAAa;;;QAIX;IAGF,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAQ;IAEhC,WAAW,qBAA4B;gBAGvC,EAAE,EAAE,WAAW,EACf,GAAG,EAAE,iBAAiB;IAGhC,QAAQ;IAKR,WAAW;IAKX,OAAO,CAAC,cAAc;IAYtB,OAAO,CAAC,oBAAoB;IA0B5B,OAAO,CAAC,sBAAsB;YAsBhB,gBAAgB;IAiC9B,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAK1C,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;IASxC,sBAAsB,IAAI,OAAO;IAMjC,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAK1C,2BAA2B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAOjD,MAAM;IAKA,IAAI;yCA9LC,uCAAuC;2CAAvC,uCAAuC;CAkOnD"}
|