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