Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Job options hidden1 #4472

Merged
merged 5 commits into from Feb 19, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
Expand Up @@ -58,6 +58,7 @@ function Option(data) {
self.descriptionHtml = ko.observable(data.descriptionHtml);
self.loading = ko.observable(false);
self.required = ko.observable(data.required ? true : false);
self.hidden = ko.observable(data.hidden ? true : false);
self.enforced = ko.observable(data.enforced ? true : false);
self.isDate = ko.observable(data.isDate ? true : false);
self.dateFormat = ko.observable(data.dateFormat);
Expand Down
Expand Up @@ -16,11 +16,12 @@

package rundeck.controllers

import java.util.regex.Pattern
import java.util.regex.PatternSyntaxException
import rundeck.Option
import rundeck.ScheduledExecution

import java.util.regex.Pattern
import java.util.regex.PatternSyntaxException

/**
* Controller for manipulating the session-stored set of Options during job edit
*/
Expand Down Expand Up @@ -498,6 +499,11 @@ class EditOptsController {
opt.errors.rejectValue('required', 'option.file.required.message')
return result
}

if (opt.hidden && !opt.defaultValue && !opt.defaultStoragePath) {
opt.errors.rejectValue('hidden', 'option.hidden.notallowed.message')
return result
}
if (opt.enforced && (opt.values || opt.valuesList) && opt.defaultValue) {
opt.convertValuesList()
if(!opt.multivalued && !opt.values.contains(opt.defaultValue)) {
Expand Down
12 changes: 10 additions & 2 deletions rundeckapp/grails-app/domain/rundeck/Option.groovy
Expand Up @@ -71,6 +71,7 @@ public class Option implements Comparable{
Boolean multivalueAllSelected
String optionValuesPluginType
List<OptionValue> valuesFromPlugin
Boolean hidden

static belongsTo=[scheduledExecution:ScheduledExecution]
static transients = ['valuesList', 'realValuesUrl', 'configMap', 'typeFile','valuesFromPlugin']
Expand Down Expand Up @@ -99,6 +100,7 @@ public class Option implements Comparable{
multivalueAllSelected(nullable: true)
label(nullable: true)
optionValuesPluginType(nullable: true)
hidden(nullable: true)
}


Expand Down Expand Up @@ -198,6 +200,9 @@ public class Option implements Comparable{
if(optionValuesPluginType) {
map.optionValuesPluginType = optionValuesPluginType
}
if(hidden){
map.hidden = hidden
}
return map
}

Expand Down Expand Up @@ -261,6 +266,9 @@ public class Option implements Comparable{
if(data.optionValuesPluginType) {
opt.optionValuesPluginType = data.optionValuesPluginType
}
if(data.hidden){
opt.hidden = data.hidden
}
return opt
}
/**
Expand Down Expand Up @@ -349,7 +357,7 @@ public class Option implements Comparable{
'dateFormat', 'values', 'valuesList', 'valuesUrl', 'valuesUrlLong', 'regex', 'multivalued',
'multivalueAllSelected', 'label',
'delimiter', 'optionValuesPluginType',
'secureInput', 'secureExposed', 'optionType', 'configData'].
'secureInput', 'secureExposed', 'optionType', 'configData', 'hidden'].
each { k ->
opt[k]=this[k]
}
Expand Down Expand Up @@ -381,7 +389,7 @@ public class Option implements Comparable{
', optionValuesPluginType=' + optionValuesPluginType + '\'' +
", optionType='" + optionType + '\'' +
", configData='" + configData + '\'' +

", hidden='" + '\'' +
'}' ;
}

Expand Down
3 changes: 3 additions & 0 deletions rundeckapp/grails-app/i18n/messages.properties
Expand Up @@ -175,6 +175,7 @@ option.defaultValue.notallowed.message=Default Value was not in the allowed valu
option.defaultValue.multivalued.notallowed.message=Default Value contains a string that was not in the allowed values list, and values are enforced: "{0}". Note: whitespace is significant.
option.defaultValue.required.message=Specify a Default Value for Required options when the Job is scheduled.
option.file.required.message=File option type cannot be Required when the Job is scheduled.
option.hidden.notallowed.message=Hidden options must have a default value.
option.file.config.invalid.message=File option type config is not valid: {0}
option.regex.invalid.message=Invalid Regular Expression: {0}
option.values.regexmismatch.message=Allowed value "{0}" does not match the regex: {1}
Expand Down Expand Up @@ -570,6 +571,8 @@ select.jobs.to.delete=Select Jobs to delete.
project.name.can.only.contain.these.characters=Project name can only contain these characters\: [a-zA-Z0-9_-+.] and cannot start with a '.'.
Option.required.label=Required
Option.required.description=Require this option to have a non-blank value when running the Job
Option.hidden.label=Should be hidden
Option.hidden.description=Should be hidden from job run page
execution=Execution
plural.format={1}
plural.count.format={0} {1}
Expand Down
67 changes: 35 additions & 32 deletions rundeckapp/grails-app/views/framework/_jobOptionsKO.gsp
Expand Up @@ -83,7 +83,8 @@ used by _editOptions.gsp template
selectedoptsmap && null != selectedoptsmap[optName] ?
selectedoptsmap[optName] :
(optionSelect.defaultValue ?: ''),
valuesFromPlugin : optionSelect.valuesFromPlugin
valuesFromPlugin : optionSelect.valuesFromPlugin,
hidden : !!optionSelect.hidden
]
}
]}" id="jobOptionData"/>
Expand All @@ -102,48 +103,50 @@ data for configuring remote option cascading/dependencies
</g:if>

<div id="_commandOptions" data-bind="foreach: {data: options(), as: 'option' }">
<div class="form-group " data-bind="
<div data-bind="visible: !hidden()">
<div class="form-group " data-bind="
css: { 'has-warning': hasError, 'remote': hasRemote }
">
<label class="remoteoptionfield col-sm-2 control-label"
data-bind="attr: { for: fieldId }, click: reloadRemoteValues">
<span data-bind="if: hasRemote()">
<span data-bind="if: loading() ">
<g:img class="loading-spinner" file="spinner-gray.gif" width="16px" height="16px"/>
<label class="remoteoptionfield col-sm-2 control-label"
data-bind="attr: { for: fieldId }, click: reloadRemoteValues">
<span data-bind="if: hasRemote()">
<span data-bind="if: loading() ">
<g:img class="loading-spinner" file="spinner-gray.gif" width="16px" height="16px"/>
</span>
<span class="remotestatus"
data-bind=" css: {ok: !remoteError() && remoteValues().length>0 && remoteValues, error: remoteError()}">
</span>
<span data-bind="text: name"></span>
</span>
<span class="remotestatus"
data-bind=" css: {ok: !remoteError() && remoteValues().length>0 && remoteValues, error: remoteError()}">
<span data-bind="if: !hasRemote()">
<span data-bind="text: label"></span>
</span>
<span data-bind="text: name"></span>
</span>
<span data-bind="if: !hasRemote()">
<span data-bind="text: label"></span>
</span>
</label>
</label>

<div class=" col-sm-9">
<div class=" col-sm-9">

<g:render template="/framework/optionValuesSelectKO"/>
<g:render template="/framework/optionValuesSelectKO"/>

</div>
</div>

<div class="col-sm-1">
<span data-bind="if: required">
<span class="reqwarning has_tooltip"
data-bind="attr: {title: hasError()||message('option.value.required') }, visible: !hasValue(), bootstrapTooltip: true"
data-toggle="tooltip">
<i class="glyphicon glyphicon-warning-sign"></i>
<div class="col-sm-1">
<span data-bind="if: required">
<span class="reqwarning has_tooltip"
data-bind="attr: {title: hasError()||message('option.value.required') }, visible: !hasValue(), bootstrapTooltip: true"
data-toggle="tooltip">
<i class="glyphicon glyphicon-warning-sign"></i>
</span>
</span>
</span>
</div>
</div>

<div class="col-sm-10 col-sm-offset-2">
%{--<span class="help-block" data-bind="text: description"></span>--}%
<span class="help-block" data-bind="html: descriptionHtml"></span>
</div>
<div class="col-sm-10 col-sm-offset-2">
%{--<span class="help-block" data-bind="text: description"></span>--}%
<span class="help-block" data-bind="html: descriptionHtml"></span>
</div>

<div class="col-sm-10 col-sm-offset-2" data-bind="if: hasError">
<p class="text-warning" data-bind="text: hasError"></p>
<div class="col-sm-10 col-sm-offset-2" data-bind="if: hasError">
<p class="text-warning" data-bind="text: hasError"></p>
</div>
</div>
</div>
</div>
Expand Down
20 changes: 20 additions & 0 deletions rundeckapp/grails-app/views/scheduledExecution/_optEdit.gsp
Expand Up @@ -536,6 +536,26 @@
</div>
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label"><g:message code="Option.hidden.label" /></label>
<div class="col-sm-10">
<div class="radio radio-inline">
<g:radio id="option-hidden-no" name="hidden" value="false" checked="${!option || !option.hidden}"/>
<label for="option-hidden-no">
<g:message code="no" />
</label>
</div>
<div class="radio radio-inline">
<g:radio id="option-hidden-yes" name="hidden" value="true" checked="${option?.hidden}"/>
<label for="option-hidden-yes">
<g:message code="yes" />
</label>
</div>
<div class="help-block">
<g:message code="Option.hidden.description"/>
</div>
</div>
</div>
<!-- ko if: !isFileType() -->
<div class="form-group">
<label class="col-sm-2 control-label ${hasErrors(bean: option, field: 'multivalued', 'has-error')}">
Expand Down