1 <div class="execution-setup-container">
3 <!-- Left column: form fields -->
5 <div class="card setup-card">
6 <div class="card-body">
7 <h5 class="card-title">Blueprint Selection</h5>
9 <div class="form-group">
10 <label for="blueprintName">Blueprint Name</label>
11 <select id="blueprintName"
13 [(ngModel)]="blueprintName"
14 (ngModelChange)="onBlueprintNameChange()">
15 <option value="" disabled>Select a blueprint...</option>
16 <option *ngFor="let name of uniquePackageNames" [value]="name">
22 <div class="form-group">
23 <label for="blueprintVersion">Version</label>
24 <select id="blueprintVersion"
26 [(ngModel)]="blueprintVersion"
27 (ngModelChange)="onBlueprintVersionChange()"
28 [disabled]="availableVersions.length === 0">
29 <option value="" disabled>Select version...</option>
30 <option *ngFor="let ver of availableVersions" [value]="ver">
36 <div class="form-group">
37 <label for="actionName">Action Name</label>
38 <select id="actionName"
40 [(ngModel)]="actionName"
41 (ngModelChange)="onActionChange()"
42 [disabled]="availableActions.length === 0">
43 <option value="" disabled>Select an action...</option>
44 <option *ngFor="let action of availableActions" [value]="action">
50 <!-- Action Inputs: loading state -->
51 <div *ngIf="loadingSpec" class="action-inputs-loading mt-2">
52 <i class="fa fa-spinner fa-spin mr-1"></i>
53 <small class="text-muted">Loading action inputs...</small>
56 <!-- Action Inputs: spec load failed -->
57 <div *ngIf="actionName && !loadingSpec && specLoadFailed" class="action-inputs-error mt-2">
58 <small class="text-muted">
59 <i class="fa fa-exclamation-triangle mr-1"></i>
60 Could not load input schema. Edit the JSON payload manually.
64 <!-- Action Inputs: dynamic form -->
65 <div *ngIf="actionName && !loadingSpec && inputGroups.length > 0"
66 class="action-inputs-section mt-3" id="actionInputs">
67 <label class="section-label">Action Inputs</label>
69 <div *ngFor="let group of inputGroups" class="input-group-block">
70 <!-- Primitive input (not a data type reference) -->
71 <div *ngIf="!group.isComplex" class="form-group">
72 <label [for]="'input-' + group.inputName" class="input-field-label">
74 <span class="text-danger" *ngIf="group.required">*</span>
76 <input *ngIf="group.type !== 'boolean'"
77 [id]="'input-' + group.inputName"
78 class="form-control form-control-sm"
79 [type]="group.type === 'integer' ? 'number' : 'text'"
80 [(ngModel)]="group.value"
81 (ngModelChange)="onFieldChange()"
82 [placeholder]="group.description"
83 [attr.data-input-name]="group.inputName">
84 <select *ngIf="group.type === 'boolean'"
85 [id]="'input-' + group.inputName"
86 class="form-control form-control-sm"
87 [(ngModel)]="group.value"
88 (ngModelChange)="onFieldChange()"
89 [attr.data-input-name]="group.inputName">
90 <option value="">-- select --</option>
91 <option value="true">true</option>
92 <option value="false">false</option>
96 <!-- Complex input (data type with nested fields) -->
97 <div *ngIf="group.isComplex" class="complex-input-group">
98 <label class="complex-group-label">
100 <span class="text-danger" *ngIf="group.required">*</span>
102 <div class="complex-fields">
103 <div *ngFor="let field of group.fields" class="form-group">
104 <label [for]="'field-' + group.inputName + '-' + field.name"
105 class="input-field-label">
107 <span class="text-danger" *ngIf="field.required">*</span>
109 <input *ngIf="field.type !== 'boolean'"
110 [id]="'field-' + group.inputName + '-' + field.name"
111 class="form-control form-control-sm"
112 [type]="field.type === 'integer' ? 'number' : 'text'"
113 [(ngModel)]="field.value"
114 (ngModelChange)="onFieldChange()"
115 [placeholder]="field.description"
116 [attr.data-field-name]="field.name">
117 <select *ngIf="field.type === 'boolean'"
118 [id]="'field-' + group.inputName + '-' + field.name"
119 class="form-control form-control-sm"
120 [(ngModel)]="field.value"
121 (ngModelChange)="onFieldChange()"
122 [attr.data-field-name]="field.name">
123 <option value="">-- select --</option>
124 <option value="true">true</option>
125 <option value="false">false</option>
135 <div class="execution-actions">
136 <button class="btn btn-primary btn-execute"
137 [disabled]="!canExecute()"
138 (click)="executeBlueprint()">
139 <i class="fa fa-play mr-1" *ngIf="!isExecuting"></i>
140 <i class="fa fa-spinner fa-spin mr-1" *ngIf="isExecuting"></i>
141 {{ isExecuting ? 'Executing...' : 'Execute' }}
143 <button class="btn btn-outline-secondary ml-2"
144 (click)="resetPayload()">
145 <i class="fa fa-refresh mr-1"></i> Reset
152 <!-- Right column: JSON payload editor -->
153 <div class="col-md-8">
154 <div class="card editor-card">
155 <div class="card-body">
156 <h5 class="card-title">Request Payload (ExecutionServiceInput)</h5>
157 <div class="ace-editor-wrapper">
159 [(text)]="payloadText"
162 [options]="aceOptions"
163 style="min-height: 350px; width: 100%; font-size: 13px;">
169 <!-- Response panel -->
170 <div class="card response-card mt-3" *ngIf="lastResponseText">
171 <div class="card-body">
172 <h5 class="card-title">
173 <i class="fa fa-check-circle text-success mr-1" *ngIf="lastResponse"></i>
174 <i class="fa fa-times-circle text-danger mr-1" *ngIf="!lastResponse"></i>
177 <div class="ace-editor-wrapper">
179 [text]="lastResponseText"
183 [options]="{ maxLines: 20, minLines: 5, showPrintMargin: false }"
184 style="min-height: 150px; width: 100%; font-size: 13px;">