@memberjunction/ng-core-entity-forms 6.2.0-edge.0 → 6.2.0-edge.1
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/AIAgentCategories/ai-agent-category-overview.panel.d.ts +1 -1
- package/dist/lib/custom/AIAgentCategories/ai-agent-category-overview.panel.js +2 -2
- package/dist/lib/custom/AIAgentCategories/ai-agent-category-overview.panel.js.map +1 -1
- package/dist/lib/custom/AIAgentSessions/ai-agent-session-form.component.js.map +1 -1
- package/dist/lib/custom/AIAgents/add-action-dialog.component.d.ts +90 -16
- package/dist/lib/custom/AIAgents/add-action-dialog.component.d.ts.map +1 -1
- package/dist/lib/custom/AIAgents/add-action-dialog.component.js +218 -70
- package/dist/lib/custom/AIAgents/add-action-dialog.component.js.map +1 -1
- package/dist/lib/custom/AIAgents/agent-prompt-advanced-settings-dialog.component.d.ts +80 -16
- 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 +146 -46
- 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 +329 -27
- package/dist/lib/custom/AIAgents/ai-agent-form.component.d.ts.map +1 -1
- package/dist/lib/custom/AIAgents/ai-agent-form.component.js +794 -262
- package/dist/lib/custom/AIAgents/ai-agent-form.component.js.map +1 -1
- package/dist/lib/custom/AIAgents/ai-agent-management.service.d.ts +76 -0
- package/dist/lib/custom/AIAgents/ai-agent-management.service.d.ts.map +1 -1
- package/dist/lib/custom/AIAgents/ai-agent-management.service.js +77 -33
- package/dist/lib/custom/AIAgents/ai-agent-management.service.js.map +1 -1
- package/dist/lib/custom/AIAgents/create-prompt-dialog.component.d.ts +69 -15
- package/dist/lib/custom/AIAgents/create-prompt-dialog.component.d.ts.map +1 -1
- package/dist/lib/custom/AIAgents/create-prompt-dialog.component.js +182 -74
- 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 +105 -25
- 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 +272 -112
- 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 +32 -6
- package/dist/lib/custom/AIAgents/new-agent-dialog.component.d.ts.map +1 -1
- package/dist/lib/custom/AIAgents/new-agent-dialog.component.js +71 -19
- package/dist/lib/custom/AIAgents/new-agent-dialog.component.js.map +1 -1
- package/dist/lib/custom/AIAgents/new-agent-dialog.service.d.ts +10 -0
- package/dist/lib/custom/AIAgents/new-agent-dialog.service.d.ts.map +1 -1
- package/dist/lib/custom/AIAgents/new-agent-dialog.service.js +27 -7
- package/dist/lib/custom/AIAgents/new-agent-dialog.service.js.map +1 -1
- package/dist/lib/custom/AIAgents/prompt-selector-dialog.component.d.ts +65 -15
- package/dist/lib/custom/AIAgents/prompt-selector-dialog.component.d.ts.map +1 -1
- package/dist/lib/custom/AIAgents/prompt-selector-dialog.component.js +152 -52
- 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 +81 -15
- 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 +145 -45
- 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 +71 -17
- 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 +175 -67
- 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 +173 -27
- 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 +385 -93
- package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.js.map +1 -1
- package/dist/lib/custom/AIPromptRuns/chat-message-viewer.component.d.ts +64 -4
- package/dist/lib/custom/AIPromptRuns/chat-message-viewer.component.d.ts.map +1 -1
- package/dist/lib/custom/AIPromptRuns/chat-message-viewer.component.js +129 -29
- package/dist/lib/custom/AIPromptRuns/chat-message-viewer.component.js.map +1 -1
- package/dist/lib/custom/AIPrompts/ai-prompt-form.component.d.ts +260 -27
- package/dist/lib/custom/AIPrompts/ai-prompt-form.component.d.ts.map +1 -1
- package/dist/lib/custom/AIPrompts/ai-prompt-form.component.js +686 -238
- package/dist/lib/custom/AIPrompts/ai-prompt-form.component.js.map +1 -1
- package/dist/lib/custom/AIPrompts/ai-prompt-management.service.d.ts +10 -0
- package/dist/lib/custom/AIPrompts/ai-prompt-management.service.d.ts.map +1 -1
- package/dist/lib/custom/AIPrompts/ai-prompt-management.service.js +17 -9
- package/dist/lib/custom/AIPrompts/ai-prompt-management.service.js.map +1 -1
- package/dist/lib/custom/AIPrompts/template-selector-dialog.component.d.ts +74 -16
- package/dist/lib/custom/AIPrompts/template-selector-dialog.component.d.ts.map +1 -1
- package/dist/lib/custom/AIPrompts/template-selector-dialog.component.js +174 -58
- package/dist/lib/custom/AIPrompts/template-selector-dialog.component.js.map +1 -1
- package/dist/lib/custom/Actions/action-execution-log-form.component.d.ts +108 -14
- package/dist/lib/custom/Actions/action-execution-log-form.component.d.ts.map +1 -1
- package/dist/lib/custom/Actions/action-execution-log-form.component.js +258 -70
- package/dist/lib/custom/Actions/action-execution-log-form.component.js.map +1 -1
- package/dist/lib/custom/Actions/action-form.component.d.ts +198 -14
- package/dist/lib/custom/Actions/action-form.component.d.ts.map +1 -1
- package/dist/lib/custom/Actions/action-form.component.js +387 -107
- package/dist/lib/custom/Actions/action-form.component.js.map +1 -1
- package/dist/lib/custom/BridgeProviders/bridge-provider-features.d.ts +12 -6
- package/dist/lib/custom/BridgeProviders/bridge-provider-features.d.ts.map +1 -1
- package/dist/lib/custom/BridgeProviders/bridge-provider-features.js +41 -29
- package/dist/lib/custom/BridgeProviders/bridge-provider-features.js.map +1 -1
- package/dist/lib/custom/BridgeProviders/bridge-provider-form.component.js +14 -14
- package/dist/lib/custom/BridgeProviders/bridge-provider-form.component.js.map +1 -1
- package/dist/lib/custom/Companies/company-overview.panel.d.ts +1 -1
- package/dist/lib/custom/Companies/company-overview.panel.js +2 -2
- package/dist/lib/custom/Companies/company-overview.panel.js.map +1 -1
- package/dist/lib/custom/Conversations/conversation-overview.panel.d.ts +1 -1
- package/dist/lib/custom/Conversations/conversation-overview.panel.js +2 -2
- package/dist/lib/custom/Conversations/conversation-overview.panel.js.map +1 -1
- package/dist/lib/custom/Employees/employee-overview.panel.d.ts +1 -1
- package/dist/lib/custom/Employees/employee-overview.panel.js +2 -2
- package/dist/lib/custom/Employees/employee-overview.panel.js.map +1 -1
- package/dist/lib/custom/Entities/entity-form.component.d.ts +209 -28
- package/dist/lib/custom/Entities/entity-form.component.d.ts.map +1 -1
- package/dist/lib/custom/Entities/entity-form.component.js +494 -138
- package/dist/lib/custom/Entities/entity-form.component.js.map +1 -1
- package/dist/lib/custom/EntityActions/entityaction.form.component.d.ts +5 -1
- package/dist/lib/custom/EntityActions/entityaction.form.component.d.ts.map +1 -1
- package/dist/lib/custom/EntityActions/entityaction.form.component.js +10 -2
- package/dist/lib/custom/EntityActions/entityaction.form.component.js.map +1 -1
- package/dist/lib/custom/Files/file-form.component.d.ts +1 -1
- package/dist/lib/custom/Files/file-form.component.js +2 -2
- package/dist/lib/custom/Files/file-form.component.js.map +1 -1
- package/dist/lib/custom/Lists/list-form.component.d.ts +300 -36
- package/dist/lib/custom/Lists/list-form.component.d.ts.map +1 -1
- package/dist/lib/custom/Lists/list-form.component.js +664 -208
- package/dist/lib/custom/Lists/list-form.component.js.map +1 -1
- package/dist/lib/custom/MLModels/ml-model-view-models.d.ts +31 -0
- package/dist/lib/custom/MLModels/ml-model-view-models.d.ts.map +1 -1
- package/dist/lib/custom/MLModels/ml-model-view-models.js +52 -16
- package/dist/lib/custom/MLModels/ml-model-view-models.js.map +1 -1
- package/dist/lib/custom/MLModels/ps-model-detail.component.d.ts +107 -10
- package/dist/lib/custom/MLModels/ps-model-detail.component.d.ts.map +1 -1
- package/dist/lib/custom/MLModels/ps-model-detail.component.js +291 -101
- package/dist/lib/custom/MLModels/ps-model-detail.component.js.map +1 -1
- package/dist/lib/custom/Queries/query-form.component.d.ts +201 -26
- package/dist/lib/custom/Queries/query-form.component.d.ts.map +1 -1
- package/dist/lib/custom/Queries/query-form.component.js +429 -109
- package/dist/lib/custom/Queries/query-form.component.js.map +1 -1
- package/dist/lib/custom/Queries/query-run-dialog.component.d.ts +107 -14
- package/dist/lib/custom/Queries/query-run-dialog.component.d.ts.map +1 -1
- package/dist/lib/custom/Queries/query-run-dialog.component.js +249 -79
- package/dist/lib/custom/Queries/query-run-dialog.component.js.map +1 -1
- package/dist/lib/custom/RecordProcesses/record-process-form.component.d.ts +110 -4
- package/dist/lib/custom/RecordProcesses/record-process-form.component.d.ts.map +1 -1
- package/dist/lib/custom/RecordProcesses/record-process-form.component.js +858 -86
- package/dist/lib/custom/RecordProcesses/record-process-form.component.js.map +1 -1
- package/dist/lib/custom/SearchScopes/searchscope-form.component.d.ts +1 -1
- package/dist/lib/custom/SearchScopes/searchscope-form.component.js +4 -4
- package/dist/lib/custom/SearchScopes/searchscope-form.component.js.map +1 -1
- package/dist/lib/custom/SessionBridges/session-bridge-form.component.js.map +1 -1
- package/dist/lib/custom/Templates/template-param-dialog.component.d.ts +77 -13
- package/dist/lib/custom/Templates/template-param-dialog.component.d.ts.map +1 -1
- package/dist/lib/custom/Templates/template-param-dialog.component.js +196 -78
- package/dist/lib/custom/Templates/template-param-dialog.component.js.map +1 -1
- package/dist/lib/custom/Templates/template-params-grid.component.d.ts +49 -7
- package/dist/lib/custom/Templates/template-params-grid.component.d.ts.map +1 -1
- package/dist/lib/custom/Templates/template-params-grid.component.js +132 -44
- package/dist/lib/custom/Templates/template-params-grid.component.js.map +1 -1
- package/dist/lib/custom/Templates/templates-form.component.d.ts +142 -17
- package/dist/lib/custom/Templates/templates-form.component.d.ts.map +1 -1
- package/dist/lib/custom/Templates/templates-form.component.js +333 -113
- package/dist/lib/custom/Templates/templates-form.component.js.map +1 -1
- package/dist/lib/custom/Tests/entity-link-pill.component.d.ts +24 -4
- package/dist/lib/custom/Tests/entity-link-pill.component.d.ts.map +1 -1
- package/dist/lib/custom/Tests/entity-link-pill.component.js +64 -20
- package/dist/lib/custom/Tests/entity-link-pill.component.js.map +1 -1
- package/dist/lib/custom/Tests/test-form.component.d.ts +217 -27
- package/dist/lib/custom/Tests/test-form.component.d.ts.map +1 -1
- package/dist/lib/custom/Tests/test-form.component.js +549 -169
- package/dist/lib/custom/Tests/test-form.component.js.map +1 -1
- package/dist/lib/custom/Tests/test-run-checks.d.ts +2 -0
- package/dist/lib/custom/Tests/test-run-checks.d.ts.map +1 -1
- package/dist/lib/custom/Tests/test-run-checks.js +5 -1
- package/dist/lib/custom/Tests/test-run-checks.js.map +1 -1
- package/dist/lib/custom/Tests/test-run-feedback-form.component.d.ts +2 -0
- package/dist/lib/custom/Tests/test-run-feedback-form.component.d.ts.map +1 -1
- package/dist/lib/custom/Tests/test-run-feedback-form.component.js +5 -1
- package/dist/lib/custom/Tests/test-run-feedback-form.component.js.map +1 -1
- package/dist/lib/custom/Tests/test-run-form.component.d.ts +146 -18
- package/dist/lib/custom/Tests/test-run-form.component.d.ts.map +1 -1
- package/dist/lib/custom/Tests/test-run-form.component.js +362 -106
- package/dist/lib/custom/Tests/test-run-form.component.js.map +1 -1
- package/dist/lib/custom/Tests/test-suite-form.component.d.ts +390 -47
- package/dist/lib/custom/Tests/test-suite-form.component.d.ts.map +1 -1
- package/dist/lib/custom/Tests/test-suite-form.component.js +1015 -343
- package/dist/lib/custom/Tests/test-suite-form.component.js.map +1 -1
- package/dist/lib/custom/Tests/test-suite-run-form.component.d.ts +214 -26
- package/dist/lib/custom/Tests/test-suite-run-form.component.d.ts.map +1 -1
- package/dist/lib/custom/Tests/test-suite-run-form.component.js +535 -159
- package/dist/lib/custom/Tests/test-suite-run-form.component.js.map +1 -1
- package/dist/lib/custom/Users/user-overview.panel.d.ts +1 -1
- package/dist/lib/custom/Users/user-overview.panel.js +2 -2
- package/dist/lib/custom/Users/user-overview.panel.js.map +1 -1
- package/dist/lib/custom/ai-agent-run/ai-agent-run-analytics.component.d.ts +208 -29
- package/dist/lib/custom/ai-agent-run/ai-agent-run-analytics.component.d.ts.map +1 -1
- package/dist/lib/custom/ai-agent-run/ai-agent-run-analytics.component.js +446 -138
- 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-cost.service.d.ts +6 -0
- package/dist/lib/custom/ai-agent-run/ai-agent-run-cost.service.d.ts.map +1 -1
- package/dist/lib/custom/ai-agent-run/ai-agent-run-cost.service.js +16 -4
- package/dist/lib/custom/ai-agent-run/ai-agent-run-cost.service.js.map +1 -1
- package/dist/lib/custom/ai-agent-run/ai-agent-run-data.service.d.ts +50 -6
- 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 +84 -12
- 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-step-detail.component.d.ts +89 -5
- package/dist/lib/custom/ai-agent-run/ai-agent-run-step-detail.component.d.ts.map +1 -1
- package/dist/lib/custom/ai-agent-run/ai-agent-run-step-detail.component.js +216 -70
- package/dist/lib/custom/ai-agent-run/ai-agent-run-step-detail.component.js.map +1 -1
- package/dist/lib/custom/ai-agent-run/ai-agent-run-step-node.component.d.ts +62 -3
- package/dist/lib/custom/ai-agent-run/ai-agent-run-step-node.component.d.ts.map +1 -1
- package/dist/lib/custom/ai-agent-run/ai-agent-run-step-node.component.js +140 -42
- package/dist/lib/custom/ai-agent-run/ai-agent-run-step-node.component.js.map +1 -1
- package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.d.ts +81 -10
- 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 +165 -37
- 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.component.d.ts +140 -15
- 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 +326 -100
- package/dist/lib/custom/ai-agent-run/ai-agent-run.component.js.map +1 -1
- package/dist/lib/custom/ai-agent-run/flow/agent-run-flow.component.d.ts +101 -15
- package/dist/lib/custom/ai-agent-run/flow/agent-run-flow.component.d.ts.map +1 -1
- package/dist/lib/custom/ai-agent-run/flow/agent-run-flow.component.js +281 -97
- package/dist/lib/custom/ai-agent-run/flow/agent-run-flow.component.js.map +1 -1
- package/dist/lib/custom/ai-agent-run/flow/agent-run-flow.model.d.ts +43 -25
- package/dist/lib/custom/ai-agent-run/flow/agent-run-flow.model.d.ts.map +1 -1
- package/dist/lib/custom/ai-agent-run/flow/agent-run-flow.model.js +100 -64
- package/dist/lib/custom/ai-agent-run/flow/agent-run-flow.model.js.map +1 -1
- package/dist/lib/custom/ai-agent-run/flow/constellation.component.d.ts +14 -2
- package/dist/lib/custom/ai-agent-run/flow/constellation.component.d.ts.map +1 -1
- package/dist/lib/custom/ai-agent-run/flow/constellation.component.js +71 -53
- package/dist/lib/custom/ai-agent-run/flow/constellation.component.js.map +1 -1
- package/dist/lib/custom/ai-agent-run/flow/flame-cascade.component.d.ts +14 -2
- package/dist/lib/custom/ai-agent-run/flow/flame-cascade.component.d.ts.map +1 -1
- package/dist/lib/custom/ai-agent-run/flow/flame-cascade.component.js +70 -52
- package/dist/lib/custom/ai-agent-run/flow/flame-cascade.component.js.map +1 -1
- package/dist/lib/custom/ai-agent-run/flow/flow-svg.util.d.ts +8 -0
- package/dist/lib/custom/ai-agent-run/flow/flow-svg.util.d.ts.map +1 -1
- package/dist/lib/custom/ai-agent-run/flow/flow-svg.util.js +22 -6
- package/dist/lib/custom/ai-agent-run/flow/flow-svg.util.js.map +1 -1
- package/dist/lib/custom/ai-agent-run/flow/flowchart.component.d.ts +24 -2
- package/dist/lib/custom/ai-agent-run/flow/flowchart.component.d.ts.map +1 -1
- package/dist/lib/custom/ai-agent-run/flow/flowchart.component.js +91 -59
- package/dist/lib/custom/ai-agent-run/flow/flowchart.component.js.map +1 -1
- package/dist/lib/custom/ai-agent-run/flow/pan-zoom.d.ts +10 -2
- package/dist/lib/custom/ai-agent-run/flow/pan-zoom.d.ts.map +1 -1
- package/dist/lib/custom/ai-agent-run/flow/pan-zoom.js +33 -17
- package/dist/lib/custom/ai-agent-run/flow/pan-zoom.js.map +1 -1
- package/dist/lib/custom/ai-agent-run/flow/run-tree-flow-projection.d.ts +2 -0
- package/dist/lib/custom/ai-agent-run/flow/run-tree-flow-projection.d.ts.map +1 -1
- package/dist/lib/custom/ai-agent-run/flow/run-tree-flow-projection.js +34 -30
- package/dist/lib/custom/ai-agent-run/flow/run-tree-flow-projection.js.map +1 -1
- package/dist/lib/custom/ai-agent-run/flow/subway-lines.component.d.ts +14 -2
- package/dist/lib/custom/ai-agent-run/flow/subway-lines.component.d.ts.map +1 -1
- package/dist/lib/custom/ai-agent-run/flow/subway-lines.component.js +69 -51
- package/dist/lib/custom/ai-agent-run/flow/subway-lines.component.js.map +1 -1
- package/dist/lib/custom/shared/entity-selector-dialog.component.d.ts +38 -12
- package/dist/lib/custom/shared/entity-selector-dialog.component.d.ts.map +1 -1
- package/dist/lib/custom/shared/entity-selector-dialog.component.js +103 -51
- package/dist/lib/custom/shared/entity-selector-dialog.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJAIPromptRun/mjaipromptrun.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJAIPromptRun/mjaipromptrun.form.component.js +59 -51
- package/dist/lib/generated/Entities/MJAIPromptRun/mjaipromptrun.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJAIVendor/mjaivendor.form.component.js +76 -74
- package/dist/lib/generated/Entities/MJAIVendor/mjaivendor.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJProject/mjproject.form.component.js +27 -25
- package/dist/lib/generated/Entities/MJProject/mjproject.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJUser/mjuser.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJUser/mjuser.form.component.js +155 -119
- package/dist/lib/generated/Entities/MJUser/mjuser.form.component.js.map +1 -1
- package/dist/lib/panels/ai-skill-sharing/ai-skill-sharing-panel.component.d.ts +5 -1
- package/dist/lib/panels/ai-skill-sharing/ai-skill-sharing-panel.component.d.ts.map +1 -1
- package/dist/lib/panels/ai-skill-sharing/ai-skill-sharing-panel.component.js +11 -3
- package/dist/lib/panels/ai-skill-sharing/ai-skill-sharing-panel.component.js.map +1 -1
- package/dist/lib/panels/content-sources/tag-pipeline-configuration.panel.d.ts +2 -0
- package/dist/lib/panels/content-sources/tag-pipeline-configuration.panel.d.ts.map +1 -1
- package/dist/lib/panels/content-sources/tag-pipeline-configuration.panel.js +16 -12
- package/dist/lib/panels/content-sources/tag-pipeline-configuration.panel.js.map +1 -1
- package/dist/lib/panels/content-sources/website-crawler-settings.panel.d.ts +1 -1
- package/dist/lib/panels/content-sources/website-crawler-settings.panel.js +2 -2
- package/dist/lib/panels/content-sources/website-crawler-settings.panel.js.map +1 -1
- package/dist/lib/panels/model-predictions/model-prediction.logic.d.ts +45 -19
- package/dist/lib/panels/model-predictions/model-prediction.logic.d.ts.map +1 -1
- package/dist/lib/panels/model-predictions/model-prediction.logic.js +95 -43
- package/dist/lib/panels/model-predictions/model-prediction.logic.js.map +1 -1
- package/dist/lib/panels/model-predictions/model-prediction.panel.d.ts +20 -16
- package/dist/lib/panels/model-predictions/model-prediction.panel.d.ts.map +1 -1
- package/dist/lib/panels/model-predictions/model-prediction.panel.js +73 -65
- package/dist/lib/panels/model-predictions/model-prediction.panel.js.map +1 -1
- package/dist/lib/shared/components/template-editor.component.d.ts +133 -14
- package/dist/lib/shared/components/template-editor.component.d.ts.map +1 -1
- package/dist/lib/shared/components/template-editor.component.js +322 -124
- package/dist/lib/shared/components/template-editor.component.js.map +1 -1
- package/package.json +43 -42
|
@@ -462,62 +462,182 @@ function TemplateEditorComponent_Conditional_0_Template(rf, ctx) { if (rf & 1) {
|
|
|
462
462
|
i0.ɵɵconditional(ctx_r2.currentTemplateContent ? 2 : 3);
|
|
463
463
|
} }
|
|
464
464
|
export class TemplateEditorComponent extends BaseAngularComponent {
|
|
465
|
+
/** @deprecated Use {@link Template}. */
|
|
466
|
+
set template(value) {
|
|
467
|
+
this.Template = value;
|
|
468
|
+
}
|
|
469
|
+
/** @deprecated Use {@link Template}. */
|
|
470
|
+
get template() {
|
|
471
|
+
return this.Template;
|
|
472
|
+
}
|
|
473
|
+
/** @deprecated Use {@link TemplateContents}. */
|
|
474
|
+
get templateContents() {
|
|
475
|
+
return this.TemplateContents;
|
|
476
|
+
}
|
|
477
|
+
/** @deprecated Use {@link TemplateContents}. */
|
|
478
|
+
set templateContents(value) {
|
|
479
|
+
this.TemplateContents = value;
|
|
480
|
+
}
|
|
481
|
+
/** @deprecated Use {@link SelectedContentIndex}. */
|
|
482
|
+
get selectedContentIndex() {
|
|
483
|
+
return this.SelectedContentIndex;
|
|
484
|
+
}
|
|
485
|
+
/** @deprecated Use {@link SelectedContentIndex}. */
|
|
486
|
+
set selectedContentIndex(value) {
|
|
487
|
+
this.SelectedContentIndex = value;
|
|
488
|
+
}
|
|
489
|
+
/** @deprecated Use {@link IsAddingNewContent}. */
|
|
490
|
+
get isAddingNewContent() {
|
|
491
|
+
return this.IsAddingNewContent;
|
|
492
|
+
}
|
|
493
|
+
/** @deprecated Use {@link IsAddingNewContent}. */
|
|
494
|
+
set isAddingNewContent(value) {
|
|
495
|
+
this.IsAddingNewContent = value;
|
|
496
|
+
}
|
|
497
|
+
/** @deprecated Use {@link NewTemplateContent}. */
|
|
498
|
+
get newTemplateContent() {
|
|
499
|
+
return this.NewTemplateContent;
|
|
500
|
+
}
|
|
501
|
+
/** @deprecated Use {@link NewTemplateContent}. */
|
|
502
|
+
set newTemplateContent(value) {
|
|
503
|
+
this.NewTemplateContent = value;
|
|
504
|
+
}
|
|
505
|
+
/** @deprecated Use {@link HasUnsavedChanges}. */
|
|
506
|
+
get hasUnsavedChanges() {
|
|
507
|
+
return this.HasUnsavedChanges;
|
|
508
|
+
}
|
|
509
|
+
/** @deprecated Use {@link HasUnsavedChanges}. */
|
|
510
|
+
set hasUnsavedChanges(value) {
|
|
511
|
+
this.HasUnsavedChanges = value;
|
|
512
|
+
}
|
|
513
|
+
/** @deprecated Use {@link ContentTypeOptions}. */
|
|
514
|
+
get contentTypeOptions() {
|
|
515
|
+
return this.ContentTypeOptions;
|
|
516
|
+
}
|
|
517
|
+
/** @deprecated Use {@link ContentTypeOptions}. */
|
|
518
|
+
set contentTypeOptions(value) {
|
|
519
|
+
this.ContentTypeOptions = value;
|
|
520
|
+
}
|
|
521
|
+
/** @deprecated Use {@link SupportedLanguages}. */
|
|
522
|
+
get supportedLanguages() {
|
|
523
|
+
return this.SupportedLanguages;
|
|
524
|
+
}
|
|
525
|
+
/** @deprecated Use {@link SupportedLanguages}. */
|
|
526
|
+
set supportedLanguages(value) {
|
|
527
|
+
this.SupportedLanguages = value;
|
|
528
|
+
}
|
|
529
|
+
/** @deprecated Use {@link IsRunningTemplate}. */
|
|
530
|
+
get isRunningTemplate() {
|
|
531
|
+
return this.IsRunningTemplate;
|
|
532
|
+
}
|
|
533
|
+
/** @deprecated Use {@link IsRunningTemplate}. */
|
|
534
|
+
set isRunningTemplate(value) {
|
|
535
|
+
this.IsRunningTemplate = value;
|
|
536
|
+
}
|
|
537
|
+
/** @deprecated Use {@link ActiveHelpTab}. */
|
|
538
|
+
get activeHelpTab() {
|
|
539
|
+
return this.ActiveHelpTab;
|
|
540
|
+
}
|
|
541
|
+
/** @deprecated Use {@link ActiveHelpTab}. */
|
|
542
|
+
set activeHelpTab(value) {
|
|
543
|
+
this.ActiveHelpTab = value;
|
|
544
|
+
}
|
|
545
|
+
/** @deprecated Use {@link ActivePlaceholderCategory}. */
|
|
546
|
+
get activePlaceholderCategory() {
|
|
547
|
+
return this.ActivePlaceholderCategory;
|
|
548
|
+
}
|
|
549
|
+
/** @deprecated Use {@link ActivePlaceholderCategory}. */
|
|
550
|
+
set activePlaceholderCategory(value) {
|
|
551
|
+
this.ActivePlaceholderCategory = value;
|
|
552
|
+
}
|
|
553
|
+
/** @deprecated Use {@link PlaceholderCategories}. */
|
|
554
|
+
get placeholderCategories() {
|
|
555
|
+
return this.PlaceholderCategories;
|
|
556
|
+
}
|
|
557
|
+
/** @deprecated Use {@link PlaceholderCategories}. */
|
|
558
|
+
set placeholderCategories(value) {
|
|
559
|
+
this.PlaceholderCategories = value;
|
|
560
|
+
}
|
|
561
|
+
/** @deprecated Use {@link CodeEditor}. */
|
|
562
|
+
get codeEditor() {
|
|
563
|
+
return this.CodeEditor;
|
|
564
|
+
}
|
|
565
|
+
/** @deprecated Use {@link CodeEditor}. */
|
|
566
|
+
set codeEditor(value) {
|
|
567
|
+
this.CodeEditor = value;
|
|
568
|
+
}
|
|
465
569
|
get _metadata() { return this.ProviderToUse; }
|
|
466
570
|
constructor(notificationService, confirmService) {
|
|
467
571
|
super();
|
|
468
572
|
this.notificationService = notificationService;
|
|
469
573
|
this.confirmService = confirmService;
|
|
470
|
-
this.
|
|
574
|
+
this.Template = null;
|
|
471
575
|
this.config = {
|
|
472
576
|
allowEdit: true,
|
|
473
577
|
showRunButton: false,
|
|
474
578
|
compactMode: false
|
|
475
579
|
};
|
|
476
|
-
this.
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
this.
|
|
485
|
-
this.
|
|
486
|
-
|
|
487
|
-
|
|
580
|
+
this.ContentChange = new EventEmitter();
|
|
581
|
+
/**
|
|
582
|
+
* @deprecated Use {@link ContentChange}.
|
|
583
|
+
*
|
|
584
|
+
* The same emitter under the old binding name, so a template still binding
|
|
585
|
+
* (contentChange) keeps working. Must stay AFTER ContentChange: class fields
|
|
586
|
+
* initialise in order, and the other way round this captures undefined.
|
|
587
|
+
*/
|
|
588
|
+
this.contentChange = this.ContentChange;
|
|
589
|
+
this.RunTemplate = new EventEmitter();
|
|
590
|
+
/**
|
|
591
|
+
* @deprecated Use {@link RunTemplate}.
|
|
592
|
+
*
|
|
593
|
+
* The same emitter under the old binding name, so a template still binding
|
|
594
|
+
* (runTemplate) keeps working. Must stay AFTER RunTemplate: class fields
|
|
595
|
+
* initialise in order, and the other way round this captures undefined.
|
|
596
|
+
*/
|
|
597
|
+
this.runTemplate = this.RunTemplate;
|
|
598
|
+
this.TemplateContents = [];
|
|
599
|
+
this.SelectedContentIndex = 0;
|
|
600
|
+
this.IsAddingNewContent = false;
|
|
601
|
+
this.NewTemplateContent = null;
|
|
602
|
+
this.HasUnsavedChanges = false;
|
|
603
|
+
this.ContentTypeOptions = [];
|
|
604
|
+
this.SupportedLanguages = languages;
|
|
605
|
+
this.IsRunningTemplate = false;
|
|
606
|
+
this.ActiveHelpTab = 'syntax';
|
|
607
|
+
this.ActivePlaceholderCategory = '';
|
|
488
608
|
// System placeholders organized by category
|
|
489
|
-
this.
|
|
490
|
-
this.
|
|
609
|
+
this.PlaceholderCategories = [];
|
|
610
|
+
this.CodeEditor = null;
|
|
491
611
|
this.isUpdatingEditorValue = false;
|
|
492
612
|
this.destroy$ = new Subject();
|
|
493
613
|
this.activeTimeouts = [];
|
|
494
614
|
}
|
|
495
615
|
async ngOnInit() {
|
|
496
|
-
this.
|
|
616
|
+
this.LoadContentTypes();
|
|
497
617
|
this.organizePlaceholdersByCategory();
|
|
498
|
-
if (this.
|
|
499
|
-
await this.
|
|
618
|
+
if (this.Template) {
|
|
619
|
+
await this.LoadTemplateContents();
|
|
500
620
|
}
|
|
501
621
|
}
|
|
502
622
|
async ngOnChanges(changes) {
|
|
503
623
|
if (changes['template']) {
|
|
504
624
|
// Template input has changed, reload contents
|
|
505
|
-
if (this.
|
|
506
|
-
await this.
|
|
625
|
+
if (this.Template) {
|
|
626
|
+
await this.LoadTemplateContents();
|
|
507
627
|
}
|
|
508
628
|
else {
|
|
509
629
|
// Template cleared, reset state
|
|
510
|
-
this.
|
|
511
|
-
this.
|
|
512
|
-
this.
|
|
513
|
-
this.
|
|
514
|
-
this.
|
|
630
|
+
this.TemplateContents = [];
|
|
631
|
+
this.SelectedContentIndex = 0;
|
|
632
|
+
this.IsAddingNewContent = false;
|
|
633
|
+
this.NewTemplateContent = null;
|
|
634
|
+
this.HasUnsavedChanges = false;
|
|
515
635
|
}
|
|
516
636
|
}
|
|
517
637
|
}
|
|
518
638
|
organizePlaceholdersByCategory() {
|
|
519
639
|
// Group placeholders by their category
|
|
520
|
-
this.
|
|
640
|
+
this.PlaceholderCategories = SYSTEM_PLACEHOLDER_CATEGORIES.map(category => {
|
|
521
641
|
const categoryPlaceholders = DEFAULT_SYSTEM_PLACEHOLDERS.filter(placeholder => placeholder.category === category.name);
|
|
522
642
|
return {
|
|
523
643
|
category: category,
|
|
@@ -528,7 +648,7 @@ export class TemplateEditorComponent extends BaseAngularComponent {
|
|
|
528
648
|
const categorized = DEFAULT_SYSTEM_PLACEHOLDERS.filter(p => p.category);
|
|
529
649
|
const uncategorized = DEFAULT_SYSTEM_PLACEHOLDERS.filter(p => !p.category);
|
|
530
650
|
if (uncategorized.length > 0) {
|
|
531
|
-
this.
|
|
651
|
+
this.PlaceholderCategories.push({
|
|
532
652
|
category: {
|
|
533
653
|
name: 'Other',
|
|
534
654
|
icon: 'fa-ellipsis-h',
|
|
@@ -538,14 +658,14 @@ export class TemplateEditorComponent extends BaseAngularComponent {
|
|
|
538
658
|
});
|
|
539
659
|
}
|
|
540
660
|
// Set the first category as active
|
|
541
|
-
if (this.
|
|
542
|
-
this.
|
|
661
|
+
if (this.PlaceholderCategories.length > 0) {
|
|
662
|
+
this.ActivePlaceholderCategory = this.PlaceholderCategories[0].category.name;
|
|
543
663
|
}
|
|
544
664
|
}
|
|
545
665
|
/**
|
|
546
666
|
* Copies a placeholder to the clipboard
|
|
547
667
|
*/
|
|
548
|
-
async
|
|
668
|
+
async CopyPlaceholder(placeholderName) {
|
|
549
669
|
try {
|
|
550
670
|
await navigator.clipboard.writeText(`{{ ${placeholderName} }}`);
|
|
551
671
|
this.notificationService.CreateSimpleNotification('Placeholder copied to clipboard!', 'success', 2000);
|
|
@@ -555,6 +675,10 @@ export class TemplateEditorComponent extends BaseAngularComponent {
|
|
|
555
675
|
this.notificationService.CreateSimpleNotification('Failed to copy placeholder', 'error', 3000);
|
|
556
676
|
}
|
|
557
677
|
}
|
|
678
|
+
/** @deprecated Use {@link CopyPlaceholder}. */
|
|
679
|
+
async copyPlaceholder(placeholderName) {
|
|
680
|
+
return this.CopyPlaceholder(placeholderName);
|
|
681
|
+
}
|
|
558
682
|
ngOnDestroy() {
|
|
559
683
|
this.destroy$.next();
|
|
560
684
|
this.destroy$.complete();
|
|
@@ -566,86 +690,102 @@ export class TemplateEditorComponent extends BaseAngularComponent {
|
|
|
566
690
|
// Initial sync when view is ready
|
|
567
691
|
this.syncEditorValue();
|
|
568
692
|
}
|
|
569
|
-
async
|
|
570
|
-
if (this.
|
|
693
|
+
async LoadTemplateContents() {
|
|
694
|
+
if (this.Template) {
|
|
571
695
|
// Reset state first
|
|
572
|
-
this.
|
|
573
|
-
this.
|
|
574
|
-
this.
|
|
575
|
-
this.
|
|
576
|
-
this.
|
|
577
|
-
if (this.
|
|
696
|
+
this.TemplateContents = [];
|
|
697
|
+
this.SelectedContentIndex = 0;
|
|
698
|
+
this.IsAddingNewContent = false;
|
|
699
|
+
this.NewTemplateContent = null;
|
|
700
|
+
this.HasUnsavedChanges = false;
|
|
701
|
+
if (this.Template.IsSaved && this.Template.ID) {
|
|
578
702
|
// Load existing template contents for saved templates
|
|
579
703
|
try {
|
|
580
704
|
const rv = RunView.FromMetadataProvider(this.ProviderToUse);
|
|
581
705
|
const results = await rv.RunView({
|
|
582
706
|
EntityName: 'MJ: Template Contents',
|
|
583
|
-
ExtraFilter: `TemplateID='${this.
|
|
707
|
+
ExtraFilter: `TemplateID='${this.Template.ID}'`,
|
|
584
708
|
OrderBy: 'Priority ASC, __mj_CreatedAt ASC',
|
|
585
709
|
ResultType: 'entity_object'
|
|
586
710
|
});
|
|
587
|
-
this.
|
|
711
|
+
this.TemplateContents = results.Results;
|
|
588
712
|
}
|
|
589
713
|
catch (error) {
|
|
590
714
|
console.error('Error loading template contents:', error);
|
|
591
715
|
}
|
|
592
716
|
}
|
|
593
717
|
// If we have contents but no selection, select the first one
|
|
594
|
-
if (this.
|
|
595
|
-
this.
|
|
718
|
+
if (this.TemplateContents.length > 0) {
|
|
719
|
+
this.SelectedContentIndex = 0;
|
|
596
720
|
}
|
|
597
721
|
// If no template contents exist (either new template or saved template with no content),
|
|
598
722
|
// create a default one for single-content optimization
|
|
599
|
-
if (this.
|
|
600
|
-
await this.
|
|
723
|
+
if (this.TemplateContents.length === 0) {
|
|
724
|
+
await this.CreateDefaultTemplateContent();
|
|
601
725
|
}
|
|
602
726
|
// Sync editor value after loading content
|
|
603
727
|
this.syncEditorValue();
|
|
604
|
-
this.
|
|
728
|
+
this.ContentChange.emit(this.TemplateContents);
|
|
605
729
|
}
|
|
606
730
|
}
|
|
731
|
+
/** @deprecated Use {@link LoadTemplateContents}. */
|
|
732
|
+
async loadTemplateContents() {
|
|
733
|
+
return this.LoadTemplateContents();
|
|
734
|
+
}
|
|
607
735
|
/**
|
|
608
736
|
* Public method to refresh the template editor and discard unsaved changes
|
|
609
737
|
* This should be called when canceling edits to restore the original state
|
|
610
738
|
*/
|
|
739
|
+
async RefreshAndDiscardChanges() {
|
|
740
|
+
await this.LoadTemplateContents();
|
|
741
|
+
}
|
|
742
|
+
/** @deprecated Use {@link RefreshAndDiscardChanges}. */
|
|
611
743
|
async refreshAndDiscardChanges() {
|
|
612
|
-
|
|
744
|
+
return this.RefreshAndDiscardChanges();
|
|
613
745
|
}
|
|
614
|
-
async
|
|
746
|
+
async CreateDefaultTemplateContent() {
|
|
615
747
|
const defaultContent = await this._metadata.GetEntityObject('MJ: Template Contents');
|
|
616
|
-
defaultContent.TemplateID = this.
|
|
748
|
+
defaultContent.TemplateID = this.Template.ID;
|
|
617
749
|
defaultContent.Priority = 1;
|
|
618
750
|
defaultContent.IsActive = true;
|
|
619
751
|
// Set default to first real content type (skip "Select Type..." if it exists)
|
|
620
|
-
const validContentTypes = this.
|
|
752
|
+
const validContentTypes = this.ContentTypeOptions.filter(option => option.value !== '');
|
|
621
753
|
if (validContentTypes.length > 0) {
|
|
622
754
|
defaultContent.TypeID = validContentTypes[0].value;
|
|
623
755
|
}
|
|
624
|
-
this.
|
|
625
|
-
this.
|
|
756
|
+
this.TemplateContents = [defaultContent];
|
|
757
|
+
this.SelectedContentIndex = 0;
|
|
626
758
|
// Sync editor value after creating default content
|
|
627
759
|
this.syncEditorValue();
|
|
628
760
|
}
|
|
629
|
-
|
|
761
|
+
/** @deprecated Use {@link CreateDefaultTemplateContent}. */
|
|
762
|
+
async createDefaultTemplateContent() {
|
|
763
|
+
return this.CreateDefaultTemplateContent();
|
|
764
|
+
}
|
|
765
|
+
async SelectTemplateContent(index, confirmSwitch = true) {
|
|
630
766
|
// If we're adding new content and user clicks on existing content, ask for confirmation
|
|
631
|
-
if (this.
|
|
767
|
+
if (this.IsAddingNewContent && confirmSwitch) {
|
|
632
768
|
if (!(await this.confirmService.Confirm({ title: 'Discard changes?', message: 'Switch content version and lose your unsaved changes?', detail: 'Your changes to the new content version will be lost.' }))) {
|
|
633
769
|
return;
|
|
634
770
|
}
|
|
635
771
|
}
|
|
636
|
-
if (index >= 0 && index < this.
|
|
637
|
-
this.
|
|
638
|
-
this.
|
|
772
|
+
if (index >= 0 && index < this.TemplateContents.length) {
|
|
773
|
+
this.SelectedContentIndex = index;
|
|
774
|
+
this.IsAddingNewContent = false;
|
|
639
775
|
// Don't clear newTemplateContent to preserve the work in progress
|
|
640
776
|
// Sync editor value when switching content
|
|
641
777
|
this.syncEditorValue();
|
|
642
778
|
}
|
|
643
779
|
}
|
|
644
|
-
|
|
780
|
+
/** @deprecated Use {@link SelectTemplateContent}. */
|
|
781
|
+
async selectTemplateContent(index, confirmSwitch = true) {
|
|
782
|
+
return this.SelectTemplateContent(index, confirmSwitch);
|
|
783
|
+
}
|
|
784
|
+
LoadContentTypes() {
|
|
645
785
|
try {
|
|
646
786
|
// Get content types from TemplateEngine cache
|
|
647
787
|
const contentTypes = TemplateEngineBase.Instance.TemplateContentTypes;
|
|
648
|
-
this.
|
|
788
|
+
this.ContentTypeOptions = [
|
|
649
789
|
{ text: 'Select Type...', value: '' },
|
|
650
790
|
...contentTypes.map(ct => ({
|
|
651
791
|
text: ct.Name,
|
|
@@ -656,7 +796,7 @@ export class TemplateEditorComponent extends BaseAngularComponent {
|
|
|
656
796
|
catch (error) {
|
|
657
797
|
console.error('Error loading content types:', error);
|
|
658
798
|
// Fallback to basic types
|
|
659
|
-
this.
|
|
799
|
+
this.ContentTypeOptions = [
|
|
660
800
|
{ text: 'Select Type...', value: '' },
|
|
661
801
|
{ text: 'HTML', value: 'HTML' },
|
|
662
802
|
{ text: 'Plain Text', value: 'Text' },
|
|
@@ -664,45 +804,53 @@ export class TemplateEditorComponent extends BaseAngularComponent {
|
|
|
664
804
|
];
|
|
665
805
|
}
|
|
666
806
|
}
|
|
667
|
-
|
|
807
|
+
/** @deprecated Use {@link LoadContentTypes}. */
|
|
808
|
+
loadContentTypes() {
|
|
809
|
+
return this.LoadContentTypes();
|
|
810
|
+
}
|
|
811
|
+
async AddNewTemplateContent() {
|
|
668
812
|
if (!this.config.allowEdit)
|
|
669
813
|
return;
|
|
670
|
-
this.
|
|
671
|
-
this.
|
|
672
|
-
this.
|
|
673
|
-
this.
|
|
814
|
+
this.NewTemplateContent = await this._metadata.GetEntityObject('MJ: Template Contents');
|
|
815
|
+
this.NewTemplateContent.TemplateID = this.Template.ID;
|
|
816
|
+
this.NewTemplateContent.Priority = this.TemplateContents.length + 1;
|
|
817
|
+
this.NewTemplateContent.IsActive = true;
|
|
674
818
|
// Set default to first real content type (skip "Select Type..." if it exists)
|
|
675
|
-
const validContentTypes = this.
|
|
819
|
+
const validContentTypes = this.ContentTypeOptions.filter(option => option.value !== '');
|
|
676
820
|
if (validContentTypes.length > 0) {
|
|
677
|
-
this.
|
|
821
|
+
this.NewTemplateContent.TypeID = validContentTypes[0].value;
|
|
678
822
|
}
|
|
679
|
-
this.
|
|
823
|
+
this.NewTemplateContent.TemplateText = '';
|
|
680
824
|
// Add immediately to the array
|
|
681
|
-
this.
|
|
682
|
-
this.
|
|
683
|
-
this.
|
|
825
|
+
this.TemplateContents.push(this.NewTemplateContent);
|
|
826
|
+
this.SelectedContentIndex = this.TemplateContents.length - 1;
|
|
827
|
+
this.IsAddingNewContent = true;
|
|
684
828
|
// Sync editor value when adding new content
|
|
685
829
|
this.syncEditorValue();
|
|
686
830
|
}
|
|
687
|
-
|
|
688
|
-
|
|
831
|
+
/** @deprecated Use {@link AddNewTemplateContent}. */
|
|
832
|
+
async addNewTemplateContent() {
|
|
833
|
+
return this.AddNewTemplateContent();
|
|
834
|
+
}
|
|
835
|
+
async DeleteTemplateContent(index) {
|
|
836
|
+
if (!this.config.allowEdit || index < 0 || index >= this.TemplateContents.length)
|
|
689
837
|
return;
|
|
690
|
-
const contentToDelete = this.
|
|
838
|
+
const contentToDelete = this.TemplateContents[index];
|
|
691
839
|
// Check if the entity is actually saved, not just if it has an ID
|
|
692
840
|
if (contentToDelete.IsSaved) {
|
|
693
841
|
try {
|
|
694
842
|
const result = await contentToDelete.Delete();
|
|
695
843
|
if (result) {
|
|
696
|
-
this.
|
|
844
|
+
this.TemplateContents.splice(index, 1);
|
|
697
845
|
// Adjust selected index if necessary
|
|
698
|
-
if (this.
|
|
699
|
-
this.
|
|
846
|
+
if (this.SelectedContentIndex >= this.TemplateContents.length) {
|
|
847
|
+
this.SelectedContentIndex = Math.max(0, this.TemplateContents.length - 1);
|
|
700
848
|
}
|
|
701
849
|
// If no contents remain, create a default one
|
|
702
|
-
if (this.
|
|
703
|
-
await this.
|
|
850
|
+
if (this.TemplateContents.length === 0) {
|
|
851
|
+
await this.CreateDefaultTemplateContent();
|
|
704
852
|
}
|
|
705
|
-
this.
|
|
853
|
+
this.ContentChange.emit(this.TemplateContents);
|
|
706
854
|
}
|
|
707
855
|
else {
|
|
708
856
|
MJNotificationService.Instance.CreateSimpleNotification(`Failed to delete template content. ${contentToDelete.LatestResult?.Message}`, 'error');
|
|
@@ -715,53 +863,77 @@ export class TemplateEditorComponent extends BaseAngularComponent {
|
|
|
715
863
|
}
|
|
716
864
|
else {
|
|
717
865
|
// Not saved yet, just remove from array
|
|
718
|
-
this.
|
|
719
|
-
if (this.
|
|
720
|
-
this.
|
|
866
|
+
this.TemplateContents.splice(index, 1);
|
|
867
|
+
if (this.SelectedContentIndex >= this.TemplateContents.length) {
|
|
868
|
+
this.SelectedContentIndex = Math.max(0, this.TemplateContents.length - 1);
|
|
721
869
|
}
|
|
722
870
|
// Reset adding new content state if we're deleting the new content
|
|
723
|
-
if (this.
|
|
724
|
-
this.
|
|
725
|
-
this.
|
|
871
|
+
if (this.IsAddingNewContent && index === this.TemplateContents.length) {
|
|
872
|
+
this.IsAddingNewContent = false;
|
|
873
|
+
this.NewTemplateContent = null;
|
|
726
874
|
}
|
|
727
|
-
this.
|
|
875
|
+
this.ContentChange.emit(this.TemplateContents);
|
|
728
876
|
}
|
|
729
877
|
}
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
878
|
+
/** @deprecated Use {@link DeleteTemplateContent}. */
|
|
879
|
+
async deleteTemplateContent(index) {
|
|
880
|
+
return this.DeleteTemplateContent(index);
|
|
881
|
+
}
|
|
882
|
+
get CurrentTemplateContent() {
|
|
883
|
+
if (this.IsAddingNewContent) {
|
|
884
|
+
return this.NewTemplateContent;
|
|
733
885
|
}
|
|
734
|
-
return this.
|
|
886
|
+
return this.TemplateContents[this.SelectedContentIndex] || null;
|
|
887
|
+
}
|
|
888
|
+
/** @deprecated Use {@link CurrentTemplateContent}. */
|
|
889
|
+
get currentTemplateContent() {
|
|
890
|
+
return this.CurrentTemplateContent;
|
|
891
|
+
}
|
|
892
|
+
get HasMultipleContents() {
|
|
893
|
+
return this.TemplateContents.length > 1 || this.IsAddingNewContent;
|
|
735
894
|
}
|
|
895
|
+
/** @deprecated Use {@link HasMultipleContents}. */
|
|
736
896
|
get hasMultipleContents() {
|
|
737
|
-
return this.
|
|
897
|
+
return this.HasMultipleContents;
|
|
738
898
|
}
|
|
739
|
-
|
|
899
|
+
OnContentTypeChange() {
|
|
740
900
|
// Content type changes just modify the current content, no new record creation
|
|
741
901
|
this.updateUnsavedChangesFlag();
|
|
742
902
|
}
|
|
743
|
-
|
|
903
|
+
/** @deprecated Use {@link OnContentTypeChange}. */
|
|
904
|
+
onContentTypeChange() {
|
|
905
|
+
return this.OnContentTypeChange();
|
|
906
|
+
}
|
|
907
|
+
OnContentChange() {
|
|
744
908
|
this.updateUnsavedChangesFlag();
|
|
745
909
|
}
|
|
910
|
+
/** @deprecated Use {@link OnContentChange}. */
|
|
911
|
+
onContentChange() {
|
|
912
|
+
return this.OnContentChange();
|
|
913
|
+
}
|
|
746
914
|
/**
|
|
747
915
|
* Updates the hasUnsavedChanges flag based on entity dirty states
|
|
748
916
|
*/
|
|
749
917
|
updateUnsavedChangesFlag() {
|
|
750
|
-
this.
|
|
751
|
-
this.
|
|
918
|
+
this.HasUnsavedChanges = this.TemplateContents.some(content => content.Dirty) ||
|
|
919
|
+
this.IsAddingNewContent;
|
|
752
920
|
}
|
|
753
|
-
|
|
921
|
+
OnTemplateTextChange(event) {
|
|
754
922
|
if (this.isUpdatingEditorValue) {
|
|
755
923
|
// Ignore change events when we're programmatically updating the editor
|
|
756
924
|
return;
|
|
757
925
|
}
|
|
758
|
-
if (this.
|
|
926
|
+
if (this.CurrentTemplateContent) {
|
|
759
927
|
// Extract value from event - might be event.target.value or just event depending on component
|
|
760
928
|
const value = typeof event === 'string' ? event : (event.target?.value || event);
|
|
761
|
-
this.
|
|
929
|
+
this.CurrentTemplateContent.TemplateText = value;
|
|
762
930
|
this.updateUnsavedChangesFlag();
|
|
763
931
|
}
|
|
764
932
|
}
|
|
933
|
+
/** @deprecated Use {@link OnTemplateTextChange}. */
|
|
934
|
+
onTemplateTextChange(event) {
|
|
935
|
+
return this.OnTemplateTextChange(event);
|
|
936
|
+
}
|
|
765
937
|
/**
|
|
766
938
|
* Helper method to track setTimeout calls for cleanup
|
|
767
939
|
*/
|
|
@@ -785,26 +957,26 @@ export class TemplateEditorComponent extends BaseAngularComponent {
|
|
|
785
957
|
Promise.resolve().then(() => {
|
|
786
958
|
// Then tracked setTimeout for the next macrotask to ensure DOM is updated
|
|
787
959
|
this.setTrackedTimeout(() => {
|
|
788
|
-
if (!this.
|
|
960
|
+
if (!this.CodeEditor) {
|
|
789
961
|
return;
|
|
790
962
|
}
|
|
791
963
|
this.isUpdatingEditorValue = true;
|
|
792
|
-
const newValue = this.
|
|
964
|
+
const newValue = this.CurrentTemplateContent?.TemplateText || '';
|
|
793
965
|
// Use the setValue method from mj-code-editor component
|
|
794
|
-
this.
|
|
966
|
+
this.CodeEditor.setValue(newValue);
|
|
795
967
|
this.isUpdatingEditorValue = false;
|
|
796
968
|
}, 0);
|
|
797
969
|
});
|
|
798
970
|
}
|
|
799
|
-
async
|
|
971
|
+
async SaveTemplateContents() {
|
|
800
972
|
if (!this.config.allowEdit)
|
|
801
973
|
return false;
|
|
802
974
|
try {
|
|
803
975
|
// Ensure FK is set on all contents, then persist the dirty/new ones atomically
|
|
804
|
-
for (const content of this.
|
|
805
|
-
content.TemplateID = this.
|
|
976
|
+
for (const content of this.TemplateContents) {
|
|
977
|
+
content.TemplateID = this.Template.ID;
|
|
806
978
|
}
|
|
807
|
-
const toSave = this.
|
|
979
|
+
const toSave = this.TemplateContents.filter(c => c.Dirty || !c.ID);
|
|
808
980
|
if (toSave.length > 0) {
|
|
809
981
|
const tg = await this._metadata.CreateTransactionGroup();
|
|
810
982
|
for (const content of toSave) {
|
|
@@ -817,10 +989,10 @@ export class TemplateEditorComponent extends BaseAngularComponent {
|
|
|
817
989
|
return false;
|
|
818
990
|
}
|
|
819
991
|
}
|
|
820
|
-
this.
|
|
821
|
-
this.
|
|
992
|
+
this.IsAddingNewContent = false;
|
|
993
|
+
this.NewTemplateContent = null;
|
|
822
994
|
this.updateUnsavedChangesFlag();
|
|
823
|
-
this.
|
|
995
|
+
this.ContentChange.emit(this.TemplateContents);
|
|
824
996
|
return true;
|
|
825
997
|
}
|
|
826
998
|
catch (error) {
|
|
@@ -828,17 +1000,25 @@ export class TemplateEditorComponent extends BaseAngularComponent {
|
|
|
828
1000
|
return false;
|
|
829
1001
|
}
|
|
830
1002
|
}
|
|
831
|
-
|
|
1003
|
+
/** @deprecated Use {@link SaveTemplateContents}. */
|
|
1004
|
+
async saveTemplateContents() {
|
|
1005
|
+
return this.SaveTemplateContents();
|
|
1006
|
+
}
|
|
1007
|
+
GetContentTypeDisplayText(typeId) {
|
|
832
1008
|
if (!typeId)
|
|
833
1009
|
return '-';
|
|
834
|
-
const option = this.
|
|
1010
|
+
const option = this.ContentTypeOptions.find(opt => opt.value === typeId);
|
|
835
1011
|
return option ? option.text : typeId;
|
|
836
1012
|
}
|
|
837
|
-
|
|
838
|
-
|
|
1013
|
+
/** @deprecated Use {@link GetContentTypeDisplayText}. */
|
|
1014
|
+
getContentTypeDisplayText(typeId) {
|
|
1015
|
+
return this.GetContentTypeDisplayText(typeId);
|
|
1016
|
+
}
|
|
1017
|
+
GetEditorLanguage() {
|
|
1018
|
+
if (!this.CurrentTemplateContent?.TypeID) {
|
|
839
1019
|
return 'jinja2'; // default to jinja2 for template syntax (compatible with Nunjucks)
|
|
840
1020
|
}
|
|
841
|
-
const contentType = this.
|
|
1021
|
+
const contentType = this.CurrentTemplateContent.TypeID.toLowerCase();
|
|
842
1022
|
// Map content types to CodeMirror language modes
|
|
843
1023
|
switch (contentType) {
|
|
844
1024
|
case 'html':
|
|
@@ -863,36 +1043,48 @@ export class TemplateEditorComponent extends BaseAngularComponent {
|
|
|
863
1043
|
return 'jinja2'; // Default to jinja2 since templates often contain template syntax
|
|
864
1044
|
}
|
|
865
1045
|
}
|
|
1046
|
+
/** @deprecated Use {@link GetEditorLanguage}. */
|
|
1047
|
+
getEditorLanguage() {
|
|
1048
|
+
return this.GetEditorLanguage();
|
|
1049
|
+
}
|
|
866
1050
|
/**
|
|
867
1051
|
* Test run the current template using the parameter dialog
|
|
868
1052
|
*/
|
|
869
|
-
async
|
|
870
|
-
if (!this.
|
|
1053
|
+
async OnRunTemplate() {
|
|
1054
|
+
if (!this.Template?.IsSaved || !this.CurrentTemplateContent) {
|
|
871
1055
|
MJNotificationService.Instance.CreateSimpleNotification('Please save the template before running it.', 'warning');
|
|
872
1056
|
return;
|
|
873
1057
|
}
|
|
874
1058
|
// Save any unsaved changes first
|
|
875
|
-
if (this.
|
|
876
|
-
const saveResult = await this.
|
|
1059
|
+
if (this.HasUnsavedChanges) {
|
|
1060
|
+
const saveResult = await this.SaveTemplateContents();
|
|
877
1061
|
if (!saveResult) {
|
|
878
1062
|
MJNotificationService.Instance.CreateSimpleNotification('Failed to save template changes.', 'error');
|
|
879
1063
|
return;
|
|
880
1064
|
}
|
|
881
1065
|
}
|
|
882
1066
|
// Emit the run template event
|
|
883
|
-
this.
|
|
1067
|
+
this.RunTemplate.emit(this.Template);
|
|
884
1068
|
}
|
|
885
|
-
|
|
1069
|
+
/** @deprecated Use {@link OnRunTemplate}. */
|
|
1070
|
+
async onRunTemplate() {
|
|
1071
|
+
return this.OnRunTemplate();
|
|
1072
|
+
}
|
|
1073
|
+
GetContentTypeOptionsForContent() {
|
|
886
1074
|
// Always exclude "Select Type..." option for all content
|
|
887
|
-
return this.
|
|
1075
|
+
return this.ContentTypeOptions.filter(option => option.value !== '');
|
|
1076
|
+
}
|
|
1077
|
+
/** @deprecated Use {@link GetContentTypeOptionsForContent}. */
|
|
1078
|
+
getContentTypeOptionsForContent() {
|
|
1079
|
+
return this.GetContentTypeOptionsForContent();
|
|
888
1080
|
}
|
|
889
1081
|
static { this.ɵfac = function TemplateEditorComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || TemplateEditorComponent)(i0.ɵɵdirectiveInject(i1.MJNotificationService), i0.ɵɵdirectiveInject(i2.MJConfirmService)); }; }
|
|
890
1082
|
static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: TemplateEditorComponent, selectors: [["mj-template-editor"]], viewQuery: function TemplateEditorComponent_Query(rf, ctx) { if (rf & 1) {
|
|
891
1083
|
i0.ɵɵviewQuery(_c0, 5);
|
|
892
1084
|
} if (rf & 2) {
|
|
893
1085
|
let _t;
|
|
894
|
-
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.
|
|
895
|
-
} }, inputs: { template: "template", config: "config" }, outputs: { contentChange: "contentChange", runTemplate: "runTemplate" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature, i0.ɵɵNgOnChangesFeature], decls: 1, vars: 1, consts: [["codeEditor", ""], [1, "template-editor", 2, "height", "100%", "display", "flex", "flex-direction", "column"], [1, "content-versions-tabs"], [1, "content-editor-container"], [1, "no-content-state"], [1, "content-tabs"], [1, "content-version-tab", 3, "active"], [1, "content-version-tab", "adding-new"], ["title", "Add new template content", 1, "content-version-tab", "add-new"], [1, "content-version-tab", 3, "click"], [2, "flex", "1"], [1, "tab-label"], [1, "tab-meta"], ["type", "button", "title", "Delete this content version", 1, "delete-btn"], [1, "inactive-label"], ["type", "button", "title", "Delete this content version", 1, "delete-btn", 3, "click"], [1, "fa-solid", "fa-trash", "fa-xs"], [1, "fa-solid", "fa-plus", "text-success"], [1, "new-label"], ["title", "Add new template content", 1, "content-version-tab", "add-new", 3, "click"], [1, "fa-solid", "fa-plus"], [1, "content-metadata-bar"], [1, "metadata-grid"], [1, "form-group"], ["for", "contentType", 1, "form-label"], [1, "fa-solid", "fa-tag"], ["name", "contentType", "TextField", "text", "ValueField", "value", 3, "ngModel", "Data", "ValuePrimitive"], [1, "form-control-plaintext"], ["for", "priority", 1, "form-label"], [1, "fa-solid", "fa-sort-numeric-up"], ["name", "priority", 3, "ngModel", "Min", "Step", "Format"], [1, "form-label"], [1, "fa-solid", "fa-toggle-on"], [1, "form-check"], [1, "content-text-editor"], [1, "editor-header"], ["for", "templateContent", 1, "editor-label"], [1, "fa-solid", "fa-code"], [1, "content-type-badge"], [1, "editor-actions"], [1, "unsaved-indicator"], ["type", "button", "title", "Test run this template", 1, "run-btn", 3, "disabled"], [1, "code-editor-wrapper", 3, "change", "readonly", "language", "languages"], [1, "template-help-section"], ["name", "contentType", "TextField", "text", "ValueField", "value", 3, "ngModelChange", "ValueChange", "ngModel", "Data", "ValuePrimitive"], ["name", "priority", 3, "ngModelChange", "ngModel", "Min", "Step", "Format"], ["type", "checkbox", "id", "isActive", "name", "isActive", 1, "form-check-input", 3, "ngModelChange", "ngModel"], ["for", "isActive", 1, "form-check-label"], [1, "badge-success"], [1, "badge-secondary"], [1, "fa-solid", "fa-check-circle"], [1, "fa-solid", "fa-pause-circle"], [1, "fa-solid", "fa-circle"], ["type", "button", "title", "Test run this template", 1, "run-btn", 3, "click", "disabled"], [1, "fa-solid", "fa-spinner", "fa-spin"], [1, "fa-solid", "fa-play"], [1, "help-tabs"], ["type", "button", 1, "help-tab", 3, "click"], [1, "fa-solid", "fa-at"], [1, "help-content"], [1, "syntax-help"], [1, "placeholders-help"], [1, "section-title"], [1, "fa-solid", "fa-lightbulb"], [1, "syntax-grid"], [1, "syntax-item"], [1, "placeholders-description"], [1, "category-tabs"], ["type", "button", 1, "category-tab", 3, "active"], [1, "placeholder-content"], [1, "usage-example"], [1, "usage-example-inner"], [1, "fa-solid", "fa-info-circle"], [1, "usage-example-text"], ["type", "button", 1, "category-tab", 3, "click"], [2, "font-size", "0.9em"], [1, "tab-badge"], [1, "category-header"], [1, "placeholder-grid"], [1, "placeholder-item"], [1, "placeholder-item-inner"], [1, "placeholder-name-row"], [1, "placeholder-code"], ["type", "button", "title", "Copy placeholder to clipboard", 1, "copy-btn", 3, "click"], [1, "fa-solid", "fa-copy"], [1, "placeholder-description"], [1, "fa-solid", "fa-file-plus"], ["type", "button", 1, "btn", "btn-primary"], ["type", "button", 1, "btn", "btn-primary", 3, "click"]], template: function TemplateEditorComponent_Template(rf, ctx) { if (rf & 1) {
|
|
1086
|
+
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.CodeEditor = _t.first);
|
|
1087
|
+
} }, inputs: { Template: "Template", template: "template", config: "config" }, outputs: { ContentChange: "ContentChange", contentChange: "contentChange", RunTemplate: "RunTemplate", runTemplate: "runTemplate" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature, i0.ɵɵNgOnChangesFeature], decls: 1, vars: 1, consts: [["codeEditor", ""], [1, "template-editor", 2, "height", "100%", "display", "flex", "flex-direction", "column"], [1, "content-versions-tabs"], [1, "content-editor-container"], [1, "no-content-state"], [1, "content-tabs"], [1, "content-version-tab", 3, "active"], [1, "content-version-tab", "adding-new"], ["title", "Add new template content", 1, "content-version-tab", "add-new"], [1, "content-version-tab", 3, "click"], [2, "flex", "1"], [1, "tab-label"], [1, "tab-meta"], ["type", "button", "title", "Delete this content version", 1, "delete-btn"], [1, "inactive-label"], ["type", "button", "title", "Delete this content version", 1, "delete-btn", 3, "click"], [1, "fa-solid", "fa-trash", "fa-xs"], [1, "fa-solid", "fa-plus", "text-success"], [1, "new-label"], ["title", "Add new template content", 1, "content-version-tab", "add-new", 3, "click"], [1, "fa-solid", "fa-plus"], [1, "content-metadata-bar"], [1, "metadata-grid"], [1, "form-group"], ["for", "contentType", 1, "form-label"], [1, "fa-solid", "fa-tag"], ["name", "contentType", "TextField", "text", "ValueField", "value", 3, "ngModel", "Data", "ValuePrimitive"], [1, "form-control-plaintext"], ["for", "priority", 1, "form-label"], [1, "fa-solid", "fa-sort-numeric-up"], ["name", "priority", 3, "ngModel", "Min", "Step", "Format"], [1, "form-label"], [1, "fa-solid", "fa-toggle-on"], [1, "form-check"], [1, "content-text-editor"], [1, "editor-header"], ["for", "templateContent", 1, "editor-label"], [1, "fa-solid", "fa-code"], [1, "content-type-badge"], [1, "editor-actions"], [1, "unsaved-indicator"], ["type", "button", "title", "Test run this template", 1, "run-btn", 3, "disabled"], [1, "code-editor-wrapper", 3, "change", "readonly", "language", "languages"], [1, "template-help-section"], ["name", "contentType", "TextField", "text", "ValueField", "value", 3, "ngModelChange", "ValueChange", "ngModel", "Data", "ValuePrimitive"], ["name", "priority", 3, "ngModelChange", "ngModel", "Min", "Step", "Format"], ["type", "checkbox", "id", "isActive", "name", "isActive", 1, "form-check-input", 3, "ngModelChange", "ngModel"], ["for", "isActive", 1, "form-check-label"], [1, "badge-success"], [1, "badge-secondary"], [1, "fa-solid", "fa-check-circle"], [1, "fa-solid", "fa-pause-circle"], [1, "fa-solid", "fa-circle"], ["type", "button", "title", "Test run this template", 1, "run-btn", 3, "click", "disabled"], [1, "fa-solid", "fa-spinner", "fa-spin"], [1, "fa-solid", "fa-play"], [1, "help-tabs"], ["type", "button", 1, "help-tab", 3, "click"], [1, "fa-solid", "fa-at"], [1, "help-content"], [1, "syntax-help"], [1, "placeholders-help"], [1, "section-title"], [1, "fa-solid", "fa-lightbulb"], [1, "syntax-grid"], [1, "syntax-item"], [1, "placeholders-description"], [1, "category-tabs"], ["type", "button", 1, "category-tab", 3, "active"], [1, "placeholder-content"], [1, "usage-example"], [1, "usage-example-inner"], [1, "fa-solid", "fa-info-circle"], [1, "usage-example-text"], ["type", "button", 1, "category-tab", 3, "click"], [2, "font-size", "0.9em"], [1, "tab-badge"], [1, "category-header"], [1, "placeholder-grid"], [1, "placeholder-item"], [1, "placeholder-item-inner"], [1, "placeholder-name-row"], [1, "placeholder-code"], ["type", "button", "title", "Copy placeholder to clipboard", 1, "copy-btn", 3, "click"], [1, "fa-solid", "fa-copy"], [1, "placeholder-description"], [1, "fa-solid", "fa-file-plus"], ["type", "button", 1, "btn", "btn-primary"], ["type", "button", 1, "btn", "btn-primary", 3, "click"]], template: function TemplateEditorComponent_Template(rf, ctx) { if (rf & 1) {
|
|
896
1088
|
i0.ɵɵconditionalCreate(0, TemplateEditorComponent_Conditional_0_Template, 4, 2, "div", 1);
|
|
897
1089
|
} if (rf & 2) {
|
|
898
1090
|
i0.ɵɵconditional(ctx.template ? 0 : -1);
|
|
@@ -901,15 +1093,21 @@ export class TemplateEditorComponent extends BaseAngularComponent {
|
|
|
901
1093
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(TemplateEditorComponent, [{
|
|
902
1094
|
type: Component,
|
|
903
1095
|
args: [{ standalone: false, selector: 'mj-template-editor', template: "@if (template) {\n <div class=\"template-editor\" style=\"height: 100%; display: flex; flex-direction: column;\">\n <!-- Content Versions List/Tabs -->\n @if (templateContents.length > 0) {\n <div class=\"content-versions-tabs\">\n <div class=\"content-tabs\">\n @for (content of templateContents; track content.ID || $index; let i = $index) {\n <div class=\"content-version-tab\"\n [class.active]=\"selectedContentIndex === i && !isAddingNewContent\"\n (click)=\"selectTemplateContent(i, false)\">\n <div style=\"flex: 1;\">\n <div class=\"tab-label\">\n {{ content.Type || 'Version ' + (i + 1) }}\n </div>\n <div class=\"tab-meta\">\n P:{{ content.Priority }}\n @if (!content.IsActive) {\n \u2022 <span class=\"inactive-label\">Inactive</span>\n }\n </div>\n </div>\n @if (templateContents.length > 1 && config.allowEdit) {\n <button type=\"button\"\n (click)=\"deleteTemplateContent(i); $event.stopPropagation()\"\n class=\"delete-btn\"\n title=\"Delete this content version\">\n <i class=\"fa-solid fa-trash fa-xs\"></i>\n </button>\n }\n </div>\n }\n @if (isAddingNewContent) {\n <div class=\"content-version-tab adding-new\">\n <i class=\"fa-solid fa-plus text-success\"></i>\n <span class=\"new-label\">New</span>\n </div>\n }\n <!-- Add New Content (Edit Mode Only) -->\n @if (config.allowEdit && !isAddingNewContent) {\n <div class=\"content-version-tab add-new\"\n (click)=\"addNewTemplateContent()\"\n title=\"Add new template content\">\n <i class=\"fa-solid fa-plus\"></i>\n <span>New</span>\n </div>\n }\n </div>\n </div>\n }\n <!-- Content Editor -->\n @if (currentTemplateContent) {\n <div class=\"content-editor-container\">\n <!-- Content Metadata Bar -->\n <div class=\"content-metadata-bar\">\n <div class=\"metadata-grid\">\n <div class=\"form-group\">\n <label for=\"contentType\" class=\"form-label\">\n <i class=\"fa-solid fa-tag\"></i> Content Type\n </label>\n @if (config.allowEdit) {\n <mj-dropdown [(ngModel)]=\"currentTemplateContent.TypeID\"\n name=\"contentType\"\n [Data]=\"getContentTypeOptionsForContent()\"\n TextField=\"text\"\n ValueField=\"value\"\n [ValuePrimitive]=\"true\"\n (ValueChange)=\"onContentTypeChange()\">\n </mj-dropdown>\n } @else {\n <div class=\"form-control-plaintext\">\n {{ getContentTypeDisplayText(currentTemplateContent.TypeID) }}\n </div>\n }\n </div>\n <div class=\"form-group\">\n <label for=\"priority\" class=\"form-label\">\n <i class=\"fa-solid fa-sort-numeric-up\"></i> Priority\n </label>\n @if (config.allowEdit) {\n <mj-numeric-input [(ngModel)]=\"currentTemplateContent.Priority\"\n name=\"priority\"\n [Min]=\"1\"\n [Step]=\"1\"\n [Format]=\"'n0'\">\n </mj-numeric-input>\n } @else {\n <div class=\"form-control-plaintext\">\n {{ currentTemplateContent.Priority || '-' }}\n </div>\n }\n </div>\n <div class=\"form-group\">\n <label class=\"form-label\">\n <i class=\"fa-solid fa-toggle-on\"></i> Status\n </label>\n @if (config.allowEdit) {\n <div class=\"form-check\">\n <input type=\"checkbox\"\n id=\"isActive\"\n class=\"form-check-input\"\n [(ngModel)]=\"currentTemplateContent.IsActive\"\n name=\"isActive\">\n <label class=\"form-check-label\" for=\"isActive\">\n Active\n </label>\n </div>\n } @else {\n <div class=\"form-control-plaintext\">\n @if (currentTemplateContent.IsActive) {\n <span class=\"badge-success\">\n <i class=\"fa-solid fa-check-circle\"></i> Active\n </span>\n } @else {\n <span class=\"badge-secondary\">\n <i class=\"fa-solid fa-pause-circle\"></i> Inactive\n </span>\n }\n </div>\n }\n </div>\n </div>\n </div>\n <!-- Content Text Editor -->\n <div class=\"content-text-editor\">\n <div class=\"editor-header\">\n <label for=\"templateContent\" class=\"editor-label\">\n <i class=\"fa-solid fa-code\"></i> Template Content\n <span class=\"content-type-badge\"\n [class.new]=\"!currentTemplateContent.ID\"\n [class.existing]=\"!!currentTemplateContent.ID\">\n @if (!currentTemplateContent.ID) {\n New\n } @else {\n {{ getContentTypeDisplayText(currentTemplateContent.TypeID) }}\n }\n </span>\n </label>\n <div class=\"editor-actions\">\n @if (!isAddingNewContent && hasUnsavedChanges) {\n <span class=\"unsaved-indicator\">\n <i class=\"fa-solid fa-circle\"></i>\n Unsaved changes\n </span>\n }\n @if (template.IsSaved && currentTemplateContent && config.showRunButton) {\n <button type=\"button\"\n class=\"run-btn\"\n [disabled]=\"isRunningTemplate\"\n (click)=\"onRunTemplate()\"\n title=\"Test run this template\">\n @if (isRunningTemplate) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n Running...\n } @else {\n <i class=\"fa-solid fa-play\"></i>\n Run\n }\n </button>\n }\n </div>\n </div>\n <mj-code-editor\n #codeEditor\n (change)=\"onTemplateTextChange($event)\"\n [readonly]=\"!config.allowEdit\"\n [language]=\"getEditorLanguage()\"\n [languages]=\"supportedLanguages\"\n class=\"code-editor-wrapper\">\n </mj-code-editor>\n <!-- Template Help Section with Tabs -->\n @if (!config.compactMode) {\n <div class=\"template-help-section\">\n <!-- Tab Navigation -->\n <div class=\"help-tabs\">\n <button type=\"button\"\n class=\"help-tab\"\n [class.active]=\"activeHelpTab === 'syntax'\"\n (click)=\"activeHelpTab = 'syntax'\">\n <i class=\"fa-solid fa-code\"></i> Template Syntax\n </button>\n <button type=\"button\"\n class=\"help-tab\"\n [class.active]=\"activeHelpTab === 'placeholders'\"\n (click)=\"activeHelpTab = 'placeholders'\">\n <i class=\"fa-solid fa-at\"></i> System Placeholders\n </button>\n </div>\n <!-- Tab Content -->\n <div class=\"help-content\">\n <!-- Template Syntax Tab -->\n @if (activeHelpTab === 'syntax') {\n <div class=\"syntax-help\">\n <div class=\"section-title\">\n <i class=\"fa-solid fa-lightbulb\"></i> Template Syntax Quick Reference\n </div>\n <div class=\"syntax-grid\">\n <div>\n <div class=\"syntax-item\">\n <strong>Parameters:</strong><br>\n <code>{{'{{'}} paramName {{'}}'}}</code>\n </div>\n <div>\n <strong>Template Includes:</strong><br>\n <code>{{'{% template \"TemplateName\" %}'}}</code>\n </div>\n </div>\n <div>\n <div class=\"syntax-item\">\n <strong>Conditionals:</strong><br>\n <code>{{'{% if condition %}'}} ... {{'{% endif %}'}}</code>\n </div>\n <div>\n <strong>Loops:</strong><br>\n <code>{{'{% for item in items %}'}} ... {{'{% endfor %}'}}</code>\n </div>\n </div>\n </div>\n </div>\n }\n <!-- System Placeholders Tab -->\n @if (activeHelpTab === 'placeholders') {\n <div class=\"placeholders-help\">\n <div class=\"section-title\">\n <i class=\"fa-solid fa-at\"></i> System Placeholders Reference\n </div>\n <p class=\"placeholders-description\">\n System placeholders are automatically available in all AI prompt templates. Simply use them in your template text and they will be replaced with their current values at execution time.\n </p>\n <!-- Category Sub-tabs -->\n <div class=\"category-tabs\">\n @for (categoryGroup of placeholderCategories; track categoryGroup.category.name) {\n <button type=\"button\"\n class=\"category-tab\"\n [class.active]=\"activePlaceholderCategory === categoryGroup.category.name\"\n (click)=\"activePlaceholderCategory = categoryGroup.category.name\">\n <i [class]=\"'fa-solid ' + categoryGroup.category.icon\" style=\"font-size: 0.9em;\"></i>\n {{ categoryGroup.category.name }}\n <span class=\"tab-badge\">\n {{ categoryGroup.placeholders.length }}\n </span>\n </button>\n }\n </div>\n <!-- Active Category Content -->\n <div class=\"placeholder-content\">\n @for (categoryGroup of placeholderCategories; track categoryGroup.category.name) {\n @if (activePlaceholderCategory === categoryGroup.category.name) {\n <div class=\"category-header\">\n <i [class]=\"'fa-solid ' + categoryGroup.category.icon\"\n [style.color]=\"categoryGroup.category.color\"></i>\n <h5>{{ categoryGroup.category.name }}</h5>\n </div>\n <div class=\"placeholder-grid\">\n @for (placeholder of categoryGroup.placeholders; track placeholder.name) {\n <div class=\"placeholder-item\">\n <div class=\"placeholder-item-inner\">\n <div>\n <div class=\"placeholder-name-row\">\n <code class=\"placeholder-code\">{{'{{'}} {{ placeholder.name }} {{'}}'}}</code>\n <button type=\"button\"\n class=\"copy-btn\"\n (click)=\"copyPlaceholder(placeholder.name)\"\n title=\"Copy placeholder to clipboard\">\n <i class=\"fa-solid fa-copy\"></i>\n </button>\n </div>\n @if (placeholder.description) {\n <div class=\"placeholder-description\">{{ placeholder.description }}</div>\n }\n </div>\n </div>\n </div>\n }\n </div>\n }\n }\n </div>\n <!-- Usage Example -->\n <div class=\"usage-example\">\n <div class=\"usage-example-inner\">\n <i class=\"fa-solid fa-info-circle\"></i>\n <div class=\"usage-example-text\">\n <strong>Usage Example:</strong> To use a system placeholder in your template, simply include it in double curly braces.\n For example: <code>\"Today is {{'{{'}} _CURRENT_DATE {{'}}'}} and the current user is {{'{{'}} _USER_NAME {{'}}'}}\"</code>\n </div>\n </div>\n </div>\n </div>\n }\n </div>\n </div>\n }\n </div>\n </div>\n } @else {\n <!-- No Content State -->\n <div class=\"no-content-state\">\n <i class=\"fa-solid fa-file-plus\"></i>\n <h5>No Template Content</h5>\n <p>Create your first template content version to get started.</p>\n @if (config.allowEdit) {\n <button type=\"button\"\n (click)=\"addNewTemplateContent()\"\n class=\"btn btn-primary\">\n <i class=\"fa-solid fa-plus\"></i> Create First Content Version\n </button>\n }\n </div>\n }\n </div>\n}\n", styles: [".template-editor {\n font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;\n}\n\n.section-header h6 {\n font-size: 0.9em;\n}\n\n.param-row:hover {\n background-color: var(--mj-bg-surface-card) !important;\n}\n\n.content-item {\n transition: box-shadow 0.2s ease;\n}\n\n.content-item:hover {\n box-shadow: 0 2px 4px var(--mj-shadow-sm);\n}\n\n.loading-state {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n}\n\n.empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 8px;\n}\n\n.badge {\n display: inline-block;\n font-size: 0.7em;\n line-height: 1;\n}\n\n/* Form control sizing */\n.template-editor .mj-input,\n.template-editor .mj-textarea,\n.template-editor mj-dropdown {\n width: 100%;\n}\n\n.template-editor [mjButton] {\n min-width: auto;\n}\n\n/* Content version tabs */\n.content-versions-tabs {\n margin-bottom: 16px;\n border-bottom: 2px solid var(--mj-border-default);\n padding-bottom: 8px;\n}\n\n.content-tabs {\n display: flex;\n gap: 6px;\n flex-wrap: wrap;\n}\n\n.content-version-tab {\n padding: 8px 12px;\n border: 1px solid var(--mj-border-strong);\n border-radius: 6px;\n cursor: pointer;\n background: var(--mj-bg-surface);\n display: flex;\n align-items: center;\n gap: 6px;\n transition: all 0.2s;\n position: relative;\n}\n\n.content-version-tab.active {\n border-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n}\n\n.content-version-tab .tab-label {\n font-weight: 600;\n font-size: 0.85em;\n color: var(--mj-text-secondary);\n}\n\n.content-version-tab .tab-meta {\n font-size: 0.7em;\n color: var(--mj-text-muted);\n}\n\n.content-version-tab .tab-meta .inactive-label {\n color: var(--mj-status-error);\n}\n\n.content-version-tab .delete-btn {\n background: none;\n border: none;\n color: var(--mj-status-error);\n padding: 4px;\n border-radius: 3px;\n transition: all 0.2s;\n cursor: pointer;\n}\n\n.content-version-tab .delete-btn:hover {\n background-color: var(--mj-status-error);\n color: var(--mj-text-inverse);\n}\n\n/* New content tab (adding state) */\n.content-version-tab.adding-new {\n border-color: var(--mj-status-success);\n background: color-mix(in srgb, var(--mj-status-success) 10%, var(--mj-bg-surface));\n}\n\n.content-version-tab.adding-new .new-label {\n font-weight: 600;\n color: var(--mj-status-success);\n font-size: 0.85em;\n}\n\n/* Add new content button */\n.content-version-tab.add-new {\n border: 1px dashed var(--mj-status-success);\n background: var(--mj-bg-surface-card);\n}\n\n.content-version-tab.add-new:hover {\n background: color-mix(in srgb, var(--mj-status-success) 8%, var(--mj-bg-surface));\n border-style: solid;\n}\n\n.content-version-tab.add-new i {\n color: var(--mj-status-success);\n font-size: 0.75em;\n}\n\n.content-version-tab.add-new span {\n font-weight: 500;\n color: var(--mj-status-success);\n font-size: 0.85em;\n}\n\n/* Content editor container */\n.content-editor-container {\n flex: 1;\n display: flex;\n flex-direction: column;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n overflow: hidden;\n}\n\n/* Content metadata bar */\n.content-metadata-bar {\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n padding: 16px 20px;\n}\n\n.metadata-grid {\n display: grid;\n grid-template-columns: 2fr 1fr 1fr auto;\n gap: 20px;\n align-items: end;\n}\n\n.form-group {\n margin: 0;\n}\n\n.form-label {\n margin-bottom: 4px;\n font-size: 0.9em;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.form-control-plaintext {\n font-size: 0.9em;\n padding: 4px 0;\n}\n\n.form-check {\n margin-top: 8px;\n}\n\n.form-check-label {\n font-size: 0.9em;\n}\n\n.badge-success {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n border: 1px solid color-mix(in srgb, var(--mj-status-success) 30%, transparent);\n padding: 3px 8px;\n border-radius: 10px;\n font-size: 0.75em;\n font-weight: 600;\n}\n\n.badge-secondary {\n background: color-mix(in srgb, var(--mj-text-muted) 15%, var(--mj-bg-surface));\n color: var(--mj-text-muted);\n border: 1px solid color-mix(in srgb, var(--mj-text-muted) 30%, transparent);\n padding: 3px 8px;\n border-radius: 10px;\n font-size: 0.75em;\n font-weight: 600;\n}\n\n/* Content text editor area */\n.content-text-editor {\n flex: 1;\n padding: 20px;\n display: flex;\n flex-direction: column;\n}\n\n.editor-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 12px;\n}\n\n.editor-label {\n margin: 0;\n font-weight: 600;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.content-type-badge {\n padding: 4px 8px;\n border-radius: 4px;\n font-size: 0.75em;\n color: var(--mj-text-inverse);\n}\n\n.content-type-badge.new {\n background: var(--mj-status-success);\n}\n\n.content-type-badge.existing {\n background: var(--mj-text-muted);\n}\n\n.editor-actions {\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n.unsaved-indicator {\n color: var(--mj-status-warning);\n font-size: 0.85em;\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n.unsaved-indicator i {\n font-size: 0.5em;\n}\n\n.run-btn {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border: none;\n padding: 6px 12px;\n border-radius: 4px;\n font-size: 0.85em;\n display: flex;\n align-items: center;\n gap: 6px;\n transition: all 0.2s;\n cursor: pointer;\n}\n\n.run-btn:hover {\n background: var(--mj-brand-primary-hover);\n}\n\n/* Code editor border */\n.code-editor-wrapper {\n flex: 1;\n height: 350px;\n border: 1px solid var(--mj-border-strong);\n border-radius: 4px;\n}\n\n/* Help section tabs */\n.template-help-section {\n margin-top: 16px;\n}\n\n.help-tabs {\n display: flex;\n border-bottom: 2px solid var(--mj-border-default);\n margin-bottom: 0;\n}\n\n.help-tab {\n padding: 8px 16px;\n border: none;\n background: none;\n cursor: pointer;\n font-size: 0.9em;\n font-weight: 600;\n color: var(--mj-text-muted);\n border-bottom: 3px solid transparent;\n transition: all 0.2s;\n}\n\n.help-tab.active {\n color: var(--mj-status-success);\n border-bottom-color: var(--mj-status-success);\n}\n\n/* Help content area */\n.help-content {\n padding: 16px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-top: none;\n border-radius: 0 0 4px 4px;\n}\n\n/* Syntax help */\n.syntax-help {\n font-size: 0.85em;\n}\n\n.syntax-help .section-title {\n font-weight: 600;\n margin-bottom: 12px;\n color: var(--mj-status-success);\n}\n\n.syntax-grid {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 16px;\n}\n\n.syntax-item {\n margin-bottom: 8px;\n}\n\n.syntax-help code {\n background: var(--mj-bg-surface);\n padding: 4px 6px;\n border-radius: 3px;\n display: inline-block;\n margin-top: 4px;\n color: var(--mj-text-primary);\n}\n\n/* Placeholders help */\n.placeholders-help {\n font-size: 0.85em;\n}\n\n.placeholders-help .section-title {\n font-weight: 600;\n margin-bottom: 12px;\n color: var(--mj-status-success);\n}\n\n.placeholders-description {\n margin-bottom: 16px;\n color: var(--mj-text-secondary);\n line-height: 1.5;\n}\n\n/* Category tabs */\n.category-tabs {\n display: flex;\n gap: 8px;\n margin-bottom: 16px;\n flex-wrap: wrap;\n}\n\n.category-tab {\n padding: 6px 14px;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n border-radius: 20px;\n cursor: pointer;\n font-size: 0.85em;\n font-weight: 500;\n display: flex;\n align-items: center;\n gap: 6px;\n transition: all 0.2s;\n color: var(--mj-text-muted);\n}\n\n.category-tab.active {\n border-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n.category-tab .tab-badge {\n background: color-mix(in srgb, var(--mj-text-primary) 10%, transparent);\n color: inherit;\n padding: 2px 6px;\n border-radius: 10px;\n font-size: 0.75em;\n margin-left: 4px;\n}\n\n/* Placeholder content area */\n.placeholder-content {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n padding: 16px;\n}\n\n.category-header {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 16px;\n}\n\n.category-header i {\n font-size: 1.2em;\n}\n\n.category-header h5 {\n margin: 0;\n color: var(--mj-text-primary);\n font-weight: 600;\n}\n\n.placeholder-grid {\n display: grid;\n gap: 10px;\n}\n\n/* Placeholder item */\n.placeholder-item {\n padding: 12px 16px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n position: relative;\n transition: all 0.2s;\n max-width: 800px;\n}\n\n.placeholder-item:hover {\n border-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 5%, var(--mj-bg-surface));\n}\n\n.placeholder-item:hover .copy-btn {\n opacity: 1 !important;\n}\n\n.placeholder-item-inner {\n display: flex;\n align-items: flex-start;\n gap: 8px;\n}\n\n.placeholder-name-row {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n}\n\n.placeholder-code {\n color: var(--mj-status-error);\n font-weight: 600;\n font-size: 0.95em;\n}\n\n.copy-btn {\n opacity: 0;\n transition: opacity 0.2s;\n background: none;\n border: none;\n padding: 4px 8px;\n cursor: pointer;\n color: var(--mj-brand-primary);\n border-radius: 4px;\n display: inline-flex;\n align-items: center;\n}\n\n.copy-btn:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n}\n\n.copy-btn i {\n font-size: 0.85em;\n}\n\n.placeholder-description {\n color: var(--mj-text-muted);\n margin-top: 4px;\n line-height: 1.4;\n}\n\n/* Usage example box */\n.usage-example {\n margin-top: 20px;\n padding: 12px;\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n border-radius: 6px;\n border: 1px solid color-mix(in srgb, var(--mj-brand-primary) 20%, var(--mj-bg-surface));\n}\n\n.usage-example-inner {\n display: flex;\n align-items: flex-start;\n gap: 8px;\n}\n\n.usage-example i {\n color: var(--mj-brand-primary);\n margin-top: 2px;\n}\n\n.usage-example-text {\n flex: 1;\n font-size: 0.85em;\n color: var(--mj-brand-primary);\n line-height: 1.5;\n}\n\n.usage-example code {\n background: var(--mj-bg-surface);\n padding: 2px 4px;\n border-radius: 3px;\n}\n\n/* No content state */\n.no-content-state {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n background: var(--mj-bg-surface-card);\n border: 2px dashed var(--mj-border-default);\n border-radius: 8px;\n padding: 40px;\n text-align: center;\n}\n\n.no-content-state i {\n font-size: 48px;\n margin-bottom: 16px;\n color: var(--mj-text-muted);\n opacity: 0.6;\n}\n\n.no-content-state h5 {\n color: var(--mj-text-secondary);\n margin-bottom: 8px;\n}\n\n.no-content-state p {\n color: var(--mj-text-muted);\n margin-bottom: 20px;\n}\n"] }]
|
|
904
|
-
}], () => [{ type: i1.MJNotificationService }, { type: i2.MJConfirmService }], {
|
|
1096
|
+
}], () => [{ type: i1.MJNotificationService }, { type: i2.MJConfirmService }], { Template: [{
|
|
1097
|
+
type: Input
|
|
1098
|
+
}], template: [{
|
|
905
1099
|
type: Input
|
|
906
1100
|
}], config: [{
|
|
907
1101
|
type: Input
|
|
1102
|
+
}], ContentChange: [{
|
|
1103
|
+
type: Output
|
|
908
1104
|
}], contentChange: [{
|
|
909
1105
|
type: Output
|
|
1106
|
+
}], RunTemplate: [{
|
|
1107
|
+
type: Output
|
|
910
1108
|
}], runTemplate: [{
|
|
911
1109
|
type: Output
|
|
912
|
-
}],
|
|
1110
|
+
}], CodeEditor: [{
|
|
913
1111
|
type: ViewChild,
|
|
914
1112
|
args: ['codeEditor']
|
|
915
1113
|
}] }); })();
|