@memberjunction/ng-core-entity-forms 6.2.0-edge.0 → 6.2.0-edge.2
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-form-tabs.d.ts +1 -0
- package/dist/lib/custom/AIAgents/agent-form-tabs.d.ts.map +1 -1
- package/dist/lib/custom/AIAgents/agent-form-tabs.js +2 -0
- package/dist/lib/custom/AIAgents/agent-form-tabs.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 +1322 -783
- 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 +694 -252
- 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/pending-records.d.ts +11 -0
- package/dist/lib/custom/AIPrompts/pending-records.d.ts.map +1 -0
- package/dist/lib/custom/AIPrompts/pending-records.js +21 -0
- package/dist/lib/custom/AIPrompts/pending-records.js.map +1 -0
- 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 +217 -29
- package/dist/lib/custom/Entities/entity-form.component.d.ts.map +1 -1
- package/dist/lib/custom/Entities/entity-form.component.js +734 -285
- 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 +129 -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 +904 -90
- package/dist/lib/custom/RecordProcesses/record-process-form.component.js.map +1 -1
- package/dist/lib/custom/Rubrics/evaluation-form.component.d.ts +37 -0
- package/dist/lib/custom/Rubrics/evaluation-form.component.d.ts.map +1 -0
- package/dist/lib/custom/Rubrics/evaluation-form.component.js +399 -0
- package/dist/lib/custom/Rubrics/evaluation-form.component.js.map +1 -0
- package/dist/lib/custom/Rubrics/record-forms.component.d.ts +69 -0
- package/dist/lib/custom/Rubrics/record-forms.component.d.ts.map +1 -0
- package/dist/lib/custom/Rubrics/record-forms.component.js +587 -0
- package/dist/lib/custom/Rubrics/record-forms.component.js.map +1 -0
- package/dist/lib/custom/Rubrics/rubric-form.component.d.ts +67 -0
- package/dist/lib/custom/Rubrics/rubric-form.component.d.ts.map +1 -0
- package/dist/lib/custom/Rubrics/rubric-form.component.js +534 -0
- package/dist/lib/custom/Rubrics/rubric-form.component.js.map +1 -0
- package/dist/lib/custom/Rubrics/rubric-form.panels.d.ts +25 -0
- package/dist/lib/custom/Rubrics/rubric-form.panels.d.ts.map +1 -0
- package/dist/lib/custom/Rubrics/rubric-form.panels.js +299 -0
- package/dist/lib/custom/Rubrics/rubric-form.panels.js.map +1 -0
- package/dist/lib/custom/Rubrics/scale-form.component.d.ts +31 -0
- package/dist/lib/custom/Rubrics/scale-form.component.d.ts.map +1 -0
- package/dist/lib/custom/Rubrics/scale-form.component.js +395 -0
- package/dist/lib/custom/Rubrics/scale-form.component.js.map +1 -0
- 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 +153 -19
- package/dist/lib/custom/Templates/templates-form.component.d.ts.map +1 -1
- package/dist/lib/custom/Templates/templates-form.component.js +434 -217
- 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 +223 -27
- package/dist/lib/custom/Tests/test-form.component.d.ts.map +1 -1
- package/dist/lib/custom/Tests/test-form.component.js +951 -530
- 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 +395 -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 +1719 -1007
- 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 +3 -3
- 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/custom-forms.module.d.ts +56 -48
- package/dist/lib/custom/custom-forms.module.d.ts.map +1 -1
- package/dist/lib/custom/custom-forms.module.js +60 -0
- package/dist/lib/custom/custom-forms.module.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/MJAIAgent/mjaiagent.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJAIAgent/mjaiagent.form.component.js +61 -43
- package/dist/lib/generated/Entities/MJAIAgent/mjaiagent.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJAIAgentRubric/mjaiagentrubric.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/MJAIAgentRubric/mjaiagentrubric.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/MJAIAgentRubric/mjaiagentrubric.form.component.js +74 -0
- package/dist/lib/generated/Entities/MJAIAgentRubric/mjaiagentrubric.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/MJAIAgentRun/mjaiagentrun.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJAIAgentRun/mjaiagentrun.form.component.js +37 -19
- package/dist/lib/generated/Entities/MJAIAgentRun/mjaiagentrun.form.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 +78 -52
- 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/MJEntity/mjentity.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJEntity/mjentity.form.component.js +156 -84
- package/dist/lib/generated/Entities/MJEntity/mjentity.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJFeaturePipelineType/mjfeaturepipelinetype.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/MJFeaturePipelineType/mjfeaturepipelinetype.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/MJFeaturePipelineType/mjfeaturepipelinetype.form.component.js +62 -0
- package/dist/lib/generated/Entities/MJFeaturePipelineType/mjfeaturepipelinetype.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/MJProcessRun/mjprocessrun.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJProcessRun/mjprocessrun.form.component.js +24 -6
- package/dist/lib/generated/Entities/MJProcessRun/mjprocessrun.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/MJRecordChange/mjrecordchange.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJRecordChange/mjrecordchange.form.component.js +24 -16
- package/dist/lib/generated/Entities/MJRecordChange/mjrecordchange.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJRecordCloneLog/mjrecordclonelog.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/MJRecordCloneLog/mjrecordclonelog.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/MJRecordCloneLog/mjrecordclonelog.form.component.js +107 -0
- package/dist/lib/generated/Entities/MJRecordCloneLog/mjrecordclonelog.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/MJRecordCloneLogItem/mjrecordclonelogitem.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/MJRecordCloneLogItem/mjrecordclonelogitem.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/MJRecordCloneLogItem/mjrecordclonelogitem.form.component.js +74 -0
- package/dist/lib/generated/Entities/MJRecordCloneLogItem/mjrecordclonelogitem.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/MJRubric/mjrubric.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/MJRubric/mjrubric.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/MJRubric/mjrubric.form.component.js +135 -0
- package/dist/lib/generated/Entities/MJRubric/mjrubric.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/MJRubricBand/mjrubricband.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/MJRubricBand/mjrubricband.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/MJRubricBand/mjrubricband.form.component.js +87 -0
- package/dist/lib/generated/Entities/MJRubricBand/mjrubricband.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/MJRubricCategory/mjrubriccategory.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/MJRubricCategory/mjrubriccategory.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/MJRubricCategory/mjrubriccategory.form.component.js +107 -0
- package/dist/lib/generated/Entities/MJRubricCategory/mjrubriccategory.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/MJRubricCriterion/mjrubriccriterion.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/MJRubricCriterion/mjrubriccriterion.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/MJRubricCriterion/mjrubriccriterion.form.component.js +155 -0
- package/dist/lib/generated/Entities/MJRubricCriterion/mjrubriccriterion.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/MJRubricCriterionLevel/mjrubriccriterionlevel.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/MJRubricCriterionLevel/mjrubriccriterionlevel.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/MJRubricCriterionLevel/mjrubriccriterionlevel.form.component.js +62 -0
- package/dist/lib/generated/Entities/MJRubricCriterionLevel/mjrubriccriterionlevel.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/MJRubricEvaluation/mjrubricevaluation.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/MJRubricEvaluation/mjrubricevaluation.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/MJRubricEvaluation/mjrubricevaluation.form.component.js +183 -0
- package/dist/lib/generated/Entities/MJRubricEvaluation/mjrubricevaluation.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/MJRubricEvaluationScore/mjrubricevaluationscore.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/MJRubricEvaluationScore/mjrubricevaluationscore.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/MJRubricEvaluationScore/mjrubricevaluationscore.form.component.js +120 -0
- package/dist/lib/generated/Entities/MJRubricEvaluationScore/mjrubricevaluationscore.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/MJRubricScale/mjrubricscale.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/MJRubricScale/mjrubricscale.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/MJRubricScale/mjrubricscale.form.component.js +107 -0
- package/dist/lib/generated/Entities/MJRubricScale/mjrubricscale.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/MJRubricScaleLevel/mjrubricscalelevel.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/MJRubricScaleLevel/mjrubricscalelevel.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/MJRubricScaleLevel/mjrubricscalelevel.form.component.js +103 -0
- package/dist/lib/generated/Entities/MJRubricScaleLevel/mjrubricscalelevel.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/MJRubricVersion/mjrubricversion.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/MJRubricVersion/mjrubricversion.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/MJRubricVersion/mjrubricversion.form.component.js +171 -0
- package/dist/lib/generated/Entities/MJRubricVersion/mjrubricversion.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/MJTest/mjtest.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJTest/mjtest.form.component.js +24 -16
- package/dist/lib/generated/Entities/MJTest/mjtest.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJTestSuite/mjtestsuite.form.component.js +27 -25
- package/dist/lib/generated/Entities/MJTestSuite/mjtestsuite.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJTestSuiteRun/mjtestsuiterun.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJTestSuiteRun/mjtestsuiterun.form.component.js +19 -11
- package/dist/lib/generated/Entities/MJTestSuiteRun/mjtestsuiterun.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 +209 -119
- package/dist/lib/generated/Entities/MJUser/mjuser.form.component.js.map +1 -1
- package/dist/lib/generated/generated-forms.module.d.ts +436 -422
- package/dist/lib/generated/generated-forms.module.d.ts.map +1 -1
- package/dist/lib/generated/generated-forms.module.js +44 -2
- package/dist/lib/generated/generated-forms.module.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/panels/record-clone/entity-clone-config-editor.component.d.ts +116 -0
- package/dist/lib/panels/record-clone/entity-clone-config-editor.component.d.ts.map +1 -0
- package/dist/lib/panels/record-clone/entity-clone-config-editor.component.js +820 -0
- package/dist/lib/panels/record-clone/entity-clone-config-editor.component.js.map +1 -0
- package/dist/lib/shared/components/template-editor.component.d.ts +158 -15
- package/dist/lib/shared/components/template-editor.component.d.ts.map +1 -1
- package/dist/lib/shared/components/template-editor.component.js +389 -127
- package/dist/lib/shared/components/template-editor.component.js.map +1 -1
- package/dist/public-api.d.ts +5 -0
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +5 -0
- package/dist/public-api.js.map +1 -1
- package/package.json +47 -42
|
@@ -1191,34 +1191,34 @@ function MJQueryFormComponentExtended_Conditional_0_Template(rf, ctx) { if (rf &
|
|
|
1191
1191
|
let MJQueryFormComponentExtended = class MJQueryFormComponentExtended extends MJQueryFormComponent {
|
|
1192
1192
|
constructor() {
|
|
1193
1193
|
super(...arguments);
|
|
1194
|
-
this.
|
|
1195
|
-
this.
|
|
1196
|
-
this.
|
|
1197
|
-
this.
|
|
1198
|
-
this.
|
|
1199
|
-
this.
|
|
1200
|
-
this.
|
|
1201
|
-
this.
|
|
1202
|
-
this.
|
|
1203
|
-
this.
|
|
1204
|
-
this.
|
|
1205
|
-
this.
|
|
1194
|
+
this.QueryParameters = [];
|
|
1195
|
+
this.QueryFields = [];
|
|
1196
|
+
this.QueryEntities = [];
|
|
1197
|
+
this.QueryPermissions = [];
|
|
1198
|
+
this.IsLoadingParameters = false;
|
|
1199
|
+
this.IsLoadingFields = false;
|
|
1200
|
+
this.IsLoadingEntities = false;
|
|
1201
|
+
this.IsLoadingPermissions = false;
|
|
1202
|
+
this.HasUnsavedChanges = false;
|
|
1203
|
+
this.ShowFiltersHelp = false;
|
|
1204
|
+
this.ShowRunDialog = false;
|
|
1205
|
+
this.CategoryPathDisplay = '';
|
|
1206
1206
|
this.IsSaving = false;
|
|
1207
1207
|
// Expansion panel states
|
|
1208
|
-
this.
|
|
1209
|
-
this.
|
|
1210
|
-
this.
|
|
1211
|
-
this.
|
|
1212
|
-
this.
|
|
1213
|
-
this.
|
|
1214
|
-
this.
|
|
1215
|
-
this.
|
|
1208
|
+
this.SqlPanelExpanded = true;
|
|
1209
|
+
this.ParametersPanelExpanded = false;
|
|
1210
|
+
this.FieldsPanelExpanded = false;
|
|
1211
|
+
this.EntitiesPanelExpanded = false;
|
|
1212
|
+
this.TechnicalDescriptionPanelExpanded = false;
|
|
1213
|
+
this.DetailsPanelExpanded = false;
|
|
1214
|
+
this.PermissionsPanelExpanded = false;
|
|
1215
|
+
this.DependentsPanelExpanded = false;
|
|
1216
1216
|
// Category data
|
|
1217
|
-
this.
|
|
1217
|
+
this.CategoryOptions = [
|
|
1218
1218
|
{ text: 'Select Category...', value: '' }
|
|
1219
1219
|
];
|
|
1220
|
-
this.
|
|
1221
|
-
this.
|
|
1220
|
+
this.Categories = [];
|
|
1221
|
+
this.CategoryTreeData = [];
|
|
1222
1222
|
/** Tree dropdown config for Query Categories */
|
|
1223
1223
|
this.CategoryBranchConfig = {
|
|
1224
1224
|
EntityName: 'MJ: Query Categories',
|
|
@@ -1230,7 +1230,7 @@ let MJQueryFormComponentExtended = class MJQueryFormComponentExtended extends MJ
|
|
|
1230
1230
|
OrderBy: 'Name ASC'
|
|
1231
1231
|
};
|
|
1232
1232
|
// Status options — matches MJQueryEntity.Status type from database CHECK constraint
|
|
1233
|
-
this.
|
|
1233
|
+
this.StatusOptions = [
|
|
1234
1234
|
{ text: 'Pending', value: 'Pending' },
|
|
1235
1235
|
{ text: 'Approved', value: 'Approved' },
|
|
1236
1236
|
{ text: 'Rejected', value: 'Rejected' },
|
|
@@ -1240,9 +1240,9 @@ let MJQueryFormComponentExtended = class MJQueryFormComponentExtended extends MJ
|
|
|
1240
1240
|
// group, keeps all left-side action buttons (delete/favorite/history/list)
|
|
1241
1241
|
// since they're now wired through `<mj-record-form-container>`.
|
|
1242
1242
|
this.ToolbarConfig = CUSTOM_LAYOUT_TOOLBAR_CONFIG;
|
|
1243
|
-
this.
|
|
1243
|
+
this.SqlEditor = null;
|
|
1244
1244
|
// SQL Filters for help display
|
|
1245
|
-
this.
|
|
1245
|
+
this.SqlFilters = RUN_QUERY_SQL_FILTERS;
|
|
1246
1246
|
this.navigationService = inject(NavigationService);
|
|
1247
1247
|
this.formPresenter = inject(MJFormPresenterService);
|
|
1248
1248
|
this.confirmService = inject(MJConfirmService);
|
|
@@ -1250,6 +1250,190 @@ let MJQueryFormComponentExtended = class MJQueryFormComponentExtended extends MJ
|
|
|
1250
1250
|
this.isUpdatingEditorValue = false;
|
|
1251
1251
|
this.isInitialLoad = true;
|
|
1252
1252
|
}
|
|
1253
|
+
/** @deprecated Use {@link QueryParameters}. */
|
|
1254
|
+
get queryParameters() {
|
|
1255
|
+
return this.QueryParameters;
|
|
1256
|
+
}
|
|
1257
|
+
/** @deprecated Use {@link QueryParameters}. */
|
|
1258
|
+
set queryParameters(value) {
|
|
1259
|
+
this.QueryParameters = value;
|
|
1260
|
+
}
|
|
1261
|
+
/** @deprecated Use {@link QueryFields}. */
|
|
1262
|
+
get queryFields() {
|
|
1263
|
+
return this.QueryFields;
|
|
1264
|
+
}
|
|
1265
|
+
/** @deprecated Use {@link QueryFields}. */
|
|
1266
|
+
set queryFields(value) {
|
|
1267
|
+
this.QueryFields = value;
|
|
1268
|
+
}
|
|
1269
|
+
/** @deprecated Use {@link QueryEntities}. */
|
|
1270
|
+
get queryEntities() {
|
|
1271
|
+
return this.QueryEntities;
|
|
1272
|
+
}
|
|
1273
|
+
/** @deprecated Use {@link QueryEntities}. */
|
|
1274
|
+
set queryEntities(value) {
|
|
1275
|
+
this.QueryEntities = value;
|
|
1276
|
+
}
|
|
1277
|
+
/** @deprecated Use {@link QueryPermissions}. */
|
|
1278
|
+
get queryPermissions() {
|
|
1279
|
+
return this.QueryPermissions;
|
|
1280
|
+
}
|
|
1281
|
+
/** @deprecated Use {@link QueryPermissions}. */
|
|
1282
|
+
set queryPermissions(value) {
|
|
1283
|
+
this.QueryPermissions = value;
|
|
1284
|
+
}
|
|
1285
|
+
/** @deprecated Use {@link IsLoadingParameters}. */
|
|
1286
|
+
get isLoadingParameters() {
|
|
1287
|
+
return this.IsLoadingParameters;
|
|
1288
|
+
}
|
|
1289
|
+
/** @deprecated Use {@link IsLoadingParameters}. */
|
|
1290
|
+
set isLoadingParameters(value) {
|
|
1291
|
+
this.IsLoadingParameters = value;
|
|
1292
|
+
}
|
|
1293
|
+
/** @deprecated Use {@link IsLoadingFields}. */
|
|
1294
|
+
get isLoadingFields() {
|
|
1295
|
+
return this.IsLoadingFields;
|
|
1296
|
+
}
|
|
1297
|
+
/** @deprecated Use {@link IsLoadingFields}. */
|
|
1298
|
+
set isLoadingFields(value) {
|
|
1299
|
+
this.IsLoadingFields = value;
|
|
1300
|
+
}
|
|
1301
|
+
/** @deprecated Use {@link IsLoadingEntities}. */
|
|
1302
|
+
get isLoadingEntities() {
|
|
1303
|
+
return this.IsLoadingEntities;
|
|
1304
|
+
}
|
|
1305
|
+
/** @deprecated Use {@link IsLoadingEntities}. */
|
|
1306
|
+
set isLoadingEntities(value) {
|
|
1307
|
+
this.IsLoadingEntities = value;
|
|
1308
|
+
}
|
|
1309
|
+
/** @deprecated Use {@link IsLoadingPermissions}. */
|
|
1310
|
+
get isLoadingPermissions() {
|
|
1311
|
+
return this.IsLoadingPermissions;
|
|
1312
|
+
}
|
|
1313
|
+
/** @deprecated Use {@link IsLoadingPermissions}. */
|
|
1314
|
+
set isLoadingPermissions(value) {
|
|
1315
|
+
this.IsLoadingPermissions = value;
|
|
1316
|
+
}
|
|
1317
|
+
/** @deprecated Use {@link HasUnsavedChanges}. */
|
|
1318
|
+
get hasUnsavedChanges() {
|
|
1319
|
+
return this.HasUnsavedChanges;
|
|
1320
|
+
}
|
|
1321
|
+
/** @deprecated Use {@link HasUnsavedChanges}. */
|
|
1322
|
+
set hasUnsavedChanges(value) {
|
|
1323
|
+
this.HasUnsavedChanges = value;
|
|
1324
|
+
}
|
|
1325
|
+
/** @deprecated Use {@link ShowFiltersHelp}. */
|
|
1326
|
+
get showFiltersHelp() {
|
|
1327
|
+
return this.ShowFiltersHelp;
|
|
1328
|
+
}
|
|
1329
|
+
/** @deprecated Use {@link ShowFiltersHelp}. */
|
|
1330
|
+
set showFiltersHelp(value) {
|
|
1331
|
+
this.ShowFiltersHelp = value;
|
|
1332
|
+
}
|
|
1333
|
+
/** @deprecated Use {@link ShowRunDialog}. */
|
|
1334
|
+
get showRunDialog() {
|
|
1335
|
+
return this.ShowRunDialog;
|
|
1336
|
+
}
|
|
1337
|
+
/** @deprecated Use {@link ShowRunDialog}. */
|
|
1338
|
+
set showRunDialog(value) {
|
|
1339
|
+
this.ShowRunDialog = value;
|
|
1340
|
+
}
|
|
1341
|
+
/** @deprecated Use {@link CategoryPathDisplay}. */
|
|
1342
|
+
get categoryPathDisplay() {
|
|
1343
|
+
return this.CategoryPathDisplay;
|
|
1344
|
+
}
|
|
1345
|
+
/** @deprecated Use {@link CategoryPathDisplay}. */
|
|
1346
|
+
set categoryPathDisplay(value) {
|
|
1347
|
+
this.CategoryPathDisplay = value;
|
|
1348
|
+
}
|
|
1349
|
+
/** @deprecated Use {@link SqlPanelExpanded}. */
|
|
1350
|
+
get sqlPanelExpanded() {
|
|
1351
|
+
return this.SqlPanelExpanded;
|
|
1352
|
+
}
|
|
1353
|
+
/** @deprecated Use {@link SqlPanelExpanded}. */
|
|
1354
|
+
set sqlPanelExpanded(value) {
|
|
1355
|
+
this.SqlPanelExpanded = value;
|
|
1356
|
+
}
|
|
1357
|
+
/** @deprecated Use {@link ParametersPanelExpanded}. */
|
|
1358
|
+
get parametersPanelExpanded() {
|
|
1359
|
+
return this.ParametersPanelExpanded;
|
|
1360
|
+
}
|
|
1361
|
+
/** @deprecated Use {@link ParametersPanelExpanded}. */
|
|
1362
|
+
set parametersPanelExpanded(value) {
|
|
1363
|
+
this.ParametersPanelExpanded = value;
|
|
1364
|
+
}
|
|
1365
|
+
/** @deprecated Use {@link FieldsPanelExpanded}. */
|
|
1366
|
+
get fieldsPanelExpanded() {
|
|
1367
|
+
return this.FieldsPanelExpanded;
|
|
1368
|
+
}
|
|
1369
|
+
/** @deprecated Use {@link FieldsPanelExpanded}. */
|
|
1370
|
+
set fieldsPanelExpanded(value) {
|
|
1371
|
+
this.FieldsPanelExpanded = value;
|
|
1372
|
+
}
|
|
1373
|
+
/** @deprecated Use {@link EntitiesPanelExpanded}. */
|
|
1374
|
+
get entitiesPanelExpanded() {
|
|
1375
|
+
return this.EntitiesPanelExpanded;
|
|
1376
|
+
}
|
|
1377
|
+
/** @deprecated Use {@link EntitiesPanelExpanded}. */
|
|
1378
|
+
set entitiesPanelExpanded(value) {
|
|
1379
|
+
this.EntitiesPanelExpanded = value;
|
|
1380
|
+
}
|
|
1381
|
+
/** @deprecated Use {@link TechnicalDescriptionPanelExpanded}. */
|
|
1382
|
+
get technicalDescriptionPanelExpanded() {
|
|
1383
|
+
return this.TechnicalDescriptionPanelExpanded;
|
|
1384
|
+
}
|
|
1385
|
+
/** @deprecated Use {@link TechnicalDescriptionPanelExpanded}. */
|
|
1386
|
+
set technicalDescriptionPanelExpanded(value) {
|
|
1387
|
+
this.TechnicalDescriptionPanelExpanded = value;
|
|
1388
|
+
}
|
|
1389
|
+
/** @deprecated Use {@link DetailsPanelExpanded}. */
|
|
1390
|
+
get detailsPanelExpanded() {
|
|
1391
|
+
return this.DetailsPanelExpanded;
|
|
1392
|
+
}
|
|
1393
|
+
/** @deprecated Use {@link DetailsPanelExpanded}. */
|
|
1394
|
+
set detailsPanelExpanded(value) {
|
|
1395
|
+
this.DetailsPanelExpanded = value;
|
|
1396
|
+
}
|
|
1397
|
+
/** @deprecated Use {@link PermissionsPanelExpanded}. */
|
|
1398
|
+
get permissionsPanelExpanded() {
|
|
1399
|
+
return this.PermissionsPanelExpanded;
|
|
1400
|
+
}
|
|
1401
|
+
/** @deprecated Use {@link PermissionsPanelExpanded}. */
|
|
1402
|
+
set permissionsPanelExpanded(value) {
|
|
1403
|
+
this.PermissionsPanelExpanded = value;
|
|
1404
|
+
}
|
|
1405
|
+
/** @deprecated Use {@link DependentsPanelExpanded}. */
|
|
1406
|
+
get dependentsPanelExpanded() {
|
|
1407
|
+
return this.DependentsPanelExpanded;
|
|
1408
|
+
}
|
|
1409
|
+
/** @deprecated Use {@link DependentsPanelExpanded}. */
|
|
1410
|
+
set dependentsPanelExpanded(value) {
|
|
1411
|
+
this.DependentsPanelExpanded = value;
|
|
1412
|
+
}
|
|
1413
|
+
/** @deprecated Use {@link CategoryOptions}. */
|
|
1414
|
+
get categoryOptions() {
|
|
1415
|
+
return this.CategoryOptions;
|
|
1416
|
+
}
|
|
1417
|
+
/** @deprecated Use {@link CategoryOptions}. */
|
|
1418
|
+
set categoryOptions(value) {
|
|
1419
|
+
this.CategoryOptions = value;
|
|
1420
|
+
}
|
|
1421
|
+
/** @deprecated Use {@link Categories}. */
|
|
1422
|
+
get categories() {
|
|
1423
|
+
return this.Categories;
|
|
1424
|
+
}
|
|
1425
|
+
/** @deprecated Use {@link Categories}. */
|
|
1426
|
+
set categories(value) {
|
|
1427
|
+
this.Categories = value;
|
|
1428
|
+
}
|
|
1429
|
+
/** @deprecated Use {@link CategoryTreeData}. */
|
|
1430
|
+
get categoryTreeData() {
|
|
1431
|
+
return this.CategoryTreeData;
|
|
1432
|
+
}
|
|
1433
|
+
/** @deprecated Use {@link CategoryTreeData}. */
|
|
1434
|
+
set categoryTreeData(value) {
|
|
1435
|
+
this.CategoryTreeData = value;
|
|
1436
|
+
}
|
|
1253
1437
|
/** CategoryID as CompositeKey for tree dropdown binding */
|
|
1254
1438
|
get CategoryIDAsKey() {
|
|
1255
1439
|
return this.record?.CategoryID ? CompositeKey.FromID(this.record.CategoryID) : null; // first-pk-ok: FK target — Query CategoryID references the single-column ID key of Query Categories
|
|
@@ -1266,8 +1450,32 @@ let MJQueryFormComponentExtended = class MJQueryFormComponentExtended extends MJ
|
|
|
1266
1450
|
}
|
|
1267
1451
|
this.updateCategoryPathDisplay();
|
|
1268
1452
|
}
|
|
1453
|
+
/** @deprecated Use {@link StatusOptions}. */
|
|
1454
|
+
get statusOptions() {
|
|
1455
|
+
return this.StatusOptions;
|
|
1456
|
+
}
|
|
1457
|
+
/** @deprecated Use {@link StatusOptions}. */
|
|
1458
|
+
set statusOptions(value) {
|
|
1459
|
+
this.StatusOptions = value;
|
|
1460
|
+
}
|
|
1269
1461
|
/** Custom-layout Query form looks best full-width on first open. */
|
|
1270
1462
|
getDefaultFormWidthMode() { return 'full-width'; }
|
|
1463
|
+
/** @deprecated Use {@link SqlEditor}. */
|
|
1464
|
+
get sqlEditor() {
|
|
1465
|
+
return this.SqlEditor;
|
|
1466
|
+
}
|
|
1467
|
+
/** @deprecated Use {@link SqlEditor}. */
|
|
1468
|
+
set sqlEditor(value) {
|
|
1469
|
+
this.SqlEditor = value;
|
|
1470
|
+
}
|
|
1471
|
+
/** @deprecated Use {@link SqlFilters}. */
|
|
1472
|
+
get sqlFilters() {
|
|
1473
|
+
return this.SqlFilters;
|
|
1474
|
+
}
|
|
1475
|
+
/** @deprecated Use {@link SqlFilters}. */
|
|
1476
|
+
set sqlFilters(value) {
|
|
1477
|
+
this.SqlFilters = value;
|
|
1478
|
+
}
|
|
1271
1479
|
/**
|
|
1272
1480
|
* Gets queries that depend on (reference) this query via composition.
|
|
1273
1481
|
*/
|
|
@@ -1280,11 +1488,11 @@ let MJQueryFormComponentExtended = class MJQueryFormComponentExtended extends MJ
|
|
|
1280
1488
|
// We do one unified detectChanges after everything completes.
|
|
1281
1489
|
this.isInitialLoad = true;
|
|
1282
1490
|
// Load all data synchronously from QueryEngine cache
|
|
1283
|
-
this.
|
|
1284
|
-
this.
|
|
1285
|
-
this.
|
|
1286
|
-
this.
|
|
1287
|
-
this.
|
|
1491
|
+
this.LoadCategories();
|
|
1492
|
+
this.LoadQueryParameters();
|
|
1493
|
+
this.LoadQueryFields();
|
|
1494
|
+
this.LoadQueryEntities();
|
|
1495
|
+
this.LoadQueryPermissions();
|
|
1288
1496
|
this.isInitialLoad = false;
|
|
1289
1497
|
this.cdr.detectChanges();
|
|
1290
1498
|
}
|
|
@@ -1294,17 +1502,17 @@ let MJQueryFormComponentExtended = class MJQueryFormComponentExtended extends MJ
|
|
|
1294
1502
|
}
|
|
1295
1503
|
ngAfterViewInit() {
|
|
1296
1504
|
super.ngAfterViewInit();
|
|
1297
|
-
this.
|
|
1505
|
+
this.SqlEditor?.setEditable(this.EditMode);
|
|
1298
1506
|
// Set initial SQL value in the editor
|
|
1299
1507
|
this.updateEditorValue();
|
|
1300
1508
|
}
|
|
1301
1509
|
EndEditMode() {
|
|
1302
1510
|
super.EndEditMode();
|
|
1303
|
-
this.
|
|
1511
|
+
this.SqlEditor?.setEditable(false);
|
|
1304
1512
|
}
|
|
1305
1513
|
StartEditMode() {
|
|
1306
1514
|
super.StartEditMode();
|
|
1307
|
-
this.
|
|
1515
|
+
this.SqlEditor?.setEditable(true);
|
|
1308
1516
|
// Force change detection after a brief delay to ensure form controls are initialized
|
|
1309
1517
|
setTimeout(() => {
|
|
1310
1518
|
this.cdr.detectChanges();
|
|
@@ -1313,74 +1521,98 @@ let MJQueryFormComponentExtended = class MJQueryFormComponentExtended extends MJ
|
|
|
1313
1521
|
CancelEdit() {
|
|
1314
1522
|
super.CancelEdit();
|
|
1315
1523
|
this.updateEditorValue(); // Reset editor value to record SQL
|
|
1316
|
-
this.
|
|
1524
|
+
this.SqlEditor?.setEditable(false);
|
|
1317
1525
|
this.updateUnsavedChangesFlag(); // Reset unsaved changes flag
|
|
1318
1526
|
}
|
|
1319
1527
|
updateEditorValue() {
|
|
1320
|
-
if (!this.
|
|
1528
|
+
if (!this.SqlEditor || this.isUpdatingEditorValue) {
|
|
1321
1529
|
return;
|
|
1322
1530
|
}
|
|
1323
1531
|
// Use setTimeout to avoid ExpressionChangedAfterItHasBeenCheckedError
|
|
1324
1532
|
setTimeout(() => {
|
|
1325
|
-
if (!this.
|
|
1533
|
+
if (!this.SqlEditor) {
|
|
1326
1534
|
return;
|
|
1327
1535
|
}
|
|
1328
1536
|
this.isUpdatingEditorValue = true;
|
|
1329
1537
|
const sqlValue = this.record?.SQL || '';
|
|
1330
1538
|
// Use the setValue method from mj-code-editor component
|
|
1331
|
-
this.
|
|
1539
|
+
this.SqlEditor.setValue(sqlValue);
|
|
1332
1540
|
this.isUpdatingEditorValue = false;
|
|
1333
1541
|
}, 0);
|
|
1334
1542
|
}
|
|
1335
|
-
|
|
1543
|
+
IsFormReadOnly() {
|
|
1336
1544
|
return !this.EditMode;
|
|
1337
1545
|
}
|
|
1338
|
-
|
|
1546
|
+
/** @deprecated Use {@link IsFormReadOnly}. */
|
|
1547
|
+
isFormReadOnly() {
|
|
1548
|
+
return this.IsFormReadOnly();
|
|
1549
|
+
}
|
|
1550
|
+
LoadQueryParameters() {
|
|
1339
1551
|
if (this.record && this.record.ID) {
|
|
1340
|
-
this.
|
|
1552
|
+
this.QueryParameters = this.record.QueryParameters;
|
|
1341
1553
|
if (!this.isInitialLoad)
|
|
1342
1554
|
this.cdr.detectChanges();
|
|
1343
1555
|
}
|
|
1344
1556
|
}
|
|
1345
|
-
|
|
1557
|
+
/** @deprecated Use {@link LoadQueryParameters}. */
|
|
1558
|
+
loadQueryParameters() {
|
|
1559
|
+
return this.LoadQueryParameters();
|
|
1560
|
+
}
|
|
1561
|
+
LoadQueryFields() {
|
|
1346
1562
|
if (this.record && this.record.ID) {
|
|
1347
|
-
this.
|
|
1563
|
+
this.QueryFields = this.record.QueryFields;
|
|
1348
1564
|
if (!this.isInitialLoad)
|
|
1349
1565
|
this.cdr.detectChanges();
|
|
1350
1566
|
}
|
|
1351
1567
|
}
|
|
1352
|
-
|
|
1568
|
+
/** @deprecated Use {@link LoadQueryFields}. */
|
|
1569
|
+
loadQueryFields() {
|
|
1570
|
+
return this.LoadQueryFields();
|
|
1571
|
+
}
|
|
1572
|
+
LoadQueryEntities() {
|
|
1353
1573
|
if (this.record && this.record.ID) {
|
|
1354
|
-
this.
|
|
1574
|
+
this.QueryEntities = this.record.QueryEntities;
|
|
1355
1575
|
if (!this.isInitialLoad)
|
|
1356
1576
|
this.cdr.detectChanges();
|
|
1357
1577
|
}
|
|
1358
1578
|
}
|
|
1359
|
-
|
|
1579
|
+
/** @deprecated Use {@link LoadQueryEntities}. */
|
|
1580
|
+
loadQueryEntities() {
|
|
1581
|
+
return this.LoadQueryEntities();
|
|
1582
|
+
}
|
|
1583
|
+
LoadQueryPermissions() {
|
|
1360
1584
|
if (this.record && this.record.ID) {
|
|
1361
|
-
this.
|
|
1585
|
+
this.QueryPermissions = this.record.QueryPermissions;
|
|
1362
1586
|
if (!this.isInitialLoad)
|
|
1363
1587
|
this.cdr.detectChanges();
|
|
1364
1588
|
}
|
|
1365
1589
|
}
|
|
1366
|
-
|
|
1367
|
-
|
|
1590
|
+
/** @deprecated Use {@link LoadQueryPermissions}. */
|
|
1591
|
+
loadQueryPermissions() {
|
|
1592
|
+
return this.LoadQueryPermissions();
|
|
1593
|
+
}
|
|
1594
|
+
LoadCategories() {
|
|
1595
|
+
this.Categories = QueryEngine.Instance.Categories;
|
|
1368
1596
|
// Build flat options for legacy compatibility
|
|
1369
|
-
this.
|
|
1597
|
+
this.CategoryOptions = [
|
|
1370
1598
|
{ text: 'Select Category...', value: '' },
|
|
1371
|
-
...this.
|
|
1599
|
+
...this.Categories.map(cat => ({
|
|
1372
1600
|
text: cat.Name,
|
|
1373
1601
|
value: cat.ID
|
|
1374
1602
|
}))
|
|
1375
1603
|
];
|
|
1376
1604
|
// Build tree data after options are set
|
|
1377
|
-
this.
|
|
1605
|
+
this.CategoryTreeData = this.buildCategoryTree(this.Categories);
|
|
1378
1606
|
// Update cached category path display
|
|
1379
1607
|
this.updateCategoryPathDisplay();
|
|
1380
1608
|
// Trigger change detection to update the view (skip during init)
|
|
1381
1609
|
if (!this.isInitialLoad)
|
|
1382
1610
|
this.cdr.detectChanges();
|
|
1383
1611
|
}
|
|
1612
|
+
/** @deprecated Use {@link LoadCategories}. */
|
|
1613
|
+
loadCategories() {
|
|
1614
|
+
return this.LoadCategories();
|
|
1615
|
+
}
|
|
1384
1616
|
buildCategoryTree(categories) {
|
|
1385
1617
|
const categoryMap = new Map();
|
|
1386
1618
|
const rootCategories = [];
|
|
@@ -1417,11 +1649,11 @@ let MJQueryFormComponentExtended = class MJQueryFormComponentExtended extends MJ
|
|
|
1417
1649
|
sortNodes(rootCategories);
|
|
1418
1650
|
return rootCategories;
|
|
1419
1651
|
}
|
|
1420
|
-
|
|
1652
|
+
GetCategoryPath() {
|
|
1421
1653
|
if (!this.record?.CategoryID)
|
|
1422
1654
|
return '';
|
|
1423
1655
|
const findPath = (categoryId) => {
|
|
1424
|
-
const category = this.
|
|
1656
|
+
const category = this.Categories.find(c => UUIDsEqual(c.ID, categoryId));
|
|
1425
1657
|
if (!category)
|
|
1426
1658
|
return [];
|
|
1427
1659
|
if (category.ParentID) {
|
|
@@ -1431,15 +1663,19 @@ let MJQueryFormComponentExtended = class MJQueryFormComponentExtended extends MJ
|
|
|
1431
1663
|
};
|
|
1432
1664
|
return findPath(this.record.CategoryID).join(' / ');
|
|
1433
1665
|
}
|
|
1666
|
+
/** @deprecated Use {@link GetCategoryPath}. */
|
|
1667
|
+
getCategoryPath() {
|
|
1668
|
+
return this.GetCategoryPath();
|
|
1669
|
+
}
|
|
1434
1670
|
updateCategoryPathDisplay() {
|
|
1435
|
-
this.
|
|
1671
|
+
this.CategoryPathDisplay = this.GetCategoryPath();
|
|
1436
1672
|
}
|
|
1437
|
-
async
|
|
1673
|
+
async OnCategoryChange(value) {
|
|
1438
1674
|
// If it's a new category (string but not in existing options)
|
|
1439
|
-
if (value && !this.
|
|
1675
|
+
if (value && !this.CategoryOptions.find(opt => opt.value === value)) {
|
|
1440
1676
|
// Check for duplicate category names (case-insensitive, trimmed)
|
|
1441
1677
|
if (this.isDuplicateCategory(value)) {
|
|
1442
|
-
const existingCategory = this.
|
|
1678
|
+
const existingCategory = this.CategoryOptions.find(option => option.text && option.text.trim().toLowerCase() === value.trim().toLowerCase());
|
|
1443
1679
|
if (existingCategory) {
|
|
1444
1680
|
// Use the existing category instead
|
|
1445
1681
|
this.record.CategoryID = existingCategory.value;
|
|
@@ -1455,7 +1691,7 @@ let MJQueryFormComponentExtended = class MJQueryFormComponentExtended extends MJ
|
|
|
1455
1691
|
const saved = await newCategory.Save();
|
|
1456
1692
|
if (saved) {
|
|
1457
1693
|
// Add to options and set the ID
|
|
1458
|
-
this.
|
|
1694
|
+
this.CategoryOptions.push({
|
|
1459
1695
|
text: newCategory.Name,
|
|
1460
1696
|
value: newCategory.ID
|
|
1461
1697
|
});
|
|
@@ -1472,30 +1708,38 @@ let MJQueryFormComponentExtended = class MJQueryFormComponentExtended extends MJ
|
|
|
1472
1708
|
}
|
|
1473
1709
|
}
|
|
1474
1710
|
}
|
|
1711
|
+
/** @deprecated Use {@link OnCategoryChange}. */
|
|
1712
|
+
async onCategoryChange(value) {
|
|
1713
|
+
return this.OnCategoryChange(value);
|
|
1714
|
+
}
|
|
1475
1715
|
isDuplicateCategory(categoryName) {
|
|
1476
1716
|
const normalizedName = categoryName?.trim().toLowerCase();
|
|
1477
|
-
return this.
|
|
1717
|
+
return this.CategoryOptions.some(option => option.text && option.text.trim().toLowerCase() === normalizedName);
|
|
1478
1718
|
}
|
|
1479
1719
|
/**
|
|
1480
1720
|
* Updates the hasUnsavedChanges flag based on entity dirty states
|
|
1481
1721
|
*/
|
|
1482
1722
|
updateUnsavedChangesFlag() {
|
|
1483
|
-
this.
|
|
1723
|
+
this.HasUnsavedChanges = this.QueryParameters.some(param => param.Dirty) ||
|
|
1484
1724
|
this.record?.Dirty || false;
|
|
1485
1725
|
}
|
|
1726
|
+
ToggleFiltersHelp() {
|
|
1727
|
+
this.ShowFiltersHelp = !this.ShowFiltersHelp;
|
|
1728
|
+
}
|
|
1729
|
+
/** @deprecated Use {@link ToggleFiltersHelp}. */
|
|
1486
1730
|
toggleFiltersHelp() {
|
|
1487
|
-
|
|
1731
|
+
return this.ToggleFiltersHelp();
|
|
1488
1732
|
}
|
|
1489
1733
|
/**
|
|
1490
1734
|
* Run the query with parameter dialog
|
|
1491
1735
|
*/
|
|
1492
|
-
async
|
|
1736
|
+
async RunQuery() {
|
|
1493
1737
|
if (!this.record?.IsSaved) {
|
|
1494
1738
|
MJNotificationService.Instance.CreateSimpleNotification('Please save the query before running it.', 'warning', 3000);
|
|
1495
1739
|
return;
|
|
1496
1740
|
}
|
|
1497
1741
|
// Save any unsaved changes first
|
|
1498
|
-
if (this.
|
|
1742
|
+
if (this.HasUnsavedChanges) {
|
|
1499
1743
|
const saveResult = await this.SaveRecord(false); // Don't exit edit mode
|
|
1500
1744
|
if (!saveResult) {
|
|
1501
1745
|
MJNotificationService.Instance.CreateSimpleNotification('Failed to save query changes.', 'error', 3000);
|
|
@@ -1507,31 +1751,39 @@ let MJQueryFormComponentExtended = class MJQueryFormComponentExtended extends MJ
|
|
|
1507
1751
|
console.warn(`Executing query '${this.record.Name}' with status '${this.record.Status}'. Query has not been approved.`);
|
|
1508
1752
|
}
|
|
1509
1753
|
// Reload parameters in case they were updated
|
|
1510
|
-
this.
|
|
1754
|
+
this.LoadQueryParameters();
|
|
1511
1755
|
// Show the run dialog — set before detectChanges to avoid NG0100
|
|
1512
|
-
this.
|
|
1756
|
+
this.ShowRunDialog = true;
|
|
1513
1757
|
this.cdr.detectChanges();
|
|
1514
1758
|
}
|
|
1759
|
+
/** @deprecated Use {@link RunQuery}. */
|
|
1760
|
+
async runQuery() {
|
|
1761
|
+
return this.RunQuery();
|
|
1762
|
+
}
|
|
1515
1763
|
/**
|
|
1516
1764
|
* Handle run dialog close
|
|
1517
1765
|
*/
|
|
1766
|
+
OnRunDialogClose() {
|
|
1767
|
+
this.ShowRunDialog = false;
|
|
1768
|
+
}
|
|
1769
|
+
/** @deprecated Use {@link OnRunDialogClose}. */
|
|
1518
1770
|
onRunDialogClose() {
|
|
1519
|
-
this.
|
|
1771
|
+
return this.OnRunDialogClose();
|
|
1520
1772
|
}
|
|
1521
1773
|
/**
|
|
1522
1774
|
* Add a new parameter
|
|
1523
1775
|
*/
|
|
1524
|
-
async
|
|
1776
|
+
async AddParameter() {
|
|
1525
1777
|
try {
|
|
1526
1778
|
const md = this.ProviderToUse;
|
|
1527
1779
|
const newParam = await md.GetEntityObject('MJ: Query Parameters');
|
|
1528
1780
|
newParam.QueryID = this.record.ID;
|
|
1529
|
-
newParam.Name = `param${this.
|
|
1781
|
+
newParam.Name = `param${this.QueryParameters.length + 1}`;
|
|
1530
1782
|
newParam.Type = 'string';
|
|
1531
1783
|
newParam.IsRequired = false;
|
|
1532
1784
|
const saved = await newParam.Save();
|
|
1533
1785
|
if (saved) {
|
|
1534
|
-
this.
|
|
1786
|
+
this.QueryParameters.push(newParam);
|
|
1535
1787
|
this.updateUnsavedChangesFlag();
|
|
1536
1788
|
MJNotificationService.Instance.CreateSimpleNotification('Parameter added successfully', 'success', 3000);
|
|
1537
1789
|
}
|
|
@@ -1544,17 +1796,25 @@ let MJQueryFormComponentExtended = class MJQueryFormComponentExtended extends MJ
|
|
|
1544
1796
|
MJNotificationService.Instance.CreateSimpleNotification('Error adding parameter', 'error', 3000);
|
|
1545
1797
|
}
|
|
1546
1798
|
}
|
|
1799
|
+
/** @deprecated Use {@link AddParameter}. */
|
|
1800
|
+
async addParameter() {
|
|
1801
|
+
return this.AddParameter();
|
|
1802
|
+
}
|
|
1547
1803
|
/**
|
|
1548
1804
|
* Edit a parameter
|
|
1549
1805
|
*/
|
|
1550
|
-
async
|
|
1806
|
+
async EditParameter(param) {
|
|
1551
1807
|
// TODO: Show parameter edit dialog
|
|
1552
1808
|
console.log('Edit parameter:', param);
|
|
1553
1809
|
}
|
|
1810
|
+
/** @deprecated Use {@link EditParameter}. */
|
|
1811
|
+
async editParameter(param) {
|
|
1812
|
+
return this.EditParameter(param);
|
|
1813
|
+
}
|
|
1554
1814
|
/**
|
|
1555
1815
|
* Delete a parameter
|
|
1556
1816
|
*/
|
|
1557
|
-
async
|
|
1817
|
+
async DeleteParameter(param) {
|
|
1558
1818
|
if (!(await this.confirmService.ConfirmDelete({ title: 'Delete Parameter', message: `Delete parameter "${param.Name}"?` }))) {
|
|
1559
1819
|
return;
|
|
1560
1820
|
}
|
|
@@ -1586,10 +1846,14 @@ let MJQueryFormComponentExtended = class MJQueryFormComponentExtended extends MJ
|
|
|
1586
1846
|
MJNotificationService.Instance.CreateSimpleNotification('Error deleting parameter', 'error', 3000);
|
|
1587
1847
|
}
|
|
1588
1848
|
}
|
|
1849
|
+
/** @deprecated Use {@link DeleteParameter}. */
|
|
1850
|
+
async deleteParameter(param) {
|
|
1851
|
+
return this.DeleteParameter(param);
|
|
1852
|
+
}
|
|
1589
1853
|
removeParameterFromList(param) {
|
|
1590
|
-
const index = this.
|
|
1854
|
+
const index = this.QueryParameters.indexOf(param);
|
|
1591
1855
|
if (index > -1) {
|
|
1592
|
-
this.
|
|
1856
|
+
this.QueryParameters.splice(index, 1);
|
|
1593
1857
|
}
|
|
1594
1858
|
this.cdr.detectChanges();
|
|
1595
1859
|
}
|
|
@@ -1598,7 +1862,7 @@ let MJQueryFormComponentExtended = class MJQueryFormComponentExtended extends MJ
|
|
|
1598
1862
|
* MJFormPresenterService. A new record opens in edit mode automatically.
|
|
1599
1863
|
* On save, refresh the category tree and select the new category.
|
|
1600
1864
|
*/
|
|
1601
|
-
async
|
|
1865
|
+
async CreateCategory() {
|
|
1602
1866
|
const ref = this.formPresenter.Open({
|
|
1603
1867
|
EntityName: 'MJ: Query Categories',
|
|
1604
1868
|
Presentation: 'slide-in',
|
|
@@ -1609,15 +1873,19 @@ let MJQueryFormComponentExtended = class MJQueryFormComponentExtended extends MJ
|
|
|
1609
1873
|
});
|
|
1610
1874
|
const saved = await ref.AfterSaved();
|
|
1611
1875
|
if (saved) {
|
|
1612
|
-
this.
|
|
1876
|
+
this.OnCategoryCreated(saved);
|
|
1613
1877
|
}
|
|
1614
1878
|
}
|
|
1879
|
+
/** @deprecated Use {@link CreateCategory}. */
|
|
1880
|
+
async createCategory() {
|
|
1881
|
+
return this.CreateCategory();
|
|
1882
|
+
}
|
|
1615
1883
|
/**
|
|
1616
1884
|
* Edit the currently-selected category in a slide-in via the generic
|
|
1617
1885
|
* MJFormPresenterService. `StartInEditMode` opens the existing record
|
|
1618
1886
|
* editable. On save, refresh the category tree.
|
|
1619
1887
|
*/
|
|
1620
|
-
async
|
|
1888
|
+
async EditSelectedCategory() {
|
|
1621
1889
|
if (!this.record.CategoryID)
|
|
1622
1890
|
return;
|
|
1623
1891
|
const ref = this.formPresenter.Open({
|
|
@@ -1631,18 +1899,26 @@ let MJQueryFormComponentExtended = class MJQueryFormComponentExtended extends MJ
|
|
|
1631
1899
|
});
|
|
1632
1900
|
const saved = await ref.AfterSaved();
|
|
1633
1901
|
if (saved) {
|
|
1634
|
-
this.
|
|
1902
|
+
this.LoadCategories();
|
|
1635
1903
|
this.cdr.detectChanges();
|
|
1636
1904
|
}
|
|
1637
1905
|
}
|
|
1638
|
-
|
|
1906
|
+
/** @deprecated Use {@link EditSelectedCategory}. */
|
|
1907
|
+
async editSelectedCategory() {
|
|
1908
|
+
return this.EditSelectedCategory();
|
|
1909
|
+
}
|
|
1910
|
+
OnCategoryCreated(newCategory) {
|
|
1639
1911
|
// Reload categories to include the new one
|
|
1640
|
-
this.
|
|
1912
|
+
this.LoadCategories();
|
|
1641
1913
|
// Set the new category as selected
|
|
1642
1914
|
this.record.CategoryID = newCategory.ID;
|
|
1643
1915
|
// Trigger change detection
|
|
1644
1916
|
this.cdr.detectChanges();
|
|
1645
1917
|
}
|
|
1918
|
+
/** @deprecated Use {@link OnCategoryCreated}. */
|
|
1919
|
+
onCategoryCreated(newCategory) {
|
|
1920
|
+
return this.OnCategoryCreated(newCategory);
|
|
1921
|
+
}
|
|
1646
1922
|
/**
|
|
1647
1923
|
* Format date for display
|
|
1648
1924
|
*/
|
|
@@ -1666,9 +1942,9 @@ let MJQueryFormComponentExtended = class MJQueryFormComponentExtended extends MJ
|
|
|
1666
1942
|
}
|
|
1667
1943
|
async internalSaveRecord(StopEditModeAfterSave) {
|
|
1668
1944
|
// Handle category creation before saving query
|
|
1669
|
-
if (this.record.CategoryID && !this.
|
|
1945
|
+
if (this.record.CategoryID && !this.CategoryOptions.find(opt => opt.value === this.record.CategoryID)) {
|
|
1670
1946
|
if (this.isDuplicateCategory(this.record.CategoryID)) {
|
|
1671
|
-
const existingCategory = this.
|
|
1947
|
+
const existingCategory = this.CategoryOptions.find(option => option.text && option.text.trim().toLowerCase() === this.record.CategoryID?.trim().toLowerCase());
|
|
1672
1948
|
if (existingCategory) {
|
|
1673
1949
|
this.record.CategoryID = existingCategory.value;
|
|
1674
1950
|
MJNotificationService.Instance.CreateSimpleNotification(`Category "${existingCategory.text}" already exists. Using existing category.`, 'warning', 3000);
|
|
@@ -1681,7 +1957,7 @@ let MJQueryFormComponentExtended = class MJQueryFormComponentExtended extends MJ
|
|
|
1681
1957
|
newCategory.Name = this.record.CategoryID.trim();
|
|
1682
1958
|
const saved = await newCategory.Save();
|
|
1683
1959
|
if (saved) {
|
|
1684
|
-
this.
|
|
1960
|
+
this.CategoryOptions.push({
|
|
1685
1961
|
text: newCategory.Name,
|
|
1686
1962
|
value: newCategory.ID
|
|
1687
1963
|
});
|
|
@@ -1702,7 +1978,7 @@ let MJQueryFormComponentExtended = class MJQueryFormComponentExtended extends MJ
|
|
|
1702
1978
|
}
|
|
1703
1979
|
// Save any unsaved query entities first
|
|
1704
1980
|
if (this.EditMode) {
|
|
1705
|
-
for (const entity of this.
|
|
1981
|
+
for (const entity of this.QueryEntities) {
|
|
1706
1982
|
if (!entity.IsSaved && entity.EntityID) {
|
|
1707
1983
|
try {
|
|
1708
1984
|
await entity.Save();
|
|
@@ -1719,16 +1995,16 @@ let MJQueryFormComponentExtended = class MJQueryFormComponentExtended extends MJ
|
|
|
1719
1995
|
this.updateUnsavedChangesFlag();
|
|
1720
1996
|
// Reload related data after successful save as server-side processes may have updated them
|
|
1721
1997
|
if (this.record && this.record.ID) {
|
|
1722
|
-
this.
|
|
1723
|
-
this.
|
|
1724
|
-
this.
|
|
1998
|
+
this.LoadQueryParameters();
|
|
1999
|
+
this.LoadQueryFields();
|
|
2000
|
+
this.LoadQueryEntities();
|
|
1725
2001
|
this.updateCategoryPathDisplay();
|
|
1726
2002
|
this.cdr.detectChanges();
|
|
1727
2003
|
}
|
|
1728
2004
|
}
|
|
1729
2005
|
return result;
|
|
1730
2006
|
}
|
|
1731
|
-
|
|
2007
|
+
GetStatusBadgeColor() {
|
|
1732
2008
|
switch (this.record?.Status) {
|
|
1733
2009
|
case 'Approved': return '#28a745';
|
|
1734
2010
|
case 'Pending': return '#f59e0b';
|
|
@@ -1737,7 +2013,11 @@ let MJQueryFormComponentExtended = class MJQueryFormComponentExtended extends MJ
|
|
|
1737
2013
|
default: return '#6c757d';
|
|
1738
2014
|
}
|
|
1739
2015
|
}
|
|
1740
|
-
|
|
2016
|
+
/** @deprecated Use {@link GetStatusBadgeColor}. */
|
|
2017
|
+
getStatusBadgeColor() {
|
|
2018
|
+
return this.GetStatusBadgeColor();
|
|
2019
|
+
}
|
|
2020
|
+
GetStatusBannerIcon() {
|
|
1741
2021
|
switch (this.record?.Status) {
|
|
1742
2022
|
case 'Pending': return 'fa-clock';
|
|
1743
2023
|
case 'Rejected': return 'fa-times-circle';
|
|
@@ -1745,7 +2025,11 @@ let MJQueryFormComponentExtended = class MJQueryFormComponentExtended extends MJ
|
|
|
1745
2025
|
default: return 'fa-info-circle';
|
|
1746
2026
|
}
|
|
1747
2027
|
}
|
|
1748
|
-
|
|
2028
|
+
/** @deprecated Use {@link GetStatusBannerIcon}. */
|
|
2029
|
+
getStatusBannerIcon() {
|
|
2030
|
+
return this.GetStatusBannerIcon();
|
|
2031
|
+
}
|
|
2032
|
+
GetStatusBannerMessage() {
|
|
1749
2033
|
switch (this.record?.Status) {
|
|
1750
2034
|
case 'Pending': return 'It can be executed for testing but has not yet been approved.';
|
|
1751
2035
|
case 'Rejected': return 'It was rejected and may need revision before approval.';
|
|
@@ -1753,10 +2037,14 @@ let MJQueryFormComponentExtended = class MJQueryFormComponentExtended extends MJ
|
|
|
1753
2037
|
default: return '';
|
|
1754
2038
|
}
|
|
1755
2039
|
}
|
|
2040
|
+
/** @deprecated Use {@link GetStatusBannerMessage}. */
|
|
2041
|
+
getStatusBannerMessage() {
|
|
2042
|
+
return this.GetStatusBannerMessage();
|
|
2043
|
+
}
|
|
1756
2044
|
/**
|
|
1757
2045
|
* Handle composition token click — navigate to the referenced query
|
|
1758
2046
|
*/
|
|
1759
|
-
|
|
2047
|
+
OnCompositionTokenClick(event) {
|
|
1760
2048
|
const allQueries = QueryEngine.Instance.Queries;
|
|
1761
2049
|
const segments = event.FullPath.split('/').map(s => s.trim()).filter(s => s.length > 0);
|
|
1762
2050
|
if (segments.length === 0)
|
|
@@ -1783,16 +2071,24 @@ let MJQueryFormComponentExtended = class MJQueryFormComponentExtended extends MJ
|
|
|
1783
2071
|
MJNotificationService.Instance.CreateSimpleNotification(`Referenced query "${event.FullPath}" not found.`, 'warning', 3000);
|
|
1784
2072
|
}
|
|
1785
2073
|
}
|
|
2074
|
+
/** @deprecated Use {@link OnCompositionTokenClick}. */
|
|
2075
|
+
onCompositionTokenClick(event) {
|
|
2076
|
+
return this.OnCompositionTokenClick(event);
|
|
2077
|
+
}
|
|
1786
2078
|
/**
|
|
1787
2079
|
* Navigate to a dependent query's record
|
|
1788
2080
|
*/
|
|
1789
|
-
|
|
2081
|
+
OnDependentQueryClick(dep) {
|
|
1790
2082
|
this.navigationService.OpenEntityRecord('MJ: Queries', CompositeKey.FromID(dep.QueryID));
|
|
1791
2083
|
}
|
|
2084
|
+
/** @deprecated Use {@link OnDependentQueryClick}. */
|
|
2085
|
+
onDependentQueryClick(dep) {
|
|
2086
|
+
return this.OnDependentQueryClick(dep);
|
|
2087
|
+
}
|
|
1792
2088
|
/**
|
|
1793
2089
|
* Handle SQL value changes from the code editor
|
|
1794
2090
|
*/
|
|
1795
|
-
|
|
2091
|
+
OnSQLChange(value) {
|
|
1796
2092
|
if (this.isUpdatingEditorValue || !this.record) {
|
|
1797
2093
|
return;
|
|
1798
2094
|
}
|
|
@@ -1800,23 +2096,27 @@ let MJQueryFormComponentExtended = class MJQueryFormComponentExtended extends MJ
|
|
|
1800
2096
|
this.record.SQL = value;
|
|
1801
2097
|
this.updateUnsavedChangesFlag();
|
|
1802
2098
|
}
|
|
2099
|
+
/** @deprecated Use {@link OnSQLChange}. */
|
|
2100
|
+
onSQLChange(value) {
|
|
2101
|
+
return this.OnSQLChange(value);
|
|
2102
|
+
}
|
|
1803
2103
|
/**
|
|
1804
2104
|
* Add a new field
|
|
1805
2105
|
*/
|
|
1806
|
-
async
|
|
2106
|
+
async AddField() {
|
|
1807
2107
|
try {
|
|
1808
2108
|
const md = this.ProviderToUse;
|
|
1809
2109
|
const newField = await md.GetEntityObject('MJ: Query Fields');
|
|
1810
2110
|
newField.QueryID = this.record.ID;
|
|
1811
|
-
newField.Name = `field${this.
|
|
2111
|
+
newField.Name = `field${this.QueryFields.length + 1}`;
|
|
1812
2112
|
newField.Description = '';
|
|
1813
|
-
newField.Sequence = (this.
|
|
2113
|
+
newField.Sequence = (this.QueryFields.length + 1) * 10;
|
|
1814
2114
|
newField.SQLBaseType = 'nvarchar';
|
|
1815
2115
|
newField.SQLFullType = 'nvarchar(255)';
|
|
1816
2116
|
const saved = await newField.Save();
|
|
1817
2117
|
if (saved) {
|
|
1818
|
-
this.
|
|
1819
|
-
this.
|
|
2118
|
+
this.QueryFields.push(newField);
|
|
2119
|
+
this.QueryFields.sort((a, b) => (a.Sequence || 0) - (b.Sequence || 0));
|
|
1820
2120
|
this.updateUnsavedChangesFlag();
|
|
1821
2121
|
MJNotificationService.Instance.CreateSimpleNotification('Field added successfully', 'success', 3000);
|
|
1822
2122
|
}
|
|
@@ -1826,10 +2126,14 @@ let MJQueryFormComponentExtended = class MJQueryFormComponentExtended extends MJ
|
|
|
1826
2126
|
MJNotificationService.Instance.CreateSimpleNotification('Failed to add field', 'error', 3000);
|
|
1827
2127
|
}
|
|
1828
2128
|
}
|
|
2129
|
+
/** @deprecated Use {@link AddField}. */
|
|
2130
|
+
async addField() {
|
|
2131
|
+
return this.AddField();
|
|
2132
|
+
}
|
|
1829
2133
|
/**
|
|
1830
2134
|
* Delete a field
|
|
1831
2135
|
*/
|
|
1832
|
-
async
|
|
2136
|
+
async DeleteField(field) {
|
|
1833
2137
|
if (!(await this.confirmService.ConfirmDelete({ title: 'Delete Field', message: `Delete field "${field.Name}"?` }))) {
|
|
1834
2138
|
return;
|
|
1835
2139
|
}
|
|
@@ -1838,13 +2142,13 @@ let MJQueryFormComponentExtended = class MJQueryFormComponentExtended extends MJ
|
|
|
1838
2142
|
const freshField = await md.GetEntityObject('MJ: Query Fields');
|
|
1839
2143
|
const loaded = await freshField.Load(field.ID);
|
|
1840
2144
|
if (!loaded) {
|
|
1841
|
-
this.
|
|
2145
|
+
this.QueryFields = this.QueryFields.filter(f => !UUIDsEqual(f.ID, field.ID));
|
|
1842
2146
|
this.cdr.detectChanges();
|
|
1843
2147
|
return;
|
|
1844
2148
|
}
|
|
1845
2149
|
const deleted = await freshField.Delete();
|
|
1846
2150
|
if (deleted) {
|
|
1847
|
-
this.
|
|
2151
|
+
this.QueryFields = this.QueryFields.filter(f => !UUIDsEqual(f.ID, field.ID));
|
|
1848
2152
|
this.updateUnsavedChangesFlag();
|
|
1849
2153
|
MJNotificationService.Instance.CreateSimpleNotification('Field deleted successfully', 'success', 3000);
|
|
1850
2154
|
}
|
|
@@ -1859,16 +2163,20 @@ let MJQueryFormComponentExtended = class MJQueryFormComponentExtended extends MJ
|
|
|
1859
2163
|
MJNotificationService.Instance.CreateSimpleNotification('Failed to delete field', 'error', 3000);
|
|
1860
2164
|
}
|
|
1861
2165
|
}
|
|
2166
|
+
/** @deprecated Use {@link DeleteField}. */
|
|
2167
|
+
async deleteField(field) {
|
|
2168
|
+
return this.DeleteField(field);
|
|
2169
|
+
}
|
|
1862
2170
|
/**
|
|
1863
2171
|
* Add a new entity
|
|
1864
2172
|
*/
|
|
1865
|
-
async
|
|
2173
|
+
async AddEntity() {
|
|
1866
2174
|
try {
|
|
1867
2175
|
const md = this.ProviderToUse;
|
|
1868
2176
|
const newEntity = await md.GetEntityObject('MJ: Query Entities');
|
|
1869
2177
|
newEntity.QueryID = this.record.ID;
|
|
1870
2178
|
// Add to the list immediately for UI responsiveness
|
|
1871
|
-
this.
|
|
2179
|
+
this.QueryEntities.push(newEntity);
|
|
1872
2180
|
this.updateUnsavedChangesFlag();
|
|
1873
2181
|
}
|
|
1874
2182
|
catch (error) {
|
|
@@ -1876,10 +2184,14 @@ let MJQueryFormComponentExtended = class MJQueryFormComponentExtended extends MJ
|
|
|
1876
2184
|
MJNotificationService.Instance.CreateSimpleNotification('Failed to add entity', 'error', 3000);
|
|
1877
2185
|
}
|
|
1878
2186
|
}
|
|
2187
|
+
/** @deprecated Use {@link AddEntity}. */
|
|
2188
|
+
async addEntity() {
|
|
2189
|
+
return this.AddEntity();
|
|
2190
|
+
}
|
|
1879
2191
|
/**
|
|
1880
2192
|
* Delete an entity
|
|
1881
2193
|
*/
|
|
1882
|
-
async
|
|
2194
|
+
async DeleteEntity(entity) {
|
|
1883
2195
|
if (!(await this.confirmService.ConfirmDelete({ title: 'Delete Entity', message: `Delete entity "${entity.Entity}"?` }))) {
|
|
1884
2196
|
return;
|
|
1885
2197
|
}
|
|
@@ -1888,13 +2200,13 @@ let MJQueryFormComponentExtended = class MJQueryFormComponentExtended extends MJ
|
|
|
1888
2200
|
const freshEntity = await md.GetEntityObject('MJ: Query Entities');
|
|
1889
2201
|
const loaded = await freshEntity.Load(entity.ID);
|
|
1890
2202
|
if (!loaded) {
|
|
1891
|
-
this.
|
|
2203
|
+
this.QueryEntities = this.QueryEntities.filter(e => !UUIDsEqual(e.ID, entity.ID));
|
|
1892
2204
|
this.cdr.detectChanges();
|
|
1893
2205
|
return;
|
|
1894
2206
|
}
|
|
1895
2207
|
const deleted = await freshEntity.Delete();
|
|
1896
2208
|
if (deleted) {
|
|
1897
|
-
this.
|
|
2209
|
+
this.QueryEntities = this.QueryEntities.filter(e => !UUIDsEqual(e.ID, entity.ID));
|
|
1898
2210
|
this.updateUnsavedChangesFlag();
|
|
1899
2211
|
MJNotificationService.Instance.CreateSimpleNotification('Entity deleted successfully', 'success', 3000);
|
|
1900
2212
|
}
|
|
@@ -1909,15 +2221,23 @@ let MJQueryFormComponentExtended = class MJQueryFormComponentExtended extends MJ
|
|
|
1909
2221
|
MJNotificationService.Instance.CreateSimpleNotification('Failed to delete entity', 'error', 3000);
|
|
1910
2222
|
}
|
|
1911
2223
|
}
|
|
2224
|
+
/** @deprecated Use {@link DeleteEntity}. */
|
|
2225
|
+
async deleteEntity(entity) {
|
|
2226
|
+
return this.DeleteEntity(entity);
|
|
2227
|
+
}
|
|
1912
2228
|
/**
|
|
1913
2229
|
* Get entity options for dropdown
|
|
1914
2230
|
*/
|
|
1915
|
-
|
|
2231
|
+
GetEntityOptions() {
|
|
1916
2232
|
return this.ProviderToUse.Entities.map(e => ({
|
|
1917
2233
|
text: e.Name,
|
|
1918
2234
|
id: e.ID
|
|
1919
2235
|
})).sort((a, b) => a.text.localeCompare(b.text));
|
|
1920
2236
|
}
|
|
2237
|
+
/** @deprecated Use {@link GetEntityOptions}. */
|
|
2238
|
+
getEntityOptions() {
|
|
2239
|
+
return this.GetEntityOptions();
|
|
2240
|
+
}
|
|
1921
2241
|
/**
|
|
1922
2242
|
* Get the grid edit mode based on component edit mode
|
|
1923
2243
|
*/
|
|
@@ -1929,7 +2249,7 @@ let MJQueryFormComponentExtended = class MJQueryFormComponentExtended extends MJ
|
|
|
1929
2249
|
i0.ɵɵviewQuery(_c0, 5);
|
|
1930
2250
|
} if (rf & 2) {
|
|
1931
2251
|
let _t;
|
|
1932
|
-
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.
|
|
2252
|
+
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.SqlEditor = _t.first);
|
|
1933
2253
|
} }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 1, vars: 1, consts: [["form", "ngForm"], ["sqlEditor", ""], [3, "Navigate", "DeleteRequested", "FavoriteToggled", "HistoryRequested", "ListManagementRequested", "Record", "FormComponent", "ToolbarConfig", "IsSaving", "WidthMode"], [1, "record-form", 2, "display", "flex", "flex-direction", "column", "height", "100%", "overflow", "hidden"], [1, "saving-overlay"], [1, "query-header"], [1, "query-header-content"], [1, "query-header-top"], [1, "query-name-section"], [1, "fa-solid", "fa-database", "query-title-icon"], ["name", "queryName", "placeholder", "Enter query name...", 1, "mj-input", "query-name-input", 3, "ngModel"], [1, "query-name-display"], [1, "query-header-actions"], ["mjButton", "", "variant", "primary", "title", "Run Query", 1, "run-query-btn", 3, "disabled"], [1, "query-meta-row"], [1, "query-meta-item"], [1, "meta-label"], [1, "meta-dropdown-row"], [1, "meta-value"], ["name", "status", "TextField", "text", "ValueField", "value", 1, "meta-dropdown", "status-dropdown", 3, "ngModel", "Data", "ValuePrimitive"], [1, "status-pill", 3, "background"], [1, "query-description-row"], ["Variant", "warning"], [1, "query-content"], [1, "query-panel", 3, "ExpandedChange", "Expanded"], ["mjAccordionTitle", ""], [1, "sql-panel-toolbar", 2, "display", "flex", "justify-content", "flex-end", "padding", "4px 0 8px"], ["type", "button", "mjButton", "", "variant", "flat", "title", "Show/hide SQL filters help", 1, "filters-help-btn", 3, "click"], [1, "fa-solid", "fa-question-circle"], [1, "fa-solid", 3, "ngClass"], [1, "sql-panel-content"], [1, "sql-editor", 3, "change", "CompositionTokenClick", "language"], [1, "filters-help"], [1, "query-panel", 3, "Expanded"], [1, "panel-body"], [1, "details-grid"], [1, "detail-item"], [1, "detail-label"], [1, "fa-solid", "fa-puzzle-piece"], [1, "detail-value"], [1, "fa-solid", "fa-bolt"], [1, "fa-solid", "fa-clipboard-list"], [1, "fa-solid", "fa-file-code"], ["name", "usesTemplate", 3, "ngModel"], [1, "fa-solid", "fa-calendar-plus"], [1, "fa-solid", "fa-calendar-check"], [3, "isVisibleChange", "onClose", "query", "parameters", "isVisible"], [1, "fa-solid", "fa-spinner", "fa-spin", "saving-spinner"], ["name", "queryName", "placeholder", "Enter query name...", 1, "mj-input", "query-name-input", 3, "ngModelChange", "ngModel"], ["mjButton", "", "variant", "primary", "title", "Run Query", 1, "run-query-btn", 3, "click", "disabled"], [1, "fa-solid", "fa-play"], [1, "meta-dropdown", 3, "ValueChange", "BranchConfig", "Value", "SelectableTypes", "SelectionMode", "Placeholder", "EnableSearch", "Clearable"], ["mjButton", "", "variant", "icon", "title", "New category", 3, "click"], [1, "fa-solid", "fa-plus"], ["mjButton", "", "variant", "icon", "title", "Edit category"], ["mjButton", "", "variant", "icon", "title", "Edit category", 3, "click"], [1, "fa-solid", "fa-pen"], ["name", "status", "TextField", "text", "ValueField", "value", 1, "meta-dropdown", "status-dropdown", 3, "ngModelChange", "ngModel", "Data", "ValuePrimitive"], [1, "status-pill"], [1, "fa-solid"], ["name", "description", "rows", "2", "placeholder", "Enter query description...", 1, "mj-input", "query-description-input", 3, "ngModel"], [1, "query-description-text"], ["name", "description", "rows", "2", "placeholder", "Enter query description...", 1, "mj-input", "query-description-input", 3, "ngModelChange", "ngModel"], [1, "panel-title-row"], [1, "panel-title"], [1, "fa-solid", "fa-code", "panel-icon", "sql-icon"], [1, "panel-badge", "defined"], [1, "filters-help-title"], [1, "fa-solid", "fa-filter"], [1, "filters-grid"], [1, "filter-card"], [1, "filter-name"], [1, "filter-description"], [1, "filter-syntax"], [1, "filter-notes"], [1, "technical-description-view"], [1, "fa-solid", "fa-book", "panel-icon"], ["name", "technicalDescription", "rows", "8", "placeholder", "Technical documentation of the query logic, performance considerations, and parameter usage. Supports markdown and mermaid diagrams.", 1, "mj-input", "technical-description-textarea", 3, "ngModelChange", "ngModel"], [1, "technical-description-preview"], [1, "preview-label"], [1, "fa-solid", "fa-eye"], [3, "data", "enableMermaid", "enableHighlight", "enableCollapsibleHeadings", "enableSmartypants"], [1, "panel-loading"], [1, "fa-solid", "fa-sliders", "panel-icon"], [1, "panel-badge", "count"], ["text", "Loading parameters..."], ["Icon", "fa-solid fa-sliders", "Title", "No Parameters Defined", "Message", "Add parameters to make your query dynamic and reusable.", "ActionIcon", "fa-solid fa-plus", 3, "ActionText"], ["Icon", "fa-solid fa-sliders", "Title", "No Parameters Defined", "Message", "Add parameters to make your query dynamic and reusable.", "ActionIcon", "fa-solid fa-plus", 3, "Action", "ActionText"], [1, "panel-toolbar"], [1, "card-grid"], [1, "item-card", 3, "required"], ["type", "button", 1, "add-item-btn", 3, "click"], [1, "item-card", 3, "click"], [1, "item-card-header"], [1, "item-name"], [1, "fa-solid", "fa-at", "item-name-icon", "param-icon"], [1, "item-badges"], [1, "item-badge", "required"], [1, "item-card-body"], [1, "item-description"], [1, "item-meta"], [1, "meta-tag"], [1, "item-actions"], [1, "meta-code"], [1, "item-actions", 3, "click"], ["type", "button", "title", "Edit parameter", 1, "item-action-btn", 3, "click"], ["type", "button", "title", "Delete parameter", 1, "item-action-btn", "delete", 3, "click"], [1, "fa-solid", "fa-trash"], [1, "fa-solid", "fa-table", "panel-icon"], ["text", "Loading fields..."], ["Icon", "fa-solid fa-table", "Title", "No Fields Defined", "Message", "Define output fields for your query results.", "ActionIcon", "fa-solid fa-plus", 3, "ActionText"], ["Icon", "fa-solid fa-table", "Title", "No Fields Defined", "Message", "Define output fields for your query results.", "ActionIcon", "fa-solid fa-plus", 3, "Action", "ActionText"], [1, "item-card"], [1, "fa-solid", "fa-columns", "item-name-icon", "field-icon"], [1, "item-badge", "type"], [1, "item-badge", "sequence"], [1, "fa-solid", "fa-code"], [1, "item-card-actions"], ["type", "button", "title", "Delete field", 1, "item-action-btn", "delete", 3, "click"], [1, "dependents-description"], [1, "item-card", "dependent-card"], [1, "fa-solid", "fa-arrow-left", "panel-icon", "dependents-icon"], [1, "item-card", "dependent-card", 3, "click"], [1, "fa-solid", "fa-arrow-left", "item-name-icon", "dependent-query-icon"], [1, "item-card-footer"], [1, "open-link"], [1, "fa-solid", "fa-arrow-up-right-from-square"], [1, "fa-solid", "fa-link"], [1, "fa-solid", "fa-database", "panel-icon"], ["text", "Loading entities..."], ["Icon", "fa-solid fa-database", "Title", "No Entities Tracked", "Message", "Track which entities this query uses for documentation.", "ActionIcon", "fa-solid fa-plus", 3, "ActionText"], ["Icon", "fa-solid fa-database", "Title", "No Entities Tracked", "Message", "Track which entities this query uses for documentation.", "ActionIcon", "fa-solid fa-plus", 3, "Action", "ActionText"], [1, "fa-solid", "fa-table", "item-name-icon", "entity-icon"], [1, "entity-dropdown-wrapper"], ["TextField", "text", "ValueField", "id", "Placeholder", "Select entity...", 1, "entity-dropdown", 3, "ngModelChange", "ngModel", "name", "Data", "ValuePrimitive"], [1, "fa-solid", "fa-database"], ["type", "button", "title", "Delete entity", 1, "item-action-btn", "delete", 3, "click"], [1, "fa-solid", "fa-info-circle", "panel-icon"], ["name", "reusable", 3, "ngModelChange", "ngModel"], [1, "detail-hint"], [1, "detail-tag", "positive"], [1, "detail-tag", "neutral"], [1, "fa-solid", "fa-check"], [1, "fa-solid", "fa-times"], ["name", "cacheEnabled", 3, "ngModelChange", "ngModel"], [1, "fa-solid", "fa-clock"], ["type", "number", "name", "cacheTTLMinutes", "min", "1", "placeholder", "Default", 1, "mj-input", "detail-input-narrow", 3, "ngModelChange", "ngModel"], ["name", "auditQueryRuns", 3, "ngModelChange", "ngModel"], ["name", "usesTemplate", 3, "ngModelChange", "ngModel"], [1, "fa-solid", "fa-star"], [1, "fa-solid", "fa-shield-alt", "panel-icon"], ["text", "Loading permissions..."], ["Icon", "fa-solid fa-shield-halved", "Title", "No Permissions Set", "Message", "This query uses default permissions."], [3, "Params", "NewRecordValues", "AllowLoad", "ShowToolbar"], [1, "permissions-list"], [1, "permission-card"], [1, "fa-solid", "fa-users", "permission-icon"], [1, "permission-info"], [1, "permission-role"], [1, "permission-type"], [1, "permission-badge"]], template: function MJQueryFormComponentExtended_Template(rf, ctx) { if (rf & 1) {
|
|
1934
2254
|
i0.ɵɵconditionalCreate(0, MJQueryFormComponentExtended_Conditional_0_Template, 88, 38);
|
|
1935
2255
|
} if (rf & 2) {
|
|
@@ -1943,7 +2263,7 @@ export { MJQueryFormComponentExtended };
|
|
|
1943
2263
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(MJQueryFormComponentExtended, [{
|
|
1944
2264
|
type: Component,
|
|
1945
2265
|
args: [{ standalone: false, selector: 'mj-query-form', template: "@if (record) {\n<mj-record-form-container [Record]=\"record\" [FormComponent]=\"this\"\n [ToolbarConfig]=\"ToolbarConfig\"\n [IsSaving]=\"IsSaving\"\n [WidthMode]=\"'full-width'\"\n (Navigate)=\"OnFormNavigate($event)\"\n (DeleteRequested)=\"OnDeleteRequested()\"\n (FavoriteToggled)=\"OnFavoriteToggled()\"\n (HistoryRequested)=\"OnHistoryRequested()\"\n (ListManagementRequested)=\"OnListManagementRequested()\">\n <form class=\"record-form\" #form=\"ngForm\" style=\"display: flex; flex-direction: column; height: 100%; overflow: hidden;\">\n\n <!-- Saving Overlay -->\n @if (IsSaving) {\n <div class=\"saving-overlay\">\n <i class=\"fa-solid fa-spinner fa-spin saving-spinner\"></i>\n <span>Saving...</span>\n </div>\n }\n\n <!-- Header Section -->\n <div class=\"query-header\" [class.content-saving]=\"IsSaving\">\n <div class=\"query-header-content\">\n <!-- Top Row: Name and Run Button -->\n <div class=\"query-header-top\">\n <!-- Left: Query Name -->\n <div class=\"query-name-section\">\n <i class=\"fa-solid fa-database query-title-icon\"></i>\n @if (EditMode) {\n <input class=\"mj-input query-name-input\"\n [(ngModel)]=\"record.Name\"\n name=\"queryName\"\n placeholder=\"Enter query name...\" />\n } @else {\n <h4 class=\"query-name-display\">{{ record.Name || 'Untitled Query' }}</h4>\n }\n </div>\n\n <!-- Right: Action Buttons -->\n <div class=\"query-header-actions\">\n @if (record.ID) {\n <button mjButton\n variant=\"primary\"\n [disabled]=\"EditMode || !record.SQL || record.SQL.trim().length === 0\"\n (click)=\"runQuery()\"\n title=\"Run Query\"\n class=\"run-query-btn\">\n <i class=\"fa-solid fa-play\"></i> Run\n </button>\n }\n </div>\n </div>\n\n <!-- Second Row: Category and Status -->\n <div class=\"query-meta-row\">\n <!-- Category -->\n <div class=\"query-meta-item\">\n <label class=\"meta-label\">Category</label>\n @if (EditMode) {\n <div class=\"meta-dropdown-row\">\n <mj-tree-dropdown\n [BranchConfig]=\"CategoryBranchConfig\"\n [Value]=\"CategoryIDAsKey\"\n [SelectableTypes]=\"'branch'\"\n [SelectionMode]=\"'single'\"\n [Placeholder]=\"'Select category...'\"\n [EnableSearch]=\"true\"\n [Clearable]=\"true\"\n (ValueChange)=\"OnCategoryTreeChange($event)\"\n class=\"meta-dropdown\">\n </mj-tree-dropdown>\n <button mjButton variant=\"icon\" title=\"New category\" (click)=\"createCategory()\">\n <i class=\"fa-solid fa-plus\"></i>\n </button>\n @if (record.CategoryID) {\n <button mjButton variant=\"icon\" title=\"Edit category\" (click)=\"editSelectedCategory()\">\n <i class=\"fa-solid fa-pen\"></i>\n </button>\n }\n </div>\n } @else {\n <span class=\"meta-value\">{{ categoryPathDisplay || 'Uncategorized' }}</span>\n }\n </div>\n\n <!-- Status -->\n <div class=\"query-meta-item\">\n <label class=\"meta-label\">Status</label>\n @if (EditMode) {\n <mj-dropdown\n [(ngModel)]=\"record.Status\"\n name=\"status\"\n [Data]=\"statusOptions\"\n TextField=\"text\"\n ValueField=\"value\"\n [ValuePrimitive]=\"true\"\n class=\"meta-dropdown status-dropdown\">\n </mj-dropdown>\n } @else {\n <span class=\"status-pill\"\n [style.background]=\"getStatusBadgeColor()\">\n <i class=\"fa-solid\" [class]=\"getStatusBannerIcon()\"></i>\n {{ record.Status || 'Unknown' }}\n </span>\n }\n </div>\n </div>\n\n <!-- Third Row: Description -->\n @if (EditMode || record.Description) {\n <div class=\"query-description-row\">\n @if (EditMode) {\n <textarea class=\"mj-input query-description-input\"\n [(ngModel)]=\"record.Description\"\n name=\"description\"\n rows=\"2\"\n placeholder=\"Enter query description...\">\n </textarea>\n } @else {\n <p class=\"query-description-text\">{{ record.Description }}</p>\n }\n </div>\n }\n </div>\n </div>\n\n <!-- Status Warning Banner for Non-Approved Queries -->\n @if (record.Status && record.Status !== 'Approved' && !EditMode) {\n <mj-alert Variant=\"warning\">\n <span>\n This query has status <strong>{{ record.Status }}</strong>. {{ getStatusBannerMessage() }}\n </span>\n </mj-alert>\n }\n\n <!-- Main Content Area with Expansion Panels -->\n <div class=\"query-content\" [class.content-saving]=\"IsSaving\">\n\n <!-- SQL Query Panel -->\n <mj-accordion-panel\n [(Expanded)]=\"sqlPanelExpanded\"\n class=\"query-panel\">\n <ng-template mjAccordionTitle>\n <span class=\"panel-title-row\">\n <span class=\"panel-title\">\n <i class=\"fa-solid fa-code panel-icon sql-icon\"></i>\n SQL\n @if (record.SQL) {\n <span class=\"panel-badge defined\">— Defined</span>\n }\n </span>\n </span>\n </ng-template>\n\n <div class=\"sql-panel-toolbar\" style=\"display: flex; justify-content: flex-end; padding: 4px 0 8px;\">\n <button type=\"button\"\n mjButton\n variant=\"flat\"\n (click)=\"toggleFiltersHelp()\"\n title=\"Show/hide SQL filters help\"\n class=\"filters-help-btn\">\n <i class=\"fa-solid fa-question-circle\"></i>\n <span>Filters Help</span>\n <i class=\"fa-solid\" [ngClass]=\"showFiltersHelp ? 'fa-chevron-up' : 'fa-chevron-down'\"></i>\n </button>\n </div>\n\n <div class=\"sql-panel-content\">\n <!-- Code Editor -->\n <mj-code-editor #sqlEditor\n (change)=\"onSQLChange($event)\"\n (CompositionTokenClick)=\"onCompositionTokenClick($event)\"\n [language]=\"'sql'\"\n class=\"sql-editor\">\n </mj-code-editor>\n\n <!-- SQL Filters Help (Below Editor) -->\n @if (showFiltersHelp) {\n <div class=\"filters-help\">\n <h6 class=\"filters-help-title\">\n <i class=\"fa-solid fa-filter\"></i> Available SQL Filters for Parameterized Queries\n </h6>\n <div class=\"filters-grid\">\n @for (filter of sqlFilters; track filter.name) {\n <div class=\"filter-card\">\n <div class=\"filter-name\">{{ filter.name }}</div>\n <div class=\"filter-description\">{{ filter.description }}</div>\n <div class=\"filter-syntax\">{{ filter.exampleSyntax }}</div>\n @if (filter.notes) {\n <div class=\"filter-notes\">{{ filter.notes }}</div>\n }\n </div>\n }\n </div>\n </div>\n }\n </div>\n </mj-accordion-panel>\n\n <!-- Technical Description Panel -->\n @if (record.TechnicalDescription || EditMode) {\n <mj-accordion-panel\n [(Expanded)]=\"technicalDescriptionPanelExpanded\"\n class=\"query-panel\">\n <ng-template mjAccordionTitle>\n <span class=\"panel-title\">\n <i class=\"fa-solid fa-book panel-icon\"></i>\n Technical Description\n @if (record.TechnicalDescription) {\n <span class=\"panel-badge defined\">— Documented</span>\n }\n </span>\n </ng-template>\n\n <div class=\"panel-body\">\n @if (EditMode) {\n <textarea class=\"mj-input technical-description-textarea\"\n [(ngModel)]=\"record.TechnicalDescription\"\n name=\"technicalDescription\"\n rows=\"8\"\n placeholder=\"Technical documentation of the query logic, performance considerations, and parameter usage. Supports markdown and mermaid diagrams.\">\n </textarea>\n @if (record.TechnicalDescription) {\n <div class=\"technical-description-preview\">\n <div class=\"preview-label\">\n <i class=\"fa-solid fa-eye\"></i> Preview\n </div>\n <mj-markdown\n [data]=\"record.TechnicalDescription || ''\"\n [enableMermaid]=\"true\"\n [enableHighlight]=\"true\"\n [enableCollapsibleHeadings]=\"false\"\n [enableSmartypants]=\"true\">\n </mj-markdown>\n </div>\n }\n } @else {\n <div class=\"technical-description-view\">\n <mj-markdown\n [data]=\"record.TechnicalDescription || ''\"\n [enableMermaid]=\"true\"\n [enableHighlight]=\"true\"\n [enableCollapsibleHeadings]=\"false\"\n [enableSmartypants]=\"true\">\n </mj-markdown>\n </div>\n }\n </div>\n </mj-accordion-panel>\n }\n\n <!-- Parameters Panel -->\n @if (record.IsSaved) {\n <mj-accordion-panel\n [(Expanded)]=\"parametersPanelExpanded\"\n class=\"query-panel\">\n <ng-template mjAccordionTitle>\n <span class=\"panel-title\">\n <i class=\"fa-solid fa-sliders panel-icon\"></i>\n Parameters\n @if (queryParameters.length > 0) {\n <span class=\"panel-badge count\">{{ queryParameters.length }}</span>\n }\n </span>\n </ng-template>\n\n <div class=\"panel-body\">\n @if (isLoadingParameters) {\n <div class=\"panel-loading\">\n <mj-loading text=\"Loading parameters...\"></mj-loading>\n </div>\n } @else {\n @if (queryParameters.length === 0) {\n <mj-empty-state Icon=\"fa-solid fa-sliders\"\n Title=\"No Parameters Defined\"\n Message=\"Add parameters to make your query dynamic and reusable.\"\n [ActionText]=\"EditMode ? 'Add First Parameter' : ''\"\n ActionIcon=\"fa-solid fa-plus\"\n (Action)=\"addParameter()\" />\n } @else {\n @if (EditMode) {\n <div class=\"panel-toolbar\">\n <button type=\"button\" class=\"add-item-btn\" (click)=\"addParameter()\">\n <i class=\"fa-solid fa-plus\"></i> Add Parameter\n </button>\n </div>\n }\n <div class=\"card-grid\">\n @for (param of queryParameters; track param.ID || $index) {\n <div class=\"item-card\" [class.required]=\"param.IsRequired\" (click)=\"editParameter(param)\">\n <div class=\"item-card-header\">\n <div class=\"item-name\">\n <i class=\"fa-solid fa-at item-name-icon param-icon\"></i>\n {{ param.Name }}\n </div>\n <div class=\"item-badges\">\n @if (param.IsRequired) {\n <span class=\"item-badge required\">Required</span>\n }\n </div>\n </div>\n <div class=\"item-card-body\">\n @if (param.Description) {\n <div class=\"item-description\">{{ param.Description }}</div>\n }\n <div class=\"item-meta\">\n <span class=\"meta-tag\">\n <strong>Type:</strong> {{ param.Type || 'Text' }}\n </span>\n @if (param.DefaultValue) {\n <span class=\"meta-tag\">\n <strong>Default:</strong>\n <code class=\"meta-code\">{{ param.DefaultValue }}</code>\n </span>\n }\n </div>\n </div>\n @if (EditMode) {\n <div class=\"item-actions\" (click)=\"$event.stopPropagation()\">\n <button type=\"button\" class=\"item-action-btn\" (click)=\"editParameter(param)\" title=\"Edit parameter\">\n <i class=\"fa-solid fa-pen\"></i>\n </button>\n <button type=\"button\" class=\"item-action-btn delete\" (click)=\"deleteParameter(param)\" title=\"Delete parameter\">\n <i class=\"fa-solid fa-trash\"></i>\n </button>\n </div>\n }\n </div>\n }\n </div>\n }\n }\n </div>\n </mj-accordion-panel>\n }\n\n <!-- Query Fields Panel -->\n @if (record.IsSaved) {\n <mj-accordion-panel\n [(Expanded)]=\"fieldsPanelExpanded\"\n class=\"query-panel\">\n <ng-template mjAccordionTitle>\n <span class=\"panel-title\">\n <i class=\"fa-solid fa-table panel-icon\"></i>\n Fields\n @if (queryFields.length > 0) {\n <span class=\"panel-badge count\">{{ queryFields.length }}</span>\n }\n </span>\n </ng-template>\n\n <div class=\"panel-body\">\n @if (isLoadingFields) {\n <div class=\"panel-loading\">\n <mj-loading text=\"Loading fields...\"></mj-loading>\n </div>\n } @else {\n @if (queryFields.length === 0) {\n <mj-empty-state Icon=\"fa-solid fa-table\"\n Title=\"No Fields Defined\"\n Message=\"Define output fields for your query results.\"\n [ActionText]=\"EditMode ? 'Add First Field' : ''\"\n ActionIcon=\"fa-solid fa-plus\"\n (Action)=\"addField()\" />\n } @else {\n @if (EditMode) {\n <div class=\"panel-toolbar\">\n <button type=\"button\" class=\"add-item-btn\" (click)=\"addField()\">\n <i class=\"fa-solid fa-plus\"></i> Add Field\n </button>\n </div>\n }\n <div class=\"card-grid\">\n @for (field of queryFields; track field.ID) {\n <div class=\"item-card\">\n <div class=\"item-card-header\">\n <div class=\"item-name\">\n <i class=\"fa-solid fa-columns item-name-icon field-icon\"></i>\n {{ field.Name }}\n </div>\n <div class=\"item-badges\">\n <span class=\"item-badge type\">{{ field.SQLBaseType }}</span>\n @if (field.Sequence) {\n <span class=\"item-badge sequence\">#{{ field.Sequence }}</span>\n }\n </div>\n </div>\n <div class=\"item-card-body\">\n @if (field.Description) {\n <div class=\"item-description\">{{ field.Description }}</div>\n }\n <div class=\"item-meta\">\n <span class=\"meta-tag\">\n <i class=\"fa-solid fa-code\"></i> {{ field.SQLFullType || field.SQLBaseType }}\n </span>\n </div>\n </div>\n @if (EditMode) {\n <div class=\"item-card-actions\">\n <button type=\"button\" class=\"item-action-btn delete\" (click)=\"deleteField(field)\" title=\"Delete field\">\n <i class=\"fa-solid fa-trash\"></i>\n </button>\n </div>\n }\n </div>\n }\n </div>\n }\n }\n </div>\n </mj-accordion-panel>\n }\n\n <!-- Dependent Queries Panel -->\n @if (record.IsSaved && DependentQueries.length > 0) {\n <mj-accordion-panel\n [(Expanded)]=\"dependentsPanelExpanded\"\n class=\"query-panel\">\n <ng-template mjAccordionTitle>\n <span class=\"panel-title\">\n <i class=\"fa-solid fa-arrow-left panel-icon dependents-icon\"></i>\n Dependent Queries\n <span class=\"panel-badge count\">{{ DependentQueries.length }}</span>\n </span>\n </ng-template>\n\n <div class=\"panel-body\">\n <div class=\"dependents-description\">\n These queries reference this query via <code>{{\"{{query:\\\"...\\\"}}\"}} </code> composition syntax.\n </div>\n <div class=\"card-grid\">\n @for (dep of DependentQueries; track dep.ID) {\n <div class=\"item-card dependent-card\" (click)=\"onDependentQueryClick(dep)\">\n <div class=\"item-card-header\">\n <div class=\"item-name\">\n <i class=\"fa-solid fa-arrow-left item-name-icon dependent-query-icon\"></i>\n {{ dep.Query }}\n </div>\n </div>\n <div class=\"item-card-body\">\n @if (dep.ReferencePath) {\n <div class=\"item-meta\">\n <span class=\"meta-tag\">\n <i class=\"fa-solid fa-link\"></i> {{ dep.ReferencePath }}\n </span>\n </div>\n }\n @if (dep.Alias) {\n <div class=\"item-meta\">\n <span class=\"meta-tag\">\n <strong>Alias:</strong> <code class=\"meta-code\">{{ dep.Alias }}</code>\n </span>\n </div>\n }\n </div>\n <div class=\"item-card-footer\">\n <span class=\"open-link\">\n <i class=\"fa-solid fa-arrow-up-right-from-square\"></i> Open\n </span>\n </div>\n </div>\n }\n </div>\n </div>\n </mj-accordion-panel>\n }\n\n <!-- Query Entities Panel -->\n @if (record.IsSaved) {\n <mj-accordion-panel\n [(Expanded)]=\"entitiesPanelExpanded\"\n class=\"query-panel\">\n <ng-template mjAccordionTitle>\n <span class=\"panel-title\">\n <i class=\"fa-solid fa-database panel-icon\"></i>\n Entities\n @if (queryEntities.length > 0) {\n <span class=\"panel-badge count\">{{ queryEntities.length }}</span>\n }\n </span>\n </ng-template>\n\n <div class=\"panel-body\">\n @if (isLoadingEntities) {\n <div class=\"panel-loading\">\n <mj-loading text=\"Loading entities...\"></mj-loading>\n </div>\n } @else {\n @if (queryEntities.length === 0) {\n <mj-empty-state Icon=\"fa-solid fa-database\"\n Title=\"No Entities Tracked\"\n Message=\"Track which entities this query uses for documentation.\"\n [ActionText]=\"EditMode ? 'Add First Entity' : ''\"\n ActionIcon=\"fa-solid fa-plus\"\n (Action)=\"addEntity()\" />\n } @else {\n @if (EditMode) {\n <div class=\"panel-toolbar\">\n <button type=\"button\" class=\"add-item-btn\" (click)=\"addEntity()\">\n <i class=\"fa-solid fa-plus\"></i> Add Entity\n </button>\n </div>\n }\n <div class=\"card-grid\">\n @for (entity of queryEntities; track entity.ID) {\n <div class=\"item-card\">\n <div class=\"item-card-header\">\n <div class=\"item-name\">\n <i class=\"fa-solid fa-table item-name-icon entity-icon\"></i>\n {{ entity.Entity || 'Select Entity...' }}\n </div>\n @if (EditMode) {\n <div class=\"entity-dropdown-wrapper\">\n <mj-dropdown\n [(ngModel)]=\"entity.EntityID\"\n [name]=\"'entity_' + entity.ID\"\n [Data]=\"getEntityOptions()\"\n TextField=\"text\"\n ValueField=\"id\"\n [ValuePrimitive]=\"true\"\n Placeholder=\"Select entity...\"\n class=\"entity-dropdown\">\n </mj-dropdown>\n </div>\n }\n </div>\n @if (!EditMode && entity.Entity) {\n <div class=\"item-card-body\">\n <div class=\"item-meta\">\n <span class=\"meta-tag\">\n <i class=\"fa-solid fa-database\"></i> Data Source\n </span>\n </div>\n </div>\n }\n @if (EditMode) {\n <div class=\"item-card-actions\">\n <button type=\"button\" class=\"item-action-btn delete\" (click)=\"deleteEntity(entity)\" title=\"Delete entity\">\n <i class=\"fa-solid fa-trash\"></i>\n </button>\n </div>\n }\n </div>\n }\n </div>\n }\n }\n </div>\n </mj-accordion-panel>\n }\n\n <!-- Details Panel -->\n <mj-accordion-panel\n [(Expanded)]=\"detailsPanelExpanded\"\n class=\"query-panel\">\n <ng-template mjAccordionTitle>\n <span class=\"panel-title\">\n <i class=\"fa-solid fa-info-circle panel-icon\"></i>\n Details\n </span>\n </ng-template>\n\n <div class=\"panel-body\">\n <div class=\"details-grid\">\n <!-- Reusable -->\n <div class=\"detail-item\">\n <label class=\"detail-label\">\n <i class=\"fa-solid fa-puzzle-piece\"></i> Reusable\n </label>\n @if (EditMode) {\n <mj-switch [(ngModel)]=\"record.Reusable\" name=\"reusable\"></mj-switch>\n <div class=\"detail-hint\">Allow other queries to reference this query using composition syntax</div>\n } @else {\n <div class=\"detail-value\">\n @if (record.Reusable) {\n <span class=\"detail-tag positive\"><i class=\"fa-solid fa-check\"></i> Reusable</span>\n } @else {\n <span class=\"detail-tag neutral\"><i class=\"fa-solid fa-times\"></i> Not Reusable</span>\n }\n </div>\n }\n </div>\n\n <!-- Cache Enabled -->\n <div class=\"detail-item\">\n <label class=\"detail-label\">\n <i class=\"fa-solid fa-bolt\"></i> Cache Enabled\n </label>\n @if (EditMode) {\n <mj-switch [(ngModel)]=\"record.CacheEnabled\" name=\"cacheEnabled\"></mj-switch>\n <div class=\"detail-hint\">Cache query results in memory to reduce database load on repeated runs</div>\n } @else {\n <div class=\"detail-value\">\n @if (record.CacheEnabled) {\n <span class=\"detail-tag positive\"><i class=\"fa-solid fa-check\"></i> Caching On</span>\n } @else {\n <span class=\"detail-tag neutral\"><i class=\"fa-solid fa-times\"></i> Caching Off</span>\n }\n </div>\n }\n </div>\n\n <!-- Cache TTL -->\n @if (record.CacheEnabled) {\n <div class=\"detail-item\">\n <label class=\"detail-label\">\n <i class=\"fa-solid fa-clock\"></i> Cache TTL (Minutes)\n </label>\n @if (EditMode) {\n <input class=\"mj-input detail-input-narrow\"\n type=\"number\"\n [(ngModel)]=\"record.CacheTTLMinutes\"\n name=\"cacheTTLMinutes\"\n min=\"1\"\n placeholder=\"Default\" />\n <div class=\"detail-hint\">How long cached results remain valid. Leave blank for default TTL.</div>\n } @else {\n <div class=\"detail-value\">{{ record.CacheTTLMinutes != null ? record.CacheTTLMinutes + ' min' : 'Default' }}</div>\n }\n </div>\n }\n\n <!-- Audit Query Runs -->\n <div class=\"detail-item\">\n <label class=\"detail-label\">\n <i class=\"fa-solid fa-clipboard-list\"></i> Audit Runs\n </label>\n @if (EditMode) {\n <mj-switch [(ngModel)]=\"record.AuditQueryRuns\" name=\"auditQueryRuns\"></mj-switch>\n <div class=\"detail-hint\">Log all executions of this query to the Audit Log for tracking and compliance</div>\n } @else {\n <div class=\"detail-value\">\n @if (record.AuditQueryRuns) {\n <span class=\"detail-tag positive\"><i class=\"fa-solid fa-check\"></i> Auditing On</span>\n } @else {\n <span class=\"detail-tag neutral\"><i class=\"fa-solid fa-times\"></i> Auditing Off</span>\n }\n </div>\n }\n </div>\n\n <!-- Uses Template -->\n <div class=\"detail-item\">\n <label class=\"detail-label\">\n <i class=\"fa-solid fa-file-code\"></i> Template Usage\n </label>\n @if (EditMode) {\n <mj-switch [(ngModel)]=\"record.UsesTemplate\" name=\"usesTemplate\"></mj-switch>\n } @else {\n <div class=\"detail-value\">\n @if (record.UsesTemplate) {\n <span class=\"detail-tag positive\"><i class=\"fa-solid fa-check\"></i> Uses Templates</span>\n } @else {\n <span class=\"detail-tag neutral\"><i class=\"fa-solid fa-times\"></i> No Templates</span>\n }\n </div>\n }\n </div>\n\n <!-- Created Date -->\n <div class=\"detail-item\">\n <label class=\"detail-label\">\n <i class=\"fa-solid fa-calendar-plus\"></i> Created\n </label>\n <div class=\"detail-value\">{{ formatDate(record.__mj_CreatedAt) }}</div>\n </div>\n\n <!-- Updated Date -->\n <div class=\"detail-item\">\n <label class=\"detail-label\">\n <i class=\"fa-solid fa-calendar-check\"></i> Last Updated\n </label>\n <div class=\"detail-value\">{{ formatDate(record.__mj_UpdatedAt) }}</div>\n </div>\n\n <!-- Quality Rank -->\n @if (record.QualityRank != null) {\n <div class=\"detail-item\">\n <label class=\"detail-label\">\n <i class=\"fa-solid fa-star\"></i> Quality Rank\n </label>\n <div class=\"detail-value\">{{ record.QualityRank }}/10</div>\n </div>\n }\n </div>\n </div>\n </mj-accordion-panel>\n\n <!-- Permissions Panel -->\n @if (record.IsSaved) {\n <mj-accordion-panel\n [(Expanded)]=\"permissionsPanelExpanded\"\n class=\"query-panel\">\n <ng-template mjAccordionTitle>\n <span class=\"panel-title\">\n <i class=\"fa-solid fa-shield-alt panel-icon\"></i>\n Permissions\n </span>\n </ng-template>\n\n <div class=\"panel-body\">\n @if (isLoadingPermissions) {\n <div class=\"panel-loading\">\n <mj-loading text=\"Loading permissions...\"></mj-loading>\n </div>\n } @else {\n @if (queryPermissions.length === 0 && !EditMode) {\n <mj-empty-state Icon=\"fa-solid fa-shield-halved\"\n Title=\"No Permissions Set\"\n Message=\"This query uses default permissions.\" />\n } @else {\n @if (EditMode) {\n <mj-explorer-entity-data-grid\n [Params]=\"BuildRelationshipViewParamsByEntityName('MJ: Query Permissions','QueryID')\"\n [NewRecordValues]=\"NewRecordValues('MJ: Query Permissions')\"\n [AllowLoad]=\"true\"\n [ShowToolbar]=\"false\">\n </mj-explorer-entity-data-grid>\n } @else {\n <div class=\"permissions-list\">\n @for (permission of queryPermissions; track permission.ID) {\n <div class=\"permission-card\">\n <i class=\"fa-solid fa-users permission-icon\"></i>\n <div class=\"permission-info\">\n <div class=\"permission-role\">{{ permission.Role }}</div>\n <div class=\"permission-type\">Role Permission</div>\n </div>\n <span class=\"permission-badge\">\n <i class=\"fa-solid fa-play\"></i> Can Execute\n </span>\n </div>\n }\n </div>\n }\n }\n }\n </div>\n </mj-accordion-panel>\n }\n\n </div>\n </form>\n</mj-record-form-container>\n\n<!-- Query Run Dialog -->\n<mj-query-run-dialog\n [query]=\"record\"\n [parameters]=\"queryParameters\"\n [(isVisible)]=\"showRunDialog\"\n (onClose)=\"onRunDialogClose()\">\n</mj-query-run-dialog>\n}\n", styles: [".k-pane {\n background-color: var(--mj-bg-surface);\n}\n\n.content-margin {\n margin: 10px;\n}\n\n\na {\n font-size: 14px;\n font-weight: bolder;\n}\n\n.tab-header-icon {\n margin-right: 5px;\n}\n\n.record-form {\n display: block;\n flex-direction: column;\n background-color: var(--mj-bg-surface);\n padding: 0;\n min-height: 100vh;\n}\n\n.record-form-group {\n margin-top: 0px;\n background-color: var(--mj-bg-surface);\n}\n\nbutton {\n margin-right: 5px;\n}\n\n.record-form h2 {\n margin-bottom: 10px;\n}\n\n.k-splitter {\n border-width: 0px;\n}\n\n.record-form-row {\n display: grid;\n grid-template-columns: auto 1fr;\n align-items: start;\n gap: 10px;\n margin-bottom: 12px;\n padding-top: 5px;\n padding-bottom: 5px;\n}\n\n.record-form .record-form-row > :first-child {\n font-weight: bold;\n padding-right: 10px;\n}\n\n.record-form .record-form-row > span {\n white-space: pre-line;\n max-height: 300px;\n overflow: auto;\n}\n\n@media (min-width: 768px) {\n .record-form-row {\n flex-direction: row;\n align-items: center;\n }\n\n .record-form-row label {\n width: 240px;\n margin-bottom: 0;\n }\n}\n\n/* Collapsible Panel Styles */\n.form-panels-container {\n display: flex;\n flex-direction: column;\n gap: 16px;\n padding: 16px;\n background-color: var(--mj-bg-surface);\n}\n\n/* All field sections take full width */\n.form-panels-container > .form-card {\n width: 100%;\n}\n\n/* Related entity grid container - responsive layout */\n.form-panels-container .related-entity-grid {\n display: grid;\n grid-template-columns: 1fr;\n gap: 16px;\n width: 100%;\n}\n\n/* Responsive multi-column layout for related entities on wider screens */\n@media (min-width: 1400px) {\n .form-panels-container .related-entity-grid {\n grid-template-columns: repeat(auto-fit, minmax(600px, 1fr));\n }\n}\n\n.form-card {\n background: var(--mj-bg-surface-card);\n border-radius: 8px;\n box-shadow: 0 2px 4px var(--mj-shadow-sm);\n overflow: hidden;\n}\n\n.collapsible-card {\n overflow: hidden;\n}\n\n.collapsible-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 20px 24px;\n background: var(--mj-bg-surface-card);\n border-bottom: 2px solid var(--mj-border-default);\n cursor: pointer;\n user-select: none;\n transition: all 0.3s ease;\n}\n\n.collapsible-header:hover {\n background: var(--mj-bg-surface-sunken);\n border-bottom-color: var(--mj-brand-primary);\n}\n\n.collapsible-title {\n display: flex;\n align-items: center;\n gap: 12px;\n flex: 1;\n}\n\n.collapsible-title i {\n font-size: 20px;\n color: var(--mj-brand-primary);\n}\n\n.collapsible-title h3 {\n margin: 0;\n font-size: 18px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.collapsible-header .collapse-icon {\n color: var(--mj-text-muted);\n transition: transform 0.3s ease;\n}\n\n.collapsible-body {\n max-height: 2000px;\n overflow: hidden;\n transition: max-height 0.4s ease, padding 0.4s ease, opacity 0.3s ease;\n opacity: 1;\n}\n\n.collapsible-body.collapsed {\n max-height: 0;\n padding: 0;\n opacity: 0;\n}\n\n.form-body {\n padding: 24px;\n}\n\n/* Related Entity Sections - Visual Distinction */\n.form-card.related-entity {\n background: var(--mj-bg-surface-card);\n border-left: 3px solid var(--mj-brand-primary);\n}\n\n.form-card.related-entity .collapsible-header {\n background: var(--mj-bg-surface-sunken);\n}\n\n.form-card.related-entity .collapsible-header:hover {\n background: var(--mj-bg-surface-card);\n border-bottom-color: var(--mj-brand-primary);\n}\n\n.form-card.related-entity .collapsible-title i {\n color: var(--mj-brand-primary);\n}\n\n/* Section Controls */\n.form-section-controls {\n display: flex;\n gap: 10px;\n padding: 14px 18px;\n background: var(--mj-bg-surface-card);\n border-bottom: 2px solid var(--mj-border-default);\n align-items: center;\n flex-wrap: wrap;\n box-shadow: 0 1px 3px var(--mj-shadow-sm);\n}\n\n.form-section-controls .control-group {\n display: flex;\n gap: 8px;\n align-items: center;\n}\n\n.form-section-controls button {\n padding: 8px 14px;\n font-size: 13px;\n border: 1px solid var(--mj-border-strong);\n background: var(--mj-bg-surface-card);\n color: var(--mj-text-secondary);\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.2s;\n margin-right: 0;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n font-weight: 500;\n}\n\n.form-section-controls button:hover {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border-color: var(--mj-brand-primary);\n transform: translateY(-1px);\n box-shadow: 0 2px 4px var(--mj-shadow-md);\n}\n\n.form-section-controls button:active {\n transform: translateY(0);\n}\n\n.form-section-controls button i {\n margin-right: 0;\n font-size: 14px;\n}\n\n.form-section-controls .section-search {\n padding: 8px 14px;\n font-size: 13px;\n border: 1px solid var(--mj-border-strong);\n border-radius: 6px;\n width: 240px;\n transition: all 0.2s;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n}\n\n.form-section-controls .section-search:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n}\n\n.form-section-controls .section-search::placeholder {\n color: var(--mj-text-muted);\n font-style: italic;\n}\n\n.form-section-controls .section-count {\n font-size: 13px;\n color: var(--mj-text-muted);\n margin-left: auto;\n font-weight: 500;\n}\n\n/* Hidden sections for search filter */\n.form-card.search-hidden {\n display: none;\n}\n\n/* Section count badge */\n.section-count-badge {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n padding: 2px 8px;\n border-radius: 12px;\n font-size: 12px;\n font-weight: 600;\n}\n\n/* Search highlighting in section names */\n.collapsible-title h3 .search-highlight {\n background-color: var(--mj-status-warning);\n color: var(--mj-text-primary);\n padding: 2px 4px;\n border-radius: 3px;\n font-weight: 700;\n}\n\n/* Row count badge in section headers */\n.collapsible-title .row-count-badge {\n background: var(--mj-status-success);\n color: var(--mj-text-inverse);\n padding: 3px 6px 2px 6px;\n border-radius: 12px;\n font-size: 12px;\n font-weight: 600;\n margin-left: 8px;\n vertical-align: middle;\n position: relative;\n top: -2px;\n display: inline-block;\n line-height: 1;\n}\n\n/* Gray badge for zero rows (loaded but empty) */\n.collapsible-title .row-count-badge.zero-rows {\n background: var(--mj-text-muted);\n}\n", "/* Override shared form-styles to enable flex layout */\n:host {\n display: block;\n height: 100%;\n}\n\n/* Override the shared record-form min-height so flex layout works properly */\n.record-form {\n min-height: 0 !important;\n}\n\n/* ========================================\n Saving Overlay\n ======================================== */\n\n.saving-overlay {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n padding: 8px 16px;\n background: color-mix(in srgb, var(--mj-status-info) 10%, var(--mj-bg-surface));\n border-bottom: 1px solid var(--mj-border-subtle);\n color: var(--mj-text-secondary);\n font-size: 13px;\n font-weight: 500;\n flex-shrink: 0;\n}\n\n.saving-spinner {\n color: var(--mj-brand-primary);\n font-size: 14px;\n}\n\n.content-saving {\n pointer-events: none;\n opacity: 0.6;\n}\n\n/* ========================================\n Header Section \u2014 matches Query Browser gradient\n ======================================== */\n\n.query-header {\n flex-shrink: 0;\n background: var(--mj-brand-primary);\n border-bottom: none;\n padding: 0;\n}\n\n.query-header-content {\n display: flex;\n flex-direction: column;\n gap: 12px;\n padding: 16px 20px;\n}\n\n.query-header-top {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n gap: 20px;\n}\n\n.query-name-section {\n flex: 1;\n min-width: 0;\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n.query-title-icon {\n color: rgba(255, 255, 255, 0.85);\n font-size: 1.3em;\n flex-shrink: 0;\n}\n\n.query-name-input {\n font-size: 1.2em;\n font-weight: 600;\n min-width: 300px;\n flex: 1;\n}\n\n.query-name-display {\n margin: 0;\n color: var(--mj-text-inverse, white);\n font-weight: 600;\n font-size: 1.2em;\n flex: 1;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.query-header-actions {\n display: flex;\n gap: 8px;\n align-items: center;\n}\n\n.run-query-btn {\n white-space: nowrap;\n}\n\n/* Meta row (category + status) */\n.query-meta-row {\n display: flex;\n gap: 24px;\n align-items: center;\n flex-wrap: wrap;\n}\n\n.query-meta-item {\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n.meta-label {\n font-weight: 500;\n color: rgba(255, 255, 255, 0.75);\n font-size: var(--mj-text-sm);\n min-width: 60px;\n}\n\n.meta-value {\n color: rgba(255, 255, 255, 0.95);\n font-size: var(--mj-text-sm);\n}\n\n.meta-dropdown {\n min-width: 200px;\n}\n\n.status-pill {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 12px;\n border-radius: var(--mj-radius-xl);\n color: var(--mj-text-inverse, white);\n font-size: var(--mj-text-sm);\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.status-pill i {\n font-size: var(--mj-text-xs);\n}\n\n/* Description row */\n.query-description-row {\n margin-top: 2px;\n}\n\n.query-description-input {\n width: 100%;\n}\n\n.query-description-text {\n margin: 0;\n color: rgba(255, 255, 255, 0.8);\n font-size: var(--mj-text-sm);\n line-height: 1.4;\n}\n\n/* ========================================\n Status Warning Banner\n ======================================== */\n\n\n/* ========================================\n Main Content Area\n ======================================== */\n\n.query-content {\n flex: 1;\n min-height: 0;\n padding: 16px;\n overflow-y: auto;\n background: var(--mj-bg-surface-card);\n}\n\n/* ========================================\n Accordion Panel Overrides \u2014 Modern Style\n ======================================== */\n\n.query-panel {\n margin-bottom: 12px;\n}\n\n::ng-deep .query-content mj-accordion-panel .mj-accordion-panel {\n border: none !important;\n border-radius: var(--mj-radius-md) !important;\n margin-bottom: 12px !important;\n box-shadow: var(--mj-shadow-sm) !important;\n background: var(--mj-bg-surface) !important;\n overflow: hidden !important;\n}\n\n::ng-deep .query-content .mj-accordion-header {\n background: var(--mj-bg-surface) !important;\n border: none !important;\n padding: 14px 18px !important;\n border-radius: var(--mj-radius-md) !important;\n color: var(--mj-text-primary) !important;\n font-weight: 600 !important;\n font-size: var(--mj-text-sm) !important;\n transition: background 0.15s ease !important;\n}\n\n::ng-deep .query-content .mj-accordion-header:hover {\n background: var(--mj-bg-surface-card) !important;\n}\n\n::ng-deep .query-content .mj-accordion-panel--expanded .mj-accordion-header {\n background: var(--mj-brand-primary) !important;\n color: white !important;\n border-radius: var(--mj-radius-md) var(--mj-radius-md) 0 0 !important;\n}\n\n::ng-deep .query-content .mj-accordion-body {\n padding: 0 !important;\n border: none !important;\n background: var(--mj-bg-surface) !important;\n border-radius: 0 0 var(--mj-radius-md) var(--mj-radius-md) !important;\n}\n\n/* ========================================\n Panel Title & Badges\n ======================================== */\n\n.panel-title-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n width: 100%;\n}\n\n.panel-title {\n display: flex;\n align-items: center;\n gap: 8px;\n font-weight: 600;\n}\n\n.panel-icon {\n opacity: 0.7;\n}\n\n.sql-icon {\n color: var(--mj-brand-primary);\n}\n\n::ng-deep .mj-accordion-panel--expanded .panel-icon {\n color: rgba(255, 255, 255, 0.85) !important;\n opacity: 1;\n}\n\n.panel-badge {\n padding: 2px 8px;\n border-radius: var(--mj-radius-lg);\n font-size: var(--mj-text-xs);\n font-weight: 600;\n}\n\n.panel-badge.defined {\n background: var(--mj-status-success);\n color: white;\n}\n\n.panel-badge.count {\n background: var(--mj-brand-primary);\n color: white;\n}\n\n::ng-deep .mj-accordion-panel--expanded .panel-badge.count {\n background: rgba(255, 255, 255, 0.25) !important;\n}\n\n::ng-deep .mj-accordion-panel--expanded .panel-badge.defined {\n background: rgba(255, 255, 255, 0.25) !important;\n}\n\n.filters-help-btn {\n display: flex;\n align-items: center;\n gap: 4px;\n margin-right: 8px;\n font-size: var(--mj-text-xs);\n}\n\n/* ========================================\n Panel Body & Loading\n ======================================== */\n\n.panel-body {\n padding: 16px 0;\n}\n\n.panel-loading {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 40px;\n}\n\n.panel-toolbar {\n display: flex;\n justify-content: flex-end;\n padding: 0 20px 12px;\n}\n\n/* ========================================\n SQL Panel\n ======================================== */\n\n.sql-panel-content {\n display: flex;\n flex-direction: column;\n}\n\n.sql-editor {\n flex: 1;\n height: 400px;\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-sm);\n margin: 16px;\n}\n\n/* Filters Help */\n.filters-help {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md);\n padding: 16px;\n margin: 0 16px 16px;\n}\n\n.filters-help-title {\n margin: 0 0 12px 0;\n color: var(--mj-text-primary);\n font-weight: 600;\n font-size: var(--mj-text-sm);\n}\n\n.filters-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));\n gap: 10px;\n}\n\n.filter-card {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md);\n padding: 12px;\n transition: transform 0.15s ease, box-shadow 0.15s ease;\n}\n\n.filter-card:hover {\n transform: translateY(-1px);\n box-shadow: var(--mj-shadow-md);\n}\n\n.filter-name {\n font-family: 'Courier New', monospace;\n font-weight: bold;\n color: var(--mj-brand-primary);\n margin-bottom: 4px;\n}\n\n.filter-description {\n font-size: var(--mj-text-xs);\n color: var(--mj-text-secondary);\n margin-bottom: 6px;\n}\n\n.filter-syntax {\n font-family: 'Courier New', monospace;\n font-size: var(--mj-text-xs);\n background: var(--mj-bg-surface-card);\n padding: 6px;\n border-radius: var(--mj-radius-sm);\n margin-bottom: 4px;\n}\n\n.filter-notes {\n font-size: var(--mj-text-xs);\n color: var(--mj-text-disabled);\n font-style: italic;\n}\n\n/* ========================================\n Card Grid (Parameters, Fields, Entities)\n ======================================== */\n\n.card-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(340px, 1fr));\n gap: 12px;\n padding: 0 20px 20px;\n}\n\n.item-card {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md);\n padding: 14px;\n transition: all 0.15s ease;\n cursor: pointer;\n position: relative;\n}\n\n.item-card:hover {\n border-color: var(--mj-brand-primary);\n box-shadow: 0 2px 8px color-mix(in srgb, var(--mj-brand-primary) 12%, transparent);\n}\n\n.item-card.required {\n border-left: 3px solid var(--mj-status-warning);\n}\n\n.item-card-header {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n margin-bottom: 10px;\n}\n\n.item-name {\n font-weight: 600;\n font-size: var(--mj-text-sm);\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.item-name-icon {\n font-size: var(--mj-text-sm);\n}\n\n.item-name-icon.param-icon {\n color: var(--mj-brand-primary);\n}\n\n.item-name-icon.field-icon {\n color: var(--mj-brand-primary);\n}\n\n.item-name-icon.entity-icon {\n color: var(--mj-status-success);\n}\n\n.item-badges {\n display: flex;\n gap: 6px;\n}\n\n.item-badge {\n padding: 2px 8px;\n border-radius: var(--mj-radius-lg);\n font-size: var(--mj-text-xs);\n font-weight: 600;\n color: white;\n}\n\n.item-badge.required {\n background: var(--mj-status-warning);\n}\n\n.item-badge.type {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n.item-badge.sequence {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: color-mix(in srgb, var(--mj-brand-primary) 80%, purple);\n}\n\n.item-card-body {\n color: var(--mj-text-secondary);\n font-size: var(--mj-text-sm);\n}\n\n.item-description {\n margin-bottom: 8px;\n}\n\n.item-meta {\n display: flex;\n gap: 16px;\n font-size: var(--mj-text-xs);\n}\n\n.meta-tag {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n}\n\n.meta-code {\n background: var(--mj-bg-surface-card);\n padding: 1px 4px;\n border-radius: var(--mj-radius-sm);\n font-size: var(--mj-text-xs);\n}\n\n/* Card actions (edit/delete) */\n.item-actions {\n position: absolute;\n top: 10px;\n right: 10px;\n display: flex;\n gap: 4px;\n opacity: 0;\n transition: opacity 0.15s ease;\n}\n\n.item-card:hover .item-actions {\n opacity: 1;\n}\n\n.item-card-actions {\n display: flex;\n justify-content: flex-end;\n margin-top: 8px;\n}\n\n.item-action-btn {\n background: none;\n border: none;\n padding: 4px 8px;\n border-radius: var(--mj-radius-sm);\n cursor: pointer;\n color: var(--mj-text-disabled);\n transition: all 0.15s ease;\n}\n\n.item-action-btn:hover {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-brand-primary);\n}\n\n.item-action-btn.delete:hover {\n background: color-mix(in srgb, var(--mj-status-error) 8%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n}\n\n/* Entity dropdown in card */\n.entity-dropdown-wrapper {\n flex: 1;\n margin-left: 12px;\n}\n\n.entity-dropdown {\n width: 100%;\n}\n\n/* ========================================\n Details Grid\n ======================================== */\n\n.details-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));\n gap: 16px;\n padding: 16px 20px;\n}\n\n.detail-item {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n.detail-label {\n font-size: var(--mj-text-xs);\n font-weight: 600;\n color: var(--mj-text-disabled);\n display: flex;\n align-items: center;\n gap: 6px;\n text-transform: uppercase;\n letter-spacing: 0.3px;\n}\n\n.detail-value {\n font-size: var(--mj-text-sm);\n color: var(--mj-text-primary);\n}\n\n.detail-tag {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n font-size: var(--mj-text-sm);\n}\n\n.detail-tag.positive {\n color: var(--mj-status-success);\n}\n\n.detail-tag.neutral {\n color: var(--mj-text-disabled);\n}\n\n.detail-hint {\n font-size: var(--mj-text-xs);\n color: var(--mj-text-muted);\n line-height: 1.4;\n}\n\n.detail-input-narrow {\n max-width: 120px;\n padding: 4px 8px;\n font-size: var(--mj-text-sm);\n}\n\n/* ========================================\n Permissions\n ======================================== */\n\n.permissions-list {\n padding: 0 20px;\n}\n\n.permission-card {\n display: flex;\n align-items: center;\n gap: 14px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md);\n padding: 14px 16px;\n margin-bottom: 8px;\n}\n\n.permission-icon {\n font-size: 1.3em;\n color: var(--mj-brand-primary);\n}\n\n.permission-info {\n flex: 1;\n}\n\n.permission-role {\n font-weight: 600;\n color: var(--mj-text-primary);\n font-size: var(--mj-text-sm);\n}\n\n.permission-type {\n font-size: var(--mj-text-xs);\n color: var(--mj-text-disabled);\n}\n\n.permission-badge {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n background: var(--mj-brand-primary);\n color: white;\n padding: 4px 10px;\n border-radius: var(--mj-radius-md);\n font-size: var(--mj-text-xs);\n font-weight: 500;\n}\n\n/* ========================================\n Empty State\n ======================================== */\n\n/* ========================================\n Buttons\n ======================================== */\n\n.add-item-btn {\n background: var(--mj-brand-primary);\n color: white;\n border: none;\n padding: 8px 16px;\n border-radius: var(--mj-radius-md);\n cursor: pointer;\n transition: all 0.15s ease;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n font-weight: 500;\n font-size: var(--mj-text-sm);\n}\n\n.add-item-btn:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 85%, black);\n box-shadow: 0 2px 6px color-mix(in srgb, var(--mj-brand-primary) 30%, transparent);\n}\n\n/* ========================================\n Badge (reused across components)\n ======================================== */\n\n.badge {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n}\n\n/* ========================================\n Technical Description Panel\n ======================================== */\n\n.technical-description-textarea {\n width: 100%;\n font-family: 'Consolas', 'Monaco', 'Courier New', monospace;\n font-size: 13px;\n}\n\n.technical-description-preview {\n margin-top: 16px;\n border-top: 1px solid var(--mj-border-default);\n padding-top: 12px;\n}\n\n.preview-label {\n font-size: 12px;\n font-weight: 600;\n color: var(--mj-text-muted);\n margin-bottom: 8px;\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.technical-description-view {\n max-height: 500px;\n overflow-y: auto;\n padding: 12px 16px;\n}\n\n/* Dependent Queries */\n.dependents-icon {\n color: var(--mj-status-warning);\n}\n\n.dependents-description {\n padding: 0 20px 12px;\n font-size: 13px;\n color: var(--mj-text-muted);\n}\n\n.dependents-description code {\n background: var(--mj-bg-surface-sunken);\n padding: 1px 5px;\n border-radius: 3px;\n font-size: 12px;\n}\n\n.dependent-card {\n cursor: pointer;\n border-left: 3px solid var(--mj-status-warning) !important;\n}\n\n.dependent-card:hover {\n border-left-color: var(--mj-status-warning-text) !important;\n background: color-mix(in srgb, var(--mj-status-warning) 8%, var(--mj-bg-surface)) !important;\n}\n\n.dependent-query-icon {\n color: var(--mj-status-warning) !important;\n}\n\n.item-card-footer {\n padding-top: 8px;\n border-top: 1px solid var(--mj-bg-surface-sunken);\n margin-top: 8px;\n}\n\n.open-link {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n font-size: 12px;\n color: var(--mj-brand-primary);\n font-weight: 500;\n}\n\n.dependent-card:hover .open-link {\n color: var(--mj-brand-primary-hover);\n}\n\n/* Category selector row: tree-dropdown + create/edit icon buttons */\n.meta-dropdown-row {\n display: flex;\n align-items: center;\n gap: 6px;\n}\n.meta-dropdown-row .meta-dropdown {\n flex: 1;\n min-width: 0;\n}\n"] }]
|
|
1946
|
-
}], null, {
|
|
2266
|
+
}], null, { SqlEditor: [{
|
|
1947
2267
|
type: ViewChild,
|
|
1948
2268
|
args: ['sqlEditor']
|
|
1949
2269
|
}] }); })();
|