blob: a39b800e6ffeea85e62a58b79db0002ecc26c2bb [file] [log] [blame]
Yoshie Muranakac4e38ab2020-04-09 12:41:27 -07001<template>
2 <b-container fluid="xl">
3 <page-title :description="$t('pageLdap.pageDescription')" />
4 <page-section :section-title="$t('pageLdap.settings')">
5 <b-form novalidate @submit.prevent="handleSubmit">
Yoshie Muranaka1c536592020-11-17 09:03:46 -08006 <b-row>
7 <b-col>
Mateusz Gapski471f2e02020-07-27 14:43:26 +02008 <b-form-group
Yoshie Muranaka1c536592020-11-17 09:03:46 -08009 class="mb-3"
10 :label="$t('pageLdap.form.ldapAuthentication')"
11 :disabled="loading"
Yoshie Muranakac4e38ab2020-04-09 12:41:27 -070012 >
Yoshie Muranaka1c536592020-11-17 09:03:46 -080013 <b-form-checkbox
14 v-model="form.ldapAuthenticationEnabled"
15 data-test-id="ldap-checkbox-ldapAuthenticationEnabled"
16 @change="onChangeldapAuthenticationEnabled"
Mateusz Gapski471f2e02020-07-27 14:43:26 +020017 >
Yoshie Muranaka1c536592020-11-17 09:03:46 -080018 {{ $t('global.action.enable') }}
19 </b-form-checkbox>
20 </b-form-group>
21 </b-col>
22 </b-row>
23 <div class="form-background p-3">
24 <b-form-group
25 class="m-0"
26 :label="$t('pageLdap.ariaLabel.ldapSettings')"
jason westoverd36ac8a2025-11-03 20:58:59 -060027 label-class="visually-hidden-focusable"
Yoshie Muranaka1c536592020-11-17 09:03:46 -080028 :disabled="!form.ldapAuthenticationEnabled || loading"
29 >
30 <b-row>
31 <b-col md="3" lg="4" xl="3">
32 <b-form-group
33 class="mb-4"
34 :label="$t('pageLdap.form.secureLdapUsingSsl')"
35 >
36 <b-form-text id="enable-secure-help-block">
37 {{ $t('pageLdap.form.secureLdapHelper') }}
38 </b-form-text>
39 <b-form-checkbox
40 id="enable-secure-ldap"
41 v-model="form.secureLdapEnabled"
42 aria-describedby="enable-secure-help-block"
43 data-test-id="ldap-checkbox-secureLdapEnabled"
44 :disabled="
45 !caCertificateExpiration || !ldapCertificateExpiration
46 "
Surya Vde23ea22024-07-11 15:19:46 +053047 @change="v$.form.secureLdapEnabled.$touch()"
Yoshie Muranaka1c536592020-11-17 09:03:46 -080048 >
49 {{ $t('global.action.enable') }}
50 </b-form-checkbox>
51 </b-form-group>
52 <dl>
jason westoverd36ac8a2025-11-03 20:58:59 -060053 <dt>
54 {{ $t('pageLdap.form.caCertificateValidUntil') }}
55 </dt>
Yoshie Muranaka1c536592020-11-17 09:03:46 -080056 <dd v-if="caCertificateExpiration">
Surya Vde23ea22024-07-11 15:19:46 +053057 {{ $filters.formatDate(caCertificateExpiration) }}
Yoshie Muranaka1c536592020-11-17 09:03:46 -080058 </dd>
59 <dd v-else>--</dd>
jason westoverd36ac8a2025-11-03 20:58:59 -060060 <dt>
61 {{ $t('pageLdap.form.ldapCertificateValidUntil') }}
62 </dt>
Yoshie Muranaka1c536592020-11-17 09:03:46 -080063 <dd v-if="ldapCertificateExpiration">
Surya Vde23ea22024-07-11 15:19:46 +053064 {{ $filters.formatDate(ldapCertificateExpiration) }}
Yoshie Muranaka1c536592020-11-17 09:03:46 -080065 </dd>
66 <dd v-else>--</dd>
67 </dl>
68 <b-link
69 class="d-inline-block mb-4 m-md-0"
Sandeepa Singhb4406162021-07-26 15:05:39 +053070 to="/security-and-access/certificates"
Yoshie Muranaka1c536592020-11-17 09:03:46 -080071 >
72 {{ $t('pageLdap.form.manageSslCertificates') }}
73 </b-link>
74 </b-col>
75 <b-col md="9" lg="8" xl="9">
76 <b-row>
77 <b-col>
78 <b-form-group :label="$t('pageLdap.form.serviceType')">
79 <b-form-radio
80 v-model="form.activeDirectoryEnabled"
81 data-test-id="ldap-radio-activeDirectoryEnabled"
82 :value="false"
83 @change="onChangeServiceType"
84 >
Nikhil Ashoka65fa7bf2023-06-15 14:11:12 +053085 {{ $t('pageLdap.form.openLDAP') }}
Yoshie Muranaka1c536592020-11-17 09:03:46 -080086 </b-form-radio>
87 <b-form-radio
88 v-model="form.activeDirectoryEnabled"
89 data-test-id="ldap-radio-activeDirectoryEnabled"
90 :value="true"
91 @change="onChangeServiceType"
92 >
Nikhil Ashoka65fa7bf2023-06-15 14:11:12 +053093 {{ $t('pageLdap.form.activeDirectory') }}
Yoshie Muranaka1c536592020-11-17 09:03:46 -080094 </b-form-radio>
95 </b-form-group>
96 </b-col>
97 </b-row>
98 <b-row>
99 <b-col sm="6" xl="4">
100 <b-form-group label-for="server-uri">
101 <template #label>
102 {{ $t('pageLdap.form.serverUri') }}
103 <info-tooltip
104 :title="$t('pageLdap.form.serverUriTooltip')"
105 />
106 </template>
107 <b-input-group :prepend="ldapProtocol">
108 <b-form-input
109 id="server-uri"
110 v-model="form.serverUri"
111 data-test-id="ldap-input-serverUri"
Surya Vde23ea22024-07-11 15:19:46 +0530112 :state="getValidationState(v$.form.serverUri)"
113 @change="v$.form.serverUri.$touch()"
Yoshie Muranaka1c536592020-11-17 09:03:46 -0800114 />
115 <b-form-invalid-feedback role="alert">
116 {{ $t('global.form.fieldRequired') }}
117 </b-form-invalid-feedback>
118 </b-input-group>
119 </b-form-group>
120 </b-col>
121 <b-col sm="6" xl="4">
122 <b-form-group
123 :label="$t('pageLdap.form.bindDn')"
124 label-for="bind-dn"
125 >
126 <b-form-input
127 id="bind-dn"
128 v-model="form.bindDn"
jason westoverd36ac8a2025-11-03 20:58:59 -0600129 autocomplete="username"
Yoshie Muranaka1c536592020-11-17 09:03:46 -0800130 data-test-id="ldap-input-bindDn"
Surya Vde23ea22024-07-11 15:19:46 +0530131 :state="getValidationState(v$.form.bindDn)"
132 @change="v$.form.bindDn.$touch()"
Yoshie Muranaka1c536592020-11-17 09:03:46 -0800133 />
134 <b-form-invalid-feedback role="alert">
135 {{ $t('global.form.fieldRequired') }}
136 </b-form-invalid-feedback>
137 </b-form-group>
138 </b-col>
139 <b-col sm="6" xl="4">
140 <b-form-group
141 :label="$t('pageLdap.form.bindPassword')"
142 label-for="bind-password"
143 >
144 <input-password-toggle
145 data-test-id="ldap-input-togglePassword"
146 >
147 <b-form-input
148 id="bind-password"
149 v-model="form.bindPassword"
150 type="password"
jason westoverd36ac8a2025-11-03 20:58:59 -0600151 autocomplete="current-password"
Surya Vde23ea22024-07-11 15:19:46 +0530152 :state="getValidationState(v$.form.bindPassword)"
Yoshie Muranaka1c536592020-11-17 09:03:46 -0800153 class="form-control-with-button"
Surya Vde23ea22024-07-11 15:19:46 +0530154 @change="v$.form.bindPassword.$touch()"
Yoshie Muranaka1c536592020-11-17 09:03:46 -0800155 />
156 <b-form-invalid-feedback role="alert">
157 {{ $t('global.form.fieldRequired') }}
158 </b-form-invalid-feedback>
159 </input-password-toggle>
160 </b-form-group>
161 </b-col>
162 <b-col sm="6" xl="4">
163 <b-form-group
164 :label="$t('pageLdap.form.baseDn')"
165 label-for="base-dn"
166 >
167 <b-form-input
168 id="base-dn"
169 v-model="form.baseDn"
170 data-test-id="ldap-input-baseDn"
Surya Vde23ea22024-07-11 15:19:46 +0530171 :state="getValidationState(v$.form.baseDn)"
172 @change="v$.form.baseDn.$touch()"
Yoshie Muranaka1c536592020-11-17 09:03:46 -0800173 />
174 <b-form-invalid-feedback role="alert">
175 {{ $t('global.form.fieldRequired') }}
176 </b-form-invalid-feedback>
177 </b-form-group>
178 </b-col>
179 <b-col sm="6" xl="4">
180 <b-form-group label-for="user-id-attribute">
181 <template #label>
jason westoverd36ac8a2025-11-03 20:58:59 -0600182 {{ $t('pageLdap.form.userIdAttribute') }}
183 -
Yoshie Muranaka1c536592020-11-17 09:03:46 -0800184 <span class="form-text d-inline">
185 {{ $t('global.form.optional') }}
186 </span>
187 </template>
188 <b-form-input
189 id="user-id-attribute"
190 v-model="form.userIdAttribute"
191 data-test-id="ldap-input-userIdAttribute"
Surya Vde23ea22024-07-11 15:19:46 +0530192 @change="v$.form.userIdAttribute.$touch()"
Yoshie Muranaka1c536592020-11-17 09:03:46 -0800193 />
194 </b-form-group>
195 </b-col>
196 <b-col sm="6" xl="4">
197 <b-form-group label-for="group-id-attribute">
198 <template #label>
jason westoverd36ac8a2025-11-03 20:58:59 -0600199 {{ $t('pageLdap.form.groupIdAttribute') }}
200 -
Yoshie Muranaka1c536592020-11-17 09:03:46 -0800201 <span class="form-text d-inline">
202 {{ $t('global.form.optional') }}
203 </span>
204 </template>
205 <b-form-input
206 id="group-id-attribute"
207 v-model="form.groupIdAttribute"
208 data-test-id="ldap-input-groupIdAttribute"
Surya Vde23ea22024-07-11 15:19:46 +0530209 @change="v$.form.groupIdAttribute.$touch()"
Yoshie Muranaka1c536592020-11-17 09:03:46 -0800210 />
211 </b-form-group>
212 </b-col>
213 </b-row>
214 </b-col>
215 </b-row>
216 </b-form-group>
217 </div>
218 <b-row class="mt-4 mb-5">
219 <b-col>
220 <b-btn
221 variant="primary"
222 type="submit"
223 data-test-id="ldap-button-saveSettings"
224 :disabled="loading"
225 >
226 {{ $t('global.action.saveSettings') }}
227 </b-btn>
228 </b-col>
229 </b-row>
Yoshie Muranakac4e38ab2020-04-09 12:41:27 -0700230 </b-form>
231 </page-section>
Yoshie Muranakadc3d5412020-04-17 09:39:41 -0700232
233 <!-- Role groups -->
234 <page-section :section-title="$t('pageLdap.roleGroups')">
235 <table-role-groups />
236 </page-section>
Yoshie Muranakac4e38ab2020-04-09 12:41:27 -0700237 </b-container>
238</template>
239
240<script>
241import { mapGetters } from 'vuex';
242import { find } from 'lodash';
Ed Tanous7d6b44c2024-03-23 14:56:34 -0700243import { requiredIf } from '@vuelidate/validators';
244import { useVuelidate } from '@vuelidate/core';
Yoshie Muranakac4e38ab2020-04-09 12:41:27 -0700245
Yoshie Muranakae9a59c72020-04-30 12:16:30 -0700246import BVToastMixin from '@/components/Mixins/BVToastMixin';
247import VuelidateMixin from '@/components/Mixins/VuelidateMixin';
Yoshie Muranakad73f4962020-12-09 08:52:23 -0800248import LoadingBarMixin, { loading } from '@/components/Mixins/LoadingBarMixin';
Derick Montagued853fba2020-07-16 11:24:10 -0500249import InputPasswordToggle from '@/components/Global/InputPasswordToggle';
Yoshie Muranakac4e38ab2020-04-09 12:41:27 -0700250import PageTitle from '@/components/Global/PageTitle';
251import PageSection from '@/components/Global/PageSection';
252import InfoTooltip from '@/components/Global/InfoTooltip';
Yoshie Muranakadc3d5412020-04-17 09:39:41 -0700253import TableRoleGroups from './TableRoleGroups';
Surya Vde23ea22024-07-11 15:19:46 +0530254import { useI18n } from 'vue-i18n';
Yoshie Muranakac4e38ab2020-04-09 12:41:27 -0700255
256export default {
257 name: 'Ldap',
Yoshie Muranakadc3d5412020-04-17 09:39:41 -0700258 components: {
259 InfoTooltip,
260 InputPasswordToggle,
261 PageTitle,
262 PageSection,
Derick Montague602e98a2020-10-21 16:20:00 -0500263 TableRoleGroups,
Yoshie Muranakadc3d5412020-04-17 09:39:41 -0700264 },
Yoshie Muranakae9a59c72020-04-30 12:16:30 -0700265 mixins: [BVToastMixin, VuelidateMixin, LoadingBarMixin],
Derick Montague602e98a2020-10-21 16:20:00 -0500266 beforeRouteLeave(to, from, next) {
267 this.hideLoader();
268 next();
269 },
Ed Tanous7d6b44c2024-03-23 14:56:34 -0700270 setup() {
271 return {
272 v$: useVuelidate(),
273 };
274 },
Yoshie Muranakac4e38ab2020-04-09 12:41:27 -0700275 data() {
276 return {
Surya Vde23ea22024-07-11 15:19:46 +0530277 $t: useI18n().t,
Yoshie Muranakac4e38ab2020-04-09 12:41:27 -0700278 form: {
Yoshie Muranakadc3d5412020-04-17 09:39:41 -0700279 ldapAuthenticationEnabled: this.$store.getters['ldap/isServiceEnabled'],
Yoshie Muranakac4e38ab2020-04-09 12:41:27 -0700280 secureLdapEnabled: false,
Ed Tanous81323992024-02-27 11:26:24 -0800281 activeDirectoryEnabled:
282 this.$store.getters['ldap/isActiveDirectoryEnabled'],
Yoshie Muranakac4e38ab2020-04-09 12:41:27 -0700283 serverUri: '',
284 bindDn: '',
285 bindPassword: '',
286 baseDn: '',
287 userIdAttribute: '',
Derick Montague602e98a2020-10-21 16:20:00 -0500288 groupIdAttribute: '',
289 },
Surya Venkatesan1a814b92024-09-23 16:29:01 +0530290 loading,
Yoshie Muranakac4e38ab2020-04-09 12:41:27 -0700291 };
292 },
293 computed: {
Yoshie Muranakadc3d5412020-04-17 09:39:41 -0700294 ...mapGetters('ldap', [
295 'isServiceEnabled',
296 'isActiveDirectoryEnabled',
297 'ldap',
Derick Montague602e98a2020-10-21 16:20:00 -0500298 'activeDirectory',
Yoshie Muranakadc3d5412020-04-17 09:39:41 -0700299 ]),
Yoshie Muranakac4e38ab2020-04-09 12:41:27 -0700300 sslCertificates() {
Sandeepa Singhb4406162021-07-26 15:05:39 +0530301 return this.$store.getters['certificates/allCertificates'];
Yoshie Muranakac4e38ab2020-04-09 12:41:27 -0700302 },
303 caCertificateExpiration() {
304 const caCertificate = find(this.sslCertificates, {
Derick Montague602e98a2020-10-21 16:20:00 -0500305 type: 'TrustStore Certificate',
Yoshie Muranakac4e38ab2020-04-09 12:41:27 -0700306 });
307 if (caCertificate === undefined) return null;
308 return caCertificate.validUntil;
309 },
310 ldapCertificateExpiration() {
311 const ldapCertificate = find(this.sslCertificates, {
Derick Montague602e98a2020-10-21 16:20:00 -0500312 type: 'LDAP Certificate',
Yoshie Muranakac4e38ab2020-04-09 12:41:27 -0700313 });
314 if (ldapCertificate === undefined) return null;
315 return ldapCertificate.validUntil;
316 },
317 ldapProtocol() {
318 return this.form.secureLdapEnabled ? 'ldaps://' : 'ldap://';
Derick Montague602e98a2020-10-21 16:20:00 -0500319 },
Yoshie Muranakac4e38ab2020-04-09 12:41:27 -0700320 },
321 watch: {
Derick Montague602e98a2020-10-21 16:20:00 -0500322 isServiceEnabled: function (value) {
Yoshie Muranakac4e38ab2020-04-09 12:41:27 -0700323 this.form.ldapAuthenticationEnabled = value;
324 },
Derick Montague602e98a2020-10-21 16:20:00 -0500325 isActiveDirectoryEnabled: function (value) {
Yoshie Muranakadc3d5412020-04-17 09:39:41 -0700326 this.form.activeDirectoryEnabled = value;
327 this.setFormValues();
Derick Montague602e98a2020-10-21 16:20:00 -0500328 },
Yoshie Muranakac4e38ab2020-04-09 12:41:27 -0700329 },
330 validations: {
331 form: {
332 ldapAuthenticationEnabled: {},
333 secureLdapEnabled: {},
334 activeDirectoryEnabled: {
Derick Montague602e98a2020-10-21 16:20:00 -0500335 required: requiredIf(function () {
Yoshie Muranakac4e38ab2020-04-09 12:41:27 -0700336 return this.form.ldapAuthenticationEnabled;
Derick Montague602e98a2020-10-21 16:20:00 -0500337 }),
Yoshie Muranakac4e38ab2020-04-09 12:41:27 -0700338 },
339 serverUri: {
Derick Montague602e98a2020-10-21 16:20:00 -0500340 required: requiredIf(function () {
Yoshie Muranakac4e38ab2020-04-09 12:41:27 -0700341 return this.form.ldapAuthenticationEnabled;
Derick Montague602e98a2020-10-21 16:20:00 -0500342 }),
Yoshie Muranakac4e38ab2020-04-09 12:41:27 -0700343 },
344 bindDn: {
Derick Montague602e98a2020-10-21 16:20:00 -0500345 required: requiredIf(function () {
Yoshie Muranakac4e38ab2020-04-09 12:41:27 -0700346 return this.form.ldapAuthenticationEnabled;
Derick Montague602e98a2020-10-21 16:20:00 -0500347 }),
Yoshie Muranakac4e38ab2020-04-09 12:41:27 -0700348 },
349 bindPassword: {
Derick Montague602e98a2020-10-21 16:20:00 -0500350 required: requiredIf(function () {
Yoshie Muranakac4e38ab2020-04-09 12:41:27 -0700351 return this.form.ldapAuthenticationEnabled;
Derick Montague602e98a2020-10-21 16:20:00 -0500352 }),
Yoshie Muranakac4e38ab2020-04-09 12:41:27 -0700353 },
354 baseDn: {
Derick Montague602e98a2020-10-21 16:20:00 -0500355 required: requiredIf(function () {
Yoshie Muranakac4e38ab2020-04-09 12:41:27 -0700356 return this.form.ldapAuthenticationEnabled;
Derick Montague602e98a2020-10-21 16:20:00 -0500357 }),
Yoshie Muranakac4e38ab2020-04-09 12:41:27 -0700358 },
359 userIdAttribute: {},
Derick Montague602e98a2020-10-21 16:20:00 -0500360 groupIdAttribute: {},
361 },
Yoshie Muranakac4e38ab2020-04-09 12:41:27 -0700362 },
363 created() {
Yoshie Muranakae9a59c72020-04-30 12:16:30 -0700364 this.startLoader();
365 this.$store
366 .dispatch('ldap/getAccountSettings')
367 .finally(() => this.endLoader());
Sandeepa Singhd2422c42021-06-01 15:57:33 +0530368 this.$store
Sandeepa Singhb4406162021-07-26 15:05:39 +0530369 .dispatch('certificates/getCertificates')
Sandeepa Singhd2422c42021-06-01 15:57:33 +0530370 .finally(() => this.endLoader());
Yoshie Muranakadc3d5412020-04-17 09:39:41 -0700371 this.setFormValues();
Yoshie Muranakac4e38ab2020-04-09 12:41:27 -0700372 },
373 methods: {
Yoshie Muranakadc3d5412020-04-17 09:39:41 -0700374 setFormValues(serviceType) {
375 if (!serviceType) {
376 serviceType = this.isActiveDirectoryEnabled
377 ? this.activeDirectory
378 : this.ldap;
379 }
380 const {
381 serviceAddress = '',
382 bindDn = '',
383 baseDn = '',
384 userAttribute = '',
Derick Montague602e98a2020-10-21 16:20:00 -0500385 groupsAttribute = '',
Yoshie Muranakadc3d5412020-04-17 09:39:41 -0700386 } = serviceType;
Yoshie Muranakac4e38ab2020-04-09 12:41:27 -0700387 const secureLdap =
388 serviceAddress && serviceAddress.includes('ldaps://') ? true : false;
389 const serverUri = serviceAddress
390 ? serviceAddress.replace(/ldaps?:\/\//, '')
391 : '';
392 this.form.secureLdapEnabled = secureLdap;
393 this.form.serverUri = serverUri;
394 this.form.bindDn = bindDn;
395 this.form.bindPassword = '';
396 this.form.baseDn = baseDn;
397 this.form.userIdAttribute = userAttribute;
398 this.form.groupIdAttribute = groupsAttribute;
399 },
400 handleSubmit() {
Surya Venkatesan1a814b92024-09-23 16:29:01 +0530401 this.v$.form.$touch();
402 if (this.v$.form.$invalid) return;
Yoshie Muranakac4e38ab2020-04-09 12:41:27 -0700403 const data = {
404 serviceEnabled: this.form.ldapAuthenticationEnabled,
405 activeDirectoryEnabled: this.form.activeDirectoryEnabled,
406 serviceAddress: `${this.ldapProtocol}${this.form.serverUri}`,
407 bindDn: this.form.bindDn,
408 bindPassword: this.form.bindPassword,
409 baseDn: this.form.baseDn,
410 userIdAttribute: this.form.userIdAttribute,
Derick Montague602e98a2020-10-21 16:20:00 -0500411 groupIdAttribute: this.form.groupIdAttribute,
Yoshie Muranakac4e38ab2020-04-09 12:41:27 -0700412 };
Yoshie Muranakae9a59c72020-04-30 12:16:30 -0700413 this.startLoader();
Yoshie Muranakac4e38ab2020-04-09 12:41:27 -0700414 this.$store
415 .dispatch('ldap/saveAccountSettings', data)
Derick Montague602e98a2020-10-21 16:20:00 -0500416 .then((success) => {
Yoshie Muranakac4e38ab2020-04-09 12:41:27 -0700417 this.successToast(success);
Yoshie Muranakac4e38ab2020-04-09 12:41:27 -0700418 })
Sandeepa Singhd2422c42021-06-01 15:57:33 +0530419 .catch(({ message }) => {
420 this.errorToast(message);
421 })
Yoshie Muranakac4e38ab2020-04-09 12:41:27 -0700422 .finally(() => {
423 this.form.bindPassword = '';
Surya Vde23ea22024-07-11 15:19:46 +0530424 this.v$.form.$reset();
Yoshie Muranakae9a59c72020-04-30 12:16:30 -0700425 this.endLoader();
Yoshie Muranakac4e38ab2020-04-09 12:41:27 -0700426 });
427 },
428 onChangeServiceType(isActiveDirectoryEnabled) {
Surya Vde23ea22024-07-11 15:19:46 +0530429 this.v$.form.activeDirectoryEnabled.$touch();
Yoshie Muranakac4e38ab2020-04-09 12:41:27 -0700430 const serviceType = isActiveDirectoryEnabled
431 ? this.activeDirectory
432 : this.ldap;
Yoshie Muranakadc3d5412020-04-17 09:39:41 -0700433 // Set form values according to user selected
434 // service type
Yoshie Muranakac4e38ab2020-04-09 12:41:27 -0700435 this.setFormValues(serviceType);
436 },
437 onChangeldapAuthenticationEnabled(isServiceEnabled) {
Surya Vde23ea22024-07-11 15:19:46 +0530438 this.v$.form.ldapAuthenticationEnabled.$touch();
Yoshie Muranakac4e38ab2020-04-09 12:41:27 -0700439 if (!isServiceEnabled) {
440 // Request will fail if sent with empty values.
441 // The frontend only checks for required fields
442 // when the service is enabled. This is to prevent
443 // an error if a user clears any properties then
444 // disables the service.
Yoshie Muranakadc3d5412020-04-17 09:39:41 -0700445 this.setFormValues();
Yoshie Muranakac4e38ab2020-04-09 12:41:27 -0700446 }
Derick Montague602e98a2020-10-21 16:20:00 -0500447 },
448 },
Yoshie Muranakac4e38ab2020-04-09 12:41:27 -0700449};
450</script>