@memberjunction/ng-core-entity-forms 5.21.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 +9 -10
- 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 +8 -8
- package/dist/lib/custom/Tests/test-run-form.component.js.map +1 -1
- package/dist/lib/custom/Tests/test-suite-form.component.js +7 -8
- package/dist/lib/custom/Tests/test-suite-form.component.js.map +1 -1
- package/dist/lib/custom/Tests/test-suite-run-form.component.js +7 -8
- 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/MJEntityDocument/mjentitydocument.form.component.js +28 -24
- package/dist/lib/generated/Entities/MJEntityDocument/mjentitydocument.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/MJVectorDatabase/mjvectordatabase.form.component.js +19 -17
- package/dist/lib/generated/Entities/MJVectorDatabase/mjvectordatabase.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 +82 -14
- 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,12 +1,12 @@
|
|
|
1
1
|
import { ViewContainerRef } from '@angular/core';
|
|
2
|
-
import {
|
|
2
|
+
import { MJDialogService } from '@memberjunction/ng-ui-components';
|
|
3
3
|
import { Observable } from 'rxjs';
|
|
4
4
|
import { MJTemplateEntity } from '@memberjunction/core-entities';
|
|
5
5
|
import { TemplateSelectorConfig, TemplateSelectorResult } from './template-selector-dialog.component';
|
|
6
6
|
import * as i0 from "@angular/core";
|
|
7
7
|
export declare class AIPromptManagementService {
|
|
8
8
|
private dialogService;
|
|
9
|
-
constructor(dialogService:
|
|
9
|
+
constructor(dialogService: MJDialogService);
|
|
10
10
|
/**
|
|
11
11
|
* Opens the template selector dialog for linking existing templates to AI prompts
|
|
12
12
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai-prompt-management.service.d.ts","sourceRoot":"","sources":["../../../../src/lib/custom/AIPrompts/ai-prompt-management.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAC7D,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"ai-prompt-management.service.d.ts","sourceRoot":"","sources":["../../../../src/lib/custom/AIPrompts/ai-prompt-management.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAe,MAAM,kCAAkC,CAAC;AAChF,OAAO,EAAE,UAAU,EAAW,MAAM,MAAM,CAAC;AAC3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAEL,sBAAsB,EACtB,sBAAsB,EACvB,MAAM,sCAAsC,CAAC;;AAE9C,qBAGa,yBAAyB;IAExB,OAAO,CAAC,aAAa;gBAAb,aAAa,EAAE,eAAe;IAElD;;OAEG;IACH,0BAA0B,CAAC,MAAM,EAAE,sBAAsB,GAAG;QAAE,gBAAgB,CAAC,EAAE,gBAAgB,CAAA;KAAE,GAAG,UAAU,CAAC,sBAAsB,GAAG,IAAI,CAAC;IAqD/I;;OAEG;IACH,wBAAwB,CAAC,MAAM,EAAE;QAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;KACrC,GAAG,UAAU,CAAC,gBAAgB,GAAG,IAAI,CAAC;yCAnE5B,yBAAyB;6CAAzB,yBAAyB;CAgFrC"}
|
|
@@ -2,7 +2,7 @@ import { Injectable } from '@angular/core';
|
|
|
2
2
|
import { Subject } from 'rxjs';
|
|
3
3
|
import { TemplateSelectorDialogComponent } from './template-selector-dialog.component';
|
|
4
4
|
import * as i0 from "@angular/core";
|
|
5
|
-
import * as i1 from "@
|
|
5
|
+
import * as i1 from "@memberjunction/ng-ui-components";
|
|
6
6
|
export class AIPromptManagementService {
|
|
7
7
|
constructor(dialogService) {
|
|
8
8
|
this.dialogService = dialogService;
|
|
@@ -16,15 +16,10 @@ export class AIPromptManagementService {
|
|
|
16
16
|
content: TemplateSelectorDialogComponent,
|
|
17
17
|
width: 800,
|
|
18
18
|
height: 600,
|
|
19
|
-
minWidth: 600
|
|
20
|
-
minHeight: 400,
|
|
21
|
-
preventAction: (action) => {
|
|
22
|
-
// Prevent closing on backdrop click
|
|
23
|
-
return action === 'close';
|
|
24
|
-
}
|
|
19
|
+
minWidth: 600
|
|
25
20
|
});
|
|
26
21
|
// Configure the dialog component
|
|
27
|
-
const dialogComponent = dialogRef.
|
|
22
|
+
const dialogComponent = dialogRef.Content.instance;
|
|
28
23
|
dialogComponent.config = {
|
|
29
24
|
title: config.title,
|
|
30
25
|
showCreateNew: config.showCreateNew ?? true,
|
|
@@ -46,7 +41,7 @@ export class AIPromptManagementService {
|
|
|
46
41
|
}
|
|
47
42
|
});
|
|
48
43
|
// Handle dialog close
|
|
49
|
-
dialogRef.
|
|
44
|
+
dialogRef.Result.subscribe({
|
|
50
45
|
next: () => {
|
|
51
46
|
// Dialog was closed, emit null if no result was already emitted
|
|
52
47
|
if (!resultSubject.closed) {
|
|
@@ -76,7 +71,7 @@ export class AIPromptManagementService {
|
|
|
76
71
|
}, 100);
|
|
77
72
|
return resultSubject.asObservable();
|
|
78
73
|
}
|
|
79
|
-
static { this.ɵfac = function AIPromptManagementService_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || AIPromptManagementService)(i0.ɵɵinject(i1.
|
|
74
|
+
static { this.ɵfac = function AIPromptManagementService_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || AIPromptManagementService)(i0.ɵɵinject(i1.MJDialogService)); }; }
|
|
80
75
|
static { this.ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: AIPromptManagementService, factory: AIPromptManagementService.ɵfac, providedIn: 'root' }); }
|
|
81
76
|
}
|
|
82
77
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(AIPromptManagementService, [{
|
|
@@ -84,5 +79,5 @@ export class AIPromptManagementService {
|
|
|
84
79
|
args: [{
|
|
85
80
|
providedIn: 'root'
|
|
86
81
|
}]
|
|
87
|
-
}], () => [{ type: i1.
|
|
82
|
+
}], () => [{ type: i1.MJDialogService }], null); })();
|
|
88
83
|
//# sourceMappingURL=ai-prompt-management.service.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai-prompt-management.service.js","sourceRoot":"","sources":["../../../../src/lib/custom/AIPrompts/ai-prompt-management.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAoB,MAAM,eAAe,CAAC;AAE7D,OAAO,EAAc,OAAO,EAAE,MAAM,MAAM,CAAC;AAE3C,OAAO,EACL,+BAA+B,EAGhC,MAAM,sCAAsC,CAAC;;;AAK9C,MAAM,OAAO,yBAAyB;IAEpC,YAAoB,
|
|
1
|
+
{"version":3,"file":"ai-prompt-management.service.js","sourceRoot":"","sources":["../../../../src/lib/custom/AIPrompts/ai-prompt-management.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAoB,MAAM,eAAe,CAAC;AAE7D,OAAO,EAAc,OAAO,EAAE,MAAM,MAAM,CAAC;AAE3C,OAAO,EACL,+BAA+B,EAGhC,MAAM,sCAAsC,CAAC;;;AAK9C,MAAM,OAAO,yBAAyB;IAEpC,YAAoB,aAA8B;QAA9B,kBAAa,GAAb,aAAa,CAAiB;IAAG,CAAC;IAEtD;;OAEG;IACH,0BAA0B,CAAC,MAAwE;QACjG,MAAM,SAAS,GAAgB,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;YACrD,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,OAAO,EAAE,+BAA+B;YACxC,KAAK,EAAE,GAAG;YACV,MAAM,EAAE,GAAG;YACX,QAAQ,EAAE,GAAG;SACd,CAAC,CAAC;QAEH,iCAAiC;QACjC,MAAM,eAAe,GAAG,SAAS,CAAC,OAAQ,CAAC,QAAsD,CAAC;QAClG,eAAe,CAAC,MAAM,GAAG;YACvB,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,aAAa,EAAE,MAAM,CAAC,aAAa,IAAI,IAAI;YAC3C,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,WAAW,EAAE,MAAM,CAAC,WAAW,IAAI,KAAK;YACxC,mBAAmB,EAAE,MAAM,CAAC,mBAAmB;YAC/C,cAAc,EAAE,MAAM,CAAC,cAAc,IAAI,IAAI;SAC9C,CAAC;QAEF,wCAAwC;QACxC,MAAM,aAAa,GAAG,IAAI,OAAO,EAAiC,CAAC;QAEnE,6CAA6C;QAC7C,eAAe,CAAC,MAAM,CAAC,SAAS,CAAC;YAC/B,IAAI,EAAE,CAAC,MAAM,EAAE,EAAE;gBACf,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBAC3B,aAAa,CAAC,QAAQ,EAAE,CAAC;YAC3B,CAAC;YACD,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE;gBACf,aAAa,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAC7B,CAAC;SACF,CAAC,CAAC;QAEH,sBAAsB;QACtB,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC;YACzB,IAAI,EAAE,GAAG,EAAE;gBACT,gEAAgE;gBAChE,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC;oBAC1B,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBACzB,aAAa,CAAC,QAAQ,EAAE,CAAC;gBAC3B,CAAC;YACH,CAAC;YACD,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE;gBACf,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC;oBAC1B,aAAa,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBAC7B,CAAC;YACH,CAAC;SACF,CAAC,CAAC;QAEH,OAAO,aAAa,CAAC,YAAY,EAAE,CAAC;IACtC,CAAC;IAED;;OAEG;IACH,wBAAwB,CAAC,MAIxB;QACC,kEAAkE;QAClE,6CAA6C;QAC7C,MAAM,aAAa,GAAG,IAAI,OAAO,EAA2B,CAAC;QAE7D,2BAA2B;QAC3B,UAAU,CAAC,GAAG,EAAE;YACd,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACzB,aAAa,CAAC,QAAQ,EAAE,CAAC;QAC3B,CAAC,EAAE,GAAG,CAAC,CAAC;QAER,OAAO,aAAa,CAAC,YAAY,EAAE,CAAC;IACtC,CAAC;0HA/EU,yBAAyB;uEAAzB,yBAAyB,WAAzB,yBAAyB,mBAFxB,MAAM;;iFAEP,yBAAyB;cAHrC,UAAU;eAAC;gBACV,UAAU,EAAE,MAAM;aACnB","sourcesContent":["import { Injectable, ViewContainerRef } from '@angular/core';\nimport { MJDialogService, MJDialogRef } from '@memberjunction/ng-ui-components';\nimport { Observable, Subject } from 'rxjs';\nimport { MJTemplateEntity } from '@memberjunction/core-entities';\nimport {\n TemplateSelectorDialogComponent,\n TemplateSelectorConfig,\n TemplateSelectorResult\n} from './template-selector-dialog.component';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class AIPromptManagementService {\n\n constructor(private dialogService: MJDialogService) {}\n\n /**\n * Opens the template selector dialog for linking existing templates to AI prompts\n */\n openTemplateSelectorDialog(config: TemplateSelectorConfig & { viewContainerRef?: ViewContainerRef }): Observable<TemplateSelectorResult | null> {\n const dialogRef: MJDialogRef = this.dialogService.open({\n title: config.title,\n content: TemplateSelectorDialogComponent,\n width: 800,\n height: 600,\n minWidth: 600\n });\n\n // Configure the dialog component\n const dialogComponent = dialogRef.Content!.instance as unknown as TemplateSelectorDialogComponent;\n dialogComponent.config = {\n title: config.title,\n showCreateNew: config.showCreateNew ?? true,\n extraFilter: config.extraFilter,\n multiSelect: config.multiSelect ?? false,\n selectedTemplateIds: config.selectedTemplateIds,\n showActiveOnly: config.showActiveOnly ?? true\n };\n\n // Create a subject to handle the result\n const resultSubject = new Subject<TemplateSelectorResult | null>();\n\n // Subscribe to the dialog component's result\n dialogComponent.result.subscribe({\n next: (result) => {\n resultSubject.next(result);\n resultSubject.complete();\n },\n error: (error) => {\n resultSubject.error(error);\n }\n });\n\n // Handle dialog close\n dialogRef.Result.subscribe({\n next: () => {\n // Dialog was closed, emit null if no result was already emitted\n if (!resultSubject.closed) {\n resultSubject.next(null);\n resultSubject.complete();\n }\n },\n error: (error) => {\n if (!resultSubject.closed) {\n resultSubject.error(error);\n }\n }\n });\n\n return resultSubject.asObservable();\n }\n\n /**\n * Opens a template creation dialog and returns the created template\n */\n openCreateTemplateDialog(config: {\n promptId?: string;\n promptName?: string;\n viewContainerRef?: ViewContainerRef;\n }): Observable<MJTemplateEntity | null> {\n // For now, we'll return a placeholder - in a full implementation,\n // this would open a template creation dialog\n const resultSubject = new Subject<MJTemplateEntity | null>();\n \n // Simulate async operation\n setTimeout(() => {\n resultSubject.next(null);\n resultSubject.complete();\n }, 100);\n\n return resultSubject.asObservable();\n }\n}"]}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import { OnInit, OnDestroy, ChangeDetectorRef } from '@angular/core';
|
|
2
|
-
import { DialogRef } 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 { MJTemplateEntity, MJTemplateCategoryEntity } from '@memberjunction/core-entities';
|
|
@@ -29,7 +28,6 @@ export interface TemplateSelectorResult {
|
|
|
29
28
|
* This dialog provides a searchable interface with category filtering and template preview.
|
|
30
29
|
*/
|
|
31
30
|
export declare class TemplateSelectorDialogComponent implements OnInit, OnDestroy {
|
|
32
|
-
private dialogRef;
|
|
33
31
|
private cdr;
|
|
34
32
|
config: TemplateSelectorConfig;
|
|
35
33
|
private destroy$;
|
|
@@ -42,7 +40,8 @@ export declare class TemplateSelectorDialogComponent implements OnInit, OnDestro
|
|
|
42
40
|
selectedCategory: string | null;
|
|
43
41
|
selectedTemplates: Set<string>;
|
|
44
42
|
viewMode: 'grid' | 'list';
|
|
45
|
-
|
|
43
|
+
DialogClose: EventEmitter<void>;
|
|
44
|
+
constructor(cdr: ChangeDetectorRef);
|
|
46
45
|
ngOnInit(): void;
|
|
47
46
|
ngOnDestroy(): void;
|
|
48
47
|
private setupSearch;
|
|
@@ -64,6 +63,6 @@ export declare class TemplateSelectorDialogComponent implements OnInit, OnDestro
|
|
|
64
63
|
createNew(): void;
|
|
65
64
|
cancel(): void;
|
|
66
65
|
static ɵfac: i0.ɵɵFactoryDeclaration<TemplateSelectorDialogComponent, never>;
|
|
67
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<TemplateSelectorDialogComponent, "mj-template-selector-dialog", never, {}, {}, never, never, true, never>;
|
|
66
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<TemplateSelectorDialogComponent, "mj-template-selector-dialog", never, {}, { "DialogClose": "DialogClose"; }, never, never, true, never>;
|
|
68
67
|
}
|
|
69
68
|
//# sourceMappingURL=template-selector-dialog.component.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"template-selector-dialog.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/custom/AIPrompts/template-selector-dialog.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,MAAM,EAAE,SAAS,EAAE,iBAAiB,
|
|
1
|
+
{"version":3,"file":"template-selector-dialog.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/custom/AIPrompts/template-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,EAAuB,MAAM,gBAAgB,CAAC;AAGlE,OAAO,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;;AAI3F,MAAM,WAAW,sBAAsB;IACrC,2BAA2B;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,8CAA8C;IAC9C,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,oCAAoC;IACpC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,+BAA+B;IAC/B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,gCAAgC;IAChC,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC/B,iCAAiC;IACjC,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,sBAAsB;IACrC,yBAAyB;IACzB,iBAAiB,EAAE,gBAAgB,EAAE,CAAC;IACtC,uCAAuC;IACvC,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED;;;GAGG;AACH,qBAOa,+BAAgC,YAAW,MAAM,EAAE,SAAS;IA0BrE,OAAO,CAAC,GAAG;IAvBb,MAAM,EAAE,sBAAsB,CAAgC;IAG9D,OAAO,CAAC,QAAQ,CAAuB;IAChC,MAAM,yCAAgD;IAG7D,UAAU,2BAAuC;IACjD,UAAU,sCAA+C;IACzD,kBAAkB,sCAA+C;IACjE,WAAW,8CAAuD;IAGlE,aAAa,6BAAuB;IACpC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAQ;IACvC,iBAAiB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAa;IAG3C,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAU;IAEzB,WAAW,qBAA4B;gBAGvC,GAAG,EAAE,iBAAiB;IAGhC,QAAQ;IAUR,WAAW;IAKX,OAAO,CAAC,WAAW;YAYL,QAAQ;YAqBR,aAAa;YAmCb,cAAc;IAwB5B,OAAO,CAAC,eAAe;IAwBvB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAK1C,sBAAsB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM;IAOlD,uBAAuB,CAAC,QAAQ,EAAE,gBAAgB;IAclD,kBAAkB,CAAC,QAAQ,EAAE,gBAAgB,GAAG,OAAO;IAIvD,0BAA0B,IAAI,gBAAgB,EAAE;IAOhD,cAAc;IAId,sBAAsB,CAAC,QAAQ,EAAE,gBAAgB,GAAG,MAAM;IAO1D,qBAAqB,CAAC,QAAQ,EAAE,gBAAgB,GAAG,MAAM;IAOzD,kBAAkB,CAAC,QAAQ,EAAE,gBAAgB,GAAG,MAAM;IAOtD,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,GAAG,IAAI,GAAG,MAAM;IAQ9C,eAAe;IAoBf,SAAS;IAUT,MAAM;yCApQK,+BAA+B;2CAA/B,+BAA+B;CAwQ3C"}
|
|
@@ -1,4 +1,4 @@
|
|
|
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, ReactiveFormsModule } from '@angular/forms';
|
|
4
4
|
import { CommonModule } from '@angular/common';
|
|
@@ -6,9 +6,8 @@ import { RunView } from '@memberjunction/core';
|
|
|
6
6
|
import { MJNotificationService } from '@memberjunction/ng-notifications';
|
|
7
7
|
import { UUIDsEqual } from '@memberjunction/global';
|
|
8
8
|
import * as i0 from "@angular/core";
|
|
9
|
-
import * as i1 from "@
|
|
10
|
-
import * as i2 from "@angular/
|
|
11
|
-
import * as i3 from "@angular/common";
|
|
9
|
+
import * as i1 from "@angular/forms";
|
|
10
|
+
import * as i2 from "@angular/common";
|
|
12
11
|
const _forTrack0 = ($index, $item) => $item.ID;
|
|
13
12
|
function TemplateSelectorDialogComponent_For_17_Template(rf, ctx) { if (rf & 1) {
|
|
14
13
|
i0.ɵɵelementStart(0, "option", 11);
|
|
@@ -157,8 +156,7 @@ function TemplateSelectorDialogComponent_Conditional_25_Template(rf, ctx) { if (
|
|
|
157
156
|
* This dialog provides a searchable interface with category filtering and template preview.
|
|
158
157
|
*/
|
|
159
158
|
export class TemplateSelectorDialogComponent {
|
|
160
|
-
constructor(
|
|
161
|
-
this.dialogRef = dialogRef;
|
|
159
|
+
constructor(cdr) {
|
|
162
160
|
this.cdr = cdr;
|
|
163
161
|
// Input configuration
|
|
164
162
|
this.config = { title: 'Select Template' };
|
|
@@ -176,6 +174,7 @@ export class TemplateSelectorDialogComponent {
|
|
|
176
174
|
this.selectedTemplates = new Set();
|
|
177
175
|
// View mode
|
|
178
176
|
this.viewMode = 'list';
|
|
177
|
+
this.DialogClose = new EventEmitter();
|
|
179
178
|
}
|
|
180
179
|
ngOnInit() {
|
|
181
180
|
this.setupSearch();
|
|
@@ -361,7 +360,7 @@ export class TemplateSelectorDialogComponent {
|
|
|
361
360
|
selectedTemplates: selectedTemplateObjects
|
|
362
361
|
};
|
|
363
362
|
this.result.next(result);
|
|
364
|
-
this.
|
|
363
|
+
this.DialogClose.emit();
|
|
365
364
|
}
|
|
366
365
|
createNew() {
|
|
367
366
|
const result = {
|
|
@@ -369,14 +368,14 @@ export class TemplateSelectorDialogComponent {
|
|
|
369
368
|
createNew: true
|
|
370
369
|
};
|
|
371
370
|
this.result.next(result);
|
|
372
|
-
this.
|
|
371
|
+
this.DialogClose.emit();
|
|
373
372
|
}
|
|
374
373
|
cancel() {
|
|
375
374
|
this.result.next(null);
|
|
376
|
-
this.
|
|
375
|
+
this.DialogClose.emit();
|
|
377
376
|
}
|
|
378
|
-
static { this.ɵfac = function TemplateSelectorDialogComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || TemplateSelectorDialogComponent)(i0.ɵɵdirectiveInject(
|
|
379
|
-
static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: TemplateSelectorDialogComponent, selectors: [["mj-template-selector-dialog"]], decls: 31, vars: 17, consts: [[1, "template-selector-dialog"], [1, "dialog-header"], [1, "header-actions"], ["
|
|
377
|
+
static { this.ɵfac = function TemplateSelectorDialogComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || TemplateSelectorDialogComponent)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); }; }
|
|
378
|
+
static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: TemplateSelectorDialogComponent, selectors: [["mj-template-selector-dialog"]], outputs: { DialogClose: "DialogClose" }, decls: 31, vars: 17, consts: [[1, "template-selector-dialog"], [1, "dialog-header"], [1, "header-actions"], ["mjButton", "", "size", "sm", 3, "click"], [1, "search-filter-section"], [1, "search-container"], ["type", "text", "placeholder", "Search templates...", 1, "mj-input", 3, "formControl"], [1, "fa-solid", "fa-search", "search-icon"], [1, "category-filter"], [1, "mj-input", 3, "change", "value"], ["value", ""], [3, "value"], [1, "loading-container"], [1, "templates-container", 3, "grid-mode"], [1, "dialog-actions"], [1, "action-buttons"], ["mjButton", "", "variant", "outline"], ["mjButton", "", 3, "click"], ["mjButton", "", "variant", "primary", 3, "click", "disabled"], [1, "fa-solid", "fa-check"], [1, "fa-solid", "fa-spinner", "fa-spin"], [1, "templates-container"], [1, "template-item", 3, "selected"], [1, "no-templates"], [1, "template-item", 3, "click"], [1, "selection-indicator"], ["type", "checkbox", 3, "checked"], ["type", "radio", 3, "checked"], [1, "template-info"], [1, "template-header"], [1, "template-name"], [1, "template-status"], [1, "status-badge"], [1, "template-description"], [1, "template-metadata"], [1, "metadata-item"], [1, "fa-solid", "fa-user"], ["type", "checkbox", 3, "change", "checked"], ["type", "radio", 3, "change", "checked"], [1, "fa-solid", "fa-folder"], [1, "fa-solid", "fa-calendar"], [1, "fa-solid", "fa-file-alt", "fa-3x"], ["mjButton", "", "variant", "outline", 3, "click"], [1, "fa-solid", "fa-plus"]], template: function TemplateSelectorDialogComponent_Template(rf, ctx) { if (rf & 1) {
|
|
380
379
|
i0.ɵɵelementStart(0, "div", 0)(1, "div", 1)(2, "h3");
|
|
381
380
|
i0.ɵɵtext(3);
|
|
382
381
|
i0.ɵɵelementEnd();
|
|
@@ -434,11 +433,13 @@ export class TemplateSelectorDialogComponent {
|
|
|
434
433
|
i0.ɵɵproperty("disabled", ctx.selectedTemplates.size === 0);
|
|
435
434
|
i0.ɵɵadvance(2);
|
|
436
435
|
i0.ɵɵtextInterpolate1(" Select ", ctx.selectedTemplates.size > 0 ? "(" + ctx.selectedTemplates.size + ")" : "", " ");
|
|
437
|
-
} }, dependencies: [CommonModule, ReactiveFormsModule,
|
|
436
|
+
} }, dependencies: [CommonModule, ReactiveFormsModule, i1.NgSelectOption, i1.ɵNgSelectMultipleOption, i1.DefaultValueAccessor, i1.NgControlStatus, i1.FormControlDirective, i2.AsyncPipe], styles: ["\n\n.template-selector-dialog[_ngcontent-%COMP%] {\n padding: 20px;\n width: 100%;\n max-width: 800px;\n height: 600px;\n display: flex;\n flex-direction: column;\n}\n\n\n\n.dialog-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 20px;\n padding-bottom: 15px;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.dialog-header[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 1.5rem;\n color: var(--mj-text-primary);\n}\n\n.header-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 10px;\n}\n\n\n\n.search-filter-section[_ngcontent-%COMP%] {\n display: flex;\n gap: 15px;\n margin-bottom: 20px;\n}\n\n.search-container[_ngcontent-%COMP%] {\n flex: 1;\n position: relative;\n}\n\n.search-icon[_ngcontent-%COMP%] {\n position: absolute;\n left: 10px;\n top: 50%;\n transform: translateY(-50%);\n color: var(--mj-text-muted);\n pointer-events: none;\n}\n\n.search-container[_ngcontent-%COMP%] input[_ngcontent-%COMP%] {\n padding-left: 35px;\n width: 100%;\n}\n\n.category-filter[_ngcontent-%COMP%] {\n min-width: 200px;\n}\n\n.category-filter[_ngcontent-%COMP%] select[_ngcontent-%COMP%] {\n width: 100%;\n}\n\n\n\n.loading-container[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 10px;\n padding: 60px;\n font-size: 1.1rem;\n color: var(--mj-text-secondary);\n}\n\n.loading-container[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 1.5rem;\n color: var(--mj-brand-primary);\n}\n\n\n\n.templates-container[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n border: 1px solid var(--mj-border-default);\n border-radius: 4px;\n background: var(--mj-bg-surface);\n padding: 10px;\n}\n\n.templates-container.grid-mode[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));\n gap: 15px;\n}\n\n\n\n.template-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n padding: 15px;\n border: 2px solid transparent;\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.2s ease;\n background: var(--mj-bg-surface-card);\n margin-bottom: 8px;\n}\n\n.template-item[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n}\n\n.template-item.selected[_ngcontent-%COMP%] {\n border-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n}\n\n.grid-mode[_ngcontent-%COMP%] .template-item[_ngcontent-%COMP%] {\n flex-direction: column;\n margin-bottom: 0;\n}\n\n.grid-mode[_ngcontent-%COMP%] .template-item[_ngcontent-%COMP%] .selection-indicator[_ngcontent-%COMP%] {\n align-self: flex-end;\n}\n\n\n\n.selection-indicator[_ngcontent-%COMP%] {\n flex-shrink: 0;\n margin-top: 2px;\n}\n\n.selection-indicator[_ngcontent-%COMP%] input[type=\"checkbox\"][_ngcontent-%COMP%], \n.selection-indicator[_ngcontent-%COMP%] input[type=\"radio\"][_ngcontent-%COMP%] {\n width: 16px;\n height: 16px;\n cursor: pointer;\n}\n\n\n\n.template-info[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n}\n\n.template-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n margin-bottom: 8px;\n}\n\n.template-name[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 1.1rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n word-break: break-word;\n}\n\n.template-status[_ngcontent-%COMP%] {\n flex-shrink: 0;\n margin-left: 10px;\n}\n\n.status-badge[_ngcontent-%COMP%] {\n display: inline-block;\n padding: 2px 8px;\n border-radius: 12px;\n font-size: 0.75rem;\n font-weight: 500;\n color: var(--mj-text-inverse);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n\n\n.template-description[_ngcontent-%COMP%] {\n margin-bottom: 12px;\n color: var(--mj-text-secondary);\n font-size: 0.9rem;\n line-height: 1.4;\n}\n\n\n\n.template-metadata[_ngcontent-%COMP%] {\n display: flex;\n flex-wrap: wrap;\n gap: 15px;\n font-size: 0.85rem;\n color: var(--mj-text-muted);\n}\n\n.metadata-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 5px;\n}\n\n.metadata-item[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 0.8rem;\n color: var(--mj-text-muted);\n}\n\n\n\n.no-templates[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 60px 20px;\n text-align: center;\n color: var(--mj-text-secondary);\n}\n\n.no-templates[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n margin-bottom: 20px;\n color: var(--mj-text-muted);\n}\n\n.no-templates[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] {\n margin: 0 0 10px 0;\n font-size: 1.2rem;\n}\n\n.no-templates[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 0.9rem;\n color: var(--mj-text-muted);\n}\n\n\n\n.dialog-actions[_ngcontent-%COMP%] {\n margin-top: 20px;\n padding-top: 20px;\n border-top: 1px solid var(--mj-border-default);\n}\n\n.action-buttons[_ngcontent-%COMP%] {\n display: flex;\n justify-content: flex-end;\n gap: 10px;\n}\n\n.action-buttons[_ngcontent-%COMP%] button[_ngcontent-%COMP%] {\n min-width: 100px;\n}\n\n.action-buttons[_ngcontent-%COMP%] button[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n margin-right: 5px;\n}\n\n\n\n@media (max-width: 768px) {\n .template-selector-dialog[_ngcontent-%COMP%] {\n padding: 15px;\n height: 500px;\n }\n\n .search-filter-section[_ngcontent-%COMP%] {\n flex-direction: column;\n gap: 10px;\n }\n\n .category-filter[_ngcontent-%COMP%] {\n min-width: auto;\n }\n\n .templates-container.grid-mode[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n }\n\n .template-header[_ngcontent-%COMP%] {\n flex-direction: column;\n align-items: flex-start;\n }\n\n .template-status[_ngcontent-%COMP%] {\n margin-left: 0;\n margin-top: 5px;\n }\n\n .template-metadata[_ngcontent-%COMP%] {\n flex-direction: column;\n gap: 8px;\n }\n\n .action-buttons[_ngcontent-%COMP%] {\n flex-direction: column;\n }\n\n .action-buttons[_ngcontent-%COMP%] button[_ngcontent-%COMP%] {\n min-width: auto;\n }\n}\n\n\n\n.templates-container[_ngcontent-%COMP%]::-webkit-scrollbar {\n width: 8px;\n}\n\n.templates-container[_ngcontent-%COMP%]::-webkit-scrollbar-track {\n background: var(--mj-bg-surface-card);\n border-radius: 4px;\n}\n\n.templates-container[_ngcontent-%COMP%]::-webkit-scrollbar-thumb {\n background: var(--mj-border-strong);\n border-radius: 4px;\n}\n\n.templates-container[_ngcontent-%COMP%]::-webkit-scrollbar-thumb:hover {\n background: var(--mj-text-muted);\n}"] }); }
|
|
438
437
|
}
|
|
439
438
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(TemplateSelectorDialogComponent, [{
|
|
440
439
|
type: Component,
|
|
441
|
-
args: [{ selector: 'mj-template-selector-dialog', standalone: true, imports: [CommonModule, ReactiveFormsModule], template: "<!-- Template Selector Dialog -->\n<div class=\"template-selector-dialog\">\n <!-- Header -->\n <div class=\"dialog-header\">\n <h3>{{ config.title }}</h3>\n <div class=\"header-actions\">\n <button\n kendoButton\n size=\"small\"\n (click)=\"toggleViewMode()\"\n >\n <i [class]=\"viewMode === 'list' ? 'fa-solid fa-th' : 'fa-solid fa-list'\"></i>\n {{ viewMode === 'list' ? 'Grid' : 'List' }}\n </button>\n </div>\n </div>\n\n <!-- Search and Filter Section -->\n <div class=\"search-filter-section\">\n <!-- Search Input -->\n <div class=\"search-container\">\n <input\n class=\"k-input k-textbox\"\n [formControl]=\"searchControl\"\n placeholder=\"Search templates...\"\n />\n <i class=\"fa-solid fa-search search-icon\"></i>\n </div>\n\n <!-- Category Filter -->\n <div class=\"category-filter\">\n <select\n class=\"k-input k-dropdown\"\n [value]=\"selectedCategory || ''\"\n (change)=\"onCategoryChange($any($event.target).value || null)\"\n >\n <option value=\"\">All Categories</option>\n @for (category of categories$ | async; track category.ID) {\n <option [value]=\"category.ID\">{{ category.Name }}</option>\n }\n </select>\n </div>\n </div>\n\n <!-- Loading State -->\n @if (isLoading$ | async) {\n <div class=\"loading-container\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n <span>Loading templates...</span>\n </div>\n }\n\n <!-- Template List/Grid -->\n @if (!(isLoading$ | async)) {\n <div class=\"templates-container\" [class.grid-mode]=\"viewMode === 'grid'\">\n @for (template of filteredTemplates$ | async; track template.ID) {\n <div \n class=\"template-item\"\n [class.selected]=\"isTemplateSelected(template)\"\n (click)=\"toggleTemplateSelection(template)\"\n >\n <!-- Selection Checkbox -->\n <div class=\"selection-indicator\">\n @if (config.multiSelect) {\n <input\n type=\"checkbox\"\n [checked]=\"isTemplateSelected(template)\"\n (change)=\"toggleTemplateSelection(template)\"\n />\n } @else {\n <input\n type=\"radio\"\n [checked]=\"isTemplateSelected(template)\"\n (change)=\"toggleTemplateSelection(template)\"\n />\n }\n </div>\n\n <!-- Template Info -->\n <div class=\"template-info\">\n <div class=\"template-header\">\n <h4 class=\"template-name\">{{ template.Name }}</h4>\n <div class=\"template-status\">\n <span \n class=\"status-badge\"\n [style.background-color]=\"getTemplateStatusColor(template)\"\n >\n {{ getTemplateStatusText(template) }}\n </span>\n </div>\n </div>\n\n <!-- Template Description -->\n @if (template.Description) {\n <div class=\"template-description\">\n {{ getTemplatePreview(template) }}\n </div>\n }\n\n <!-- Template Metadata -->\n <div class=\"template-metadata\">\n <div class=\"metadata-item\">\n <i class=\"fa-solid fa-user\"></i>\n <span>{{ template.User || 'Unknown User' }}</span>\n </div>\n \n @if (template.Category) {\n <div class=\"metadata-item\">\n <i class=\"fa-solid fa-folder\"></i>\n <span>{{ template.Category }}</span>\n </div>\n }\n \n @if (template.__mj_CreatedAt) {\n <div class=\"metadata-item\">\n <i class=\"fa-solid fa-calendar\"></i>\n <span>{{ formatDate(template.__mj_CreatedAt) }}</span>\n </div>\n }\n </div>\n </div>\n </div>\n } @empty {\n <div class=\"no-templates\">\n <i class=\"fa-solid fa-file-alt fa-3x\"></i>\n <h4>No templates found</h4>\n <p>No templates match your current search criteria.</p>\n </div>\n }\n </div>\n }\n\n <!-- Dialog Actions -->\n <div class=\"dialog-actions\">\n <div class=\"action-buttons\">\n @if (config.showCreateNew) {\n <button\n kendoButton\n themeColor=\"secondary\"\n (click)=\"createNew()\"\n >\n <i class=\"fa-solid fa-plus\"></i>\n Create New\n </button>\n }\n \n <button\n kendoButton\n (click)=\"cancel()\"\n >\n Cancel\n </button>\n \n <button\n kendoButton\n themeColor=\"primary\"\n (click)=\"selectTemplates()\"\n [disabled]=\"selectedTemplates.size === 0\"\n >\n <i class=\"fa-solid fa-check\"></i>\n Select {{ selectedTemplates.size > 0 ? '(' + selectedTemplates.size + ')' : '' }}\n </button>\n </div>\n </div>\n</div>", styles: ["/* Template Selector Dialog Styles */\n.template-selector-dialog {\n padding: 20px;\n width: 100%;\n max-width: 800px;\n height: 600px;\n display: flex;\n flex-direction: column;\n}\n\n/* Header */\n.dialog-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 20px;\n padding-bottom: 15px;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.dialog-header h3 {\n margin: 0;\n font-size: 1.5rem;\n color: var(--mj-text-primary);\n}\n\n.header-actions {\n display: flex;\n gap: 10px;\n}\n\n/* Search and Filter Section */\n.search-filter-section {\n display: flex;\n gap: 15px;\n margin-bottom: 20px;\n}\n\n.search-container {\n flex: 1;\n position: relative;\n}\n\n.search-icon {\n position: absolute;\n left: 10px;\n top: 50%;\n transform: translateY(-50%);\n color: var(--mj-text-muted);\n pointer-events: none;\n}\n\n.search-container input {\n padding-left: 35px;\n width: 100%;\n}\n\n.category-filter {\n min-width: 200px;\n}\n\n.category-filter select {\n width: 100%;\n}\n\n/* Loading State */\n.loading-container {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 10px;\n padding: 60px;\n font-size: 1.1rem;\n color: var(--mj-text-secondary);\n}\n\n.loading-container i {\n font-size: 1.5rem;\n color: var(--mj-brand-primary);\n}\n\n/* Templates Container */\n.templates-container {\n flex: 1;\n overflow-y: auto;\n border: 1px solid var(--mj-border-default);\n border-radius: 4px;\n background: var(--mj-bg-surface);\n padding: 10px;\n}\n\n.templates-container.grid-mode {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));\n gap: 15px;\n}\n\n/* Template Item */\n.template-item {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n padding: 15px;\n border: 2px solid transparent;\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.2s ease;\n background: var(--mj-bg-surface-card);\n margin-bottom: 8px;\n}\n\n.template-item:hover {\n border-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n}\n\n.template-item.selected {\n border-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n}\n\n.grid-mode .template-item {\n flex-direction: column;\n margin-bottom: 0;\n}\n\n.grid-mode .template-item .selection-indicator {\n align-self: flex-end;\n}\n\n/* Selection Indicator */\n.selection-indicator {\n flex-shrink: 0;\n margin-top: 2px;\n}\n\n.selection-indicator input[type=\"checkbox\"],\n.selection-indicator input[type=\"radio\"] {\n width: 16px;\n height: 16px;\n cursor: pointer;\n}\n\n/* Template Info */\n.template-info {\n flex: 1;\n min-width: 0;\n}\n\n.template-header {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n margin-bottom: 8px;\n}\n\n.template-name {\n margin: 0;\n font-size: 1.1rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n word-break: break-word;\n}\n\n.template-status {\n flex-shrink: 0;\n margin-left: 10px;\n}\n\n.status-badge {\n display: inline-block;\n padding: 2px 8px;\n border-radius: 12px;\n font-size: 0.75rem;\n font-weight: 500;\n color: var(--mj-text-inverse);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n/* Template Description */\n.template-description {\n margin-bottom: 12px;\n color: var(--mj-text-secondary);\n font-size: 0.9rem;\n line-height: 1.4;\n}\n\n/* Template Metadata */\n.template-metadata {\n display: flex;\n flex-wrap: wrap;\n gap: 15px;\n font-size: 0.85rem;\n color: var(--mj-text-muted);\n}\n\n.metadata-item {\n display: flex;\n align-items: center;\n gap: 5px;\n}\n\n.metadata-item i {\n font-size: 0.8rem;\n color: var(--mj-text-muted);\n}\n\n/* No Templates State */\n.no-templates {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 60px 20px;\n text-align: center;\n color: var(--mj-text-secondary);\n}\n\n.no-templates i {\n margin-bottom: 20px;\n color: var(--mj-text-muted);\n}\n\n.no-templates h4 {\n margin: 0 0 10px 0;\n font-size: 1.2rem;\n}\n\n.no-templates p {\n margin: 0;\n font-size: 0.9rem;\n color: var(--mj-text-muted);\n}\n\n/* Dialog Actions */\n.dialog-actions {\n margin-top: 20px;\n padding-top: 20px;\n border-top: 1px solid var(--mj-border-default);\n}\n\n.action-buttons {\n display: flex;\n justify-content: flex-end;\n gap: 10px;\n}\n\n.action-buttons button {\n min-width: 100px;\n}\n\n.action-buttons button i {\n margin-right: 5px;\n}\n\n/* Responsive Design */\n@media (max-width: 768px) {\n .template-selector-dialog {\n padding: 15px;\n height: 500px;\n }\n\n .search-filter-section {\n flex-direction: column;\n gap: 10px;\n }\n\n .category-filter {\n min-width: auto;\n }\n\n .templates-container.grid-mode {\n grid-template-columns: 1fr;\n }\n\n .template-header {\n flex-direction: column;\n align-items: flex-start;\n }\n\n .template-status {\n margin-left: 0;\n margin-top: 5px;\n }\n\n .template-metadata {\n flex-direction: column;\n gap: 8px;\n }\n\n .action-buttons {\n flex-direction: column;\n }\n\n .action-buttons button {\n min-width: auto;\n }\n}\n\n/* Scrollbar Styling */\n.templates-container::-webkit-scrollbar {\n width: 8px;\n}\n\n.templates-container::-webkit-scrollbar-track {\n background: var(--mj-bg-surface-card);\n border-radius: 4px;\n}\n\n.templates-container::-webkit-scrollbar-thumb {\n background: var(--mj-border-strong);\n border-radius: 4px;\n}\n\n.templates-container::-webkit-scrollbar-thumb:hover {\n background: var(--mj-text-muted);\n}\n"] }]
|
|
442
|
-
}], () => [{ type:
|
|
443
|
-
|
|
440
|
+
args: [{ selector: 'mj-template-selector-dialog', standalone: true, imports: [CommonModule, ReactiveFormsModule], template: "<!-- Template Selector Dialog -->\n<div class=\"template-selector-dialog\">\n <!-- Header -->\n <div class=\"dialog-header\">\n <h3>{{ config.title }}</h3>\n <div class=\"header-actions\">\n <button\n mjButton\n size=\"sm\"\n (click)=\"toggleViewMode()\"\n >\n <i [class]=\"viewMode === 'list' ? 'fa-solid fa-th' : 'fa-solid fa-list'\"></i>\n {{ viewMode === 'list' ? 'Grid' : 'List' }}\n </button>\n </div>\n </div>\n\n <!-- Search and Filter Section -->\n <div class=\"search-filter-section\">\n <!-- Search Input -->\n <div class=\"search-container\">\n <input\n class=\"mj-input\"\n type=\"text\"\n [formControl]=\"searchControl\"\n placeholder=\"Search templates...\"\n />\n <i class=\"fa-solid fa-search search-icon\"></i>\n </div>\n\n <!-- Category Filter -->\n <div class=\"category-filter\">\n <select\n class=\"mj-input\"\n [value]=\"selectedCategory || ''\"\n (change)=\"onCategoryChange($any($event.target).value || null)\"\n >\n <option value=\"\">All Categories</option>\n @for (category of categories$ | async; track category.ID) {\n <option [value]=\"category.ID\">{{ category.Name }}</option>\n }\n </select>\n </div>\n </div>\n\n <!-- Loading State -->\n @if (isLoading$ | async) {\n <div class=\"loading-container\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n <span>Loading templates...</span>\n </div>\n }\n\n <!-- Template List/Grid -->\n @if (!(isLoading$ | async)) {\n <div class=\"templates-container\" [class.grid-mode]=\"viewMode === 'grid'\">\n @for (template of filteredTemplates$ | async; track template.ID) {\n <div \n class=\"template-item\"\n [class.selected]=\"isTemplateSelected(template)\"\n (click)=\"toggleTemplateSelection(template)\"\n >\n <!-- Selection Checkbox -->\n <div class=\"selection-indicator\">\n @if (config.multiSelect) {\n <input\n type=\"checkbox\"\n [checked]=\"isTemplateSelected(template)\"\n (change)=\"toggleTemplateSelection(template)\"\n />\n } @else {\n <input\n type=\"radio\"\n [checked]=\"isTemplateSelected(template)\"\n (change)=\"toggleTemplateSelection(template)\"\n />\n }\n </div>\n\n <!-- Template Info -->\n <div class=\"template-info\">\n <div class=\"template-header\">\n <h4 class=\"template-name\">{{ template.Name }}</h4>\n <div class=\"template-status\">\n <span \n class=\"status-badge\"\n [style.background-color]=\"getTemplateStatusColor(template)\"\n >\n {{ getTemplateStatusText(template) }}\n </span>\n </div>\n </div>\n\n <!-- Template Description -->\n @if (template.Description) {\n <div class=\"template-description\">\n {{ getTemplatePreview(template) }}\n </div>\n }\n\n <!-- Template Metadata -->\n <div class=\"template-metadata\">\n <div class=\"metadata-item\">\n <i class=\"fa-solid fa-user\"></i>\n <span>{{ template.User || 'Unknown User' }}</span>\n </div>\n \n @if (template.Category) {\n <div class=\"metadata-item\">\n <i class=\"fa-solid fa-folder\"></i>\n <span>{{ template.Category }}</span>\n </div>\n }\n \n @if (template.__mj_CreatedAt) {\n <div class=\"metadata-item\">\n <i class=\"fa-solid fa-calendar\"></i>\n <span>{{ formatDate(template.__mj_CreatedAt) }}</span>\n </div>\n }\n </div>\n </div>\n </div>\n } @empty {\n <div class=\"no-templates\">\n <i class=\"fa-solid fa-file-alt fa-3x\"></i>\n <h4>No templates found</h4>\n <p>No templates match your current search criteria.</p>\n </div>\n }\n </div>\n }\n\n <!-- Dialog Actions -->\n <div class=\"dialog-actions\">\n <div class=\"action-buttons\">\n @if (config.showCreateNew) {\n <button\n mjButton\n variant=\"outline\"\n (click)=\"createNew()\"\n >\n <i class=\"fa-solid fa-plus\"></i>\n Create New\n </button>\n }\n \n <button\n mjButton\n (click)=\"cancel()\"\n >\n Cancel\n </button>\n \n <button\n mjButton\n variant=\"primary\"\n (click)=\"selectTemplates()\"\n [disabled]=\"selectedTemplates.size === 0\"\n >\n <i class=\"fa-solid fa-check\"></i>\n Select {{ selectedTemplates.size > 0 ? '(' + selectedTemplates.size + ')' : '' }}\n </button>\n </div>\n </div>\n</div>", styles: ["/* Template Selector Dialog Styles */\n.template-selector-dialog {\n padding: 20px;\n width: 100%;\n max-width: 800px;\n height: 600px;\n display: flex;\n flex-direction: column;\n}\n\n/* Header */\n.dialog-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 20px;\n padding-bottom: 15px;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.dialog-header h3 {\n margin: 0;\n font-size: 1.5rem;\n color: var(--mj-text-primary);\n}\n\n.header-actions {\n display: flex;\n gap: 10px;\n}\n\n/* Search and Filter Section */\n.search-filter-section {\n display: flex;\n gap: 15px;\n margin-bottom: 20px;\n}\n\n.search-container {\n flex: 1;\n position: relative;\n}\n\n.search-icon {\n position: absolute;\n left: 10px;\n top: 50%;\n transform: translateY(-50%);\n color: var(--mj-text-muted);\n pointer-events: none;\n}\n\n.search-container input {\n padding-left: 35px;\n width: 100%;\n}\n\n.category-filter {\n min-width: 200px;\n}\n\n.category-filter select {\n width: 100%;\n}\n\n/* Loading State */\n.loading-container {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 10px;\n padding: 60px;\n font-size: 1.1rem;\n color: var(--mj-text-secondary);\n}\n\n.loading-container i {\n font-size: 1.5rem;\n color: var(--mj-brand-primary);\n}\n\n/* Templates Container */\n.templates-container {\n flex: 1;\n overflow-y: auto;\n border: 1px solid var(--mj-border-default);\n border-radius: 4px;\n background: var(--mj-bg-surface);\n padding: 10px;\n}\n\n.templates-container.grid-mode {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));\n gap: 15px;\n}\n\n/* Template Item */\n.template-item {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n padding: 15px;\n border: 2px solid transparent;\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.2s ease;\n background: var(--mj-bg-surface-card);\n margin-bottom: 8px;\n}\n\n.template-item:hover {\n border-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n}\n\n.template-item.selected {\n border-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n}\n\n.grid-mode .template-item {\n flex-direction: column;\n margin-bottom: 0;\n}\n\n.grid-mode .template-item .selection-indicator {\n align-self: flex-end;\n}\n\n/* Selection Indicator */\n.selection-indicator {\n flex-shrink: 0;\n margin-top: 2px;\n}\n\n.selection-indicator input[type=\"checkbox\"],\n.selection-indicator input[type=\"radio\"] {\n width: 16px;\n height: 16px;\n cursor: pointer;\n}\n\n/* Template Info */\n.template-info {\n flex: 1;\n min-width: 0;\n}\n\n.template-header {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n margin-bottom: 8px;\n}\n\n.template-name {\n margin: 0;\n font-size: 1.1rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n word-break: break-word;\n}\n\n.template-status {\n flex-shrink: 0;\n margin-left: 10px;\n}\n\n.status-badge {\n display: inline-block;\n padding: 2px 8px;\n border-radius: 12px;\n font-size: 0.75rem;\n font-weight: 500;\n color: var(--mj-text-inverse);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n/* Template Description */\n.template-description {\n margin-bottom: 12px;\n color: var(--mj-text-secondary);\n font-size: 0.9rem;\n line-height: 1.4;\n}\n\n/* Template Metadata */\n.template-metadata {\n display: flex;\n flex-wrap: wrap;\n gap: 15px;\n font-size: 0.85rem;\n color: var(--mj-text-muted);\n}\n\n.metadata-item {\n display: flex;\n align-items: center;\n gap: 5px;\n}\n\n.metadata-item i {\n font-size: 0.8rem;\n color: var(--mj-text-muted);\n}\n\n/* No Templates State */\n.no-templates {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 60px 20px;\n text-align: center;\n color: var(--mj-text-secondary);\n}\n\n.no-templates i {\n margin-bottom: 20px;\n color: var(--mj-text-muted);\n}\n\n.no-templates h4 {\n margin: 0 0 10px 0;\n font-size: 1.2rem;\n}\n\n.no-templates p {\n margin: 0;\n font-size: 0.9rem;\n color: var(--mj-text-muted);\n}\n\n/* Dialog Actions */\n.dialog-actions {\n margin-top: 20px;\n padding-top: 20px;\n border-top: 1px solid var(--mj-border-default);\n}\n\n.action-buttons {\n display: flex;\n justify-content: flex-end;\n gap: 10px;\n}\n\n.action-buttons button {\n min-width: 100px;\n}\n\n.action-buttons button i {\n margin-right: 5px;\n}\n\n/* Responsive Design */\n@media (max-width: 768px) {\n .template-selector-dialog {\n padding: 15px;\n height: 500px;\n }\n\n .search-filter-section {\n flex-direction: column;\n gap: 10px;\n }\n\n .category-filter {\n min-width: auto;\n }\n\n .templates-container.grid-mode {\n grid-template-columns: 1fr;\n }\n\n .template-header {\n flex-direction: column;\n align-items: flex-start;\n }\n\n .template-status {\n margin-left: 0;\n margin-top: 5px;\n }\n\n .template-metadata {\n flex-direction: column;\n gap: 8px;\n }\n\n .action-buttons {\n flex-direction: column;\n }\n\n .action-buttons button {\n min-width: auto;\n }\n}\n\n/* Scrollbar Styling */\n.templates-container::-webkit-scrollbar {\n width: 8px;\n}\n\n.templates-container::-webkit-scrollbar-track {\n background: var(--mj-bg-surface-card);\n border-radius: 4px;\n}\n\n.templates-container::-webkit-scrollbar-thumb {\n background: var(--mj-border-strong);\n border-radius: 4px;\n}\n\n.templates-container::-webkit-scrollbar-thumb:hover {\n background: var(--mj-text-muted);\n}\n"] }]
|
|
441
|
+
}], () => [{ type: i0.ChangeDetectorRef }], { DialogClose: [{
|
|
442
|
+
type: Output
|
|
443
|
+
}] }); })();
|
|
444
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(TemplateSelectorDialogComponent, { className: "TemplateSelectorDialogComponent", filePath: "src/lib/custom/AIPrompts/template-selector-dialog.component.ts", lineNumber: 43 }); })();
|
|
444
445
|
//# sourceMappingURL=template-selector-dialog.component.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"template-selector-dialog.component.js","sourceRoot":"","sources":["../../../../src/lib/custom/AIPrompts/template-selector-dialog.component.ts","../../../../src/lib/custom/AIPrompts/template-selector-dialog.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, OnDestroy, ChangeDetectorRef } from '@angular/core';\nimport { DialogRef } from '@progress/kendo-angular-dialog';\nimport { Subject, BehaviorSubject, debounceTime, distinctUntilChanged, takeUntil } from 'rxjs';\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\nimport { CommonModule } from '@angular/common';\nimport { RunView } from '@memberjunction/core';\nimport { MJTemplateEntity, MJTemplateCategoryEntity } from '@memberjunction/core-entities';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\nimport { UUIDsEqual } from '@memberjunction/global';\n\nexport interface TemplateSelectorConfig {\n /** Title for the dialog */\n title: string;\n /** Whether to show the \"Create New\" option */\n showCreateNew?: boolean;\n /** Filter criteria for templates */\n extraFilter?: string;\n /** Allow multiple selection */\n multiSelect?: boolean;\n /** Pre-selected template IDs */\n selectedTemplateIds?: string[];\n /** Show only active templates */\n showActiveOnly?: boolean;\n}\n\nexport interface TemplateSelectorResult {\n /** Selected templates */\n selectedTemplates: MJTemplateEntity[];\n /** Whether user chose to create new */\n createNew?: boolean;\n}\n\n/**\n * Template selector dialog that allows users to search and select from existing templates.\n * This dialog provides a searchable interface with category filtering and template preview.\n */\n@Component({\n selector: 'mj-template-selector-dialog',\n templateUrl: './template-selector-dialog.component.html',\n styleUrls: ['./template-selector-dialog.component.css'],\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule]\n})\nexport class TemplateSelectorDialogComponent implements OnInit, OnDestroy {\n \n // Input configuration\n config: TemplateSelectorConfig = { title: 'Select Template' };\n \n // State management\n private destroy$ = new Subject<void>();\n public result = new Subject<TemplateSelectorResult | null>();\n \n // Data and UI state\n isLoading$ = new BehaviorSubject<boolean>(false);\n templates$ = new BehaviorSubject<MJTemplateEntity[]>([]);\n filteredTemplates$ = new BehaviorSubject<MJTemplateEntity[]>([]);\n categories$ = new BehaviorSubject<MJTemplateCategoryEntity[]>([]);\n \n // Search and filtering\n searchControl = new FormControl('');\n selectedCategory: string | null = null;\n selectedTemplates: Set<string> = new Set();\n \n // View mode\n viewMode: 'grid' | 'list' = 'list';\n\n constructor(\n private dialogRef: DialogRef,\n private cdr: ChangeDetectorRef\n ) {}\n\n ngOnInit() {\n this.setupSearch();\n this.loadData();\n \n // Initialize selected templates if provided\n if (this.config.selectedTemplateIds) {\n this.selectedTemplates = new Set(this.config.selectedTemplateIds);\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.filterTemplates(searchTerm || '');\n });\n }\n\n private async loadData() {\n this.isLoading$.next(true);\n \n try {\n // Load both templates and categories in parallel\n await Promise.all([\n this.loadTemplates(),\n this.loadCategories()\n ]);\n } catch (error) {\n console.error('Error loading template data:', error);\n MJNotificationService.Instance.CreateSimpleNotification(\n 'Error loading templates. Please try again.',\n 'error',\n 3000\n );\n } finally {\n this.isLoading$.next(false);\n }\n }\n\n private async loadTemplates() {\n try {\n const rv = new RunView();\n \n // Build filter\n let filter = '';\n if (this.config.showActiveOnly !== false) {\n filter = \"IsActive = 1\";\n }\n if (this.config.extraFilter) {\n filter += filter ? ` AND ${this.config.extraFilter}` : this.config.extraFilter;\n }\n \n const result = await rv.RunView<MJTemplateEntity>({\n EntityName: 'MJ: Templates',\n ExtraFilter: filter,\n OrderBy: 'Name ASC',\n ResultType: 'entity_object',\n MaxRows: 1000\n });\n\n if (result.Success) {\n const templates = result.Results || [];\n this.templates$.next(templates);\n this.filteredTemplates$.next(templates);\n } else {\n throw new Error(result.ErrorMessage || 'Failed to load templates');\n }\n } catch (error) {\n console.error('Error loading templates:', error);\n this.templates$.next([]);\n this.filteredTemplates$.next([]);\n }\n }\n\n private async loadCategories() {\n try {\n const rv = new RunView();\n \n const result = await rv.RunView<MJTemplateCategoryEntity>({\n EntityName: 'MJ: Template Categories',\n ExtraFilter: '',\n OrderBy: 'Name ASC',\n ResultType: 'entity_object',\n MaxRows: 1000\n });\n\n if (result.Success) {\n const categories = result.Results || [];\n this.categories$.next(categories);\n } else {\n throw new Error(result.ErrorMessage || 'Failed to load categories');\n }\n } catch (error) {\n console.error('Error loading categories:', error);\n this.categories$.next([]);\n }\n }\n\n private filterTemplates(searchTerm: string) {\n const allTemplates = this.templates$.value;\n let filtered = allTemplates;\n \n // Apply search filter\n if (searchTerm.trim()) {\n filtered = filtered.filter(template => \n template.Name?.toLowerCase().includes(searchTerm.toLowerCase()) ||\n template.Description?.toLowerCase().includes(searchTerm.toLowerCase())\n );\n }\n \n // Apply category filter\n if (this.selectedCategory) {\n filtered = filtered.filter(template => \n UUIDsEqual(template.CategoryID, this.selectedCategory)\n );\n }\n \n this.filteredTemplates$.next(filtered);\n }\n\n // === Category Management ===\n\n onCategoryChange(categoryId: string | null) {\n this.selectedCategory = categoryId === '' ? null : categoryId;\n this.filterTemplates(this.searchControl.value || '');\n }\n\n getCategoryDisplayName(categoryId: string): string {\n const category = this.categories$.value.find(c => UUIDsEqual(c.ID, categoryId));\n return category?.Name || 'Unknown Category';\n }\n\n // === Selection Management ===\n\n toggleTemplateSelection(template: MJTemplateEntity) {\n if (this.config.multiSelect) {\n if (this.selectedTemplates.has(template.ID)) {\n this.selectedTemplates.delete(template.ID);\n } else {\n this.selectedTemplates.add(template.ID);\n }\n } else {\n // Single select - replace current selection\n this.selectedTemplates.clear();\n this.selectedTemplates.add(template.ID);\n }\n }\n\n isTemplateSelected(template: MJTemplateEntity): boolean {\n return this.selectedTemplates.has(template.ID);\n }\n\n getSelectedTemplateObjects(): MJTemplateEntity[] {\n const allTemplates = this.templates$.value;\n return allTemplates.filter(template => this.selectedTemplates.has(template.ID));\n }\n\n // === UI Helpers ===\n\n toggleViewMode() {\n this.viewMode = this.viewMode === 'grid' ? 'list' : 'grid';\n }\n\n getTemplateStatusColor(template: MJTemplateEntity): string {\n if (!template.IsActive) return '#6c757d';\n if (template.DisabledAt && new Date(template.DisabledAt) <= new Date()) return '#dc3545';\n if (template.ActiveAt && new Date(template.ActiveAt) > new Date()) return '#ffc107';\n return '#28a745';\n }\n\n getTemplateStatusText(template: MJTemplateEntity): string {\n if (!template.IsActive) return 'Inactive';\n if (template.DisabledAt && new Date(template.DisabledAt) <= new Date()) return 'Disabled';\n if (template.ActiveAt && new Date(template.ActiveAt) > new Date()) return 'Scheduled';\n return 'Active';\n }\n\n getTemplatePreview(template: MJTemplateEntity): string {\n if (!template.Description) return 'No description available';\n return template.Description.length > 100 \n ? template.Description.substring(0, 100) + '...' \n : template.Description;\n }\n\n formatDate(date: Date | string | null): string {\n if (!date) return '';\n const d = new Date(date);\n return d.toLocaleDateString();\n }\n\n // === Dialog Actions ===\n\n selectTemplates() {\n const selectedTemplateObjects = this.getSelectedTemplateObjects();\n \n if (selectedTemplateObjects.length === 0) {\n MJNotificationService.Instance.CreateSimpleNotification(\n 'Please select at least one template',\n 'warning',\n 2000\n );\n return;\n }\n\n const result: TemplateSelectorResult = {\n selectedTemplates: selectedTemplateObjects\n };\n\n this.result.next(result);\n this.dialogRef.close();\n }\n\n createNew() {\n const result: TemplateSelectorResult = {\n selectedTemplates: [],\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}","<!-- Template Selector Dialog -->\n<div class=\"template-selector-dialog\">\n <!-- Header -->\n <div class=\"dialog-header\">\n <h3>{{ config.title }}</h3>\n <div class=\"header-actions\">\n <button\n kendoButton\n size=\"small\"\n (click)=\"toggleViewMode()\"\n >\n <i [class]=\"viewMode === 'list' ? 'fa-solid fa-th' : 'fa-solid fa-list'\"></i>\n {{ viewMode === 'list' ? 'Grid' : 'List' }}\n </button>\n </div>\n </div>\n\n <!-- Search and Filter Section -->\n <div class=\"search-filter-section\">\n <!-- Search Input -->\n <div class=\"search-container\">\n <input\n class=\"k-input k-textbox\"\n [formControl]=\"searchControl\"\n placeholder=\"Search templates...\"\n />\n <i class=\"fa-solid fa-search search-icon\"></i>\n </div>\n\n <!-- Category Filter -->\n <div class=\"category-filter\">\n <select\n class=\"k-input k-dropdown\"\n [value]=\"selectedCategory || ''\"\n (change)=\"onCategoryChange($any($event.target).value || null)\"\n >\n <option value=\"\">All Categories</option>\n @for (category of categories$ | async; track category.ID) {\n <option [value]=\"category.ID\">{{ category.Name }}</option>\n }\n </select>\n </div>\n </div>\n\n <!-- Loading State -->\n @if (isLoading$ | async) {\n <div class=\"loading-container\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n <span>Loading templates...</span>\n </div>\n }\n\n <!-- Template List/Grid -->\n @if (!(isLoading$ | async)) {\n <div class=\"templates-container\" [class.grid-mode]=\"viewMode === 'grid'\">\n @for (template of filteredTemplates$ | async; track template.ID) {\n <div \n class=\"template-item\"\n [class.selected]=\"isTemplateSelected(template)\"\n (click)=\"toggleTemplateSelection(template)\"\n >\n <!-- Selection Checkbox -->\n <div class=\"selection-indicator\">\n @if (config.multiSelect) {\n <input\n type=\"checkbox\"\n [checked]=\"isTemplateSelected(template)\"\n (change)=\"toggleTemplateSelection(template)\"\n />\n } @else {\n <input\n type=\"radio\"\n [checked]=\"isTemplateSelected(template)\"\n (change)=\"toggleTemplateSelection(template)\"\n />\n }\n </div>\n\n <!-- Template Info -->\n <div class=\"template-info\">\n <div class=\"template-header\">\n <h4 class=\"template-name\">{{ template.Name }}</h4>\n <div class=\"template-status\">\n <span \n class=\"status-badge\"\n [style.background-color]=\"getTemplateStatusColor(template)\"\n >\n {{ getTemplateStatusText(template) }}\n </span>\n </div>\n </div>\n\n <!-- Template Description -->\n @if (template.Description) {\n <div class=\"template-description\">\n {{ getTemplatePreview(template) }}\n </div>\n }\n\n <!-- Template Metadata -->\n <div class=\"template-metadata\">\n <div class=\"metadata-item\">\n <i class=\"fa-solid fa-user\"></i>\n <span>{{ template.User || 'Unknown User' }}</span>\n </div>\n \n @if (template.Category) {\n <div class=\"metadata-item\">\n <i class=\"fa-solid fa-folder\"></i>\n <span>{{ template.Category }}</span>\n </div>\n }\n \n @if (template.__mj_CreatedAt) {\n <div class=\"metadata-item\">\n <i class=\"fa-solid fa-calendar\"></i>\n <span>{{ formatDate(template.__mj_CreatedAt) }}</span>\n </div>\n }\n </div>\n </div>\n </div>\n } @empty {\n <div class=\"no-templates\">\n <i class=\"fa-solid fa-file-alt fa-3x\"></i>\n <h4>No templates found</h4>\n <p>No templates match your current search criteria.</p>\n </div>\n }\n </div>\n }\n\n <!-- Dialog Actions -->\n <div class=\"dialog-actions\">\n <div class=\"action-buttons\">\n @if (config.showCreateNew) {\n <button\n kendoButton\n themeColor=\"secondary\"\n (click)=\"createNew()\"\n >\n <i class=\"fa-solid fa-plus\"></i>\n Create New\n </button>\n }\n \n <button\n kendoButton\n (click)=\"cancel()\"\n >\n Cancel\n </button>\n \n <button\n kendoButton\n themeColor=\"primary\"\n (click)=\"selectTemplates()\"\n [disabled]=\"selectedTemplates.size === 0\"\n >\n <i class=\"fa-solid fa-check\"></i>\n Select {{ selectedTemplates.size > 0 ? '(' + selectedTemplates.size + ')' : '' }}\n </button>\n </div>\n </div>\n</div>"]}
|
|
1
|
+
{"version":3,"file":"template-selector-dialog.component.js","sourceRoot":"","sources":["../../../../src/lib/custom/AIPrompts/template-selector-dialog.component.ts","../../../../src/lib/custom/AIPrompts/template-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, ReactiveFormsModule } from '@angular/forms';\nimport { CommonModule } from '@angular/common';\nimport { RunView } from '@memberjunction/core';\nimport { MJTemplateEntity, MJTemplateCategoryEntity } from '@memberjunction/core-entities';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\nimport { UUIDsEqual } from '@memberjunction/global';\n\nexport interface TemplateSelectorConfig {\n /** Title for the dialog */\n title: string;\n /** Whether to show the \"Create New\" option */\n showCreateNew?: boolean;\n /** Filter criteria for templates */\n extraFilter?: string;\n /** Allow multiple selection */\n multiSelect?: boolean;\n /** Pre-selected template IDs */\n selectedTemplateIds?: string[];\n /** Show only active templates */\n showActiveOnly?: boolean;\n}\n\nexport interface TemplateSelectorResult {\n /** Selected templates */\n selectedTemplates: MJTemplateEntity[];\n /** Whether user chose to create new */\n createNew?: boolean;\n}\n\n/**\n * Template selector dialog that allows users to search and select from existing templates.\n * This dialog provides a searchable interface with category filtering and template preview.\n */\n@Component({\n selector: 'mj-template-selector-dialog',\n templateUrl: './template-selector-dialog.component.html',\n styleUrls: ['./template-selector-dialog.component.css'],\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule]\n})\nexport class TemplateSelectorDialogComponent implements OnInit, OnDestroy {\n \n // Input configuration\n config: TemplateSelectorConfig = { title: 'Select Template' };\n \n // State management\n private destroy$ = new Subject<void>();\n public result = new Subject<TemplateSelectorResult | null>();\n \n // Data and UI state\n isLoading$ = new BehaviorSubject<boolean>(false);\n templates$ = new BehaviorSubject<MJTemplateEntity[]>([]);\n filteredTemplates$ = new BehaviorSubject<MJTemplateEntity[]>([]);\n categories$ = new BehaviorSubject<MJTemplateCategoryEntity[]>([]);\n \n // Search and filtering\n searchControl = new FormControl('');\n selectedCategory: string | null = null;\n selectedTemplates: 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.loadData();\n \n // Initialize selected templates if provided\n if (this.config.selectedTemplateIds) {\n this.selectedTemplates = new Set(this.config.selectedTemplateIds);\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.filterTemplates(searchTerm || '');\n });\n }\n\n private async loadData() {\n this.isLoading$.next(true);\n \n try {\n // Load both templates and categories in parallel\n await Promise.all([\n this.loadTemplates(),\n this.loadCategories()\n ]);\n } catch (error) {\n console.error('Error loading template data:', error);\n MJNotificationService.Instance.CreateSimpleNotification(\n 'Error loading templates. Please try again.',\n 'error',\n 3000\n );\n } finally {\n this.isLoading$.next(false);\n }\n }\n\n private async loadTemplates() {\n try {\n const rv = new RunView();\n \n // Build filter\n let filter = '';\n if (this.config.showActiveOnly !== false) {\n filter = \"IsActive = 1\";\n }\n if (this.config.extraFilter) {\n filter += filter ? ` AND ${this.config.extraFilter}` : this.config.extraFilter;\n }\n \n const result = await rv.RunView<MJTemplateEntity>({\n EntityName: 'MJ: Templates',\n ExtraFilter: filter,\n OrderBy: 'Name ASC',\n ResultType: 'entity_object',\n MaxRows: 1000\n });\n\n if (result.Success) {\n const templates = result.Results || [];\n this.templates$.next(templates);\n this.filteredTemplates$.next(templates);\n } else {\n throw new Error(result.ErrorMessage || 'Failed to load templates');\n }\n } catch (error) {\n console.error('Error loading templates:', error);\n this.templates$.next([]);\n this.filteredTemplates$.next([]);\n }\n }\n\n private async loadCategories() {\n try {\n const rv = new RunView();\n \n const result = await rv.RunView<MJTemplateCategoryEntity>({\n EntityName: 'MJ: Template Categories',\n ExtraFilter: '',\n OrderBy: 'Name ASC',\n ResultType: 'entity_object',\n MaxRows: 1000\n });\n\n if (result.Success) {\n const categories = result.Results || [];\n this.categories$.next(categories);\n } else {\n throw new Error(result.ErrorMessage || 'Failed to load categories');\n }\n } catch (error) {\n console.error('Error loading categories:', error);\n this.categories$.next([]);\n }\n }\n\n private filterTemplates(searchTerm: string) {\n const allTemplates = this.templates$.value;\n let filtered = allTemplates;\n \n // Apply search filter\n if (searchTerm.trim()) {\n filtered = filtered.filter(template => \n template.Name?.toLowerCase().includes(searchTerm.toLowerCase()) ||\n template.Description?.toLowerCase().includes(searchTerm.toLowerCase())\n );\n }\n \n // Apply category filter\n if (this.selectedCategory) {\n filtered = filtered.filter(template => \n UUIDsEqual(template.CategoryID, this.selectedCategory)\n );\n }\n \n this.filteredTemplates$.next(filtered);\n }\n\n // === Category Management ===\n\n onCategoryChange(categoryId: string | null) {\n this.selectedCategory = categoryId === '' ? null : categoryId;\n this.filterTemplates(this.searchControl.value || '');\n }\n\n getCategoryDisplayName(categoryId: string): string {\n const category = this.categories$.value.find(c => UUIDsEqual(c.ID, categoryId));\n return category?.Name || 'Unknown Category';\n }\n\n // === Selection Management ===\n\n toggleTemplateSelection(template: MJTemplateEntity) {\n if (this.config.multiSelect) {\n if (this.selectedTemplates.has(template.ID)) {\n this.selectedTemplates.delete(template.ID);\n } else {\n this.selectedTemplates.add(template.ID);\n }\n } else {\n // Single select - replace current selection\n this.selectedTemplates.clear();\n this.selectedTemplates.add(template.ID);\n }\n }\n\n isTemplateSelected(template: MJTemplateEntity): boolean {\n return this.selectedTemplates.has(template.ID);\n }\n\n getSelectedTemplateObjects(): MJTemplateEntity[] {\n const allTemplates = this.templates$.value;\n return allTemplates.filter(template => this.selectedTemplates.has(template.ID));\n }\n\n // === UI Helpers ===\n\n toggleViewMode() {\n this.viewMode = this.viewMode === 'grid' ? 'list' : 'grid';\n }\n\n getTemplateStatusColor(template: MJTemplateEntity): string {\n if (!template.IsActive) return '#6c757d';\n if (template.DisabledAt && new Date(template.DisabledAt) <= new Date()) return '#dc3545';\n if (template.ActiveAt && new Date(template.ActiveAt) > new Date()) return '#ffc107';\n return '#28a745';\n }\n\n getTemplateStatusText(template: MJTemplateEntity): string {\n if (!template.IsActive) return 'Inactive';\n if (template.DisabledAt && new Date(template.DisabledAt) <= new Date()) return 'Disabled';\n if (template.ActiveAt && new Date(template.ActiveAt) > new Date()) return 'Scheduled';\n return 'Active';\n }\n\n getTemplatePreview(template: MJTemplateEntity): string {\n if (!template.Description) return 'No description available';\n return template.Description.length > 100 \n ? template.Description.substring(0, 100) + '...' \n : template.Description;\n }\n\n formatDate(date: Date | string | null): string {\n if (!date) return '';\n const d = new Date(date);\n return d.toLocaleDateString();\n }\n\n // === Dialog Actions ===\n\n selectTemplates() {\n const selectedTemplateObjects = this.getSelectedTemplateObjects();\n \n if (selectedTemplateObjects.length === 0) {\n MJNotificationService.Instance.CreateSimpleNotification(\n 'Please select at least one template',\n 'warning',\n 2000\n );\n return;\n }\n\n const result: TemplateSelectorResult = {\n selectedTemplates: selectedTemplateObjects\n };\n\n this.result.next(result);\n this.DialogClose.emit();\n }\n\n createNew() {\n const result: TemplateSelectorResult = {\n selectedTemplates: [],\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}","<!-- Template Selector Dialog -->\n<div class=\"template-selector-dialog\">\n <!-- Header -->\n <div class=\"dialog-header\">\n <h3>{{ config.title }}</h3>\n <div class=\"header-actions\">\n <button\n mjButton\n size=\"sm\"\n (click)=\"toggleViewMode()\"\n >\n <i [class]=\"viewMode === 'list' ? 'fa-solid fa-th' : 'fa-solid fa-list'\"></i>\n {{ viewMode === 'list' ? 'Grid' : 'List' }}\n </button>\n </div>\n </div>\n\n <!-- Search and Filter Section -->\n <div class=\"search-filter-section\">\n <!-- Search Input -->\n <div class=\"search-container\">\n <input\n class=\"mj-input\"\n type=\"text\"\n [formControl]=\"searchControl\"\n placeholder=\"Search templates...\"\n />\n <i class=\"fa-solid fa-search search-icon\"></i>\n </div>\n\n <!-- Category Filter -->\n <div class=\"category-filter\">\n <select\n class=\"mj-input\"\n [value]=\"selectedCategory || ''\"\n (change)=\"onCategoryChange($any($event.target).value || null)\"\n >\n <option value=\"\">All Categories</option>\n @for (category of categories$ | async; track category.ID) {\n <option [value]=\"category.ID\">{{ category.Name }}</option>\n }\n </select>\n </div>\n </div>\n\n <!-- Loading State -->\n @if (isLoading$ | async) {\n <div class=\"loading-container\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n <span>Loading templates...</span>\n </div>\n }\n\n <!-- Template List/Grid -->\n @if (!(isLoading$ | async)) {\n <div class=\"templates-container\" [class.grid-mode]=\"viewMode === 'grid'\">\n @for (template of filteredTemplates$ | async; track template.ID) {\n <div \n class=\"template-item\"\n [class.selected]=\"isTemplateSelected(template)\"\n (click)=\"toggleTemplateSelection(template)\"\n >\n <!-- Selection Checkbox -->\n <div class=\"selection-indicator\">\n @if (config.multiSelect) {\n <input\n type=\"checkbox\"\n [checked]=\"isTemplateSelected(template)\"\n (change)=\"toggleTemplateSelection(template)\"\n />\n } @else {\n <input\n type=\"radio\"\n [checked]=\"isTemplateSelected(template)\"\n (change)=\"toggleTemplateSelection(template)\"\n />\n }\n </div>\n\n <!-- Template Info -->\n <div class=\"template-info\">\n <div class=\"template-header\">\n <h4 class=\"template-name\">{{ template.Name }}</h4>\n <div class=\"template-status\">\n <span \n class=\"status-badge\"\n [style.background-color]=\"getTemplateStatusColor(template)\"\n >\n {{ getTemplateStatusText(template) }}\n </span>\n </div>\n </div>\n\n <!-- Template Description -->\n @if (template.Description) {\n <div class=\"template-description\">\n {{ getTemplatePreview(template) }}\n </div>\n }\n\n <!-- Template Metadata -->\n <div class=\"template-metadata\">\n <div class=\"metadata-item\">\n <i class=\"fa-solid fa-user\"></i>\n <span>{{ template.User || 'Unknown User' }}</span>\n </div>\n \n @if (template.Category) {\n <div class=\"metadata-item\">\n <i class=\"fa-solid fa-folder\"></i>\n <span>{{ template.Category }}</span>\n </div>\n }\n \n @if (template.__mj_CreatedAt) {\n <div class=\"metadata-item\">\n <i class=\"fa-solid fa-calendar\"></i>\n <span>{{ formatDate(template.__mj_CreatedAt) }}</span>\n </div>\n }\n </div>\n </div>\n </div>\n } @empty {\n <div class=\"no-templates\">\n <i class=\"fa-solid fa-file-alt fa-3x\"></i>\n <h4>No templates found</h4>\n <p>No templates match your current search criteria.</p>\n </div>\n }\n </div>\n }\n\n <!-- Dialog Actions -->\n <div class=\"dialog-actions\">\n <div class=\"action-buttons\">\n @if (config.showCreateNew) {\n <button\n mjButton\n variant=\"outline\"\n (click)=\"createNew()\"\n >\n <i class=\"fa-solid fa-plus\"></i>\n Create New\n </button>\n }\n \n <button\n mjButton\n (click)=\"cancel()\"\n >\n Cancel\n </button>\n \n <button\n mjButton\n variant=\"primary\"\n (click)=\"selectTemplates()\"\n [disabled]=\"selectedTemplates.size === 0\"\n >\n <i class=\"fa-solid fa-check\"></i>\n Select {{ selectedTemplates.size > 0 ? '(' + selectedTemplates.size + ')' : '' }}\n </button>\n </div>\n </div>\n</div>"]}
|