/** * Copyright (c) HashiCorp, Inc. * SPDX-License-Identifier: MPL-2.0 */ import Component from '@glimmer/component'; import { action } from '@ember/object'; import { inject as service } from '@ember/service'; import { tracked } from '@glimmer/tracking'; /** * @module SecretEditMetadata * * @example * ```js * * ``` * * @param {object} model - name of the current cluster, passed from the parent. * @param {string} mode - if the mode is create, show, edit. * @param {Function} [updateValidationErrorCount] - function on parent that handles disabling the save button. */ export default class SecretEditMetadata extends Component { @service router; @service store; @tracked validationErrorCount = 0; @tracked modelValidations; async save() { const model = this.args.model; try { await model.save(); } catch (e) { this.error = e; return; } this.router.transitionTo('vault.cluster.secrets.backend.metadata', this.args.model.id); } @action onSaveChanges(event) { event.preventDefault(); return this.save(); } @action onKeyUp(name, value) { let state = {}; if (value) { if (name === 'customMetadata') { // atypical case where property is not set on model on change - validate independently /* eslint-disable no-useless-escape */ const regex = /^[^\\]+$/g; // looking for a backward slash if (!value.match(regex)) { state[name] = { errors: ['Custom values cannot contain a backward slash.'], isValid: false, }; } } if (name === 'maxVersions') { this.args.model.maxVersions = value; state = this.args.model.validate().state; } } let count = 0; for (const key in state) { if (!state[key].isValid) { count++; } } this.modelValidations = state; this.validationErrorCount = count; // when mode is "update" this works, but on mode "create" we need to bubble up the count if (this.args.updateValidationErrorCount) { this.args.updateValidationErrorCount(this.validationErrorCount); } } }