1%{-- 2 - Copyright 2016 SimplifyOps, Inc. (http://simplifyops.com) 3 - 4 - Licensed under the Apache License, Version 2.0 (the "License"); 5 - you may not use this file except in compliance with the License. 6 - You may obtain a copy of the License at 7 - 8 - http://www.apache.org/licenses/LICENSE-2.0 9 - 10 - Unless required by applicable law or agreed to in writing, software 11 - distributed under the License is distributed on an "AS IS" BASIS, 12 - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 - See the License for the specific language governing permissions and 14 - limitations under the License. 15 --}% 16 17<%@ page import="rundeck.User; com.dtolabs.rundeck.core.plugins.configuration.PropertyScope; rundeck.PluginStep; rundeck.CommandExec; rundeck.JobExec" %> 18<asset:javascript src="static/pages/dynamic-form.js" defer="defer"/> 19 20<%-- 21 _wfitemEdit.gsp 22 23 Author: Greg Schueler <a href="mailto:greg@dtosolutions.com">greg@dtosolutions.com</a> 24 Created: Jul 26, 2010 5:15:53 PM 25 $Id$ 26 --%> 27<g:set var="rkey" value="${g.rkey()}"/> 28<div class=" wfitemEditForm"> 29 <g:hasErrors bean="${item}"> 30 <div class="alert alert-danger"> 31 <g:renderErrors bean="${item}" as="list"/> 32 </div> 33 </g:hasErrors> 34 <g:render template="/common/messages"/> 35 <div id="wfiedit_${rkey}" class="_wfiedit" data-rkey="${rkey}"> 36 <g:if test="${isErrorHandler}"> 37 <span class="text-info"><g:message code="Workflow.stepErrorHandler.description" /></span> 38 </g:if> 39 %{--Job Reference item--}% 40 <g:if test="${'job'==newitemtype || item instanceof JobExec }"> 41 <section > 42 <div class="form-group"> 43 <label class="col-sm-2 control-label"><g:message code="Workflow.Step.jobreference.title" /></label> 44 <div class="col-sm-10"> 45 <g:set var="isUseName" value="${ item?.useName || false }"/> 46 <div class="radio"> 47 <g:radio id="useNameTrue" name="useName" value="true" 48 onclick="_enableNameJobRefFields(true,'jobUuidField${rkey}','jobNameField${rkey}','jobGroupField${rkey}');" 49 checked="${!!isUseName}"/> 50 <label for="useNameTrue"> 51 <g:message code="Workflow.Step.jobreference.name.label" /> 52 </label> 53 <span><g:message code="Workflow.Step.jobreference.name.description"/></span> 54 </div> 55 <div class="radio"> 56 <g:radio id="useNameFalse" name="useName" value="false" 57 onclick="_enableNameJobRefFields(false,'jobUuidField${rkey}','jobNameField${rkey}','jobGroupField${rkey}');" 58 checked="${!isUseName}"/> 59 <label for="useNameFalse"> 60 <g:message code="Workflow.Step.jobreference.uuid.label" /> 61 </label> 62 <span><g:message code="Workflow.Step.jobreference.uuid.description"/></span> 63 </div> 64 </div> 65 </div> 66 <div class="form-group"> 67 <label class="col-sm-2 control-label" for="jobNameField${rkey}"><g:message code="Workflow.Step.jobreference.name-group.label" /></label> 68 <div class="col-sm-6"> 69 <g:select name="jobProject" from="${fprojects}" id="jobProjectField${rkey}" value="${enc(attr:item?.jobProject)}" noSelection="${['':message(code:'step.type.jobreference.project.label',args:[project])]}" 70 class="form-control "/> 71 </div> 72 73 <div class="col-sm-2"> 74 <g:javascript> 75 fireWhenReady('jobProjectField${rkey}',function(){ 76 _enableNameJobRefFields(${isUseName},'jobUuidField${rkey}','jobNameField${rkey}','jobGroupField${rkey}','jobProjectField${rkey}'); 77 _initJobPickerAutocomplete('jobUuidField${rkey}','jobNameField${rkey}','jobGroupField${rkey}','jobProjectField${rkey}'); 78 }); 79 </g:javascript> 80 81 <span class="btn btn-sm btn-default act_choose_job" onclick="loadJobChooserModal(this,'jobUuidField${rkey}', 'jobNameField${rkey}','jobGroupField${rkey}', 'jobProjectField${rkey}','jobrefpicker${rkey}','jobrefpicker${rkey}_content');" 82 id="jobChooseBtn${rkey}" 83 title="${message(code:"select.an.existing.job.to.use")}" 84 data-loading-text="Loading..."> 85 <g:message code="choose.a.job..." /> 86 %{--<i class="caret"></i>--}% 87 </span> 88 <span id="jobChooseSpinner"></span> 89 <g:render template="/common/modal" model="${[modalid:'jobrefpicker'+rkey,modalsize:'modal-lg',title:message(code:"choose.a.job..."),buttons:[]]}"/> 90 </div> 91 <div class="col-sm-10 col-sm-offset-2" style="maring-top:1em;"> 92 <p class="help-block"> 93 <g:message code="Workflow.Step.jobreference.jobName.help" /> 94 </p> 95 </div> 96 </div> 97 <div class="form-group"> 98 <label class="col-sm-2 control-label"></label> 99 <div class="col-sm-5"> 100 101 <input id="jobNameField${rkey}" type="text" name="jobName" value="${enc(attr: item?.jobName)}" 102 placeholder="${message(code:"scheduledExecution.jobName.label")}" 103 class="form-control" 104 size="100" autofocus/> 105 </div> 106 <div class="col-sm-5"> 107 <input id="jobGroupField${rkey}" type="text" name="jobGroup" value="${enc(attr:item?.jobGroup)}" size="100" 108 placeholder="${message(code:"scheduledExecution.groupPath.label")}" 109 class="form-control" 110 /> 111 </div> 112 </div> 113 114 <div class="form-group" > 115 <label class="col-sm-2 control-label"><g:message code="Workflow.Step.uuid.label" /></label> 116 <div class="col-sm-10"> 117 <input type='text' name="uuid" value="${enc(attr:item?.uuid)}" size="100" 118 ${!isUseName?"":"readonly='true'"} 119 placeholder="${message(code:"Workflow.Step.jobreference.uuid.placeholder")}" 120 id="jobUuidField${rkey}" 121 class="form-control context_var_autocomplete"/> 122 </div> 123 </div> 124 <div class="form-group" style="margin-top:1em;"> 125 <div class="col-sm-10 col-sm-offset-2"> 126 <div class="text-info"> 127 <g:message code="Workflow.Step.jobreference.uuid.help" /> 128 </div> 129 </div> 130 </div> 131 <div class="form-group" > 132 <label class="col-sm-2 control-label"><g:message code="Workflow.Step.argString.label" /></label> 133 <div class="col-sm-10"> 134 <input type='text' name="argString" value="${enc(attr:item?.argString)}" size="100" 135 placeholder="${message(code:"Workflow.Step.jobreference.argString.placeholder")}" 136 id="jobArgStringField" 137 class="form-control context_var_autocomplete"/> 138 </div> 139 </div> 140 <div class="form-group" > 141 <label class="col-sm-2 control-label"></label> 142 <div class="col-sm-10"> 143 <div class="checkbox"> 144 <g:checkBox name="importOptions" 145 checked="${item?.importOptions}" 146 id="importOptionsCheck" value="true" 147 /> 148 <label for="importOptionsCheck"> 149 <g:message code="Workflow.Step.jobreference.import.options.label" /> 150 </label> 151 <span><g:message code="Workflow.Step.jobreference.import.options.help" /></span> 152 </div> 153 </div> 154 155 </div> 156 <div class="form-group" > 157 <label class="col-sm-2 control-label"></label> 158 <div class="col-sm-10"> 159 <div class="checkbox"> 160 <g:checkBox name="ignoreNotifications" 161 checked="${item?.ignoreNotifications}" 162 id="ignoreNotificationsCheck" value="true" 163 /> 164 <label for="ignoreNotificationsCheck"> 165 <g:message code="Workflow.Step.jobreference.ignore.notifications.label" /> 166 </label> 167 <span><g:message code="Workflow.Step.jobreference.ignore.notifications.help" /></span> 168 </div> 169 </div> 170 171 </div> 172 <div class="form-group" > 173 <label class="col-sm-2 control-label"></label> 174 <div class="col-sm-10"> 175 <div class="checkbox"> 176 <g:checkBox name="failOnDisable" 177 checked="${item?.failOnDisable}" 178 id="failOnDisableCheck" value="true" 179 /> 180 <label for="failOnDisableCheck"> 181 <g:message code="Workflow.Step.jobreference.fail.on.disabled.label" /> 182 </label> 183 <span><g:message code="Workflow.Step.jobreference.fail.on.disabled.help" /></span> 184 </div> 185 </div> 186 187 </div> 188 <div class="form-group" > 189 <label class="col-sm-2 control-label"></label> 190 <div class="col-sm-10"> 191 <div class="checkbox"> 192 <g:checkBox name="childNodes" 193 checked="${item?.childNodes}" 194 id="childNodesCheck" value="true" 195 /> 196 <label for="childNodesCheck"> 197 <g:message code="Workflow.Step.jobreference.child.nodes.label" /> 198 </label> 199 <span><g:message code="Workflow.Step.jobreference.child.nodes.help" /></span> 200 </div> 201 </div> 202 203 </div> 204 205 <g:set var="nodeFilterOverrideExpanded" value="${item?.nodeFilter || item?.nodeIntersect}"/> 206 <div class="row"> 207 <div class="col-sm-2 control-label"> 208 <span class="btn btn-sm ${wdgt.css(if: nodeFilterOverrideExpanded, then: 'active')}" data-toggle="collapse" data-target="#nodeFilterOverride${enc(attr: rkey)}"> 209 <g:message code="override.node.filters" /> 210 <i class="glyphicon ${wdgt.css(if: nodeFilterOverrideExpanded, then: 'glyphicon-chevron-down', else: 'glyphicon-chevron-right')} "></i> 211 </span> 212 </div> 213 </div> 214 </section> 215 216 <section id="nodeFilterOverride${enc(attr: rkey)}" class="collapse-expandable collapse ${wdgt.css(if: nodeFilterOverrideExpanded, then: 'in')} node_filter_link_holder section-separator-solo"> 217 <div class="form-group" style="margin-top:1em;"> 218 <div class="col-sm-12 "> 219 <div class="text-info"> 220 <g:message code="JobExec.property.nodeFilter.help.description" /> 221 </div> 222 </div> 223 </div> 224 225 <div class="form-group" > 226 <label class="col-sm-2 control-label "> 227 <g:message code="scheduledExecution.property.nodeIntersect.label"/> 228 </label> 229 230 <div class="col-sm-10"> 231 <div class="radio"> 232 <g:radio id="nodeIntersectFalse" name="nodeIntersect" value="" checked="${item?.nodeIntersect==null}"/> 233 <label for="nodeIntersectFalse"> 234 <g:message code="scheduledExecution.property.nodeIntersect.false"/> 235 </label> 236 </div> 237 238 <div class="radio"> 239 <g:radio id="nodeIntersectTrue" name="nodeIntersect" value="true" checked="${item?.nodeIntersect!=null&&item?.nodeIntersect}"/> 240 <label for="nodeIntersectTrue"> 241 <g:message code="scheduledExecution.property.nodeIntersect.true"/> 242 </label> 243 </div> 244 </div> 245 </div> 246 247 <div class="form-group"> 248 249 <label class="col-sm-2 control-label" for="nodeFilterField${enc(attr: rkey)}"> 250 <g:message code="node.filter.prompt"/> 251 </label> 252 253 <div class="col-sm-10"> 254 <g:set var="filtvalue" value="${item?.nodeFilter}"/> 255 256 <span class="input-group multiple-control-input-group nodefilters"> 257 <g:if test="${session.user && User.findByLogin(session.user)?.nodefilters}"> 258 <g:set var="filterset" value="${User.findByLogin(session.user)?.nodefilters}"/> 259 </g:if> 260 <g:render template="/framework/nodeFilterInputGroup" 261 model="[filterFieldName: 'nodeFilter', 262 filterFieldId:'nodeFilterField'+rkey, 263 queryFieldHelpId:'nodeFilterQueryFieldHelp'+rkey, 264 queryFieldPlaceholderText: g.message(code:'enter.a.node.filter.override'), 265 filterset: filterset, 266 filtvalue: filtvalue, 267 filterName: null]"/> 268 </span> 269 270 <div class=" collapse" id="nodeFilterQueryFieldHelp${enc(attr: rkey)}"> 271 <div class="help-block"> 272 <g:render template="/common/nodefilterStringHelp"/> 273 </div> 274 </div> 275 276 </div> 277 </div> 278 279 <div class="form-group"> 280 <label class="col-sm-2 control-label"> 281 <g:message code="matched.nodes.prompt"/> 282 </label> 283 284 <div class=" col-sm-10 "> 285 286 <div class="well well-sm embed matchednodes"> 287 <button type="button" class="pull-right btn btn-sm refresh_nodes" 288 data-loading-text="${message(code:"loading.text")}" 289 data-bind="click: $data.updateMatchedNodes" 290 title="${message(code:"click.to.refresh")}"> 291 <g:message code="refresh"/> 292 <i class="glyphicon glyphicon-refresh"></i> 293 </button> 294 <span data-bind="visible: total()>0"> 295 <span data-bind="messageTemplate: [total,nodesTitle]"><g:message code="count.nodes.matched"/></span> 296 </span> 297 <span data-bind="visible: !filter()"> 298 <span data-bind="text: emptyMessage"></span> 299 </span> 300 301 <div id='matchednodes${rkey}' class="clearfix "> 302 <g:render template="/framework/nodesEmbedKO" model="[showLoading:true,showTruncated:true,showNone:true, nodefilterLinkId: '#nodeFilterOverride'+ rkey]"/> 303 </div> 304 </div> 305 </div> 306 </div> 307 308 <div class="form-group"> 309 310 <label class="col-sm-2 control-label" for="nodeThreadcountField${rkey}"> 311 <g:message code="scheduledExecution.property.nodeThreadcount.label"/> 312 </label> 313 314 <div class="col-sm-2"> 315 <input 316 data-bind="enable: filter()" 317 type='number' 318 name="nodeThreadcount" 319 min="1" 320 value="${enc(attr: item?.nodeThreadcount)}" 321 size="3" 322 class="form-control" 323 id="nodeThreadcountField${rkey}" 324 /> 325 </div> 326 <div class="col-sm-8 help-block"> 327 <g:message code="JobExec.property.nodeThreadcount.null.description"/> 328 </div> 329 </div> 330 331 <div class="form-group"> 332 333 <label class="col-sm-2 control-label "> 334 <g:message code="scheduledExecution.property.nodeKeepgoing.prompt"/> 335 </label> 336 337 <div class="col-sm-10"> 338 <div class="radio"> 339 <g:radio name="nodeKeepgoing" value="" checked="${item?.nodeKeepgoing==null}" data-bind="enable: filter()" id="nodeKeepgoingNull"/> 340 <label for="nodeKeepgoingNull"> 341 <g:message code="JobExec.property.nodeKeepgoing.null.description"/> 342 </label> 343 </div> 344 345 <div class="radio"> 346 <g:radio name="nodeKeepgoing" value="true" checked="${item?.nodeKeepgoing!=null&&item?.nodeKeepgoing}" data-bind="enable: filter()" id="nodeKeepgoingTrue"/> 347 <label for="nodeKeepgoingTrue"> 348 <g:message code="Workflow.property.keepgoing.true.description"/> 349 </label> 350 </div> 351 352 <div class="radio"> 353 <g:radio name="nodeKeepgoing" value="false" checked="${item?.nodeKeepgoing!=null&&!item?.nodeKeepgoing}" data-bind="enable: filter()" id="nodeKeepgoingFalse"/> 354 <label for="nodeKeepgoingFalse"> 355 <g:message code="Workflow.property.keepgoing.false.description"/> 356 </label> 357 </div> 358 </div> 359 </div> 360 361 <div class="form-group"> 362 363 <label class="col-sm-2 control-label" for="nodeRankAttributeField${rkey}"> 364 <g:message code="scheduledExecution.property.nodeRankAttribute.label"/> 365 </label> 366 367 <div class="col-sm-10"> 368 <input 369 data-bind="enable: filter()" 370 type='text' 371 name="nodeRankAttribute" 372 value="${enc(attr: item?.nodeRankAttribute)}" 373 class="form-control" 374 placeholder="${enc(code:'scheduledExecution.property.nodeRankAttribute.description',encodeAs:'HTMLAttribute')}" 375 id="nodeRankAttributeField${rkey}"/> 376 </div> 377 378 </div> 379 <div class="form-group"> 380 381 <label class="col-sm-2 control-label" for="nodeRankOrderField${rkey}"> 382 <g:message code="scheduledExecution.property.nodeRankOrder.label"/> 383 </label> 384 385 <div class="col-sm-10"> 386 <div class="radio"> 387 <g:radio name="nodeRankOrderAscending" value="" 388 checked="${item?.nodeRankOrderAscending == null}" 389 data-bind="enable: filter()" 390 id="nodeRankOrderAscendingNull"/> 391 <label for="nodeRankOrderAscendingNull"> 392 <g:message code="JobExec.property.nodeRankOrder.null.description"/> 393 </label> 394 </div> 395 <div class="radio"> 396 <g:radio name="nodeRankOrderAscending" value="true" 397 checked="${item?.nodeRankOrderAscending == Boolean.TRUE}" 398 data-bind="enable: filter()" 399 id="nodeRankOrderAscending"/> 400 <label for="nodeRankOrderAscending"> 401 <g:message code="scheduledExecution.property.nodeRankOrder.ascending.label"/> 402 </label> 403 </div> 404 <div class="radio"> 405 <g:radio name="nodeRankOrderAscending" value="false" 406 checked="${item?.nodeRankOrderAscending == Boolean.FALSE}" 407 data-bind="enable: filter()" 408 id="nodeRankOrderDescending"/> 409 410 <label for="nodeRankOrderDescending"> 411 <g:message code="scheduledExecution.property.nodeRankOrder.descending.label"/> 412 </label> 413 </div> 414 </div> 415 </div> 416 </section> 417 <section> 418 <div class="form-group"> 419 <g:set var="isNodeStep" value="${item ? item.nodeStep : newitemnodestep == 'true'}"/> 420 <label class="col-sm-2 control-label"><g:message code="JobExec.nodeStep.title" /></label> 421 <div class="col-sm-10"> 422 <div class="radio"> 423 <g:radio id="jobNodeStepFieldTrue" name="nodeStep" value="true" 424 checked="${!!isNodeStep}"/> 425 <label for="jobNodeStepFieldTrue"> 426 <g:message code="JobExec.nodeStep.true.label" /> 427 </label> 428 <span><g:message code="JobExec.nodeStep.true.description"/></span> 429 </div> 430 <div class="radio"> 431 <g:radio id="jobNodeStepFieldFalse" name="nodeStep" value="false" checked="${!isNodeStep}"/> 432 <label for="jobNodeStepFieldFalse"> 433 <g:message code="JobExec.nodeStep.false.label" /> 434 </label> 435 <span><g:message code="JobExec.nodeStep.false.description"/></span> 436 </div> 437 </div> 438 </div> 439 </section> 440 <g:embedJSON id="jobrefFilterParamsJSON${rkey}" data="${[filter: item?.nodeFilter]}"/> 441 <g:javascript> 442 fireWhenReady("nodeFilterOverride${rkey}",function(){ 443 setupJobExecNodeFilterBinding('#nodeFilterOverride${rkey}','matchednodes${rkey}','jobrefFilterParamsJSON${rkey}'); 444 }); 445 </g:javascript> 446 </g:if> 447 %{--Script or Command item--}% 448 <g:elseif test="${(newitemtype in ['command','script','scriptfile']) || item instanceof CommandExec }"> 449 <g:set var="isAdhocRemote" value="${'command'==newitemtype || 'command'==origitemtype || item?.adhocRemoteString}"/> 450 <g:set var="isAdhocLocal" value="${'script'==newitemtype ||'script'==origitemtype || item?.adhocLocalString}"/> 451 <g:set var="isAdhocFileExecution" value="${'scriptfile'==newitemtype ||'scriptfile'==origitemtype || item?.adhocFilepath}"/> 452 <g:hiddenField name="adhocExecution" value="true"/> 453 <div id="scriptStep_${rkey}"> 454 <g:if test="${isAdhocLocal}"> 455 <div id="localScriptDiv" class="form-group ${hasErrors(bean:item,field:'adhocLocalString','has-error')}"> 456 <label class="col-sm-12 text-form-label" for="adhocLocalStringField${rkey}"> 457 <g:message code="Workflow.Step.adhocLocalString.description" /> 458 </label> 459 <div class="col-sm-12"> 460 <textarea rows="10" cols="60" name="adhocLocalString" id="adhocLocalStringField${rkey}" 461 class="form-control code apply_ace _wfscriptitem" 462 data-ace-autofocus='true'><g:enc>${item?.adhocLocalString}</g:enc></textarea> 463 </div> 464 </div> 465 </g:if> 466 <g:elseif test="${isAdhocFileExecution}"> 467 <div id="filepathDiv" class="form-group ${hasErrors(bean:item,field:'adhocFilepath','has-error')}"> 468 <label class="col-sm-2 control-label"><g:message code="Workflow.Step.adhocFilepath.label" /></label> 469 <div class="col-sm-10"> 470 <input 471 type='text' 472 name="adhocFilepath" 473 value="${enc(attr:item?.adhocFilepath)}" 474 class="form-control context_env_autocomplete _wfitemnodestep" 475 id="adhocFilepathField" 476 placeholder="${g.enc(code:'Workflow.Step.adhocFilepath.description',encodeAs:'HTMLAttribute')}" 477 autofocus 478 /> 479 </div> 480 </div> 481 </g:elseif> 482 <g:elseif test="${isAdhocRemote}"> 483 <div id="remoteScriptDiv" class="form-group ${hasErrors(bean:item,field:'adhocRemoteString','has-error')}"> 484 <label class="col-sm-2 control-label"><g:message code="Workflow.Step.adhocRemoteString.label" /></label> 485 <div class="col-sm-10"> 486 <input 487 type='text' 488 name="adhocRemoteString" 489 value="${enc(attr:item?.adhocRemoteString)}" 490 class="form-control context_env_autocomplete _wfcommanditem _wfitemnodestep" 491 placeholder="${g.enc(code:'Workflow.Step.adhocRemoteString.description',encodeAs:'HTMLAttribute')}" 492 id="adhocRemoteStringField" 493 autofocus/> 494 </div> 495 </div> 496 </g:elseif> 497 <g:if test="${!isAdhocRemote||isAdhocFileExecution}"> 498 <div id="adhocScriptArgs" class="form-group" > 499 <label class="control-label col-sm-2"> 500 <g:message code="Workflow.Step.argString.label" /> 501 </label> 502 <div class="col-sm-10"> 503 <input type='text' 504 name="argString" 505 value="${enc(attr:item?.argString)}" 506 class="form-control context_env_autocomplete _wfitemnodestep" 507 id="argStringField" 508 placeholder="${enc(code:'Workflow.Step.argString.description',encodeAs:'HTMLAttribute')}" 509 data-bind="value: args, valueUpdate: 'keyup'" 510 /> 511 </div> 512 </div> 513 </g:if> 514 <g:if test="${!isAdhocRemote}"> 515 <g:set var="hasAdvanced" value="${item?.scriptInterpreter || item?.interpreterArgsQuoted || item?.fileExtension}"/> 516 <div class="row"> 517 <div class="col-sm-2 control-label"> 518 <span class="btn btn-sm ${wdgt.css(if: hasAdvanced, then:'active')}" data-toggle="collapse" data-target="#scriptInterpreter${rkey}"> 519 Advanced 520 <i class="glyphicon ${wdgt.css(if: hasAdvanced, then: 'glyphicon-chevron-down', else:'glyphicon-chevron-right')} "></i> 521 </span> 522 </div> 523 </div> 524 <div id="scriptInterpreter${enc(attr:rkey)}" class="collapse-expandable collapse ${wdgt.css(if: hasAdvanced, then: 'in')}"> 525 <div class="form-group"> 526 527 <label class="col-sm-2 control-label" 528 for="scriptInterpreterField${rkey}"><g:message 529 code="Workflow.Step.scriptInterpreter.label"/></label> 530 <div class="col-sm-10"> 531 <div class="" 532 id="interpreterHelp${enc(attr: rkey)}_tooltip" 533 style="display:none;"> 534 <div class="help-block"><g:message 535 code="Workflow.Step.scriptInterpreter.help"/></div> 536 </div> 537 <span class="input-group"> 538 539 <input type='text' name="scriptInterpreter" 540 placeholder="${enc(attr:g.message(code: 'Workflow.Step.scriptInterpreter.prompt'))}" 541 value="${enc(attr:item?.scriptInterpreter)}" size="100" 542 class="form-control context_env_autocomplete _wfitemnodestep" 543 data-bind="value: invocationString, valueUpdate: 'keyup'" 544 id="scriptInterpreterField${rkey}" autofocus/> 545 546 <div class="input-group-addon"> 547 <span class="action " 548 data-toggle="popover" 549 data-placement="left" 550 data-trigger="hover" 551 data-popover-content-ref="#interpreterHelp${enc(attr: rkey)}_tooltip" 552 id="interpreterHelp${enc(attr: rkey)}"><i 553 class="glyphicon glyphicon-question-sign text-info"></i></span> 554 555 </div> 556 557 558 </span> 559 </div> 560 </div> 561 <g:if test="${isAdhocFileExecution}"> 562 <div id="expandTokenCheckboxDiv" class="form-group"> 563 <div class="col-sm-offset-2 col-sm-10"> 564 <div class="checkbox"> 565 <g:checkBox name="expandTokenInScriptFile" 566 lass="form-control" 567 checked="${item?.expandTokenInScriptFile}" 568 id="expandTokenInScriptFileField" value="true" 569 data-bind="checked: expandToken"/> 570 <label for="expandTokenInScriptFileField"> 571 <g:message code="Workflow.Step.expandTokenInScriptFile.label"/> 572 </label> 573 </div> 574 </div> 575 </div> 576 </g:if> 577 <div class="form-group"> 578 <div class="col-sm-offset-2 col-sm-10"> 579 <div class="checkbox"> 580 <g:checkBox name="interpreterArgsQuoted" 581 checked="${item?.interpreterArgsQuoted}" 582 id="interpreterArgsQuotedField" value="true" 583 data-bind="checked: argsQuoted"/> 584 <label for="interpreterArgsQuotedField"> 585 <g:message code="Workflow.Step.interpreterArgsQuoted.label"/> 586 </label> 587 <span class="action" 588 589 data-toggle="popover" 590 data-placement="bottom" 591 data-trigger="hover" 592 data-popover-content-ref="#interpreterArgsQuotedHelp${enc(attr: rkey)}_tooltip" 593 id="interpreterArgsQuotedHelp${enc(attr: rkey)}"><i 594 class="glyphicon glyphicon-question-sign text-info"></i> 595 </span> 596 <div class="" 597 id="interpreterArgsQuotedHelp${enc(attr: rkey)}_tooltip" 598 style="display:none; "> 599 <div class="help-block"><g:message 600 code="Workflow.Step.interpreterArgsQuoted.help"/></div> 601 </div> 602 603 </div> 604 </div> 605 </div> 606 607 <div class="form-group"> 608 609 <label class="col-sm-2 control-label" 610 for="fileExtensionField${rkey}"><g:message 611 code="Workflow.Step.fileExtension.label"/></label> 612 613 <div class="col-sm-10"> 614 <div class="popout tooltipcontent helptooltip" 615 id="fileExtensionHelp${enc(attr: rkey)}_tooltip" 616 style="display: none;"> 617 <div class="panel-body"> 618 <div class="help-block"><g:message 619 code="Workflow.Step.fileExtension.help"/></div> 620 </div> 621 </div> 622 <span class="input-group"> 623 624 <input type='text' name="fileExtension" 625 placeholder="${enc(attr: g.message(code: 'Workflow.Step.fileExtension.prompt'))}" 626 value="${enc(attr: item?.fileExtension)}" size="100" 627 class="form-control" 628 data-bind="value: fileExtension, valueUpdate: 'keyup'" 629 id="fileExtensionField${rkey}" /> 630 631 <div class="input-group-addon"> 632 <span class="action" 633 data-toggle="popover" 634 data-placement="left" 635 data-trigger="hover" 636 data-popover-content-ref="#fileExtensionHelp${enc(attr: rkey)}_tooltip" 637 id="fileExtensionHelp${enc(attr: rkey)}"><i 638 class="glyphicon glyphicon-question-sign text-info"></i></span> 639 640 </div> 641 642 </span> 643 </div> 644 </div> 645 </div> 646 <div> 647 <div class="form-group"> 648 <div class="col-sm-2 control-label"><g:message code="Workflow.step.script.execution.preview.label" /></div> 649 650 <div id='interpreterArgsQuotedHelp${rkey}_preview' class="col-sm-10 form-control-static"> 651 <code>$ <span data-bind="text: invocationPreviewHtml"></span></code> 652 </div> 653 654 <g:embedJSON id="scriptStepData_${rkey}" data="${[invocationString: item?.scriptInterpreter?:'',fileExtension: item?.fileExtension?:'',args: item?.argString?:'',argsQuoted: item?.interpreterArgsQuoted?true:false, expandToken: item?.expandTokenInScriptFile?true:false]}"/> 655 <g:javascript> 656 fireWhenReady("scriptStep_${rkey}",function(){ 657 workflowEditor.bindScriptStepKey('${rkey}','scriptStep_${rkey}',loadJsonData('scriptStepData_${rkey}')); 658 if (typeof(_initPopoverContentRef) == 'function') { 659 _initPopoverContentRef("#scriptStep_${rkey}"); 660 } 661 }); 662 </g:javascript> 663 </div> 664 </div> 665 </g:if> 666 </div> 667 </g:elseif> 668 <g:elseif test="${( newitemtype || item && item.instanceOf(PluginStep) ) && newitemDescription}"> 669 <g:set var="isNodeStep" value="${item ? !!item.nodeStep : newitemnodestep == 'true'}"/> 670 <g:set var="serviceName" value="${isNodeStep ? 'WorkflowNodeStep' : 'WorkflowStep'}"/> 671 <div> 672 <div> 673 <span class="h4"><stepplugin:pluginIcon 674 service="${serviceName}" 675 name="${newitemDescription.name}" 676 width="16px" 677 height="16px"/> 678 <stepplugin:message 679 service="${serviceName}" 680 name="${newitemDescription.name}" 681 code="plugin.title" 682 default="${newitemDescription.title}"/></span> 683 <span class="help-block"> 684 <g:render template="/scheduledExecution/description" 685 model="[description: stepplugin.messageText( 686 service: serviceName, 687 name: newitemDescription.name, 688 code: 'plugin.description', 689 default: newitemDescription.description 690 ), 691 textCss : '', 692 mode : 'collapsed', 693 moreText : message(code: 'more.information', default: 'More Information'), 694 rkey : g.rkey()]"/> 695 </span> 696 </div> 697 <g:hiddenField name="pluginItem" value="true"/> 698 <g:hiddenField name="newitemnodestep" value="${isNodeStep}"/> 699 700 701 <div> 702 <g:set var="pluginprefix" value="pluginConfig."/> 703 <g:render template="/framework/pluginConfigPropertiesInputs" model="${[ 704 extraInputCss: 'context_var_autocomplete', 705 groupTitleCss : 'h5', 706 service : serviceName, 707 dynamicProperties : dynamicProperties, 708 provider : newitemDescription.name, 709 properties : newitemDescription.properties, 710 report : report, 711 prefix : pluginprefix, 712 values : item?.configuration, 713 fieldnamePrefix : pluginprefix, 714 origfieldnamePrefix:'orig.' + pluginprefix, 715 allowedScope : PropertyScope.Instance 716 ]}"/> 717 718 </div> 719 </div> 720 </g:elseif> 721 <g:elseif test="${( newitemtype || item && item.instanceOf(PluginStep) ) && pluginNotFound}"> 722 <div> 723 <div> 724 <span class="text-danger invalidProvider"><g:message code="Workflow.step.plugin.provider.not.found" /></span> 725 <span class="help-block text-danger"> 726 <g:message code="Workflow.step.plugin.provider.not.found.description" args="[newitemtype?:item?.type]" /> 727 </span> 728 </div> 729 <g:hiddenField name="pluginItem" value="true"/> 730 <g:hiddenField name="newitemnodestep" value="${item?!!item.nodeStep:newitemnodestep=='true'}"/> 731 732 </div> 733 </g:elseif> 734 <g:if test="${isErrorHandler}"> 735 <div class="presentation checkbox"> 736 <g:checkBox name="keepgoingOnSuccess" id="keepgoingOnSuccess" value="true" checked="${item?.keepgoingOnSuccess}"/> 737 <label for="keepgoingOnSuccess"> 738 <g:message code="Workflow.stepErrorHandler.keepgoingOnSuccess.label" /> 739 </label> 740 <span><g:message code="Workflow.stepErrorHandler.keepgoingOnSuccess.description" /></span> 741 </div> 742 </g:if> 743 <g:else> 744 <hr/> 745 <div class="form-group"> 746 <label class="col-sm-2 control-label" for="description${rkey}"><g:message 747 code="Workflow.step.property.description.label"/></label> 748 <div class="col-sm-10"> 749 <input id="description${rkey}" type="text" name="description" value="${enc(attr:item?.description)}" 750 class="form-control" 751 placeholder="${message(code: "Workflow.step.property.description.placeholder")}" 752 size="100"/> 753 </div> 754 </div> 755 </g:else> 756 757 <g:hiddenField name="key" value="${key}"/> 758 <g:hiddenField name="isErrorHandler" value="${isErrorHandler ? true : false}"/> 759 <g:hiddenField name="scheduledExecutionId" value="${scheduledExecutionId}"/> 760 <div class="floatr" style="margin:10px 0;"> 761 <g:set var="msgItem" value="${isErrorHandler ? 'stepErrorHandler' : 'step'}"/> 762 <g:if test="${newitemtype||newitem}"> 763 <g:hiddenField name="newitem" value="true"/> 764 <g:hiddenField name="newitemtype" value="${newitemtype}"/> 765 766 <g:if test="${isErrorHandler}"> 767 <g:hiddenField name="num" value="${num}"/> 768 <span class="btn btn-default btn-sm" onclick="_wficancelnewEH(this);" 769 title="${message(code:"Workflow.stepErrorHandler.cancel.title")}"><g:message code="button.action.Cancel" /></span> 770 <span class="btn btn-primary btn-sm" onclick="_wfisave('${key}', ${num}, 'wfiedit_${rkey}',true);" title="${message(code:"Workflow.stepErrorHandler.savenew.title")}"><g:message code="button.action.Save" /></span> 771 </g:if> 772 <g:else> 773 774 <span class="btn btn-default btn-sm" onclick="_wficancelnew(${num});" 775 title="${message(code:"Workflow.step.cancel.title")}"><g:message code="button.action.Cancel" /></span> 776 <span class="btn btn-primary btn-sm" onclick="_wfisavenew('wfiedit_${rkey}');" title="${message(code:"Workflow.step.savenew.title")}"><g:message code="button.action.Save" /></span> 777 </g:else> 778 </g:if> 779 <g:else> 780 <g:hiddenField name="num" value="${num}"/> 781 <g:hiddenField name="origitemtype" value="${origitemtype}"/> 782 <span class="btn btn-default btn-sm" onclick="_wfiview('${key}',${num},${isErrorHandler?true:false});" title="${message(code:"Workflow."+msgItem+".discard.title")}" ><g:message code="button.action.Cancel" /></span> 783 <span class="btn btn-primary btn-sm" onclick="_wfisave('${key}',${num}, 'wfiedit_${rkey}', ${ isErrorHandler?true:false});" 784 title="${message(code:"Workflow."+msgItem+".save.title")}"><g:message code="button.action.Save" /></span> 785 </g:else> 786 <span class="text-warning cancelsavemsg" style="display:none;"> 787 <g:message code="scheduledExecution.workflow.${msgItem}.Item.unsaved.warning" 788 default="Discard or save changes to this Workflow Step before completing changes to the job"/> 789 </span> 790 </div> 791 <div class="clear"></div> 792 <script type="text/javascript">jQuery('.wfitemEditForm .modal').appendTo('body')</script> 793 </div> 794</div> 795