1
+ <%@ page import =" grails.converters.deep.JSON; grails.util.Environment" %>
1
2
<%--
2
3
used by _editOptions.gsp template
3
4
--%>
@@ -17,29 +18,43 @@ used by _editOptions.gsp template
17
18
<table >
18
19
<tr >
19
20
<td style =" vertical-align :top " >
20
- <table class =" simpleForm" >
21
- <g:each var =" optName" in =" ${ optsmap. keySet(). sort() } " >
21
+ <table class =" simpleForm" id = " _commandOptions " >
22
+ <g:each var =" optName" in =" ${ optionordering ?: optsmap. keySet(). sort()} " >
22
23
<g:set var =" optionSelect" value =" ${ optsmap[optName]. selopt } " />
23
24
<g:set var =" optRequired" value =" ${ optionSelect. required } " />
24
25
<g:set var =" optDescription" value =" ${ optionSelect. description } " />
25
26
<g:set var =" fieldName" value =" ${ usePrefix+ ' option.' + optName } " />
26
27
<g:set var =" optionHasValue" value =" ${ optionSelect. defaultValue || selectedoptsmap && selectedoptsmap[optName] } " />
27
28
<g:set var =" hasError" value =" ${ jobexecOptionErrors? jobexecOptionErrors[optName]: null } " />
28
29
<g:set var =" fieldNamekey" value =" ${ rkey+ ' _' + optName+ ' _label' } " />
30
+ <g:set var =" fieldhiddenid" value =" ${ rkey+ ' _' + optName+ ' _h' } " />
29
31
<tr >
30
- <td class =" ${ hasError? ' fieldError' : ' ' } remoteoptionfield" id =" ${ fieldNamekey } " ><span style =" display :none ;" class =" remotestatus" ></span > ${ optName } :</td >
32
+ <td class =" ${ hasError? ' fieldError' : ' ' } remoteoptionfield" id =" ${ fieldNamekey } " ><span style =" display :none ;" class =" remotestatus" ></span > ${ optName. encodeAsHTML() } :
33
+ <g:if test =" ${ Environment . current == Environment . DEVELOPMENT && grailsApplication. config. rundeck? . debug} " >
34
+ (${ optiondependencies? optiondependencies[optName]: ' -' } )(${ dependentoptions? dependentoptions[optName]: ' -' } )
35
+ </g:if >
36
+ </td >
37
+ %{--determine if option has all dependencies met--}%
38
+ <g:set var =" optionDepsMet" value =" ${ ! optiondependencies[optName] || selectedoptsmap && optiondependencies[optName]. every {selectedoptsmap[it]}} " />
31
39
<td >
32
40
<g:if test =" ${ optionSelect. realValuesUrl != null } " >
33
41
<g:set var =" holder" value =" ${ rkey+ ' _' + optName+ ' _hold' } " />
34
42
<span id =" ${ holder } " >
43
+ <g:if test =" ${ ! optionDepsMet} " >
44
+ <span class =" info note" >
45
+ Select a value for these options: ${ optiondependencies[optName]. join(' , ' ). encodeAsHTML() }
46
+ </span >
47
+ </g:if >
48
+ <g:hiddenField name =" ${ fieldName } " value =" ${ selectedoptsmap? selectedoptsmap[optName]: ' ' } " id =" ${ fieldhiddenid } " />
49
+ <span class =" loading" ></span >
35
50
</span >
36
- <g:javascript >
37
- _loadRemoteOptionValues(" ${ holder } ",' ${ scheduledExecutionId } ', '${ optName } ',' ${ usePrefix } ',' ${ selectedoptsmap ? selectedoptsmap[ optName] : ' ' } ',' ${ fieldNamekey } ',true);
38
- </g:javascript >
51
+ <g:if test = " ${ Environment . current == Environment . DEVELOPMENT && grailsApplication . config . rundeck ? . debug } " >
52
+ < a onclick = " _remoteOptionControl('_commandOptions').loadRemoteOptionValues( '${ optName. encodeAsJavaScript() } ');return false; " href = " # " > ${ optName. encodeAsHTML() } reload</ a >
53
+ </g:if >
39
54
</g:if >
40
55
<g:else >
41
56
<g:render template =" /framework/optionValuesSelect"
42
- model =" ${ [elemTarget: rkey+ ' _' + optName,optionSelect: optionSelect, fieldPrefix: usePrefix,fieldName: ' option.' + optName,selectedoptsmap: selectedoptsmap] } " />
57
+ model =" ${ [elemTarget: rkey+ ' _' + optName,optionSelect: optionSelect, fieldPrefix: usePrefix,fieldName: ' option.' + optName,selectedoptsmap: selectedoptsmap,fieldkey : fieldhiddenid ] } " />
43
58
</g:else >
44
59
45
60
<span id =" ${ optName. encodeAsHTML()+ ' _state' } " >
@@ -48,19 +63,81 @@ used by _editOptions.gsp template
48
63
<img src =" ${ resource( dir: ' images' ,file: ' icon-small-warn.png' ) } " class =" warnimg"
49
64
alt =" Required Option" title =" Required Option" width =" 16px" height =" 16px" />
50
65
<g:if test =" ${ hasError && hasError. contains(' required' ) } " >
51
- <span class =" error label" >${ hasError } </span >
66
+ <span class =" error label" >${ hasError. encodeAsHTML() } </span >
52
67
</g:if >
53
68
</span >
54
69
</g:if >
55
70
<g:if test =" ${ hasError && ! hasError. contains(' required' ) } " >
56
- <span class =" error label" >${ hasError } </span >
71
+ <span class =" error label" >${ hasError. encodeAsHTML() } </span >
57
72
</g:if >
58
73
</span >
59
- <div class =" info note" >${ optDescription } </div >
74
+ <div class =" info note" >${ optDescription? . encodeAsHTML() } </div >
60
75
</td >
61
76
</tr >
62
77
</g:each >
78
+
79
+ <%--
80
+ Javascript for configuring remote option cascading/dependencies
81
+ --%>
82
+ <g:javascript >
83
+ fireWhenReady('_commandOptions', function(){
84
+ var remoteOptions = _remoteOptionControl('_commandOptions');
85
+ <g:if test =" ${ optionsDependenciesCyclic } " >
86
+ remoteOptions.cyclic=true;
87
+ </g:if >
88
+ <g:each var =" optName" in =" ${ optionordering ?: optsmap. keySet(). sort() } " >
89
+ <g:set var =" optionSelect" value =" ${ optsmap[optName]. selopt } " />
90
+ <g:set var =" fieldName" value =" ${ usePrefix + ' option.' + optName } " />
91
+ <g:set var =" fieldNamekey" value =" ${ rkey + ' _' + optName + ' _label' } " />
92
+ <g:set var =" holder" value =" ${ rkey + ' _' + optName + ' _hold' } " />
93
+ <g:set var =" fieldhiddenid" value =" ${ rkey + ' _' + optName + ' _h' } " />
94
+ <g:set var =" optionDepsMet"
95
+ value =" ${ ! optiondependencies[optName] || selectedoptsmap && optiondependencies[optName]. every {selectedoptsmap[it]}} " />
96
+ <g:if test =" ${ optiondependencies[optName] } " >
97
+ remoteOptions.addOptionDependencies("${ optName. encodeAsJavaScript() } ", ${ optiondependencies[optName] as JSON } );
98
+ </g:if >
99
+ <g:if test =" ${ dependentoptions[optName] } " >
100
+ <%-- If option has dependents, register them to refresh when this option value changes --%>
101
+ remoteOptions.addOptionDeps("${ optName. encodeAsJavaScript() } ", ${ dependentoptions[optName] as JSON } );
102
+
103
+
104
+ <g:if test =" ${ optionSelect. enforced } " >
105
+ <%-- Will be a drop down list, so trigger change automatically. --%>
106
+ remoteOptions.setOptionAutoReload("${ optName. encodeAsJavaScript() } ",true);
107
+ </g:if >
108
+ </g:if >
109
+ <g:if test =" ${ optionSelect. realValuesUrl != null } " >
110
+ <%-- If option has a remote URL, register data used for ajax reload --%>
111
+ remoteOptions.addOption("${ optName. encodeAsJavaScript() } ","${ holder. encodeAsJavaScript() } ",'${ scheduledExecutionId. encodeAsJavaScript() } ','${ optName. encodeAsJavaScript() } ','${ usePrefix. encodeAsJavaScript() } ','${ selectedoptsmap ? selectedoptsmap[optName]? . encodeAsJavaScript() : ' ' } ','${ fieldNamekey. encodeAsJavaScript() } ',true);
112
+
113
+ <g:if test =" ${ ! optiondependencies[optName] || optionsDependenciesCyclic} " >
114
+ remoteOptions.loadonstart["${ optName. encodeAsJavaScript() } "]=true;
115
+ </g:if >
116
+ <g:else >
117
+ remoteOptions.setOptionAutoReload("${ optName. encodeAsJavaScript() } ",true);
118
+ </g:else >
119
+ <g:if test =" ${ optionSelect. multivalued } " >
120
+ remoteOptions.setFieldMultiId('${ optName. encodeAsJavaScript() } ','${ fieldhiddenid. encodeAsJavaScript() } ');
121
+ </g:if >
122
+ <g:else >
123
+ remoteOptions.setFieldId('${ optName. encodeAsJavaScript() } ','${ fieldhiddenid. encodeAsJavaScript() } ');
124
+ </g:else >
125
+ </g:if >
126
+ <g:else >
127
+ remoteOptions.addLocalOption("${ optName. encodeAsJavaScript() } ");
128
+ </g:else >
129
+ </g:each >
130
+ <%-- register observers for field value changes --%>
131
+ remoteOptions.observeChanges();
132
+ if(typeof(_registerJobExecUnloadHandler)=='function'){
133
+ _registerJobExecUnloadHandler(remoteOptions.unload.bind(remoteOptions));
134
+ }
135
+ });
136
+ </g:javascript >
63
137
</table >
138
+ <g:if test =" ${ optionsDependenciesCyclic } " >
139
+ <g:message code =" remote.options.warning.cyclicDependencies" />
140
+ </g:if >
64
141
</td >
65
142
<g:if test =" ${ showDTFormat } " >
66
143
<td style =" vertical-align :top " >
@@ -115,11 +192,11 @@ used by _editOptions.gsp template
115
192
</g:if >
116
193
<g:elseif test =" ${ notfound } " >
117
194
<div class =" info note" >Choose a valid command (notfound).</div >
118
- <g:if test =" ${ selectedargstring } " ><div >Old value: ${ selectedargstring } </div ></g:if >
195
+ <g:if test =" ${ selectedargstring } " ><div >Old value: ${ selectedargstring. encodeAsHTML() } </div ></g:if >
119
196
</g:elseif >
120
197
<g:elseif test =" ${ ! authorized} " >
121
198
<div class =" info note" >Not authorized to execute chosen command.</div >
122
- <g:if test =" ${ selectedargstring } " ><div >Old value: ${ selectedargstring } </div ></g:if >
199
+ <g:if test =" ${ selectedargstring } " ><div >Old value: ${ selectedargstring. encodeAsHTML() } </div ></g:if >
123
200
</g:elseif >
124
201
<g:else >
125
202
<span class =" info note" >None for this job</span >
0 commit comments