mirror of
https://github.com/hashicorp/vault.git
synced 2025-08-22 15:11:07 +02:00
* Completed initial replacement of editor * fixing ts issues * removing codemirror modifier and deps * working on replacing the code editor * addressing linting concerns * cleaning up policy-form editor * fixing linting issues * fixing linting issues * fixing tests * fixing tests * fixing tests * fixing tests * fixing failing tests * cleaning up PR * fixing tests * remove outdated message for navigating editor * fix linting in tests * add changelog * fix tests * update naming * remove unused lint param + name changes * update test selector usage * update test selector usage * update test selector usage * lint fixes * replace page object selectors * lint fix * fix lint * fix lint after merge * update tests * remove import --------- Co-authored-by: Lane Wetmore <lane.wetmore@hashicorp.com>
97 lines
2.7 KiB
TypeScript
97 lines
2.7 KiB
TypeScript
/**
|
|
* Copyright (c) HashiCorp, Inc.
|
|
* SPDX-License-Identifier: BUSL-1.1
|
|
*/
|
|
|
|
import Component from '@glimmer/component';
|
|
import { service } from '@ember/service';
|
|
import { action } from '@ember/object';
|
|
import { tracked } from '@glimmer/tracking';
|
|
import { stringify } from 'core/helpers/stringify';
|
|
|
|
import type ApiService from 'vault/services/api';
|
|
import type FlashMessageService from 'vault/services/flash-messages';
|
|
import type { TtlEvent } from 'vault/app-types';
|
|
import type { HTMLElementEvent } from 'vault/forms';
|
|
|
|
/**
|
|
* @module ToolsWrap
|
|
* ToolsWrap components are components that sys/wrapping/wrap functionality.
|
|
*
|
|
* @example
|
|
* <Tools::Wrap />
|
|
*/
|
|
|
|
export default class ToolsWrap extends Component {
|
|
@service declare readonly api: ApiService;
|
|
@service declare readonly flashMessages: FlashMessageService;
|
|
|
|
@tracked hasLintingErrors = false;
|
|
@tracked token = '';
|
|
@tracked wrapTTL = '';
|
|
@tracked wrapData = null;
|
|
@tracked errorMessage = '';
|
|
@tracked showJson = true;
|
|
|
|
get startingValue() {
|
|
// must pass the third param called "space" in JSON.stringify to structure object with whitespace
|
|
// otherwise the following codemirror modifier check will pass `this._editor.getValue() !== namedArgs.content` and _setValue will be called.
|
|
// the method _setValue moves the cursor to the beginning of the text field.
|
|
// the effect is that the cursor jumps after the first key input.
|
|
return stringify([{ '': '' }], { skipFormat: false });
|
|
}
|
|
|
|
get stringifiedWrapData() {
|
|
return this.wrapData ? stringify([this.wrapData], { skipFormat: false }) : this.startingValue;
|
|
}
|
|
|
|
@action
|
|
handleToggle() {
|
|
this.showJson = !this.showJson;
|
|
this.hasLintingErrors = false;
|
|
}
|
|
|
|
@action
|
|
reset(clearData = true) {
|
|
this.token = '';
|
|
this.errorMessage = '';
|
|
this.wrapTTL = '';
|
|
this.hasLintingErrors = false;
|
|
if (clearData) this.wrapData = null;
|
|
}
|
|
|
|
@action
|
|
updateTtl(evt: TtlEvent) {
|
|
if (!evt) return;
|
|
this.wrapTTL = evt.enabled ? `${evt.seconds}s` : '30m';
|
|
}
|
|
|
|
@action
|
|
editorUpdated(val: string) {
|
|
this.hasLintingErrors = false;
|
|
|
|
try {
|
|
this.wrapData = JSON.parse(val);
|
|
} catch {
|
|
this.hasLintingErrors = true;
|
|
}
|
|
}
|
|
|
|
@action
|
|
async handleSubmit(evt: HTMLElementEvent<HTMLFormElement>) {
|
|
evt.preventDefault();
|
|
|
|
const data = this.wrapData || {};
|
|
const wrap = this.wrapTTL || '';
|
|
|
|
try {
|
|
const { wrap_info } = await this.api.sys.wrap(data, this.api.buildHeaders({ wrap }));
|
|
this.token = wrap_info?.token || '';
|
|
this.flashMessages.success('Wrap was successful.');
|
|
} catch (error) {
|
|
const { message } = await this.api.parseError(error);
|
|
this.errorMessage = message;
|
|
}
|
|
}
|
|
}
|