@memberjunction/ng-core-entity-forms 5.42.0 → 5.44.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/__tests__/model-prediction.logic.test.d.ts +2 -0
- package/dist/__tests__/model-prediction.logic.test.d.ts.map +1 -0
- package/dist/__tests__/model-prediction.logic.test.js +140 -0
- package/dist/__tests__/model-prediction.logic.test.js.map +1 -0
- package/dist/lib/custom/AIAgentSessions/ai-agent-session-form.component.js +79 -105
- package/dist/lib/custom/AIAgentSessions/ai-agent-session-form.component.js.map +1 -1
- package/dist/lib/custom/AIAgents/FlowAgentType/flow-agent-form-section.component.js +7 -10
- package/dist/lib/custom/AIAgents/FlowAgentType/flow-agent-form-section.component.js.map +1 -1
- package/dist/lib/custom/AIAgents/add-action-dialog.component.d.ts.map +1 -1
- package/dist/lib/custom/AIAgents/add-action-dialog.component.js +46 -51
- package/dist/lib/custom/AIAgents/add-action-dialog.component.js.map +1 -1
- package/dist/lib/custom/AIAgents/ai-agent-form.component.d.ts +2 -0
- package/dist/lib/custom/AIAgents/ai-agent-form.component.d.ts.map +1 -1
- package/dist/lib/custom/AIAgents/ai-agent-form.component.js +300 -378
- package/dist/lib/custom/AIAgents/ai-agent-form.component.js.map +1 -1
- package/dist/lib/custom/AIAgents/create-sub-agent-dialog.component.js +22 -29
- package/dist/lib/custom/AIAgents/create-sub-agent-dialog.component.js.map +1 -1
- package/dist/lib/custom/AIAgents/new-agent-dialog.component.js +15 -17
- package/dist/lib/custom/AIAgents/new-agent-dialog.component.js.map +1 -1
- package/dist/lib/custom/AIAgents/prompt-selector-dialog.component.js +27 -34
- package/dist/lib/custom/AIAgents/prompt-selector-dialog.component.js.map +1 -1
- package/dist/lib/custom/AIAgents/sub-agent-selector-dialog.component.d.ts +11 -0
- 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 +48 -47
- package/dist/lib/custom/AIAgents/sub-agent-selector-dialog.component.js.map +1 -1
- package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.js +438 -454
- package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.js.map +1 -1
- package/dist/lib/custom/AIPromptRuns/chat-message-viewer.component.js +48 -51
- package/dist/lib/custom/AIPromptRuns/chat-message-viewer.component.js.map +1 -1
- package/dist/lib/custom/AIPrompts/ai-prompt-form.component.js +253 -282
- package/dist/lib/custom/AIPrompts/ai-prompt-form.component.js.map +1 -1
- package/dist/lib/custom/Actions/action-execution-log-form.component.js +24 -33
- package/dist/lib/custom/Actions/action-execution-log-form.component.js.map +1 -1
- package/dist/lib/custom/Actions/action-form.component.js +263 -311
- package/dist/lib/custom/Actions/action-form.component.js.map +1 -1
- package/dist/lib/custom/Entities/entity-form.component.d.ts +6 -0
- package/dist/lib/custom/Entities/entity-form.component.d.ts.map +1 -1
- package/dist/lib/custom/Entities/entity-form.component.js +475 -493
- package/dist/lib/custom/Entities/entity-form.component.js.map +1 -1
- package/dist/lib/custom/Lists/list-form.component.js +122 -173
- package/dist/lib/custom/Lists/list-form.component.js.map +1 -1
- package/dist/lib/custom/Queries/query-form.component.js +190 -248
- package/dist/lib/custom/Queries/query-form.component.js.map +1 -1
- package/dist/lib/custom/Queries/query-run-dialog.component.js +19 -23
- package/dist/lib/custom/Queries/query-run-dialog.component.js.map +1 -1
- package/dist/lib/custom/RecordProcesses/record-process-form.component.d.ts +16 -0
- package/dist/lib/custom/RecordProcesses/record-process-form.component.d.ts.map +1 -0
- package/dist/lib/custom/RecordProcesses/record-process-form.component.js +54 -0
- package/dist/lib/custom/RecordProcesses/record-process-form.component.js.map +1 -0
- package/dist/lib/custom/SearchScopes/searchscopeprovider-form.component.js +23 -24
- package/dist/lib/custom/SearchScopes/searchscopeprovider-form.component.js.map +1 -1
- package/dist/lib/custom/Templates/template-param-dialog.component.d.ts.map +1 -1
- package/dist/lib/custom/Templates/template-param-dialog.component.js +25 -46
- package/dist/lib/custom/Templates/template-param-dialog.component.js.map +1 -1
- package/dist/lib/custom/Tests/test-form.component.js +100 -130
- package/dist/lib/custom/Tests/test-form.component.js.map +1 -1
- package/dist/lib/custom/Tests/test-run-form.component.js +187 -205
- package/dist/lib/custom/Tests/test-run-form.component.js.map +1 -1
- package/dist/lib/custom/Tests/test-suite-form.component.d.ts +8 -0
- package/dist/lib/custom/Tests/test-suite-form.component.d.ts.map +1 -1
- package/dist/lib/custom/Tests/test-suite-form.component.js +412 -489
- package/dist/lib/custom/Tests/test-suite-form.component.js.map +1 -1
- package/dist/lib/custom/Tests/test-suite-run-form.component.js +100 -126
- package/dist/lib/custom/Tests/test-suite-run-form.component.js.map +1 -1
- package/dist/lib/custom/ai-agent-run/ai-agent-run-analytics.component.js +166 -184
- 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-step-detail.component.js +42 -61
- 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-timeline.component.js +8 -17
- 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 +0 -2
- 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 +183 -188
- 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 +108 -0
- package/dist/lib/custom/ai-agent-run/flow/agent-run-flow.component.d.ts.map +1 -0
- package/dist/lib/custom/ai-agent-run/flow/agent-run-flow.component.js +665 -0
- package/dist/lib/custom/ai-agent-run/flow/agent-run-flow.component.js.map +1 -0
- package/dist/lib/custom/ai-agent-run/flow/agent-run-flow.model.d.ts +94 -0
- package/dist/lib/custom/ai-agent-run/flow/agent-run-flow.model.d.ts.map +1 -0
- package/dist/lib/custom/ai-agent-run/flow/agent-run-flow.model.js +257 -0
- package/dist/lib/custom/ai-agent-run/flow/agent-run-flow.model.js.map +1 -0
- package/dist/lib/custom/ai-agent-run/flow/constellation.component.d.ts +38 -0
- package/dist/lib/custom/ai-agent-run/flow/constellation.component.d.ts.map +1 -0
- package/dist/lib/custom/ai-agent-run/flow/constellation.component.js +200 -0
- package/dist/lib/custom/ai-agent-run/flow/constellation.component.js.map +1 -0
- package/dist/lib/custom/ai-agent-run/flow/flame-cascade.component.d.ts +44 -0
- package/dist/lib/custom/ai-agent-run/flow/flame-cascade.component.d.ts.map +1 -0
- package/dist/lib/custom/ai-agent-run/flow/flame-cascade.component.js +180 -0
- package/dist/lib/custom/ai-agent-run/flow/flame-cascade.component.js.map +1 -0
- package/dist/lib/custom/ai-agent-run/flow/flow-svg.util.d.ts +12 -0
- package/dist/lib/custom/ai-agent-run/flow/flow-svg.util.d.ts.map +1 -0
- package/dist/lib/custom/ai-agent-run/flow/flow-svg.util.js +46 -0
- package/dist/lib/custom/ai-agent-run/flow/flow-svg.util.js.map +1 -0
- package/dist/lib/custom/ai-agent-run/flow/flowchart.component.d.ts +64 -0
- package/dist/lib/custom/ai-agent-run/flow/flowchart.component.d.ts.map +1 -0
- package/dist/lib/custom/ai-agent-run/flow/flowchart.component.js +267 -0
- package/dist/lib/custom/ai-agent-run/flow/flowchart.component.js.map +1 -0
- package/dist/lib/custom/ai-agent-run/flow/pan-zoom.d.ts +53 -0
- package/dist/lib/custom/ai-agent-run/flow/pan-zoom.d.ts.map +1 -0
- package/dist/lib/custom/ai-agent-run/flow/pan-zoom.js +111 -0
- package/dist/lib/custom/ai-agent-run/flow/pan-zoom.js.map +1 -0
- package/dist/lib/custom/ai-agent-run/flow/subway-lines.component.d.ts +42 -0
- package/dist/lib/custom/ai-agent-run/flow/subway-lines.component.d.ts.map +1 -0
- package/dist/lib/custom/ai-agent-run/flow/subway-lines.component.js +193 -0
- package/dist/lib/custom/ai-agent-run/flow/subway-lines.component.js.map +1 -0
- package/dist/lib/custom/custom-forms.module.d.ts +58 -49
- package/dist/lib/custom/custom-forms.module.d.ts.map +1 -1
- package/dist/lib/custom/custom-forms.module.js +64 -16
- package/dist/lib/custom/custom-forms.module.js.map +1 -1
- package/dist/lib/custom/shared/entity-selector-dialog.component.d.ts +2 -0
- package/dist/lib/custom/shared/entity-selector-dialog.component.d.ts.map +1 -1
- package/dist/lib/custom/shared/entity-selector-dialog.component.js +25 -25
- 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 +280 -216
- package/dist/lib/generated/Entities/MJAIAgent/mjaiagent.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJAIAgentChannel/mjaiagentchannel.form.component.js +25 -21
- package/dist/lib/generated/Entities/MJAIAgentChannel/mjaiagentchannel.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJAIAgentRun/mjaiagentrun.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJAIAgentRun/mjaiagentrun.form.component.js +68 -14
- package/dist/lib/generated/Entities/MJAIAgentRun/mjaiagentrun.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJAIAgentSession/mjaiagentsession.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJAIAgentSession/mjaiagentsession.form.component.js +44 -32
- package/dist/lib/generated/Entities/MJAIAgentSession/mjaiagentsession.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJAIAgentSkill/mjaiagentskill.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/MJAIAgentSkill/mjaiagentskill.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/MJAIAgentSkill/mjaiagentskill.form.component.js +66 -0
- package/dist/lib/generated/Entities/MJAIAgentSkill/mjaiagentskill.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/MJAIPrompt/mjaiprompt.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJAIPrompt/mjaiprompt.form.component.js +55 -19
- package/dist/lib/generated/Entities/MJAIPrompt/mjaiprompt.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 +28 -10
- package/dist/lib/generated/Entities/MJAIPromptRun/mjaipromptrun.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJAISkill/mjaiskill.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/MJAISkill/mjaiskill.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/MJAISkill/mjaiskill.form.component.js +167 -0
- package/dist/lib/generated/Entities/MJAISkill/mjaiskill.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/MJAISkillAction/mjaiskillaction.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/MJAISkillAction/mjaiskillaction.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/MJAISkillAction/mjaiskillaction.form.component.js +64 -0
- package/dist/lib/generated/Entities/MJAISkillAction/mjaiskillaction.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/MJAISkillPermission/mjaiskillpermission.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/MJAISkillPermission/mjaiskillpermission.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/MJAISkillPermission/mjaiskillpermission.form.component.js +82 -0
- package/dist/lib/generated/Entities/MJAISkillPermission/mjaiskillpermission.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/MJAISkillSubAgent/mjaiskillsubagent.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/MJAISkillSubAgent/mjaiskillsubagent.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/MJAISkillSubAgent/mjaiskillsubagent.form.component.js +64 -0
- package/dist/lib/generated/Entities/MJAISkillSubAgent/mjaiskillsubagent.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/MJAction/mjaction.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJAction/mjaction.form.component.js +35 -17
- package/dist/lib/generated/Entities/MJAction/mjaction.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJApplication/mjapplication.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJApplication/mjapplication.form.component.js +59 -51
- package/dist/lib/generated/Entities/MJApplication/mjapplication.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJCollection/mjcollection.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJCollection/mjcollection.form.component.js +25 -7
- package/dist/lib/generated/Entities/MJCollection/mjcollection.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJCollectionArtifact/mjcollectionartifact.form.component.js +11 -7
- package/dist/lib/generated/Entities/MJCollectionArtifact/mjcollectionartifact.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJConversation/mjconversation.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJConversation/mjconversation.form.component.js +56 -46
- package/dist/lib/generated/Entities/MJConversation/mjconversation.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJConversationDetail/mjconversationdetail.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJConversationDetail/mjconversationdetail.form.component.js +73 -59
- package/dist/lib/generated/Entities/MJConversationDetail/mjconversationdetail.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJDuplicateRunDetailMatch/mjduplicaterundetailmatch.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJDuplicateRunDetailMatch/mjduplicaterundetailmatch.form.component.js +24 -4
- package/dist/lib/generated/Entities/MJDuplicateRunDetailMatch/mjduplicaterundetailmatch.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 +137 -87
- package/dist/lib/generated/Entities/MJEntity/mjentity.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJEntityActionInvocation/mjentityactioninvocation.form.component.js +10 -8
- package/dist/lib/generated/Entities/MJEntityActionInvocation/mjentityactioninvocation.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJEntityDocument/mjentitydocument.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJEntityDocument/mjentitydocument.form.component.js +47 -29
- package/dist/lib/generated/Entities/MJEntityDocument/mjentitydocument.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJExperiment/mjexperiment.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/MJExperiment/mjexperiment.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/MJExperiment/mjexperiment.form.component.js +99 -0
- package/dist/lib/generated/Entities/MJExperiment/mjexperiment.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/MJExperimentSession/mjexperimentsession.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/MJExperimentSession/mjexperimentsession.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/MJExperimentSession/mjexperimentsession.form.component.js +101 -0
- package/dist/lib/generated/Entities/MJExperimentSession/mjexperimentsession.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/MJExperimentSessionIteration/mjexperimentsessioniteration.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/MJExperimentSessionIteration/mjexperimentsessioniteration.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/MJExperimentSessionIteration/mjexperimentsessioniteration.form.component.js +115 -0
- package/dist/lib/generated/Entities/MJExperimentSessionIteration/mjexperimentsessioniteration.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/MJFile/mjfile.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJFile/mjfile.form.component.js +63 -9
- package/dist/lib/generated/Entities/MJFile/mjfile.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJFileStorageProvider/mjfilestorageprovider.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJFileStorageProvider/mjfilestorageprovider.form.component.js +32 -14
- package/dist/lib/generated/Entities/MJFileStorageProvider/mjfilestorageprovider.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJMLAlgorithm/mjmlalgorithm.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/MJMLAlgorithm/mjmlalgorithm.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/MJMLAlgorithm/mjmlalgorithm.form.component.js +161 -0
- package/dist/lib/generated/Entities/MJMLAlgorithm/mjmlalgorithm.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/MJMLAlgorithmUseCase/mjmlalgorithmusecase.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/MJMLAlgorithmUseCase/mjmlalgorithmusecase.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/MJMLAlgorithmUseCase/mjmlalgorithmusecase.form.component.js +89 -0
- package/dist/lib/generated/Entities/MJMLAlgorithmUseCase/mjmlalgorithmusecase.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/MJMLAlgorithmUseCaseRanking/mjmlalgorithmusecaseranking.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/MJMLAlgorithmUseCaseRanking/mjmlalgorithmusecaseranking.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/MJMLAlgorithmUseCaseRanking/mjmlalgorithmusecaseranking.form.component.js +76 -0
- package/dist/lib/generated/Entities/MJMLAlgorithmUseCaseRanking/mjmlalgorithmusecaseranking.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/MJMLModel/mjmlmodel.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/MJMLModel/mjmlmodel.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/MJMLModel/mjmlmodel.form.component.js +141 -0
- package/dist/lib/generated/Entities/MJMLModel/mjmlmodel.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/MJMLModelScoringBinding/mjmlmodelscoringbinding.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/MJMLModelScoringBinding/mjmlmodelscoringbinding.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/MJMLModelScoringBinding/mjmlmodelscoringbinding.form.component.js +88 -0
- package/dist/lib/generated/Entities/MJMLModelScoringBinding/mjmlmodelscoringbinding.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/MJMLTrainingPipeline/mjmltrainingpipeline.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/MJMLTrainingPipeline/mjmltrainingpipeline.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/MJMLTrainingPipeline/mjmltrainingpipeline.form.component.js +143 -0
- package/dist/lib/generated/Entities/MJMLTrainingPipeline/mjmltrainingpipeline.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/MJMLTrainingRun/mjmltrainingrun.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/MJMLTrainingRun/mjmltrainingrun.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/MJMLTrainingRun/mjmltrainingrun.form.component.js +110 -0
- package/dist/lib/generated/Entities/MJMLTrainingRun/mjmltrainingrun.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/MJOpenApp/mjopenapp.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJOpenApp/mjopenapp.form.component.js +56 -24
- package/dist/lib/generated/Entities/MJOpenApp/mjopenapp.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJProcessRun/mjprocessrun.form.component.js +19 -17
- package/dist/lib/generated/Entities/MJProcessRun/mjprocessrun.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJRecordProcess/mjrecordprocess.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJRecordProcess/mjrecordprocess.form.component.js +46 -26
- package/dist/lib/generated/Entities/MJRecordProcess/mjrecordprocess.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJRemoteOperation/mjremoteoperation.form.component.js +12 -6
- package/dist/lib/generated/Entities/MJRemoteOperation/mjremoteoperation.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJRole/mjrole.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJRole/mjrole.form.component.js +36 -18
- package/dist/lib/generated/Entities/MJRole/mjrole.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJSchemaInfo/mjschemainfo.form.component.js +8 -6
- package/dist/lib/generated/Entities/MJSchemaInfo/mjschemainfo.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJScopedPromptPart/mjscopedpromptpart.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/MJScopedPromptPart/mjscopedpromptpart.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/MJScopedPromptPart/mjscopedpromptpart.form.component.js +78 -0
- package/dist/lib/generated/Entities/MJScopedPromptPart/mjscopedpromptpart.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/MJUser/mjuser.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJUser/mjuser.form.component.js +145 -109
- package/dist/lib/generated/Entities/MJUser/mjuser.form.component.js.map +1 -1
- package/dist/lib/generated/generated-forms.module.d.ts +356 -335
- package/dist/lib/generated/generated-forms.module.d.ts.map +1 -1
- package/dist/lib/generated/generated-forms.module.js +304 -226
- package/dist/lib/generated/generated-forms.module.js.map +1 -1
- package/dist/lib/panels/ai-agents/agent-realtime.panel.js +44 -44
- package/dist/lib/panels/ai-agents/agent-realtime.panel.js.map +1 -1
- package/dist/lib/panels/ai-skill-sharing/ai-skill-sharing-panel.component.d.ts +43 -0
- package/dist/lib/panels/ai-skill-sharing/ai-skill-sharing-panel.component.d.ts.map +1 -0
- package/dist/lib/panels/ai-skill-sharing/ai-skill-sharing-panel.component.js +240 -0
- package/dist/lib/panels/ai-skill-sharing/ai-skill-sharing-panel.component.js.map +1 -0
- package/dist/lib/panels/model-predictions/model-prediction.logic.d.ts +69 -0
- package/dist/lib/panels/model-predictions/model-prediction.logic.d.ts.map +1 -0
- package/dist/lib/panels/model-predictions/model-prediction.logic.js +130 -0
- package/dist/lib/panels/model-predictions/model-prediction.logic.js.map +1 -0
- package/dist/lib/panels/model-predictions/model-prediction.panel.d.ts +83 -0
- package/dist/lib/panels/model-predictions/model-prediction.panel.d.ts.map +1 -0
- package/dist/lib/panels/model-predictions/model-prediction.panel.js +293 -0
- package/dist/lib/panels/model-predictions/model-prediction.panel.js.map +1 -0
- package/package.json +38 -36
- package/dist/lib/custom/ai-agent-run/ai-agent-run-visualization.component.d.ts +0 -82
- package/dist/lib/custom/ai-agent-run/ai-agent-run-visualization.component.d.ts.map +0 -1
- package/dist/lib/custom/ai-agent-run/ai-agent-run-visualization.component.js +0 -1033
- package/dist/lib/custom/ai-agent-run/ai-agent-run-visualization.component.js.map +0 -1
|
@@ -312,8 +312,8 @@ function QueryRunDialogComponent_Conditional_0_Conditional_7_Conditional_20_Cond
|
|
|
312
312
|
const ctx_r1 = i0.ɵɵnextContext(4);
|
|
313
313
|
i0.ɵɵconditional(ctx_r1.resultRows.length > 0 ? 0 : 1);
|
|
314
314
|
} }
|
|
315
|
-
function
|
|
316
|
-
i0.ɵɵelementStart(0, "div",
|
|
315
|
+
function QueryRunDialogComponent_Conditional_0_Conditional_7_Conditional_20_Conditional_4_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
316
|
+
i0.ɵɵelementStart(0, "div", 79);
|
|
317
317
|
i0.ɵɵtext(1);
|
|
318
318
|
i0.ɵɵelementEnd();
|
|
319
319
|
} if (rf & 2) {
|
|
@@ -322,17 +322,13 @@ function QueryRunDialogComponent_Conditional_0_Conditional_7_Conditional_20_Cond
|
|
|
322
322
|
i0.ɵɵtextInterpolate1(" ", ctx_r1.runResult.ErrorMessage, " ");
|
|
323
323
|
} }
|
|
324
324
|
function QueryRunDialogComponent_Conditional_0_Conditional_7_Conditional_20_Conditional_4_Template(rf, ctx) { if (rf & 1) {
|
|
325
|
-
i0.ɵɵelementStart(0, "
|
|
326
|
-
i0.ɵɵ
|
|
327
|
-
i0.ɵɵelementStart(3, "strong");
|
|
328
|
-
i0.ɵɵtext(4, "Query execution failed");
|
|
329
|
-
i0.ɵɵelementEnd()();
|
|
330
|
-
i0.ɵɵconditionalCreate(5, QueryRunDialogComponent_Conditional_0_Conditional_7_Conditional_20_Conditional_4_Conditional_5_Template, 2, 1, "div", 81);
|
|
325
|
+
i0.ɵɵelementStart(0, "mj-alert", 48);
|
|
326
|
+
i0.ɵɵconditionalCreate(1, QueryRunDialogComponent_Conditional_0_Conditional_7_Conditional_20_Conditional_4_Conditional_1_Template, 2, 1, "div", 79);
|
|
331
327
|
i0.ɵɵelementEnd();
|
|
332
328
|
} if (rf & 2) {
|
|
333
329
|
const ctx_r1 = i0.ɵɵnextContext(4);
|
|
334
|
-
i0.ɵɵadvance(
|
|
335
|
-
i0.ɵɵconditional(ctx_r1.runResult.ErrorMessage ?
|
|
330
|
+
i0.ɵɵadvance();
|
|
331
|
+
i0.ɵɵconditional(ctx_r1.runResult.ErrorMessage ? 1 : -1);
|
|
336
332
|
} }
|
|
337
333
|
function QueryRunDialogComponent_Conditional_0_Conditional_7_Conditional_20_Template(rf, ctx) { if (rf & 1) {
|
|
338
334
|
const _r8 = i0.ɵɵgetCurrentView();
|
|
@@ -340,7 +336,7 @@ function QueryRunDialogComponent_Conditional_0_Conditional_7_Conditional_20_Temp
|
|
|
340
336
|
i0.ɵɵtwoWayListener("ExpandedChange", function QueryRunDialogComponent_Conditional_0_Conditional_7_Conditional_20_Template_mj_accordion_panel_ExpandedChange_0_listener($event) { i0.ɵɵrestoreView(_r8); const ctx_r1 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r1.resultsExpanded, $event) || (ctx_r1.resultsExpanded = $event); return i0.ɵɵresetView($event); });
|
|
341
337
|
i0.ɵɵtemplate(1, QueryRunDialogComponent_Conditional_0_Conditional_7_Conditional_20_ng_template_1_Template, 3, 1, "ng-template", 11);
|
|
342
338
|
i0.ɵɵelementStart(2, "div", 47);
|
|
343
|
-
i0.ɵɵconditionalCreate(3, QueryRunDialogComponent_Conditional_0_Conditional_7_Conditional_20_Conditional_3_Template, 2, 1)(4, QueryRunDialogComponent_Conditional_0_Conditional_7_Conditional_20_Conditional_4_Template,
|
|
339
|
+
i0.ɵɵconditionalCreate(3, QueryRunDialogComponent_Conditional_0_Conditional_7_Conditional_20_Conditional_3_Template, 2, 1)(4, QueryRunDialogComponent_Conditional_0_Conditional_7_Conditional_20_Conditional_4_Template, 2, 1, "mj-alert", 48);
|
|
344
340
|
i0.ɵɵelementEnd()();
|
|
345
341
|
} if (rf & 2) {
|
|
346
342
|
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
@@ -388,21 +384,21 @@ function QueryRunDialogComponent_Conditional_0_Conditional_7_Template(rf, ctx) {
|
|
|
388
384
|
i0.ɵɵconditional(ctx_r1.runResult ? 20 : -1);
|
|
389
385
|
} }
|
|
390
386
|
function QueryRunDialogComponent_Conditional_0_Conditional_9_Conditional_4_Template(rf, ctx) { if (rf & 1) {
|
|
391
|
-
i0.ɵɵelement(0, "i",
|
|
387
|
+
i0.ɵɵelement(0, "i", 83);
|
|
392
388
|
i0.ɵɵtext(1, " Running... ");
|
|
393
389
|
} }
|
|
394
390
|
function QueryRunDialogComponent_Conditional_0_Conditional_9_Conditional_5_Template(rf, ctx) { if (rf & 1) {
|
|
395
|
-
i0.ɵɵelement(0, "i",
|
|
391
|
+
i0.ɵɵelement(0, "i", 84);
|
|
396
392
|
i0.ɵɵtext(1, " Run Query ");
|
|
397
393
|
} }
|
|
398
394
|
function QueryRunDialogComponent_Conditional_0_Conditional_9_Template(rf, ctx) { if (rf & 1) {
|
|
399
395
|
const _r14 = i0.ɵɵgetCurrentView();
|
|
400
|
-
i0.ɵɵelementStart(0, "button",
|
|
396
|
+
i0.ɵɵelementStart(0, "button", 80);
|
|
401
397
|
i0.ɵɵlistener("click", function QueryRunDialogComponent_Conditional_0_Conditional_9_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r14); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.close()); });
|
|
402
|
-
i0.ɵɵelement(1, "i",
|
|
398
|
+
i0.ɵɵelement(1, "i", 81);
|
|
403
399
|
i0.ɵɵtext(2, " Cancel ");
|
|
404
400
|
i0.ɵɵelementEnd();
|
|
405
|
-
i0.ɵɵelementStart(3, "button",
|
|
401
|
+
i0.ɵɵelementStart(3, "button", 82);
|
|
406
402
|
i0.ɵɵlistener("click", function QueryRunDialogComponent_Conditional_0_Conditional_9_Template_button_click_3_listener() { i0.ɵɵrestoreView(_r14); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.runQuery()); });
|
|
407
403
|
i0.ɵɵconditionalCreate(4, QueryRunDialogComponent_Conditional_0_Conditional_9_Conditional_4_Template, 2, 0)(5, QueryRunDialogComponent_Conditional_0_Conditional_9_Conditional_5_Template, 2, 0);
|
|
408
404
|
i0.ɵɵelementEnd();
|
|
@@ -415,14 +411,14 @@ function QueryRunDialogComponent_Conditional_0_Conditional_9_Template(rf, ctx) {
|
|
|
415
411
|
} }
|
|
416
412
|
function QueryRunDialogComponent_Conditional_0_Conditional_10_Template(rf, ctx) { if (rf & 1) {
|
|
417
413
|
const _r15 = i0.ɵɵgetCurrentView();
|
|
418
|
-
i0.ɵɵelementStart(0, "button",
|
|
414
|
+
i0.ɵɵelementStart(0, "button", 80);
|
|
419
415
|
i0.ɵɵlistener("click", function QueryRunDialogComponent_Conditional_0_Conditional_10_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r15); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.close()); });
|
|
420
|
-
i0.ɵɵelement(1, "i",
|
|
416
|
+
i0.ɵɵelement(1, "i", 81);
|
|
421
417
|
i0.ɵɵtext(2, " Close ");
|
|
422
418
|
i0.ɵɵelementEnd();
|
|
423
|
-
i0.ɵɵelementStart(3, "button",
|
|
419
|
+
i0.ɵɵelementStart(3, "button", 82);
|
|
424
420
|
i0.ɵɵlistener("click", function QueryRunDialogComponent_Conditional_0_Conditional_10_Template_button_click_3_listener() { i0.ɵɵrestoreView(_r15); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.runQuery()); });
|
|
425
|
-
i0.ɵɵelement(4, "i",
|
|
421
|
+
i0.ɵɵelement(4, "i", 85);
|
|
426
422
|
i0.ɵɵtext(5, " Run Again ");
|
|
427
423
|
i0.ɵɵelementEnd();
|
|
428
424
|
} if (rf & 2) {
|
|
@@ -759,15 +755,15 @@ export class QueryRunDialogComponent extends BaseAngularComponent {
|
|
|
759
755
|
}
|
|
760
756
|
}
|
|
761
757
|
static { this.ɵfac = /*@__PURE__*/ (() => { let ɵQueryRunDialogComponent_BaseFactory; return function QueryRunDialogComponent_Factory(__ngFactoryType__) { return (ɵQueryRunDialogComponent_BaseFactory || (ɵQueryRunDialogComponent_BaseFactory = i0.ɵɵgetInheritedFactory(QueryRunDialogComponent)))(__ngFactoryType__ || QueryRunDialogComponent); }; })(); }
|
|
762
|
-
static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: QueryRunDialogComponent, selectors: [["mj-query-run-dialog"]], inputs: { query: "query", parameters: "parameters", isVisible: "isVisible" }, outputs: { isVisibleChange: "isVisibleChange", onClose: "onClose" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature, i0.ɵɵNgOnChangesFeature], decls: 1, vars: 1, consts: [[3, "Visible", "Width"], [3, "Close", "Visible", "Width"], [2, "display", "flex", "align-items", "center", "gap", "8px"], [1, "fa-solid", "fa-play-circle", 2, "color", "var(--mj-brand-primary)"], [2, "display", "flex", "flex-direction", "column", "height", "100%", "overflow-y", "auto", "overflow-x", "hidden"], [2, "display", "flex", "align-items", "center", "justify-content", "center", "padding", "40px"], [1, "fa-solid", "fa-spinner", "fa-spin", 2, "font-size", "24px", "color", "var(--mj-text-muted)", "margin-right", "12px"], [2, "color", "var(--mj-text-muted)"], [2, "margin-bottom", "16px", "flex-shrink", "0", 3, "Expanded"], [2, "padding", "20px", "background", "var(--mj-bg-surface-sunken)", "border-radius", "6px", "margin-bottom", "16px", "text-align", "center", "color", "var(--mj-text-muted)"], [2, "margin-bottom", "16px", 3, "ExpandedChange", "Expanded"], ["mjAccordionTitle", ""], [2, "padding", "12px 0"], [2, "display", "flex", "flex-direction", "column", "gap", "12px"], [2, "display", "flex", "align-items", "center", "gap", "12px"], [2, "font-weight", "600", "color", "var(--mj-text-secondary)", "white-space", "nowrap", "min-width", "100px"], [1, "fa-solid", "fa-list-ol", 2, "color", "var(--mj-text-muted)", "margin-right", "6px"], ["type", "number", "min", "1", "step", "100", "placeholder", "All rows", 1, "mj-input", 2, "width", "150px", 3, "ngModelChange", "ngModel"], [2, "font-size", "0.85em", "color", "var(--mj-text-muted)"], [1, "fa-solid", "fa-forward", 2, "color", "var(--mj-text-muted)", "margin-right", "6px"], ["type", "number", "min", "0", "step", "1", "placeholder", "0", 1, "mj-input", 2, "width", "150px", 3, "ngModelChange", "ngModel"], [2, "flex", "1", "display", "flex", "flex-direction", "column", "overflow", "hidden", "min-height", "0", 3, "Expanded"], [2, "margin-bottom", "16px", "flex-shrink", "0", 3, "ExpandedChange", "Expanded"], [2, "margin-bottom", "12px", "color", "var(--mj-text-muted)", "font-size", "0.85em"], [1, "fa-solid", "fa-info-circle"], [2, "display", "flex", "flex-direction", "column", "gap", "16px"], [2, "background", "var(--mj-bg-surface-sunken)", "border", "1px solid var(--mj-border-default)", "border-radius", "6px", "padding", "16px"], [2, "display", "flex", "align-items", "center", "gap", "8px", "font-weight", "600"], [1, "fa-solid", "fa-sliders", 2, "color", "var(--mj-text-muted)"], [2, "background", "var(--mj-status-info)", "color", "var(--mj-text-inverse)", "padding", "2px 6px", "border-radius", "10px", "font-size", "0.7em"], [2, "display", "flex", "justify-content", "space-between", "align-items", "flex-start", "margin-bottom", "8px"], [2, "font-weight", "600", "color", "var(--mj-text-secondary)", "display", "flex", "align-items", "center", "gap", "6px"], [1, "fa-solid", "fa-at", 2, "color", "var(--mj-brand-primary)"], [2, "color", "#dc3545"], [2, "font-size", "0.85em", "color", "var(--mj-text-muted)", "margin-top", "4px"], [2, "display", "flex", "gap", "8px", "align-items", "center"], [1, "badge", 2, "background", "var(--mj-text-muted)", "color", "white", "padding", "2px 6px", "border-radius", "4px", "font-size", "0.75em"], ["title", "Required parameter is empty", 1, "fa-solid", "fa-exclamation-triangle", 2, "color", "#dc3545"], ["type", "number", "placeholder", "Enter number value...", 1, "mj-input", 2, "width", "100%", 3, "ngModel"], ["rows", "2", "placeholder", "Enter value (JSON, string, or number)...", 1, "mj-input", 2, "width", "100%", "font-family", "'Courier New', monospace", 3, "ngModel"], [2, "font-size", "0.8em", "color", "var(--mj-text-muted)", "margin-top", "4px"], ["type", "number", "placeholder", "Enter number value...", 1, "mj-input", 2, "width", "100%", 3, "ngModelChange", "ngModel"], ["rows", "2", "placeholder", "Enter value (JSON, string, or number)...", 1, "mj-input", 2, "width", "100%", "font-family", "'Courier New', monospace", 3, "ngModelChange", "ngModel"], [2, "background", "var(--mj-bg-surface-sunken)", "padding", "2px 4px", "border-radius", "3px"], [1, "fa-solid", "fa-table-list", 2, "color", "var(--mj-text-muted)"], [2, "background", "var(--mj-text-muted)", "color", "var(--mj-text-inverse)", "padding", "2px 6px", "border-radius", "10px", "font-size", "0.7em"], [2, "flex", "1", "display", "flex", "flex-direction", "column", "overflow", "hidden", "min-height", "0", 3, "ExpandedChange", "Expanded"], [2, "flex", "1", "display", "flex", "flex-direction", "column", "overflow", "hidden", "min-height", "0"], [
|
|
758
|
+
static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: QueryRunDialogComponent, selectors: [["mj-query-run-dialog"]], inputs: { query: "query", parameters: "parameters", isVisible: "isVisible" }, outputs: { isVisibleChange: "isVisibleChange", onClose: "onClose" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature, i0.ɵɵNgOnChangesFeature], decls: 1, vars: 1, consts: [[3, "Visible", "Width"], [3, "Close", "Visible", "Width"], [2, "display", "flex", "align-items", "center", "gap", "8px"], [1, "fa-solid", "fa-play-circle", 2, "color", "var(--mj-brand-primary)"], [2, "display", "flex", "flex-direction", "column", "height", "100%", "overflow-y", "auto", "overflow-x", "hidden"], [2, "display", "flex", "align-items", "center", "justify-content", "center", "padding", "40px"], [1, "fa-solid", "fa-spinner", "fa-spin", 2, "font-size", "24px", "color", "var(--mj-text-muted)", "margin-right", "12px"], [2, "color", "var(--mj-text-muted)"], [2, "margin-bottom", "16px", "flex-shrink", "0", 3, "Expanded"], [2, "padding", "20px", "background", "var(--mj-bg-surface-sunken)", "border-radius", "6px", "margin-bottom", "16px", "text-align", "center", "color", "var(--mj-text-muted)"], [2, "margin-bottom", "16px", 3, "ExpandedChange", "Expanded"], ["mjAccordionTitle", ""], [2, "padding", "12px 0"], [2, "display", "flex", "flex-direction", "column", "gap", "12px"], [2, "display", "flex", "align-items", "center", "gap", "12px"], [2, "font-weight", "600", "color", "var(--mj-text-secondary)", "white-space", "nowrap", "min-width", "100px"], [1, "fa-solid", "fa-list-ol", 2, "color", "var(--mj-text-muted)", "margin-right", "6px"], ["type", "number", "min", "1", "step", "100", "placeholder", "All rows", 1, "mj-input", 2, "width", "150px", 3, "ngModelChange", "ngModel"], [2, "font-size", "0.85em", "color", "var(--mj-text-muted)"], [1, "fa-solid", "fa-forward", 2, "color", "var(--mj-text-muted)", "margin-right", "6px"], ["type", "number", "min", "0", "step", "1", "placeholder", "0", 1, "mj-input", 2, "width", "150px", 3, "ngModelChange", "ngModel"], [2, "flex", "1", "display", "flex", "flex-direction", "column", "overflow", "hidden", "min-height", "0", 3, "Expanded"], [2, "margin-bottom", "16px", "flex-shrink", "0", 3, "ExpandedChange", "Expanded"], [2, "margin-bottom", "12px", "color", "var(--mj-text-muted)", "font-size", "0.85em"], [1, "fa-solid", "fa-info-circle"], [2, "display", "flex", "flex-direction", "column", "gap", "16px"], [2, "background", "var(--mj-bg-surface-sunken)", "border", "1px solid var(--mj-border-default)", "border-radius", "6px", "padding", "16px"], [2, "display", "flex", "align-items", "center", "gap", "8px", "font-weight", "600"], [1, "fa-solid", "fa-sliders", 2, "color", "var(--mj-text-muted)"], [2, "background", "var(--mj-status-info)", "color", "var(--mj-text-inverse)", "padding", "2px 6px", "border-radius", "10px", "font-size", "0.7em"], [2, "display", "flex", "justify-content", "space-between", "align-items", "flex-start", "margin-bottom", "8px"], [2, "font-weight", "600", "color", "var(--mj-text-secondary)", "display", "flex", "align-items", "center", "gap", "6px"], [1, "fa-solid", "fa-at", 2, "color", "var(--mj-brand-primary)"], [2, "color", "#dc3545"], [2, "font-size", "0.85em", "color", "var(--mj-text-muted)", "margin-top", "4px"], [2, "display", "flex", "gap", "8px", "align-items", "center"], [1, "badge", 2, "background", "var(--mj-text-muted)", "color", "white", "padding", "2px 6px", "border-radius", "4px", "font-size", "0.75em"], ["title", "Required parameter is empty", 1, "fa-solid", "fa-exclamation-triangle", 2, "color", "#dc3545"], ["type", "number", "placeholder", "Enter number value...", 1, "mj-input", 2, "width", "100%", 3, "ngModel"], ["rows", "2", "placeholder", "Enter value (JSON, string, or number)...", 1, "mj-input", 2, "width", "100%", "font-family", "'Courier New', monospace", 3, "ngModel"], [2, "font-size", "0.8em", "color", "var(--mj-text-muted)", "margin-top", "4px"], ["type", "number", "placeholder", "Enter number value...", 1, "mj-input", 2, "width", "100%", 3, "ngModelChange", "ngModel"], ["rows", "2", "placeholder", "Enter value (JSON, string, or number)...", 1, "mj-input", 2, "width", "100%", "font-family", "'Courier New', monospace", 3, "ngModelChange", "ngModel"], [2, "background", "var(--mj-bg-surface-sunken)", "padding", "2px 4px", "border-radius", "3px"], [1, "fa-solid", "fa-table-list", 2, "color", "var(--mj-text-muted)"], [2, "background", "var(--mj-text-muted)", "color", "var(--mj-text-inverse)", "padding", "2px 6px", "border-radius", "10px", "font-size", "0.7em"], [2, "flex", "1", "display", "flex", "flex-direction", "column", "overflow", "hidden", "min-height", "0", 3, "ExpandedChange", "Expanded"], [2, "flex", "1", "display", "flex", "flex-direction", "column", "overflow", "hidden", "min-height", "0"], ["Variant", "error", "Title", "Query execution failed"], [1, "fa-solid", "fa-table", 2, "color", "var(--mj-status-success)"], [2, "background", "var(--mj-status-success)", "color", "var(--mj-text-inverse)", "padding", "2px 6px", "border-radius", "10px", "font-size", "0.7em"], [2, "color", "var(--mj-text-muted)", "font-size", "0.85em", "font-weight", "normal"], [1, "fa-solid", "fa-exclamation-circle", 2, "color", "var(--mj-status-error)"], [2, "display", "flex", "align-items", "center", "justify-content", "center", "height", "200px", "color", "var(--mj-text-muted)"], [2, "display", "flex", "justify-content", "space-between", "align-items", "center", "padding", "12px", "border-bottom", "1px solid var(--mj-border-default)"], [2, "display", "flex", "gap", "8px"], ["mjButton", "", "variant", "flat", "title", "Copy to clipboard", 3, "click"], [1, "fa-solid", "fa-copy"], ["mjButton", "", "variant", "flat", "title", "Export to CSV", 3, "click"], [1, "fa-solid", "fa-download"], [1, "results-table-container", 2, "flex", "1", "overflow", "auto", "border", "1px solid var(--mj-border-default)", "border-radius", "4px", "min-height", "0"], [1, "results-table", 2, "width", "100%", "border-collapse", "collapse", "font-size", "14px"], [2, "position", "sticky", "top", "0", "background", "var(--mj-bg-surface-sunken)", "z-index", "10"], [2, "padding", "12px 16px", "text-align", "left", "font-weight", "600", "color", "var(--mj-text-secondary)", "border-bottom", "2px solid var(--mj-border-default)", "background", "var(--mj-bg-surface-sunken)", "white-space", "nowrap"], [2, "border-bottom", "1px solid var(--mj-border-default)", "transition", "background-color 0.2s"], [2, "padding", "40px", "text-align", "center", "color", "var(--mj-text-muted)"], [2, "font-size", "0.9em", "color", "var(--mj-text-muted)"], [2, "display", "flex", "gap", "4px"], ["mjButton", "", "variant", "flat", "title", "First page", 3, "click", "disabled"], [1, "fa-solid", "fa-angles-left"], ["mjButton", "", "variant", "flat", "title", "Previous page", 3, "click", "disabled"], [1, "fa-solid", "fa-angle-left"], ["mjButton", "", "variant", "flat", "title", "Next page", 3, "click", "disabled"], [1, "fa-solid", "fa-angle-right"], ["mjButton", "", "variant", "flat", "title", "Last page", 3, "click", "disabled"], [1, "fa-solid", "fa-angles-right"], [2, "padding", "10px 16px", "color", "var(--mj-text-primary)", "max-width", "300px", "overflow", "hidden", "text-overflow", "ellipsis", "white-space", "nowrap", 3, "title"], [1, "fa-solid", "fa-table", 2, "font-size", "48px", "margin-bottom", "12px", "opacity", "0.3"], [1, "fa-solid", "fa-inbox", 2, "font-size", "48px", "margin-bottom", "12px"], [2, "margin-top", "8px", "font-family", "'Courier New', monospace", "font-size", "0.9em"], ["mjButton", "", 3, "click"], [1, "fa-solid", "fa-times"], ["mjButton", "", "variant", "primary", 3, "click", "disabled"], [1, "fa-solid", "fa-spinner", "fa-spin"], [1, "fa-solid", "fa-play"], [1, "fa-solid", "fa-refresh"]], template: function QueryRunDialogComponent_Template(rf, ctx) { if (rf & 1) {
|
|
763
759
|
i0.ɵɵconditionalCreate(0, QueryRunDialogComponent_Conditional_0_Template, 11, 5, "mj-dialog", 0);
|
|
764
760
|
} if (rf & 2) {
|
|
765
761
|
i0.ɵɵconditional(ctx.isVisible ? 0 : -1);
|
|
766
|
-
} }, dependencies: [i1.DefaultValueAccessor, i1.NumberValueAccessor, i1.NgControlStatus, i1.MinValidator, i1.NgModel, i2.MJButtonDirective, i2.MJAccordionPanelComponent, i2.MJAccordionTitleDirective, i2.MJDialogComponent, i2.MJDialogTitlebarComponent, i2.MJDialogActionsComponent], styles: [".param-value[_ngcontent-%COMP%] textarea[_ngcontent-%COMP%] {\n resize: vertical;\n min-height: 60px;\n}\n\n.loading-state[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n}\n\n.badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n}\n\n\n\n.results-table-container[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n box-shadow: var(--mj-shadow-sm);\n display: flex;\n flex-direction: column;\n}\n\n.results-table-container[_ngcontent-%COMP%]::-webkit-scrollbar {\n width: 8px;\n height: 8px;\n}\n\n.results-table-container[_ngcontent-%COMP%]::-webkit-scrollbar-track {\n background: var(--mj-bg-surface-sunken);\n}\n\n.results-table-container[_ngcontent-%COMP%]::-webkit-scrollbar-thumb {\n background: var(--mj-border-strong);\n border-radius: var(--mj-radius-sm);\n}\n\n.results-table-container[_ngcontent-%COMP%]::-webkit-scrollbar-thumb:hover {\n background: var(--mj-text-disabled);\n}\n\n.results-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:hover {\n background-color: var(--mj-bg-surface-card) !important;\n}\n\n.results-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:nth-child(even) {\n background-color: var(--mj-bg-surface-card);\n}\n\n.dialog-content[_ngcontent-%COMP%] {\n overflow-y: auto;\n}\n\n.header-section[_ngcontent-%COMP%] {\n flex-shrink: 0;\n}\n\n.param-actions[_ngcontent-%COMP%] button[_ngcontent-%COMP%] {\n min-width: 30px;\n padding: 4px 6px;\n}\n\n\n\n .k-expander-content-wrapper {\n display: flex;\n flex-direction: column;\n flex: 1;\n min-height: 0;\n overflow: hidden;\n}\n\n .k-expander-content {\n display: flex;\n flex-direction: column;\n flex: 1;\n min-height: 0;\n overflow: hidden;\n}"] }); }
|
|
762
|
+
} }, dependencies: [i1.DefaultValueAccessor, i1.NumberValueAccessor, i1.NgControlStatus, i1.MinValidator, i1.NgModel, i2.MJAlertComponent, i2.MJButtonDirective, i2.MJAccordionPanelComponent, i2.MJAccordionTitleDirective, i2.MJDialogComponent, i2.MJDialogTitlebarComponent, i2.MJDialogActionsComponent], styles: [".param-value[_ngcontent-%COMP%] textarea[_ngcontent-%COMP%] {\n resize: vertical;\n min-height: 60px;\n}\n\n.loading-state[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n}\n\n.badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n}\n\n\n\n.results-table-container[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n box-shadow: var(--mj-shadow-sm);\n display: flex;\n flex-direction: column;\n}\n\n.results-table-container[_ngcontent-%COMP%]::-webkit-scrollbar {\n width: 8px;\n height: 8px;\n}\n\n.results-table-container[_ngcontent-%COMP%]::-webkit-scrollbar-track {\n background: var(--mj-bg-surface-sunken);\n}\n\n.results-table-container[_ngcontent-%COMP%]::-webkit-scrollbar-thumb {\n background: var(--mj-border-strong);\n border-radius: var(--mj-radius-sm);\n}\n\n.results-table-container[_ngcontent-%COMP%]::-webkit-scrollbar-thumb:hover {\n background: var(--mj-text-disabled);\n}\n\n.results-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:hover {\n background-color: var(--mj-bg-surface-card) !important;\n}\n\n.results-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:nth-child(even) {\n background-color: var(--mj-bg-surface-card);\n}\n\n.dialog-content[_ngcontent-%COMP%] {\n overflow-y: auto;\n}\n\n.header-section[_ngcontent-%COMP%] {\n flex-shrink: 0;\n}\n\n.param-actions[_ngcontent-%COMP%] button[_ngcontent-%COMP%] {\n min-width: 30px;\n padding: 4px 6px;\n}\n\n\n\n .k-expander-content-wrapper {\n display: flex;\n flex-direction: column;\n flex: 1;\n min-height: 0;\n overflow: hidden;\n}\n\n .k-expander-content {\n display: flex;\n flex-direction: column;\n flex: 1;\n min-height: 0;\n overflow: hidden;\n}"] }); }
|
|
767
763
|
}
|
|
768
764
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(QueryRunDialogComponent, [{
|
|
769
765
|
type: Component,
|
|
770
|
-
args: [{ standalone: false, selector: 'mj-query-run-dialog', template: "@if (isVisible) {\n <mj-dialog\n [Visible]=\"true\"\n [Width]=\"900\"\n (Close)=\"close()\">\n <mj-dialog-titlebar>\n <div style=\"display: flex; align-items: center; gap: 8px;\">\n <i class=\"fa-solid fa-play-circle\" style=\"color: var(--mj-brand-primary);\"></i>\n Run Query: {{ query?.Name || 'Untitled' }}\n </div>\n </mj-dialog-titlebar>\n <div style=\"display: flex; flex-direction: column; height: 100%; overflow-y: auto; overflow-x: hidden;\">\n @if (isLoadingParams) {\n <div style=\"display: flex; align-items: center; justify-content: center; padding: 40px;\">\n <i class=\"fa-solid fa-spinner fa-spin\" style=\"font-size: 24px; color: var(--mj-text-muted); margin-right: 12px;\"></i>\n <span style=\"color: var(--mj-text-muted);\">Loading query parameters...</span>\n </div>\n } @else {\n <!-- Query Parameters Section -->\n @if (parameterPairs.length > 0) {\n <mj-accordion-panel\n [(Expanded)]=\"parametersExpanded\"\n style=\"margin-bottom: 16px; flex-shrink: 0;\">\n <ng-template mjAccordionTitle>\n <span style=\"display: flex; align-items: center; gap: 8px; font-weight: 600;\">\n <i class=\"fa-solid fa-sliders\" style=\"color: var(--mj-text-muted);\"></i>\n Query Parameters\n <span style=\"background: var(--mj-status-info); color: var(--mj-text-inverse); padding: 2px 6px; border-radius: 10px; font-size: 0.7em;\">\n {{ parameterPairs.length }}\n </span>\n </span>\n </ng-template>\n <div style=\"padding: 12px 0;\">\n <div style=\"margin-bottom: 12px; color: var(--mj-text-muted); font-size: 0.85em;\">\n <i class=\"fa-solid fa-info-circle\"></i>\n Configure parameter values for query execution.\n </div>\n <!-- Parameters List -->\n <div style=\"display: flex; flex-direction: column; gap: 16px;\">\n @for (param of parameterPairs; track param.name) {\n <div style=\"background: var(--mj-bg-surface-sunken); border: 1px solid var(--mj-border-default); border-radius: 6px; padding: 16px;\">\n <div style=\"display: flex; justify-content: space-between; align-items: flex-start; margin-bottom: 8px;\">\n <div>\n <label style=\"font-weight: 600; color: var(--mj-text-secondary); display: flex; align-items: center; gap: 6px;\">\n <i class=\"fa-solid fa-at\" style=\"color: var(--mj-brand-primary);\"></i>\n {{ param.name }}\n @if (param.isRequired) {\n <span style=\"color: #dc3545;\">*</span>\n }\n </label>\n @if (param.description) {\n <div style=\"font-size: 0.85em; color: var(--mj-text-muted); margin-top: 4px;\">\n {{ param.description }}\n </div>\n }\n </div>\n <div style=\"display: flex; gap: 8px; align-items: center;\">\n <span class=\"badge\" style=\"background: var(--mj-text-muted); color: white; padding: 2px 6px; border-radius: 4px; font-size: 0.75em;\">\n {{ param.type }}\n </span>\n @if (!isParameterValid(param)) {\n <i class=\"fa-solid fa-exclamation-triangle\" style=\"color: #dc3545;\" title=\"Required parameter is empty\"></i>\n }\n </div>\n </div>\n <!-- Parameter Value Input -->\n @if (param.type === 'number') {\n <input type=\"number\" class=\"mj-input\"\n [(ngModel)]=\"param.value\"\n placeholder=\"Enter number value...\"\n style=\"width: 100%;\" />\n } @else {\n <textarea class=\"mj-input\"\n [(ngModel)]=\"param.value\"\n rows=\"2\"\n placeholder=\"Enter value (JSON, string, or number)...\"\n style=\"width: 100%; font-family: 'Courier New', monospace;\">\n </textarea>\n }\n @if (param.defaultValue) {\n <div style=\"font-size: 0.8em; color: var(--mj-text-muted); margin-top: 4px;\">\n Default: <code style=\"background: var(--mj-bg-surface-sunken); padding: 2px 4px; border-radius: 3px;\">{{ param.defaultValue }}</code>\n </div>\n }\n </div>\n }\n </div>\n </div>\n </mj-accordion-panel>\n } @else {\n <div style=\"padding: 20px; background: var(--mj-bg-surface-sunken); border-radius: 6px; margin-bottom: 16px; text-align: center; color: var(--mj-text-muted);\">\n <i class=\"fa-solid fa-info-circle\"></i> This query has no parameters.\n </div>\n }\n <!-- Pagination Settings -->\n <mj-accordion-panel\n [(Expanded)]=\"paginationExpanded\"\n style=\"margin-bottom: 16px;\">\n <ng-template mjAccordionTitle>\n <span style=\"display: flex; align-items: center; gap: 8px; font-weight: 600;\">\n <i class=\"fa-solid fa-table-list\" style=\"color: var(--mj-text-muted);\"></i>\n Pagination Settings\n @if (maxRows && maxRows > 0) {\n <span style=\"background: var(--mj-text-muted); color: var(--mj-text-inverse); padding: 2px 6px; border-radius: 10px; font-size: 0.7em;\">\n {{ maxRows }} rows/page\n </span>\n }\n </span>\n </ng-template>\n <div style=\"padding: 12px 0;\">\n <div style=\"display: flex; flex-direction: column; gap: 12px;\">\n <!-- Max Rows -->\n <div style=\"display: flex; align-items: center; gap: 12px;\">\n <label style=\"font-weight: 600; color: var(--mj-text-secondary); white-space: nowrap; min-width: 100px;\">\n <i class=\"fa-solid fa-list-ol\" style=\"color: var(--mj-text-muted); margin-right: 6px;\"></i>\n Max Rows:\n </label>\n <input type=\"number\" class=\"mj-input\"\n [(ngModel)]=\"maxRows\"\n min=\"1\"\n step=\"100\"\n placeholder=\"All rows\"\n style=\"width: 150px;\" />\n <span style=\"font-size: 0.85em; color: var(--mj-text-muted);\">\n Leave empty to return all rows\n </span>\n </div>\n <!-- Start Row -->\n <div style=\"display: flex; align-items: center; gap: 12px;\">\n <label style=\"font-weight: 600; color: var(--mj-text-secondary); white-space: nowrap; min-width: 100px;\">\n <i class=\"fa-solid fa-forward\" style=\"color: var(--mj-text-muted); margin-right: 6px;\"></i>\n Start Row:\n </label>\n <input type=\"number\" class=\"mj-input\"\n [(ngModel)]=\"startRow\"\n min=\"0\"\n step=\"1\"\n placeholder=\"0\"\n style=\"width: 150px;\" />\n <span style=\"font-size: 0.85em; color: var(--mj-text-muted);\">\n 0-based offset for pagination\n </span>\n </div>\n </div>\n </div>\n </mj-accordion-panel>\n <!-- Results Section -->\n @if (runResult) {\n <mj-accordion-panel\n [(Expanded)]=\"resultsExpanded\"\n style=\"flex: 1; display: flex; flex-direction: column; overflow: hidden; min-height: 0;\">\n <ng-template mjAccordionTitle>\n <span style=\"display: flex; align-items: center; gap: 8px; font-weight: 600;\">\n @if (runResult.Success) {\n <i class=\"fa-solid fa-table\" style=\"color: var(--mj-status-success);\"></i>\n Query Results\n <span style=\"background: var(--mj-status-success); color: var(--mj-text-inverse); padding: 2px 6px; border-radius: 10px; font-size: 0.7em;\">\n {{ runResult.RowCount }} rows@if (runResult.TotalRowCount > runResult.RowCount) { of {{ runResult.TotalRowCount }} total}\n </span>\n @if (runResult.ExecutionTime) {\n <span style=\"color: var(--mj-text-muted); font-size: 0.85em; font-weight: normal;\">— {{ runResult.ExecutionTime }}ms</span>\n }\n } @else {\n <i class=\"fa-solid fa-exclamation-circle\" style=\"color: var(--mj-status-error);\"></i>\n Query Results — Error\n }\n </span>\n </ng-template>\n <div style=\"flex: 1; display: flex; flex-direction: column; overflow: hidden; min-height: 0;\">\n @if (runResult.Success) {\n @if (resultRows.length > 0) {\n <!-- Export and Pagination Controls -->\n <div style=\"display: flex; justify-content: space-between; align-items: center; padding: 12px; border-bottom: 1px solid var(--mj-border-default);\">\n <!-- Pagination Info and Controls -->\n <div style=\"display: flex; align-items: center; gap: 12px;\">\n @if (runResult.TotalRowCount > runResult.RowCount || startRow > 0) {\n <span style=\"font-size: 0.9em; color: var(--mj-text-muted);\">\n Showing rows {{ startRow + 1 }} - {{ startRow + runResult.RowCount }} of {{ runResult.TotalRowCount }}\n </span>\n <div style=\"display: flex; gap: 4px;\">\n <button mjButton\n variant=\"flat\"\n [disabled]=\"startRow === 0\"\n (click)=\"goToFirstPage()\"\n title=\"First page\">\n <i class=\"fa-solid fa-angles-left\"></i>\n </button>\n <button mjButton\n variant=\"flat\"\n [disabled]=\"startRow === 0\"\n (click)=\"goToPreviousPage()\"\n title=\"Previous page\">\n <i class=\"fa-solid fa-angle-left\"></i>\n </button>\n <button mjButton\n variant=\"flat\"\n [disabled]=\"startRow + runResult.RowCount >= runResult.TotalRowCount\"\n (click)=\"goToNextPage()\"\n title=\"Next page\">\n <i class=\"fa-solid fa-angle-right\"></i>\n </button>\n <button mjButton\n variant=\"flat\"\n [disabled]=\"startRow + runResult.RowCount >= runResult.TotalRowCount\"\n (click)=\"goToLastPage()\"\n title=\"Last page\">\n <i class=\"fa-solid fa-angles-right\"></i>\n </button>\n </div>\n }\n </div>\n <!-- Export Buttons -->\n <div style=\"display: flex; gap: 8px;\">\n <button mjButton\n variant=\"flat\"\n (click)=\"copyToClipboard()\"\n title=\"Copy to clipboard\">\n <i class=\"fa-solid fa-copy\"></i> Copy\n </button>\n <button mjButton\n variant=\"flat\"\n (click)=\"exportToCSV()\"\n title=\"Export to CSV\">\n <i class=\"fa-solid fa-download\"></i> Export CSV\n </button>\n </div>\n </div>\n <!-- Results Grid -->\n <div class=\"results-table-container\" style=\"flex: 1; overflow: auto; border: 1px solid var(--mj-border-default); border-radius: 4px; min-height: 0;\">\n <table class=\"results-table\" style=\"width: 100%; border-collapse: collapse; font-size: 14px;\">\n <thead style=\"position: sticky; top: 0; background: var(--mj-bg-surface-sunken); z-index: 10;\">\n <tr>\n @for (col of resultColumns; track col.field) {\n <th style=\"padding: 12px 16px; text-align: left; font-weight: 600; color: var(--mj-text-secondary); border-bottom: 2px solid var(--mj-border-default); background: var(--mj-bg-surface-sunken); white-space: nowrap;\">\n {{ col.title }}\n </th>\n }\n </tr>\n </thead>\n <tbody>\n @for (row of resultRows; track $index) {\n <tr style=\"border-bottom: 1px solid var(--mj-border-default); transition: background-color 0.2s;\">\n @for (col of resultColumns; track col.field) {\n <td style=\"padding: 10px 16px; color: var(--mj-text-primary); max-width: 300px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;\"\n [title]=\"row[col.field]\">\n {{ row[col.field] || '' }}\n </td>\n }\n </tr>\n }\n </tbody>\n </table>\n @if (resultRows.length === 0) {\n <div style=\"padding: 40px; text-align: center; color: var(--mj-text-muted);\">\n <i class=\"fa-solid fa-table\" style=\"font-size: 48px; margin-bottom: 12px; opacity: 0.3;\"></i>\n <p>No data in results</p>\n </div>\n }\n </div>\n } @else {\n <div style=\"display: flex; align-items: center; justify-content: center; height: 200px; color: var(--mj-text-muted);\">\n <i class=\"fa-solid fa-inbox\" style=\"font-size: 48px; margin-bottom: 12px;\"></i>\n <p>No results returned</p>\n </div>\n }\n } @else {\n <div style=\"padding: 20px; background: #f8d7da; border: 1px solid #f5c6cb; border-radius: 6px; margin: 12px;\">\n <div style=\"color: #721c24;\">\n <i class=\"fa-solid fa-exclamation-circle\"></i>\n <strong>Query execution failed</strong>\n </div>\n @if (runResult.ErrorMessage) {\n <div style=\"margin-top: 8px; font-family: 'Courier New', monospace; font-size: 0.9em;\">\n {{ runResult.ErrorMessage }}\n </div>\n }\n </div>\n }\n </div>\n </mj-accordion-panel>\n }\n }\n </div>\n <mj-dialog-actions>\n @if (!runResult) {\n <button mjButton (click)=\"close()\">\n <i class=\"fa-solid fa-times\"></i> Cancel\n </button>\n <button mjButton\n variant=\"primary\"\n [disabled]=\"isRunning || hasInvalidParameters()\"\n (click)=\"runQuery()\">\n @if (isRunning) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Running...\n } @else {\n <i class=\"fa-solid fa-play\"></i> Run Query\n }\n </button>\n } @else {\n <button mjButton (click)=\"close()\">\n <i class=\"fa-solid fa-times\"></i> Close\n </button>\n <button mjButton\n variant=\"primary\"\n [disabled]=\"isRunning\"\n (click)=\"runQuery()\">\n <i class=\"fa-solid fa-refresh\"></i> Run Again\n </button>\n }\n </mj-dialog-actions>\n </mj-dialog>\n}\n", styles: [".param-value textarea {\n resize: vertical;\n min-height: 60px;\n}\n\n.loading-state {\n color: var(--mj-text-muted);\n}\n\n.badge {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n}\n\n/* Professional Results Table Styling */\n.results-table-container {\n background: var(--mj-bg-surface);\n box-shadow: var(--mj-shadow-sm);\n display: flex;\n flex-direction: column;\n}\n\n.results-table-container::-webkit-scrollbar {\n width: 8px;\n height: 8px;\n}\n\n.results-table-container::-webkit-scrollbar-track {\n background: var(--mj-bg-surface-sunken);\n}\n\n.results-table-container::-webkit-scrollbar-thumb {\n background: var(--mj-border-strong);\n border-radius: var(--mj-radius-sm);\n}\n\n.results-table-container::-webkit-scrollbar-thumb:hover {\n background: var(--mj-text-disabled);\n}\n\n.results-table tbody tr:hover {\n background-color: var(--mj-bg-surface-card) !important;\n}\n\n.results-table tbody tr:nth-child(even) {\n background-color: var(--mj-bg-surface-card);\n}\n\n.dialog-content {\n overflow-y: auto;\n}\n\n.header-section {\n flex-shrink: 0;\n}\n\n.param-actions button {\n min-width: 30px;\n padding: 4px 6px;\n}\n\n/* Ensure expansion panel content flexes properly */\n::ng-deep .k-expander-content-wrapper {\n display: flex;\n flex-direction: column;\n flex: 1;\n min-height: 0;\n overflow: hidden;\n}\n\n::ng-deep .k-expander-content {\n display: flex;\n flex-direction: column;\n flex: 1;\n min-height: 0;\n overflow: hidden;\n}\n"] }]
|
|
766
|
+
args: [{ standalone: false, selector: 'mj-query-run-dialog', template: "@if (isVisible) {\n <mj-dialog\n [Visible]=\"true\"\n [Width]=\"900\"\n (Close)=\"close()\">\n <mj-dialog-titlebar>\n <div style=\"display: flex; align-items: center; gap: 8px;\">\n <i class=\"fa-solid fa-play-circle\" style=\"color: var(--mj-brand-primary);\"></i>\n Run Query: {{ query?.Name || 'Untitled' }}\n </div>\n </mj-dialog-titlebar>\n <div style=\"display: flex; flex-direction: column; height: 100%; overflow-y: auto; overflow-x: hidden;\">\n @if (isLoadingParams) {\n <div style=\"display: flex; align-items: center; justify-content: center; padding: 40px;\">\n <i class=\"fa-solid fa-spinner fa-spin\" style=\"font-size: 24px; color: var(--mj-text-muted); margin-right: 12px;\"></i>\n <span style=\"color: var(--mj-text-muted);\">Loading query parameters...</span>\n </div>\n } @else {\n <!-- Query Parameters Section -->\n @if (parameterPairs.length > 0) {\n <mj-accordion-panel\n [(Expanded)]=\"parametersExpanded\"\n style=\"margin-bottom: 16px; flex-shrink: 0;\">\n <ng-template mjAccordionTitle>\n <span style=\"display: flex; align-items: center; gap: 8px; font-weight: 600;\">\n <i class=\"fa-solid fa-sliders\" style=\"color: var(--mj-text-muted);\"></i>\n Query Parameters\n <span style=\"background: var(--mj-status-info); color: var(--mj-text-inverse); padding: 2px 6px; border-radius: 10px; font-size: 0.7em;\">\n {{ parameterPairs.length }}\n </span>\n </span>\n </ng-template>\n <div style=\"padding: 12px 0;\">\n <div style=\"margin-bottom: 12px; color: var(--mj-text-muted); font-size: 0.85em;\">\n <i class=\"fa-solid fa-info-circle\"></i>\n Configure parameter values for query execution.\n </div>\n <!-- Parameters List -->\n <div style=\"display: flex; flex-direction: column; gap: 16px;\">\n @for (param of parameterPairs; track param.name) {\n <div style=\"background: var(--mj-bg-surface-sunken); border: 1px solid var(--mj-border-default); border-radius: 6px; padding: 16px;\">\n <div style=\"display: flex; justify-content: space-between; align-items: flex-start; margin-bottom: 8px;\">\n <div>\n <label style=\"font-weight: 600; color: var(--mj-text-secondary); display: flex; align-items: center; gap: 6px;\">\n <i class=\"fa-solid fa-at\" style=\"color: var(--mj-brand-primary);\"></i>\n {{ param.name }}\n @if (param.isRequired) {\n <span style=\"color: #dc3545;\">*</span>\n }\n </label>\n @if (param.description) {\n <div style=\"font-size: 0.85em; color: var(--mj-text-muted); margin-top: 4px;\">\n {{ param.description }}\n </div>\n }\n </div>\n <div style=\"display: flex; gap: 8px; align-items: center;\">\n <span class=\"badge\" style=\"background: var(--mj-text-muted); color: white; padding: 2px 6px; border-radius: 4px; font-size: 0.75em;\">\n {{ param.type }}\n </span>\n @if (!isParameterValid(param)) {\n <i class=\"fa-solid fa-exclamation-triangle\" style=\"color: #dc3545;\" title=\"Required parameter is empty\"></i>\n }\n </div>\n </div>\n <!-- Parameter Value Input -->\n @if (param.type === 'number') {\n <input type=\"number\" class=\"mj-input\"\n [(ngModel)]=\"param.value\"\n placeholder=\"Enter number value...\"\n style=\"width: 100%;\" />\n } @else {\n <textarea class=\"mj-input\"\n [(ngModel)]=\"param.value\"\n rows=\"2\"\n placeholder=\"Enter value (JSON, string, or number)...\"\n style=\"width: 100%; font-family: 'Courier New', monospace;\">\n </textarea>\n }\n @if (param.defaultValue) {\n <div style=\"font-size: 0.8em; color: var(--mj-text-muted); margin-top: 4px;\">\n Default: <code style=\"background: var(--mj-bg-surface-sunken); padding: 2px 4px; border-radius: 3px;\">{{ param.defaultValue }}</code>\n </div>\n }\n </div>\n }\n </div>\n </div>\n </mj-accordion-panel>\n } @else {\n <div style=\"padding: 20px; background: var(--mj-bg-surface-sunken); border-radius: 6px; margin-bottom: 16px; text-align: center; color: var(--mj-text-muted);\">\n <i class=\"fa-solid fa-info-circle\"></i> This query has no parameters.\n </div>\n }\n <!-- Pagination Settings -->\n <mj-accordion-panel\n [(Expanded)]=\"paginationExpanded\"\n style=\"margin-bottom: 16px;\">\n <ng-template mjAccordionTitle>\n <span style=\"display: flex; align-items: center; gap: 8px; font-weight: 600;\">\n <i class=\"fa-solid fa-table-list\" style=\"color: var(--mj-text-muted);\"></i>\n Pagination Settings\n @if (maxRows && maxRows > 0) {\n <span style=\"background: var(--mj-text-muted); color: var(--mj-text-inverse); padding: 2px 6px; border-radius: 10px; font-size: 0.7em;\">\n {{ maxRows }} rows/page\n </span>\n }\n </span>\n </ng-template>\n <div style=\"padding: 12px 0;\">\n <div style=\"display: flex; flex-direction: column; gap: 12px;\">\n <!-- Max Rows -->\n <div style=\"display: flex; align-items: center; gap: 12px;\">\n <label style=\"font-weight: 600; color: var(--mj-text-secondary); white-space: nowrap; min-width: 100px;\">\n <i class=\"fa-solid fa-list-ol\" style=\"color: var(--mj-text-muted); margin-right: 6px;\"></i>\n Max Rows:\n </label>\n <input type=\"number\" class=\"mj-input\"\n [(ngModel)]=\"maxRows\"\n min=\"1\"\n step=\"100\"\n placeholder=\"All rows\"\n style=\"width: 150px;\" />\n <span style=\"font-size: 0.85em; color: var(--mj-text-muted);\">\n Leave empty to return all rows\n </span>\n </div>\n <!-- Start Row -->\n <div style=\"display: flex; align-items: center; gap: 12px;\">\n <label style=\"font-weight: 600; color: var(--mj-text-secondary); white-space: nowrap; min-width: 100px;\">\n <i class=\"fa-solid fa-forward\" style=\"color: var(--mj-text-muted); margin-right: 6px;\"></i>\n Start Row:\n </label>\n <input type=\"number\" class=\"mj-input\"\n [(ngModel)]=\"startRow\"\n min=\"0\"\n step=\"1\"\n placeholder=\"0\"\n style=\"width: 150px;\" />\n <span style=\"font-size: 0.85em; color: var(--mj-text-muted);\">\n 0-based offset for pagination\n </span>\n </div>\n </div>\n </div>\n </mj-accordion-panel>\n <!-- Results Section -->\n @if (runResult) {\n <mj-accordion-panel\n [(Expanded)]=\"resultsExpanded\"\n style=\"flex: 1; display: flex; flex-direction: column; overflow: hidden; min-height: 0;\">\n <ng-template mjAccordionTitle>\n <span style=\"display: flex; align-items: center; gap: 8px; font-weight: 600;\">\n @if (runResult.Success) {\n <i class=\"fa-solid fa-table\" style=\"color: var(--mj-status-success);\"></i>\n Query Results\n <span style=\"background: var(--mj-status-success); color: var(--mj-text-inverse); padding: 2px 6px; border-radius: 10px; font-size: 0.7em;\">\n {{ runResult.RowCount }} rows@if (runResult.TotalRowCount > runResult.RowCount) { of {{ runResult.TotalRowCount }} total}\n </span>\n @if (runResult.ExecutionTime) {\n <span style=\"color: var(--mj-text-muted); font-size: 0.85em; font-weight: normal;\">— {{ runResult.ExecutionTime }}ms</span>\n }\n } @else {\n <i class=\"fa-solid fa-exclamation-circle\" style=\"color: var(--mj-status-error);\"></i>\n Query Results — Error\n }\n </span>\n </ng-template>\n <div style=\"flex: 1; display: flex; flex-direction: column; overflow: hidden; min-height: 0;\">\n @if (runResult.Success) {\n @if (resultRows.length > 0) {\n <!-- Export and Pagination Controls -->\n <div style=\"display: flex; justify-content: space-between; align-items: center; padding: 12px; border-bottom: 1px solid var(--mj-border-default);\">\n <!-- Pagination Info and Controls -->\n <div style=\"display: flex; align-items: center; gap: 12px;\">\n @if (runResult.TotalRowCount > runResult.RowCount || startRow > 0) {\n <span style=\"font-size: 0.9em; color: var(--mj-text-muted);\">\n Showing rows {{ startRow + 1 }} - {{ startRow + runResult.RowCount }} of {{ runResult.TotalRowCount }}\n </span>\n <div style=\"display: flex; gap: 4px;\">\n <button mjButton\n variant=\"flat\"\n [disabled]=\"startRow === 0\"\n (click)=\"goToFirstPage()\"\n title=\"First page\">\n <i class=\"fa-solid fa-angles-left\"></i>\n </button>\n <button mjButton\n variant=\"flat\"\n [disabled]=\"startRow === 0\"\n (click)=\"goToPreviousPage()\"\n title=\"Previous page\">\n <i class=\"fa-solid fa-angle-left\"></i>\n </button>\n <button mjButton\n variant=\"flat\"\n [disabled]=\"startRow + runResult.RowCount >= runResult.TotalRowCount\"\n (click)=\"goToNextPage()\"\n title=\"Next page\">\n <i class=\"fa-solid fa-angle-right\"></i>\n </button>\n <button mjButton\n variant=\"flat\"\n [disabled]=\"startRow + runResult.RowCount >= runResult.TotalRowCount\"\n (click)=\"goToLastPage()\"\n title=\"Last page\">\n <i class=\"fa-solid fa-angles-right\"></i>\n </button>\n </div>\n }\n </div>\n <!-- Export Buttons -->\n <div style=\"display: flex; gap: 8px;\">\n <button mjButton\n variant=\"flat\"\n (click)=\"copyToClipboard()\"\n title=\"Copy to clipboard\">\n <i class=\"fa-solid fa-copy\"></i> Copy\n </button>\n <button mjButton\n variant=\"flat\"\n (click)=\"exportToCSV()\"\n title=\"Export to CSV\">\n <i class=\"fa-solid fa-download\"></i> Export CSV\n </button>\n </div>\n </div>\n <!-- Results Grid -->\n <div class=\"results-table-container\" style=\"flex: 1; overflow: auto; border: 1px solid var(--mj-border-default); border-radius: 4px; min-height: 0;\">\n <table class=\"results-table\" style=\"width: 100%; border-collapse: collapse; font-size: 14px;\">\n <thead style=\"position: sticky; top: 0; background: var(--mj-bg-surface-sunken); z-index: 10;\">\n <tr>\n @for (col of resultColumns; track col.field) {\n <th style=\"padding: 12px 16px; text-align: left; font-weight: 600; color: var(--mj-text-secondary); border-bottom: 2px solid var(--mj-border-default); background: var(--mj-bg-surface-sunken); white-space: nowrap;\">\n {{ col.title }}\n </th>\n }\n </tr>\n </thead>\n <tbody>\n @for (row of resultRows; track $index) {\n <tr style=\"border-bottom: 1px solid var(--mj-border-default); transition: background-color 0.2s;\">\n @for (col of resultColumns; track col.field) {\n <td style=\"padding: 10px 16px; color: var(--mj-text-primary); max-width: 300px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;\"\n [title]=\"row[col.field]\">\n {{ row[col.field] || '' }}\n </td>\n }\n </tr>\n }\n </tbody>\n </table>\n @if (resultRows.length === 0) {\n <div style=\"padding: 40px; text-align: center; color: var(--mj-text-muted);\">\n <i class=\"fa-solid fa-table\" style=\"font-size: 48px; margin-bottom: 12px; opacity: 0.3;\"></i>\n <p>No data in results</p>\n </div>\n }\n </div>\n } @else {\n <div style=\"display: flex; align-items: center; justify-content: center; height: 200px; color: var(--mj-text-muted);\">\n <i class=\"fa-solid fa-inbox\" style=\"font-size: 48px; margin-bottom: 12px;\"></i>\n <p>No results returned</p>\n </div>\n }\n } @else {\n <mj-alert Variant=\"error\" Title=\"Query execution failed\">\n @if (runResult.ErrorMessage) {\n <div style=\"margin-top: 8px; font-family: 'Courier New', monospace; font-size: 0.9em;\">\n {{ runResult.ErrorMessage }}\n </div>\n }\n </mj-alert>\n }\n </div>\n </mj-accordion-panel>\n }\n }\n </div>\n <mj-dialog-actions>\n @if (!runResult) {\n <button mjButton (click)=\"close()\">\n <i class=\"fa-solid fa-times\"></i> Cancel\n </button>\n <button mjButton\n variant=\"primary\"\n [disabled]=\"isRunning || hasInvalidParameters()\"\n (click)=\"runQuery()\">\n @if (isRunning) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Running...\n } @else {\n <i class=\"fa-solid fa-play\"></i> Run Query\n }\n </button>\n } @else {\n <button mjButton (click)=\"close()\">\n <i class=\"fa-solid fa-times\"></i> Close\n </button>\n <button mjButton\n variant=\"primary\"\n [disabled]=\"isRunning\"\n (click)=\"runQuery()\">\n <i class=\"fa-solid fa-refresh\"></i> Run Again\n </button>\n }\n </mj-dialog-actions>\n </mj-dialog>\n}\n", styles: [".param-value textarea {\n resize: vertical;\n min-height: 60px;\n}\n\n.loading-state {\n color: var(--mj-text-muted);\n}\n\n.badge {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n}\n\n/* Professional Results Table Styling */\n.results-table-container {\n background: var(--mj-bg-surface);\n box-shadow: var(--mj-shadow-sm);\n display: flex;\n flex-direction: column;\n}\n\n.results-table-container::-webkit-scrollbar {\n width: 8px;\n height: 8px;\n}\n\n.results-table-container::-webkit-scrollbar-track {\n background: var(--mj-bg-surface-sunken);\n}\n\n.results-table-container::-webkit-scrollbar-thumb {\n background: var(--mj-border-strong);\n border-radius: var(--mj-radius-sm);\n}\n\n.results-table-container::-webkit-scrollbar-thumb:hover {\n background: var(--mj-text-disabled);\n}\n\n.results-table tbody tr:hover {\n background-color: var(--mj-bg-surface-card) !important;\n}\n\n.results-table tbody tr:nth-child(even) {\n background-color: var(--mj-bg-surface-card);\n}\n\n.dialog-content {\n overflow-y: auto;\n}\n\n.header-section {\n flex-shrink: 0;\n}\n\n.param-actions button {\n min-width: 30px;\n padding: 4px 6px;\n}\n\n/* Ensure expansion panel content flexes properly */\n::ng-deep .k-expander-content-wrapper {\n display: flex;\n flex-direction: column;\n flex: 1;\n min-height: 0;\n overflow: hidden;\n}\n\n::ng-deep .k-expander-content {\n display: flex;\n flex-direction: column;\n flex: 1;\n min-height: 0;\n overflow: hidden;\n}\n"] }]
|
|
771
767
|
}], null, { query: [{
|
|
772
768
|
type: Input
|
|
773
769
|
}], parameters: [{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query-run-dialog.component.js","sourceRoot":"","sources":["../../../../src/lib/custom/Queries/query-run-dialog.component.ts","../../../../src/lib/custom/Queries/query-run-dialog.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, Output, EventEmitter, OnInit, OnChanges, SimpleChanges, ChangeDetectorRef, inject } from '@angular/core';\nimport { MJQueryEntity, MJQueryParameterEntity } from '@memberjunction/core-entities';\nimport { GraphQLDataProvider } from '@memberjunction/graphql-dataprovider';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\nimport { Metadata } from '@memberjunction/core';\n\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\ninterface QueryRunResult {\n QueryID: string;\n QueryName: string;\n Success: boolean;\n Results: string; // This is a JSON string that needs to be parsed\n ErrorMessage: string;\n RowCount: number;\n TotalRowCount: number;\n ExecutionTime: number;\n AppliedParameters?: string; // JSON string of applied parameters\n}\n\ninterface ParameterPair {\n name: string;\n value: string;\n type: string;\n defaultValue: string;\n description: string;\n isRequired: boolean;\n}\n\n@Component({\n standalone: false,\n selector: 'mj-query-run-dialog',\n templateUrl: './query-run-dialog.component.html',\n styleUrls: ['./query-run-dialog.component.css']\n})\nexport class QueryRunDialogComponent extends BaseAngularComponent implements OnInit, OnChanges {\n private cdr = inject(ChangeDetectorRef);\n\n @Input() query: MJQueryEntity | null = null;\n @Input() parameters: MJQueryParameterEntity[] = [];\n @Input() isVisible = false;\n @Output() isVisibleChange = new EventEmitter<boolean>();\n @Output() onClose = new EventEmitter<void>();\n\n public isRunning = false;\n public isLoadingParams = false;\n public parameterPairs: ParameterPair[] = [];\n public parametersExpanded = true;\n public resultsExpanded = true;\n public paginationExpanded = false;\n public runResult: QueryRunResult | null = null;\n public resultColumns: any[] = [];\n public resultRows: any[] = [];\n public selectedRows: any[] = [];\n public maxRows: number | null = null;\n public startRow: number = 0;\n\n ngOnInit() {\n this.initializeParameters();\n }\n\n ngOnChanges(changes: SimpleChanges) {\n if (changes['isVisible'] && changes['isVisible'].currentValue) {\n this.initializeParameters();\n }\n if (changes['parameters']) {\n this.initializeParameters();\n }\n }\n\n private initializeParameters() {\n if (!this.query || !this.parameters) return;\n\n // Create parameter pairs from defined query parameters only\n this.parameterPairs = this.parameters.map(param => ({\n name: param.Name,\n value: param.DefaultValue || '',\n type: param.Type || 'string',\n defaultValue: param.DefaultValue || '',\n description: param.Description || '',\n isRequired: param.IsRequired || false\n }));\n }\n\n getValueListOptions(valueList: string): Array<{text: string, value: string}> {\n if (!valueList) return [];\n \n try {\n const options = valueList.split(',').map(v => v.trim());\n return options.map(opt => ({ text: opt, value: opt }));\n } catch {\n return [];\n }\n }\n\n isParameterValid(param: ParameterPair): boolean {\n if (param.isRequired && !param.value) {\n return false;\n }\n \n // Additional type-specific validation could go here\n if (param.type === 'number' && param.value) {\n return !isNaN(Number(param.value));\n }\n \n return true;\n }\n\n async runQuery(isPaginationRequest: boolean = false) {\n if (!this.query?.ID) return;\n\n // Validate required parameters\n const invalidParams = this.parameterPairs.filter(p => p.isRequired && !p.value);\n if (invalidParams.length > 0) {\n MJNotificationService.Instance.CreateSimpleNotification(\n `Required parameters missing: ${invalidParams.map(p => p.name).join(', ')}`,\n 'warning',\n 3000\n );\n return;\n }\n\n this.isRunning = true;\n this.runResult = null;\n\n try {\n // Build parameters object\n const queryParameters: Record<string, any> = {};\n this.parameterPairs.forEach(param => {\n if (param.value) {\n try {\n // Try to parse as JSON first, fallback to string\n queryParameters[param.name] = JSON.parse(param.value);\n } catch {\n // If JSON parsing fails, treat as string or number based on type\n if (param.type === 'number') {\n queryParameters[param.name] = Number(param.value);\n } else {\n queryParameters[param.name] = param.value;\n }\n }\n }\n });\n\n // Get GraphQL data provider\n const dataProvider = this.ProviderToUse as GraphQLDataProvider;\n \n // Execute the GetQueryData GraphQL query\n const query = `\n query GetQueryData($QueryID: String!, $Parameters: JSONObject, $MaxRows: Int, $StartRow: Int) {\n GetQueryData(QueryID: $QueryID, Parameters: $Parameters, MaxRows: $MaxRows, StartRow: $StartRow) {\n QueryID\n QueryName\n Success\n Results\n ErrorMessage\n RowCount\n TotalRowCount\n ExecutionTime\n AppliedParameters\n }\n }\n `;\n\n const variables: any = {\n QueryID: this.query.ID,\n Parameters: queryParameters\n };\n \n // Only include MaxRows if it's set\n if (this.maxRows && this.maxRows > 0) {\n variables.MaxRows = this.maxRows;\n }\n \n // Only include StartRow if it's set and greater than 0\n if (this.startRow && this.startRow > 0) {\n variables.StartRow = this.startRow;\n }\n\n console.log('Executing query with variables:', variables);\n \n const response = await dataProvider.ExecuteGQL(\n query, \n variables\n ) as {GetQueryData: QueryRunResult};\n\n if (response?.GetQueryData) {\n this.runResult = response.GetQueryData;\n \n if (this.runResult.Success && this.runResult.Results) {\n // Parse the JSON string results\n try {\n const parsedResults = JSON.parse(this.runResult.Results);\n this.processResults(parsedResults);\n // Only show notification on first run (not pagination)\n if (!isPaginationRequest) {\n const rowCountMsg = this.runResult.TotalRowCount > this.runResult.RowCount\n ? `Query executed successfully. Showing ${this.runResult.RowCount} of ${this.runResult.TotalRowCount} total rows.`\n : `Query executed successfully. ${this.runResult.RowCount} rows returned.`;\n MJNotificationService.Instance.CreateSimpleNotification(\n rowCountMsg,\n 'success',\n 3000\n );\n }\n \n // Automatically expand results and collapse other sections\n this.parametersExpanded = false;\n this.paginationExpanded = false;\n this.resultsExpanded = true;\n } catch (error) {\n console.error('Error parsing results:', error);\n MJNotificationService.Instance.CreateSimpleNotification(\n 'Failed to parse query results',\n 'error',\n 3000\n );\n }\n } else {\n console.error('Query execution failed:', this.runResult);\n MJNotificationService.Instance.CreateSimpleNotification(\n this.runResult?.ErrorMessage || 'Query execution failed',\n 'error',\n 3000\n );\n \n // Expand results section to show error\n this.parametersExpanded = false;\n this.paginationExpanded = false;\n this.resultsExpanded = true;\n }\n } else {\n throw new Error('No response from server');\n }\n } catch (error) {\n console.error('Error running query:', error);\n this.runResult = {\n QueryID: this.query.ID,\n QueryName: this.query.Name,\n Success: false,\n Results: '[]',\n ErrorMessage: error instanceof Error ? error.message : 'Unknown error occurred',\n RowCount: 0,\n TotalRowCount: 0,\n ExecutionTime: 0\n };\n MJNotificationService.Instance.CreateSimpleNotification(\n 'Failed to execute query. Please check your parameters and try again.',\n 'error',\n 3000\n );\n } finally {\n this.isRunning = false;\n this.cdr.detectChanges();\n }\n }\n\n private processResults(results: any[]) {\n if (!results || results.length === 0) {\n this.resultColumns = [];\n this.resultRows = [];\n return;\n }\n\n // Extract columns from first row\n const firstRow = results[0];\n this.resultColumns = Object.keys(firstRow).map(key => ({\n field: key,\n title: this.formatColumnTitle(key),\n width: this.calculateColumnWidth(key, results)\n }));\n\n // Set rows\n this.resultRows = results;\n }\n\n private formatColumnTitle(field: string): string {\n // Convert camelCase or snake_case to Title Case\n return field\n .replace(/([A-Z])/g, ' $1')\n .replace(/_/g, ' ')\n .replace(/^\\s+/, '')\n .split(' ')\n .map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n .join(' ');\n }\n\n private calculateColumnWidth(field: string, data: any[]): number {\n // Calculate appropriate column width based on content\n const maxLength = Math.max(\n field.length,\n ...data.slice(0, 10).map(row => String(row[field] || '').length)\n );\n return Math.min(Math.max(maxLength * 10, 100), 300);\n }\n\n exportToCSV() {\n if (!this.resultRows || this.resultRows.length === 0) {\n MJNotificationService.Instance.CreateSimpleNotification(\n 'No data to export',\n 'warning',\n 3000\n );\n return;\n }\n\n // Create CSV content\n const headers = this.resultColumns.map(col => col.title).join(',');\n const rows = this.resultRows.map(row =>\n this.resultColumns.map(col => {\n const value = row[col.field];\n // Escape values containing commas or quotes\n if (typeof value === 'string' && (value.includes(',') || value.includes('\"'))) {\n return `\"${value.replace(/\"/g, '\"\"')}\"`;\n }\n return value;\n }).join(',')\n );\n\n const csv = [headers, ...rows].join('\\n');\n\n // Create and download file\n const blob = new Blob([csv], { type: 'text/csv' });\n const url = window.URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = `${this.query?.Name || 'query'}_results_${new Date().toISOString().slice(0, 10)}.csv`;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n window.URL.revokeObjectURL(url);\n\n MJNotificationService.Instance.CreateSimpleNotification(\n 'Results exported to CSV',\n 'success',\n 3000\n );\n }\n\n async copyToClipboard() {\n if (!this.resultRows || this.resultRows.length === 0) {\n MJNotificationService.Instance.CreateSimpleNotification(\n 'No data to copy',\n 'warning',\n 3000\n );\n return;\n }\n\n try {\n // Create tab-delimited content for pasting into Excel\n const headers = this.resultColumns.map(col => col.title).join('\\t');\n const rows = this.resultRows.map(row =>\n this.resultColumns.map(col => row[col.field] || '').join('\\t')\n );\n\n const content = [headers, ...rows].join('\\n');\n await navigator.clipboard.writeText(content);\n\n MJNotificationService.Instance.CreateSimpleNotification(\n 'Results copied to clipboard',\n 'success',\n 3000\n );\n } catch (error) {\n console.error('Failed to copy to clipboard:', error);\n MJNotificationService.Instance.CreateSimpleNotification(\n 'Failed to copy to clipboard',\n 'error',\n 3000\n );\n }\n }\n\n close() {\n this.isVisible = false;\n this.isVisibleChange.emit(false);\n this.onClose.emit();\n \n // Reset state\n this.runResult = null;\n this.resultColumns = [];\n this.resultRows = [];\n this.selectedRows = [];\n this.startRow = 0;\n }\n\n getAppliedParametersCount(): number {\n return this.parameterPairs.filter(p => p.value).length;\n }\n \n hasInvalidParameters(): boolean {\n return this.parameterPairs.some(p => !this.isParameterValid(p));\n }\n \n // Pagination methods\n goToFirstPage() {\n this.startRow = 0;\n this.runQuery(true);\n }\n \n goToPreviousPage() {\n if (this.startRow > 0 && this.maxRows) {\n this.startRow = Math.max(0, this.startRow - this.maxRows);\n this.runQuery(true);\n }\n }\n \n goToNextPage() {\n if (this.maxRows && this.runResult && this.startRow + this.runResult.RowCount < this.runResult.TotalRowCount) {\n this.startRow += this.maxRows;\n this.runQuery(true);\n }\n }\n \n goToLastPage() {\n if (this.maxRows && this.runResult) {\n const totalPages = Math.ceil(this.runResult.TotalRowCount / this.maxRows);\n this.startRow = (totalPages - 1) * this.maxRows;\n this.runQuery(true);\n }\n }\n}","@if (isVisible) {\n <mj-dialog\n [Visible]=\"true\"\n [Width]=\"900\"\n (Close)=\"close()\">\n <mj-dialog-titlebar>\n <div style=\"display: flex; align-items: center; gap: 8px;\">\n <i class=\"fa-solid fa-play-circle\" style=\"color: var(--mj-brand-primary);\"></i>\n Run Query: {{ query?.Name || 'Untitled' }}\n </div>\n </mj-dialog-titlebar>\n <div style=\"display: flex; flex-direction: column; height: 100%; overflow-y: auto; overflow-x: hidden;\">\n @if (isLoadingParams) {\n <div style=\"display: flex; align-items: center; justify-content: center; padding: 40px;\">\n <i class=\"fa-solid fa-spinner fa-spin\" style=\"font-size: 24px; color: var(--mj-text-muted); margin-right: 12px;\"></i>\n <span style=\"color: var(--mj-text-muted);\">Loading query parameters...</span>\n </div>\n } @else {\n <!-- Query Parameters Section -->\n @if (parameterPairs.length > 0) {\n <mj-accordion-panel\n [(Expanded)]=\"parametersExpanded\"\n style=\"margin-bottom: 16px; flex-shrink: 0;\">\n <ng-template mjAccordionTitle>\n <span style=\"display: flex; align-items: center; gap: 8px; font-weight: 600;\">\n <i class=\"fa-solid fa-sliders\" style=\"color: var(--mj-text-muted);\"></i>\n Query Parameters\n <span style=\"background: var(--mj-status-info); color: var(--mj-text-inverse); padding: 2px 6px; border-radius: 10px; font-size: 0.7em;\">\n {{ parameterPairs.length }}\n </span>\n </span>\n </ng-template>\n <div style=\"padding: 12px 0;\">\n <div style=\"margin-bottom: 12px; color: var(--mj-text-muted); font-size: 0.85em;\">\n <i class=\"fa-solid fa-info-circle\"></i>\n Configure parameter values for query execution.\n </div>\n <!-- Parameters List -->\n <div style=\"display: flex; flex-direction: column; gap: 16px;\">\n @for (param of parameterPairs; track param.name) {\n <div style=\"background: var(--mj-bg-surface-sunken); border: 1px solid var(--mj-border-default); border-radius: 6px; padding: 16px;\">\n <div style=\"display: flex; justify-content: space-between; align-items: flex-start; margin-bottom: 8px;\">\n <div>\n <label style=\"font-weight: 600; color: var(--mj-text-secondary); display: flex; align-items: center; gap: 6px;\">\n <i class=\"fa-solid fa-at\" style=\"color: var(--mj-brand-primary);\"></i>\n {{ param.name }}\n @if (param.isRequired) {\n <span style=\"color: #dc3545;\">*</span>\n }\n </label>\n @if (param.description) {\n <div style=\"font-size: 0.85em; color: var(--mj-text-muted); margin-top: 4px;\">\n {{ param.description }}\n </div>\n }\n </div>\n <div style=\"display: flex; gap: 8px; align-items: center;\">\n <span class=\"badge\" style=\"background: var(--mj-text-muted); color: white; padding: 2px 6px; border-radius: 4px; font-size: 0.75em;\">\n {{ param.type }}\n </span>\n @if (!isParameterValid(param)) {\n <i class=\"fa-solid fa-exclamation-triangle\" style=\"color: #dc3545;\" title=\"Required parameter is empty\"></i>\n }\n </div>\n </div>\n <!-- Parameter Value Input -->\n @if (param.type === 'number') {\n <input type=\"number\" class=\"mj-input\"\n [(ngModel)]=\"param.value\"\n placeholder=\"Enter number value...\"\n style=\"width: 100%;\" />\n } @else {\n <textarea class=\"mj-input\"\n [(ngModel)]=\"param.value\"\n rows=\"2\"\n placeholder=\"Enter value (JSON, string, or number)...\"\n style=\"width: 100%; font-family: 'Courier New', monospace;\">\n </textarea>\n }\n @if (param.defaultValue) {\n <div style=\"font-size: 0.8em; color: var(--mj-text-muted); margin-top: 4px;\">\n Default: <code style=\"background: var(--mj-bg-surface-sunken); padding: 2px 4px; border-radius: 3px;\">{{ param.defaultValue }}</code>\n </div>\n }\n </div>\n }\n </div>\n </div>\n </mj-accordion-panel>\n } @else {\n <div style=\"padding: 20px; background: var(--mj-bg-surface-sunken); border-radius: 6px; margin-bottom: 16px; text-align: center; color: var(--mj-text-muted);\">\n <i class=\"fa-solid fa-info-circle\"></i> This query has no parameters.\n </div>\n }\n <!-- Pagination Settings -->\n <mj-accordion-panel\n [(Expanded)]=\"paginationExpanded\"\n style=\"margin-bottom: 16px;\">\n <ng-template mjAccordionTitle>\n <span style=\"display: flex; align-items: center; gap: 8px; font-weight: 600;\">\n <i class=\"fa-solid fa-table-list\" style=\"color: var(--mj-text-muted);\"></i>\n Pagination Settings\n @if (maxRows && maxRows > 0) {\n <span style=\"background: var(--mj-text-muted); color: var(--mj-text-inverse); padding: 2px 6px; border-radius: 10px; font-size: 0.7em;\">\n {{ maxRows }} rows/page\n </span>\n }\n </span>\n </ng-template>\n <div style=\"padding: 12px 0;\">\n <div style=\"display: flex; flex-direction: column; gap: 12px;\">\n <!-- Max Rows -->\n <div style=\"display: flex; align-items: center; gap: 12px;\">\n <label style=\"font-weight: 600; color: var(--mj-text-secondary); white-space: nowrap; min-width: 100px;\">\n <i class=\"fa-solid fa-list-ol\" style=\"color: var(--mj-text-muted); margin-right: 6px;\"></i>\n Max Rows:\n </label>\n <input type=\"number\" class=\"mj-input\"\n [(ngModel)]=\"maxRows\"\n min=\"1\"\n step=\"100\"\n placeholder=\"All rows\"\n style=\"width: 150px;\" />\n <span style=\"font-size: 0.85em; color: var(--mj-text-muted);\">\n Leave empty to return all rows\n </span>\n </div>\n <!-- Start Row -->\n <div style=\"display: flex; align-items: center; gap: 12px;\">\n <label style=\"font-weight: 600; color: var(--mj-text-secondary); white-space: nowrap; min-width: 100px;\">\n <i class=\"fa-solid fa-forward\" style=\"color: var(--mj-text-muted); margin-right: 6px;\"></i>\n Start Row:\n </label>\n <input type=\"number\" class=\"mj-input\"\n [(ngModel)]=\"startRow\"\n min=\"0\"\n step=\"1\"\n placeholder=\"0\"\n style=\"width: 150px;\" />\n <span style=\"font-size: 0.85em; color: var(--mj-text-muted);\">\n 0-based offset for pagination\n </span>\n </div>\n </div>\n </div>\n </mj-accordion-panel>\n <!-- Results Section -->\n @if (runResult) {\n <mj-accordion-panel\n [(Expanded)]=\"resultsExpanded\"\n style=\"flex: 1; display: flex; flex-direction: column; overflow: hidden; min-height: 0;\">\n <ng-template mjAccordionTitle>\n <span style=\"display: flex; align-items: center; gap: 8px; font-weight: 600;\">\n @if (runResult.Success) {\n <i class=\"fa-solid fa-table\" style=\"color: var(--mj-status-success);\"></i>\n Query Results\n <span style=\"background: var(--mj-status-success); color: var(--mj-text-inverse); padding: 2px 6px; border-radius: 10px; font-size: 0.7em;\">\n {{ runResult.RowCount }} rows@if (runResult.TotalRowCount > runResult.RowCount) { of {{ runResult.TotalRowCount }} total}\n </span>\n @if (runResult.ExecutionTime) {\n <span style=\"color: var(--mj-text-muted); font-size: 0.85em; font-weight: normal;\">— {{ runResult.ExecutionTime }}ms</span>\n }\n } @else {\n <i class=\"fa-solid fa-exclamation-circle\" style=\"color: var(--mj-status-error);\"></i>\n Query Results — Error\n }\n </span>\n </ng-template>\n <div style=\"flex: 1; display: flex; flex-direction: column; overflow: hidden; min-height: 0;\">\n @if (runResult.Success) {\n @if (resultRows.length > 0) {\n <!-- Export and Pagination Controls -->\n <div style=\"display: flex; justify-content: space-between; align-items: center; padding: 12px; border-bottom: 1px solid var(--mj-border-default);\">\n <!-- Pagination Info and Controls -->\n <div style=\"display: flex; align-items: center; gap: 12px;\">\n @if (runResult.TotalRowCount > runResult.RowCount || startRow > 0) {\n <span style=\"font-size: 0.9em; color: var(--mj-text-muted);\">\n Showing rows {{ startRow + 1 }} - {{ startRow + runResult.RowCount }} of {{ runResult.TotalRowCount }}\n </span>\n <div style=\"display: flex; gap: 4px;\">\n <button mjButton\n variant=\"flat\"\n [disabled]=\"startRow === 0\"\n (click)=\"goToFirstPage()\"\n title=\"First page\">\n <i class=\"fa-solid fa-angles-left\"></i>\n </button>\n <button mjButton\n variant=\"flat\"\n [disabled]=\"startRow === 0\"\n (click)=\"goToPreviousPage()\"\n title=\"Previous page\">\n <i class=\"fa-solid fa-angle-left\"></i>\n </button>\n <button mjButton\n variant=\"flat\"\n [disabled]=\"startRow + runResult.RowCount >= runResult.TotalRowCount\"\n (click)=\"goToNextPage()\"\n title=\"Next page\">\n <i class=\"fa-solid fa-angle-right\"></i>\n </button>\n <button mjButton\n variant=\"flat\"\n [disabled]=\"startRow + runResult.RowCount >= runResult.TotalRowCount\"\n (click)=\"goToLastPage()\"\n title=\"Last page\">\n <i class=\"fa-solid fa-angles-right\"></i>\n </button>\n </div>\n }\n </div>\n <!-- Export Buttons -->\n <div style=\"display: flex; gap: 8px;\">\n <button mjButton\n variant=\"flat\"\n (click)=\"copyToClipboard()\"\n title=\"Copy to clipboard\">\n <i class=\"fa-solid fa-copy\"></i> Copy\n </button>\n <button mjButton\n variant=\"flat\"\n (click)=\"exportToCSV()\"\n title=\"Export to CSV\">\n <i class=\"fa-solid fa-download\"></i> Export CSV\n </button>\n </div>\n </div>\n <!-- Results Grid -->\n <div class=\"results-table-container\" style=\"flex: 1; overflow: auto; border: 1px solid var(--mj-border-default); border-radius: 4px; min-height: 0;\">\n <table class=\"results-table\" style=\"width: 100%; border-collapse: collapse; font-size: 14px;\">\n <thead style=\"position: sticky; top: 0; background: var(--mj-bg-surface-sunken); z-index: 10;\">\n <tr>\n @for (col of resultColumns; track col.field) {\n <th style=\"padding: 12px 16px; text-align: left; font-weight: 600; color: var(--mj-text-secondary); border-bottom: 2px solid var(--mj-border-default); background: var(--mj-bg-surface-sunken); white-space: nowrap;\">\n {{ col.title }}\n </th>\n }\n </tr>\n </thead>\n <tbody>\n @for (row of resultRows; track $index) {\n <tr style=\"border-bottom: 1px solid var(--mj-border-default); transition: background-color 0.2s;\">\n @for (col of resultColumns; track col.field) {\n <td style=\"padding: 10px 16px; color: var(--mj-text-primary); max-width: 300px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;\"\n [title]=\"row[col.field]\">\n {{ row[col.field] || '' }}\n </td>\n }\n </tr>\n }\n </tbody>\n </table>\n @if (resultRows.length === 0) {\n <div style=\"padding: 40px; text-align: center; color: var(--mj-text-muted);\">\n <i class=\"fa-solid fa-table\" style=\"font-size: 48px; margin-bottom: 12px; opacity: 0.3;\"></i>\n <p>No data in results</p>\n </div>\n }\n </div>\n } @else {\n <div style=\"display: flex; align-items: center; justify-content: center; height: 200px; color: var(--mj-text-muted);\">\n <i class=\"fa-solid fa-inbox\" style=\"font-size: 48px; margin-bottom: 12px;\"></i>\n <p>No results returned</p>\n </div>\n }\n } @else {\n <div style=\"padding: 20px; background: #f8d7da; border: 1px solid #f5c6cb; border-radius: 6px; margin: 12px;\">\n <div style=\"color: #721c24;\">\n <i class=\"fa-solid fa-exclamation-circle\"></i>\n <strong>Query execution failed</strong>\n </div>\n @if (runResult.ErrorMessage) {\n <div style=\"margin-top: 8px; font-family: 'Courier New', monospace; font-size: 0.9em;\">\n {{ runResult.ErrorMessage }}\n </div>\n }\n </div>\n }\n </div>\n </mj-accordion-panel>\n }\n }\n </div>\n <mj-dialog-actions>\n @if (!runResult) {\n <button mjButton (click)=\"close()\">\n <i class=\"fa-solid fa-times\"></i> Cancel\n </button>\n <button mjButton\n variant=\"primary\"\n [disabled]=\"isRunning || hasInvalidParameters()\"\n (click)=\"runQuery()\">\n @if (isRunning) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Running...\n } @else {\n <i class=\"fa-solid fa-play\"></i> Run Query\n }\n </button>\n } @else {\n <button mjButton (click)=\"close()\">\n <i class=\"fa-solid fa-times\"></i> Close\n </button>\n <button mjButton\n variant=\"primary\"\n [disabled]=\"isRunning\"\n (click)=\"runQuery()\">\n <i class=\"fa-solid fa-refresh\"></i> Run Again\n </button>\n }\n </mj-dialog-actions>\n </mj-dialog>\n}\n"]}
|
|
1
|
+
{"version":3,"file":"query-run-dialog.component.js","sourceRoot":"","sources":["../../../../src/lib/custom/Queries/query-run-dialog.component.ts","../../../../src/lib/custom/Queries/query-run-dialog.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, Output, EventEmitter, OnInit, OnChanges, SimpleChanges, ChangeDetectorRef, inject } from '@angular/core';\nimport { MJQueryEntity, MJQueryParameterEntity } from '@memberjunction/core-entities';\nimport { GraphQLDataProvider } from '@memberjunction/graphql-dataprovider';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\nimport { Metadata } from '@memberjunction/core';\n\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\ninterface QueryRunResult {\n QueryID: string;\n QueryName: string;\n Success: boolean;\n Results: string; // This is a JSON string that needs to be parsed\n ErrorMessage: string;\n RowCount: number;\n TotalRowCount: number;\n ExecutionTime: number;\n AppliedParameters?: string; // JSON string of applied parameters\n}\n\ninterface ParameterPair {\n name: string;\n value: string;\n type: string;\n defaultValue: string;\n description: string;\n isRequired: boolean;\n}\n\n@Component({\n standalone: false,\n selector: 'mj-query-run-dialog',\n templateUrl: './query-run-dialog.component.html',\n styleUrls: ['./query-run-dialog.component.css']\n})\nexport class QueryRunDialogComponent extends BaseAngularComponent implements OnInit, OnChanges {\n private cdr = inject(ChangeDetectorRef);\n\n @Input() query: MJQueryEntity | null = null;\n @Input() parameters: MJQueryParameterEntity[] = [];\n @Input() isVisible = false;\n @Output() isVisibleChange = new EventEmitter<boolean>();\n @Output() onClose = new EventEmitter<void>();\n\n public isRunning = false;\n public isLoadingParams = false;\n public parameterPairs: ParameterPair[] = [];\n public parametersExpanded = true;\n public resultsExpanded = true;\n public paginationExpanded = false;\n public runResult: QueryRunResult | null = null;\n public resultColumns: any[] = [];\n public resultRows: any[] = [];\n public selectedRows: any[] = [];\n public maxRows: number | null = null;\n public startRow: number = 0;\n\n ngOnInit() {\n this.initializeParameters();\n }\n\n ngOnChanges(changes: SimpleChanges) {\n if (changes['isVisible'] && changes['isVisible'].currentValue) {\n this.initializeParameters();\n }\n if (changes['parameters']) {\n this.initializeParameters();\n }\n }\n\n private initializeParameters() {\n if (!this.query || !this.parameters) return;\n\n // Create parameter pairs from defined query parameters only\n this.parameterPairs = this.parameters.map(param => ({\n name: param.Name,\n value: param.DefaultValue || '',\n type: param.Type || 'string',\n defaultValue: param.DefaultValue || '',\n description: param.Description || '',\n isRequired: param.IsRequired || false\n }));\n }\n\n getValueListOptions(valueList: string): Array<{text: string, value: string}> {\n if (!valueList) return [];\n \n try {\n const options = valueList.split(',').map(v => v.trim());\n return options.map(opt => ({ text: opt, value: opt }));\n } catch {\n return [];\n }\n }\n\n isParameterValid(param: ParameterPair): boolean {\n if (param.isRequired && !param.value) {\n return false;\n }\n \n // Additional type-specific validation could go here\n if (param.type === 'number' && param.value) {\n return !isNaN(Number(param.value));\n }\n \n return true;\n }\n\n async runQuery(isPaginationRequest: boolean = false) {\n if (!this.query?.ID) return;\n\n // Validate required parameters\n const invalidParams = this.parameterPairs.filter(p => p.isRequired && !p.value);\n if (invalidParams.length > 0) {\n MJNotificationService.Instance.CreateSimpleNotification(\n `Required parameters missing: ${invalidParams.map(p => p.name).join(', ')}`,\n 'warning',\n 3000\n );\n return;\n }\n\n this.isRunning = true;\n this.runResult = null;\n\n try {\n // Build parameters object\n const queryParameters: Record<string, any> = {};\n this.parameterPairs.forEach(param => {\n if (param.value) {\n try {\n // Try to parse as JSON first, fallback to string\n queryParameters[param.name] = JSON.parse(param.value);\n } catch {\n // If JSON parsing fails, treat as string or number based on type\n if (param.type === 'number') {\n queryParameters[param.name] = Number(param.value);\n } else {\n queryParameters[param.name] = param.value;\n }\n }\n }\n });\n\n // Get GraphQL data provider\n const dataProvider = this.ProviderToUse as GraphQLDataProvider;\n \n // Execute the GetQueryData GraphQL query\n const query = `\n query GetQueryData($QueryID: String!, $Parameters: JSONObject, $MaxRows: Int, $StartRow: Int) {\n GetQueryData(QueryID: $QueryID, Parameters: $Parameters, MaxRows: $MaxRows, StartRow: $StartRow) {\n QueryID\n QueryName\n Success\n Results\n ErrorMessage\n RowCount\n TotalRowCount\n ExecutionTime\n AppliedParameters\n }\n }\n `;\n\n const variables: any = {\n QueryID: this.query.ID,\n Parameters: queryParameters\n };\n \n // Only include MaxRows if it's set\n if (this.maxRows && this.maxRows > 0) {\n variables.MaxRows = this.maxRows;\n }\n \n // Only include StartRow if it's set and greater than 0\n if (this.startRow && this.startRow > 0) {\n variables.StartRow = this.startRow;\n }\n\n console.log('Executing query with variables:', variables);\n \n const response = await dataProvider.ExecuteGQL(\n query, \n variables\n ) as {GetQueryData: QueryRunResult};\n\n if (response?.GetQueryData) {\n this.runResult = response.GetQueryData;\n \n if (this.runResult.Success && this.runResult.Results) {\n // Parse the JSON string results\n try {\n const parsedResults = JSON.parse(this.runResult.Results);\n this.processResults(parsedResults);\n // Only show notification on first run (not pagination)\n if (!isPaginationRequest) {\n const rowCountMsg = this.runResult.TotalRowCount > this.runResult.RowCount\n ? `Query executed successfully. Showing ${this.runResult.RowCount} of ${this.runResult.TotalRowCount} total rows.`\n : `Query executed successfully. ${this.runResult.RowCount} rows returned.`;\n MJNotificationService.Instance.CreateSimpleNotification(\n rowCountMsg,\n 'success',\n 3000\n );\n }\n \n // Automatically expand results and collapse other sections\n this.parametersExpanded = false;\n this.paginationExpanded = false;\n this.resultsExpanded = true;\n } catch (error) {\n console.error('Error parsing results:', error);\n MJNotificationService.Instance.CreateSimpleNotification(\n 'Failed to parse query results',\n 'error',\n 3000\n );\n }\n } else {\n console.error('Query execution failed:', this.runResult);\n MJNotificationService.Instance.CreateSimpleNotification(\n this.runResult?.ErrorMessage || 'Query execution failed',\n 'error',\n 3000\n );\n \n // Expand results section to show error\n this.parametersExpanded = false;\n this.paginationExpanded = false;\n this.resultsExpanded = true;\n }\n } else {\n throw new Error('No response from server');\n }\n } catch (error) {\n console.error('Error running query:', error);\n this.runResult = {\n QueryID: this.query.ID,\n QueryName: this.query.Name,\n Success: false,\n Results: '[]',\n ErrorMessage: error instanceof Error ? error.message : 'Unknown error occurred',\n RowCount: 0,\n TotalRowCount: 0,\n ExecutionTime: 0\n };\n MJNotificationService.Instance.CreateSimpleNotification(\n 'Failed to execute query. Please check your parameters and try again.',\n 'error',\n 3000\n );\n } finally {\n this.isRunning = false;\n this.cdr.detectChanges();\n }\n }\n\n private processResults(results: any[]) {\n if (!results || results.length === 0) {\n this.resultColumns = [];\n this.resultRows = [];\n return;\n }\n\n // Extract columns from first row\n const firstRow = results[0];\n this.resultColumns = Object.keys(firstRow).map(key => ({\n field: key,\n title: this.formatColumnTitle(key),\n width: this.calculateColumnWidth(key, results)\n }));\n\n // Set rows\n this.resultRows = results;\n }\n\n private formatColumnTitle(field: string): string {\n // Convert camelCase or snake_case to Title Case\n return field\n .replace(/([A-Z])/g, ' $1')\n .replace(/_/g, ' ')\n .replace(/^\\s+/, '')\n .split(' ')\n .map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n .join(' ');\n }\n\n private calculateColumnWidth(field: string, data: any[]): number {\n // Calculate appropriate column width based on content\n const maxLength = Math.max(\n field.length,\n ...data.slice(0, 10).map(row => String(row[field] || '').length)\n );\n return Math.min(Math.max(maxLength * 10, 100), 300);\n }\n\n exportToCSV() {\n if (!this.resultRows || this.resultRows.length === 0) {\n MJNotificationService.Instance.CreateSimpleNotification(\n 'No data to export',\n 'warning',\n 3000\n );\n return;\n }\n\n // Create CSV content\n const headers = this.resultColumns.map(col => col.title).join(',');\n const rows = this.resultRows.map(row =>\n this.resultColumns.map(col => {\n const value = row[col.field];\n // Escape values containing commas or quotes\n if (typeof value === 'string' && (value.includes(',') || value.includes('\"'))) {\n return `\"${value.replace(/\"/g, '\"\"')}\"`;\n }\n return value;\n }).join(',')\n );\n\n const csv = [headers, ...rows].join('\\n');\n\n // Create and download file\n const blob = new Blob([csv], { type: 'text/csv' });\n const url = window.URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = `${this.query?.Name || 'query'}_results_${new Date().toISOString().slice(0, 10)}.csv`;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n window.URL.revokeObjectURL(url);\n\n MJNotificationService.Instance.CreateSimpleNotification(\n 'Results exported to CSV',\n 'success',\n 3000\n );\n }\n\n async copyToClipboard() {\n if (!this.resultRows || this.resultRows.length === 0) {\n MJNotificationService.Instance.CreateSimpleNotification(\n 'No data to copy',\n 'warning',\n 3000\n );\n return;\n }\n\n try {\n // Create tab-delimited content for pasting into Excel\n const headers = this.resultColumns.map(col => col.title).join('\\t');\n const rows = this.resultRows.map(row =>\n this.resultColumns.map(col => row[col.field] || '').join('\\t')\n );\n\n const content = [headers, ...rows].join('\\n');\n await navigator.clipboard.writeText(content);\n\n MJNotificationService.Instance.CreateSimpleNotification(\n 'Results copied to clipboard',\n 'success',\n 3000\n );\n } catch (error) {\n console.error('Failed to copy to clipboard:', error);\n MJNotificationService.Instance.CreateSimpleNotification(\n 'Failed to copy to clipboard',\n 'error',\n 3000\n );\n }\n }\n\n close() {\n this.isVisible = false;\n this.isVisibleChange.emit(false);\n this.onClose.emit();\n \n // Reset state\n this.runResult = null;\n this.resultColumns = [];\n this.resultRows = [];\n this.selectedRows = [];\n this.startRow = 0;\n }\n\n getAppliedParametersCount(): number {\n return this.parameterPairs.filter(p => p.value).length;\n }\n \n hasInvalidParameters(): boolean {\n return this.parameterPairs.some(p => !this.isParameterValid(p));\n }\n \n // Pagination methods\n goToFirstPage() {\n this.startRow = 0;\n this.runQuery(true);\n }\n \n goToPreviousPage() {\n if (this.startRow > 0 && this.maxRows) {\n this.startRow = Math.max(0, this.startRow - this.maxRows);\n this.runQuery(true);\n }\n }\n \n goToNextPage() {\n if (this.maxRows && this.runResult && this.startRow + this.runResult.RowCount < this.runResult.TotalRowCount) {\n this.startRow += this.maxRows;\n this.runQuery(true);\n }\n }\n \n goToLastPage() {\n if (this.maxRows && this.runResult) {\n const totalPages = Math.ceil(this.runResult.TotalRowCount / this.maxRows);\n this.startRow = (totalPages - 1) * this.maxRows;\n this.runQuery(true);\n }\n }\n}","@if (isVisible) {\n <mj-dialog\n [Visible]=\"true\"\n [Width]=\"900\"\n (Close)=\"close()\">\n <mj-dialog-titlebar>\n <div style=\"display: flex; align-items: center; gap: 8px;\">\n <i class=\"fa-solid fa-play-circle\" style=\"color: var(--mj-brand-primary);\"></i>\n Run Query: {{ query?.Name || 'Untitled' }}\n </div>\n </mj-dialog-titlebar>\n <div style=\"display: flex; flex-direction: column; height: 100%; overflow-y: auto; overflow-x: hidden;\">\n @if (isLoadingParams) {\n <div style=\"display: flex; align-items: center; justify-content: center; padding: 40px;\">\n <i class=\"fa-solid fa-spinner fa-spin\" style=\"font-size: 24px; color: var(--mj-text-muted); margin-right: 12px;\"></i>\n <span style=\"color: var(--mj-text-muted);\">Loading query parameters...</span>\n </div>\n } @else {\n <!-- Query Parameters Section -->\n @if (parameterPairs.length > 0) {\n <mj-accordion-panel\n [(Expanded)]=\"parametersExpanded\"\n style=\"margin-bottom: 16px; flex-shrink: 0;\">\n <ng-template mjAccordionTitle>\n <span style=\"display: flex; align-items: center; gap: 8px; font-weight: 600;\">\n <i class=\"fa-solid fa-sliders\" style=\"color: var(--mj-text-muted);\"></i>\n Query Parameters\n <span style=\"background: var(--mj-status-info); color: var(--mj-text-inverse); padding: 2px 6px; border-radius: 10px; font-size: 0.7em;\">\n {{ parameterPairs.length }}\n </span>\n </span>\n </ng-template>\n <div style=\"padding: 12px 0;\">\n <div style=\"margin-bottom: 12px; color: var(--mj-text-muted); font-size: 0.85em;\">\n <i class=\"fa-solid fa-info-circle\"></i>\n Configure parameter values for query execution.\n </div>\n <!-- Parameters List -->\n <div style=\"display: flex; flex-direction: column; gap: 16px;\">\n @for (param of parameterPairs; track param.name) {\n <div style=\"background: var(--mj-bg-surface-sunken); border: 1px solid var(--mj-border-default); border-radius: 6px; padding: 16px;\">\n <div style=\"display: flex; justify-content: space-between; align-items: flex-start; margin-bottom: 8px;\">\n <div>\n <label style=\"font-weight: 600; color: var(--mj-text-secondary); display: flex; align-items: center; gap: 6px;\">\n <i class=\"fa-solid fa-at\" style=\"color: var(--mj-brand-primary);\"></i>\n {{ param.name }}\n @if (param.isRequired) {\n <span style=\"color: #dc3545;\">*</span>\n }\n </label>\n @if (param.description) {\n <div style=\"font-size: 0.85em; color: var(--mj-text-muted); margin-top: 4px;\">\n {{ param.description }}\n </div>\n }\n </div>\n <div style=\"display: flex; gap: 8px; align-items: center;\">\n <span class=\"badge\" style=\"background: var(--mj-text-muted); color: white; padding: 2px 6px; border-radius: 4px; font-size: 0.75em;\">\n {{ param.type }}\n </span>\n @if (!isParameterValid(param)) {\n <i class=\"fa-solid fa-exclamation-triangle\" style=\"color: #dc3545;\" title=\"Required parameter is empty\"></i>\n }\n </div>\n </div>\n <!-- Parameter Value Input -->\n @if (param.type === 'number') {\n <input type=\"number\" class=\"mj-input\"\n [(ngModel)]=\"param.value\"\n placeholder=\"Enter number value...\"\n style=\"width: 100%;\" />\n } @else {\n <textarea class=\"mj-input\"\n [(ngModel)]=\"param.value\"\n rows=\"2\"\n placeholder=\"Enter value (JSON, string, or number)...\"\n style=\"width: 100%; font-family: 'Courier New', monospace;\">\n </textarea>\n }\n @if (param.defaultValue) {\n <div style=\"font-size: 0.8em; color: var(--mj-text-muted); margin-top: 4px;\">\n Default: <code style=\"background: var(--mj-bg-surface-sunken); padding: 2px 4px; border-radius: 3px;\">{{ param.defaultValue }}</code>\n </div>\n }\n </div>\n }\n </div>\n </div>\n </mj-accordion-panel>\n } @else {\n <div style=\"padding: 20px; background: var(--mj-bg-surface-sunken); border-radius: 6px; margin-bottom: 16px; text-align: center; color: var(--mj-text-muted);\">\n <i class=\"fa-solid fa-info-circle\"></i> This query has no parameters.\n </div>\n }\n <!-- Pagination Settings -->\n <mj-accordion-panel\n [(Expanded)]=\"paginationExpanded\"\n style=\"margin-bottom: 16px;\">\n <ng-template mjAccordionTitle>\n <span style=\"display: flex; align-items: center; gap: 8px; font-weight: 600;\">\n <i class=\"fa-solid fa-table-list\" style=\"color: var(--mj-text-muted);\"></i>\n Pagination Settings\n @if (maxRows && maxRows > 0) {\n <span style=\"background: var(--mj-text-muted); color: var(--mj-text-inverse); padding: 2px 6px; border-radius: 10px; font-size: 0.7em;\">\n {{ maxRows }} rows/page\n </span>\n }\n </span>\n </ng-template>\n <div style=\"padding: 12px 0;\">\n <div style=\"display: flex; flex-direction: column; gap: 12px;\">\n <!-- Max Rows -->\n <div style=\"display: flex; align-items: center; gap: 12px;\">\n <label style=\"font-weight: 600; color: var(--mj-text-secondary); white-space: nowrap; min-width: 100px;\">\n <i class=\"fa-solid fa-list-ol\" style=\"color: var(--mj-text-muted); margin-right: 6px;\"></i>\n Max Rows:\n </label>\n <input type=\"number\" class=\"mj-input\"\n [(ngModel)]=\"maxRows\"\n min=\"1\"\n step=\"100\"\n placeholder=\"All rows\"\n style=\"width: 150px;\" />\n <span style=\"font-size: 0.85em; color: var(--mj-text-muted);\">\n Leave empty to return all rows\n </span>\n </div>\n <!-- Start Row -->\n <div style=\"display: flex; align-items: center; gap: 12px;\">\n <label style=\"font-weight: 600; color: var(--mj-text-secondary); white-space: nowrap; min-width: 100px;\">\n <i class=\"fa-solid fa-forward\" style=\"color: var(--mj-text-muted); margin-right: 6px;\"></i>\n Start Row:\n </label>\n <input type=\"number\" class=\"mj-input\"\n [(ngModel)]=\"startRow\"\n min=\"0\"\n step=\"1\"\n placeholder=\"0\"\n style=\"width: 150px;\" />\n <span style=\"font-size: 0.85em; color: var(--mj-text-muted);\">\n 0-based offset for pagination\n </span>\n </div>\n </div>\n </div>\n </mj-accordion-panel>\n <!-- Results Section -->\n @if (runResult) {\n <mj-accordion-panel\n [(Expanded)]=\"resultsExpanded\"\n style=\"flex: 1; display: flex; flex-direction: column; overflow: hidden; min-height: 0;\">\n <ng-template mjAccordionTitle>\n <span style=\"display: flex; align-items: center; gap: 8px; font-weight: 600;\">\n @if (runResult.Success) {\n <i class=\"fa-solid fa-table\" style=\"color: var(--mj-status-success);\"></i>\n Query Results\n <span style=\"background: var(--mj-status-success); color: var(--mj-text-inverse); padding: 2px 6px; border-radius: 10px; font-size: 0.7em;\">\n {{ runResult.RowCount }} rows@if (runResult.TotalRowCount > runResult.RowCount) { of {{ runResult.TotalRowCount }} total}\n </span>\n @if (runResult.ExecutionTime) {\n <span style=\"color: var(--mj-text-muted); font-size: 0.85em; font-weight: normal;\">— {{ runResult.ExecutionTime }}ms</span>\n }\n } @else {\n <i class=\"fa-solid fa-exclamation-circle\" style=\"color: var(--mj-status-error);\"></i>\n Query Results — Error\n }\n </span>\n </ng-template>\n <div style=\"flex: 1; display: flex; flex-direction: column; overflow: hidden; min-height: 0;\">\n @if (runResult.Success) {\n @if (resultRows.length > 0) {\n <!-- Export and Pagination Controls -->\n <div style=\"display: flex; justify-content: space-between; align-items: center; padding: 12px; border-bottom: 1px solid var(--mj-border-default);\">\n <!-- Pagination Info and Controls -->\n <div style=\"display: flex; align-items: center; gap: 12px;\">\n @if (runResult.TotalRowCount > runResult.RowCount || startRow > 0) {\n <span style=\"font-size: 0.9em; color: var(--mj-text-muted);\">\n Showing rows {{ startRow + 1 }} - {{ startRow + runResult.RowCount }} of {{ runResult.TotalRowCount }}\n </span>\n <div style=\"display: flex; gap: 4px;\">\n <button mjButton\n variant=\"flat\"\n [disabled]=\"startRow === 0\"\n (click)=\"goToFirstPage()\"\n title=\"First page\">\n <i class=\"fa-solid fa-angles-left\"></i>\n </button>\n <button mjButton\n variant=\"flat\"\n [disabled]=\"startRow === 0\"\n (click)=\"goToPreviousPage()\"\n title=\"Previous page\">\n <i class=\"fa-solid fa-angle-left\"></i>\n </button>\n <button mjButton\n variant=\"flat\"\n [disabled]=\"startRow + runResult.RowCount >= runResult.TotalRowCount\"\n (click)=\"goToNextPage()\"\n title=\"Next page\">\n <i class=\"fa-solid fa-angle-right\"></i>\n </button>\n <button mjButton\n variant=\"flat\"\n [disabled]=\"startRow + runResult.RowCount >= runResult.TotalRowCount\"\n (click)=\"goToLastPage()\"\n title=\"Last page\">\n <i class=\"fa-solid fa-angles-right\"></i>\n </button>\n </div>\n }\n </div>\n <!-- Export Buttons -->\n <div style=\"display: flex; gap: 8px;\">\n <button mjButton\n variant=\"flat\"\n (click)=\"copyToClipboard()\"\n title=\"Copy to clipboard\">\n <i class=\"fa-solid fa-copy\"></i> Copy\n </button>\n <button mjButton\n variant=\"flat\"\n (click)=\"exportToCSV()\"\n title=\"Export to CSV\">\n <i class=\"fa-solid fa-download\"></i> Export CSV\n </button>\n </div>\n </div>\n <!-- Results Grid -->\n <div class=\"results-table-container\" style=\"flex: 1; overflow: auto; border: 1px solid var(--mj-border-default); border-radius: 4px; min-height: 0;\">\n <table class=\"results-table\" style=\"width: 100%; border-collapse: collapse; font-size: 14px;\">\n <thead style=\"position: sticky; top: 0; background: var(--mj-bg-surface-sunken); z-index: 10;\">\n <tr>\n @for (col of resultColumns; track col.field) {\n <th style=\"padding: 12px 16px; text-align: left; font-weight: 600; color: var(--mj-text-secondary); border-bottom: 2px solid var(--mj-border-default); background: var(--mj-bg-surface-sunken); white-space: nowrap;\">\n {{ col.title }}\n </th>\n }\n </tr>\n </thead>\n <tbody>\n @for (row of resultRows; track $index) {\n <tr style=\"border-bottom: 1px solid var(--mj-border-default); transition: background-color 0.2s;\">\n @for (col of resultColumns; track col.field) {\n <td style=\"padding: 10px 16px; color: var(--mj-text-primary); max-width: 300px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;\"\n [title]=\"row[col.field]\">\n {{ row[col.field] || '' }}\n </td>\n }\n </tr>\n }\n </tbody>\n </table>\n @if (resultRows.length === 0) {\n <div style=\"padding: 40px; text-align: center; color: var(--mj-text-muted);\">\n <i class=\"fa-solid fa-table\" style=\"font-size: 48px; margin-bottom: 12px; opacity: 0.3;\"></i>\n <p>No data in results</p>\n </div>\n }\n </div>\n } @else {\n <div style=\"display: flex; align-items: center; justify-content: center; height: 200px; color: var(--mj-text-muted);\">\n <i class=\"fa-solid fa-inbox\" style=\"font-size: 48px; margin-bottom: 12px;\"></i>\n <p>No results returned</p>\n </div>\n }\n } @else {\n <mj-alert Variant=\"error\" Title=\"Query execution failed\">\n @if (runResult.ErrorMessage) {\n <div style=\"margin-top: 8px; font-family: 'Courier New', monospace; font-size: 0.9em;\">\n {{ runResult.ErrorMessage }}\n </div>\n }\n </mj-alert>\n }\n </div>\n </mj-accordion-panel>\n }\n }\n </div>\n <mj-dialog-actions>\n @if (!runResult) {\n <button mjButton (click)=\"close()\">\n <i class=\"fa-solid fa-times\"></i> Cancel\n </button>\n <button mjButton\n variant=\"primary\"\n [disabled]=\"isRunning || hasInvalidParameters()\"\n (click)=\"runQuery()\">\n @if (isRunning) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Running...\n } @else {\n <i class=\"fa-solid fa-play\"></i> Run Query\n }\n </button>\n } @else {\n <button mjButton (click)=\"close()\">\n <i class=\"fa-solid fa-times\"></i> Close\n </button>\n <button mjButton\n variant=\"primary\"\n [disabled]=\"isRunning\"\n (click)=\"runQuery()\">\n <i class=\"fa-solid fa-refresh\"></i> Run Again\n </button>\n }\n </mj-dialog-actions>\n </mj-dialog>\n}\n"]}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { MJRecordProcessFormComponent } from '../../generated/Entities/MJRecordProcess/mjrecordprocess.form.component';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
/**
|
|
4
|
+
* Custom form override for `MJ: Record Processes`. Replaces the generated field layout (which exposes the
|
|
5
|
+
* rules as a raw `Configuration` JSON textarea) with the visual `<mj-record-process-editor>` — the same
|
|
6
|
+
* authoring surface used in the Bulk Operations app — so editing a process record anywhere in Explorer
|
|
7
|
+
* gets the business-friendly rules builder + inline dry-run preview. The form's container owns Save; the
|
|
8
|
+
* editor mutates the record in place (ShowToolbar=false).
|
|
9
|
+
*/
|
|
10
|
+
export declare class RecordProcessFormComponentExtended extends MJRecordProcessFormComponent {
|
|
11
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<RecordProcessFormComponentExtended, never>;
|
|
12
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<RecordProcessFormComponentExtended, "mj-record-process-form-extended", never, {}, {}, never, never, false, never>;
|
|
13
|
+
}
|
|
14
|
+
/** Tree-shaking guard so the override registers with the ClassFactory. */
|
|
15
|
+
export declare function LoadRecordProcessFormComponentExtended(): void;
|
|
16
|
+
//# sourceMappingURL=record-process-form.component.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"record-process-form.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/custom/RecordProcesses/record-process-form.component.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,4BAA4B,EAAE,MAAM,yEAAyE,CAAC;;AAEvH;;;;;;GAMG;AACH,qBAMa,kCAAmC,SAAQ,4BAA4B;yCAAvE,kCAAkC;2CAAlC,kCAAkC;CAAwC;AAEvF,0EAA0E;AAC1E,wBAAgB,sCAAsC,IAAI,IAAI,CAE7D"}
|