Website: (config builder) Add Windows Update settings (#34112)

Related to: https://github.com/fleetdm/fleet/issues/33293

Changes:
- Added settings related to Windows Update to the configuration builder.
- Updated the configuration builder to support custom validation and
error messages
- Updated the configuration builder to include the description of
settings in the form.
This commit is contained in:
Eric 2025-10-13 10:19:08 -05:00 committed by GitHub
parent 9cc7a02209
commit 38bef2b6f2
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 996 additions and 12 deletions

File diff suppressed because it is too large Load diff

View file

@ -421,8 +421,7 @@
border-bottom: 1px solid #E2E4EA;
h2 {
color: #192147;
margin-bottom: 16px;
font-family: Inter;
font-size: 16px;
font-style: normal;
@ -613,13 +612,14 @@
padding: 0px 6px 0px 8px;
color: #192147;
font-family: Inter;
font-size: 13px;
font-size: 12px;
font-style: normal;
font-weight: 400;
line-height: 24px;
text-transform: uppercase;
width: 130px;
cursor: pointer;
}
[purpose='multifield-option'] {
[purpose='option-value'] {

View file

@ -183,7 +183,10 @@
<div purpose="payload-option" v-for="option in selectedPayloadsGroupedByCategory[category]">
<div purpose="name-and-access-type" class="d-flex flex-row align-items-center justify-content-between w-100">
<p class="mb-0"><strong>{{option.name}}</strong></p>
<div purpose="name-and-description">
<p class="mb-3"><strong>{{option.name}}</strong></p>
<p>{{option.tooltip}}</p>
</div>
<div class="d-flex flex-row align-items-center" v-if="selectedPlatform === 'windows'">
<a href="https://learn.microsoft.com/en-us/windows/client-management/mdm/policy-configuration-service-provider" target="_blank" no-icon><img style="margin-right: 6px; height: 14px" class="d-inline" purpose="tooltip-icon" src="/images/icon-more-info-14x14@2x.png" alt="More info" data-html="true" data-toggle="tooltip" tabindex="0" data-placement="top" title="<%= '<p class="text-white">A Windows CSP profile may require the ADD action to work on initial delivery. To modify a previously delivered setting, the REPLACE action may be needed.</p> <p class="d-flex flex-row align-items-center mb-0">Click <img src="/images/icon-more-info-25-14x14@2x.png" class="mx-1" style="height: 12px; display: inline;" alt="more info"> to learn more</p>'%>"></a>
<div class="d-flex flex-column">
@ -201,13 +204,15 @@
<input :class="[formErrors[option.uniqueSlug+'-value'] ? 'is-invalid' : '']" class="form-control" v-model.trim="configurationBuilderFormData[option.uniqueSlug+'-value']" :type="option.formInput.type" placeholder="0" :min="option.formInput.minValue" :max="option.formInput.maxValue">
<span purpose="unit-label" v-if="option.formInput.unitLabel">{{option.formInput.unitLabel}}</span>
</div>
<div class="invalid-feedback d-block" v-if="formErrors[option.uniqueSlug+'-value'] === 'custom' && option.formInput.customFormRuleErrorMessage">{{option.formInput.customFormRuleErrorMessage}}</div>
<div class="invalid-feedback d-block" v-if="formErrors[option.uniqueSlug+'-value'] && option.formInput.unitLabel">Please enter a number of {{option.formInput.unitLabel}}</div>
<div class="invalid-feedback d-block" v-else-if="formErrors[option.uniqueSlug+'-value']">Please enter a value</div>
</div>
<% // Text input %>
<div purpose="option-value" v-if="['text'].includes(option.formInput.type)">
<input :class="[formErrors[option.uniqueSlug+'-value'] ? 'is-invalid' : '']" class="form-control" v-model.trim="configurationBuilderFormData[option.uniqueSlug+'-value']" :type="option.formInput.type" placeholder="Please enter a value" >
<div class="invalid-feedback" v-if="formErrors[option.uniqueSlug+'-value']">Please enter a value</div>
<div class="invalid-feedback d-block" v-if="formErrors[option.uniqueSlug+'-value'] === 'custom' && option.formInput.customFormRuleErrorMessage">{{option.formInput.customFormRuleErrorMessage}}</div>
<div class="invalid-feedback" v-else-if="formErrors[option.uniqueSlug+'-value']">Please enter a value</div>
</div>
<% // Radio input %>
<div purpose="option-value" v-else-if="['radio'].includes(option.formInput.type)" :class="[formErrors[option.uniqueSlug+'-value'] ? 'is-invalid' : '']">
@ -216,7 +221,8 @@
<span purpose="custom-radio"><span purpose="custom-radio-selected"></span></span>
{{formInput.name}}
</label>
<div class="invalid-feedback" v-if="formErrors[option.uniqueSlug+'-value']">Please select an option</div>
<div class="invalid-feedback d-block" v-if="formErrors[option.uniqueSlug+'-value'] === 'custom' && option.formInput.customFormRuleErrorMessage">{{option.formInput.customFormRuleErrorMessage}}</div>
<div class="invalid-feedback" v-else-if="formErrors[option.uniqueSlug+'-value']">Please select an option</div>
</div>
<%// Checkbox input %>
<div purpose="option-value" v-else-if="['boolean'].includes(option.formInput.type)">
@ -232,7 +238,8 @@
<option selected value="undefined" >Select an option</option>
<option :value="formInput.value" style="text-transform: uppercase;" v-for="formInput in option.formInput.options">{{formInput.name}}</option>
</select>
<div class="invalid-feedback" v-if="formErrors[option.uniqueSlug+'-value']">Please select an option</div>
<div class="invalid-feedback d-block" v-if="formErrors[option.uniqueSlug+'-value'] === 'custom' && option.formInput.customFormRuleErrorMessage">{{option.formInput.customFormRuleErrorMessage}}</div>
<div class="invalid-feedback" v-else-if="formErrors[option.uniqueSlug+'-value']">Please select an option</div>
</div>
<%// Multiple inputs %>
<div purpose="option-value" class="w-100" v-else-if="['multifield'].includes(option.formInput.type)">
@ -243,7 +250,8 @@
<input :class="[formErrors[option.uniqueSlug+'-'+input.slug] ? 'is-invalid' : '']" class="form-control" v-model.trim="configurationBuilderFormData[option.uniqueSlug+'-'+input.slug]" :type="input.type" placeholder="0" :min="input.minValue" :max="input.maxValue">
<span purpose="unit-label" v-if="input.unitLabel">{{input.unitLabel}}</span>
</div>
<div class="invalid-feedback d-block" v-if="formErrors[option.uniqueSlug+'-'+input.slug] && input.unitLabel">Please enter a number of {{input.unitLabel}}</div>
<div class="invalid-feedback d-block" v-if="formErrors[option.uniqueSlug+'-value'] === 'custom' && option.formInput.customFormRuleErrorMessage">{{option.formInput.customFormRuleErrorMessage}}</div>
<div class="invalid-feedback d-block" v-else-if="formErrors[option.uniqueSlug+'-'+input.slug] && input.unitLabel">Please enter a number of {{input.unitLabel}}</div>
<div class="invalid-feedback d-block" v-else-if="formErrors[option.uniqueSlug+'-'+input.slug]">Please enter a value</div>
</div>
<% // Text input %>
@ -251,7 +259,8 @@
<label>
<span purpose="nested-label">{{input.name}}</span>
<input :class="[formErrors[option.uniqueSlug+'-'+input.slug] ? 'is-invalid' : '']" class="form-control" v-model.trim="configurationBuilderFormData[option.uniqueSlug+'-'+input.slug]" :type="input.type" placeholder="Please enter a value" >
<div class="invalid-feedback" v-if="formErrors[option.uniqueSlug+'-'+input.slug]">Please enter a value</div>
<div class="invalid-feedback d-block" v-if="formErrors[option.uniqueSlug+'-value'] === 'custom' && option.formInput.customFormRuleErrorMessage">{{option.formInput.customFormRuleErrorMessage}}</div>
<div class="invalid-feedback" v-else-if="formErrors[option.uniqueSlug+'-'+input.slug]">Please enter a value</div>
</label>
</div>
<% // Radio input %>
@ -261,7 +270,8 @@
<span purpose="custom-radio"><span purpose="custom-radio-selected"></span></span>
{{formInput.name}}
</label>
<div class="invalid-feedback" v-if="formErrors[option.uniqueSlug+'-'+input.slug]">Please select an option</div>
<div class="invalid-feedback d-block" v-if="formErrors[option.uniqueSlug+'-value'] === 'custom' && option.formInput.customFormRuleErrorMessage">{{option.formInput.customFormRuleErrorMessage}}</div>
<div class="invalid-feedback" v-else-if="formErrors[option.uniqueSlug+'-'+input.slug]">Please select an option</div>
</div>
<%// Checkbox input %>
<div purpose="option-value" v-else-if="['boolean'].includes(input.type)">