08d97a19ca
* ui: Toggle for `read-only` view (#16279) * ui: model update for specification * style: add styling for select * style: add styling for select * refact: add spec to view * refact: update component API * test: refactor for new UI state * refact: clean conditional * refact: update component API for prop * chore: correct naming * chore: remove `fn` helper Co-authored-by: Phil Renaud <phil.renaud@hashicorp.com> * update `default` Mirage scenario (#16496) * chore: update mirage scenario: * ui: conditionally render toggle button (#16497) * chore: update css variable name (#16498) --------- Co-authored-by: Phil Renaud <phil.renaud@hashicorp.com> * ui: Display JSON view of variables associated to job specification (#16570) * chore: move fixture to util * chore: update tests: * ui: display variables table * chore: add mirage fixture (#16572) * ui: regex for job spec parse (#16668) * ui: remove variable table (#16670) * ui: notify user if specification has variables (#16671) * ui: regex for job spec parse * chore: deprecate variable references * chore: update mirage * ui: add notification * test: add test coverage for parse method (#16590) * refact: `JobEditor` reactive query parameters (#16710) * refact: add query parameter * refact: move toggle action to controller * ui: remove toggle behavior in `JobEditor` (#16711) * refact: rename logic for select * chore: instantiate qp in route * refact: uniform alerts (#16715) * style: buffer between alert and header * refact: extract alerts into a component * chore: update tests for qp * chore: defensive logic for app controller * refact: move `edit` state to controller (#16725) * refact: move edit state to controller * refact: handle edit state (#16731) * refact: handle edit state * ui: warning message (#16732) * ui: warning message * ui: enable editing of HCL vars in the UI (#16734) * enable editing of HCL vars * refact: default qp logic * refact: alert condition * refact: Pass `variables` as string (#16849) * ui: Toggle for `read-only` view (#16279) * ui: model update for specification * style: add styling for select * style: add styling for select * refact: add spec to view * refact: update component API * test: refactor for new UI state * refact: clean conditional * refact: update component API for prop * chore: correct naming * chore: remove `fn` helper Co-authored-by: Phil Renaud <phil.renaud@hashicorp.com> * update `default` Mirage scenario (#16496) * chore: update mirage scenario: * ui: conditionally render toggle button (#16497) * chore: update css variable name (#16498) --------- Co-authored-by: Phil Renaud <phil.renaud@hashicorp.com> * refact: `JobEditor` reactive query parameters (#16710) * refact: add query parameter * refact: move toggle action to controller * ui: remove toggle behavior in `JobEditor` (#16711) * refact: rename logic for select * chore: instantiate qp in route * refact: uniform alerts (#16715) * style: buffer between alert and header * refact: extract alerts into a component * chore: update tests for qp * chore: defensive logic for app controller * refact: move `edit` state to controller (#16725) * refact: move edit state to controller * refact: handle edit state (#16731) * refact: handle edit state * ui: warning message (#16732) * ui: warning message * ui: enable editing of HCL vars in the UI (#16734) * enable editing of HCL vars * refact: default qp logic * refact: alert condition * refact: variables as string * style: revert styling change --------- Co-authored-by: Phil Renaud <phil.renaud@hashicorp.com> * bug: correctly edit variables (#16989) * ui: visualize variables (#16987) * ui: fetchRawSpecification * refact: integrate new model method * test: fetchRaw unit * styling: enable height on cm * chore: update copy * feat: visual variables * chore: conditional render info txt * refact: add mirage endpoint * refact: update test for new schema * refact: job submit flow (#17015) * refact: job update logic * chore: remove dead code * bug: update `job.run` and `job.update` adapter methods (#17055) * refact: update adapter * chore: update api usage * styling: UX requests (#17064) * refact: update adapter * chore: update api usage * styling: disable toggle w text * styling: stick button * style: space out alerts * chore: autofocus on first editor * bug: dismiss alert * chore: add jsdoc and assertion check * chore: update mirage for Vercel (#17054) * chore: mirage logic for vercel deploy * chore: update test for mirage change * refact: API refactoring (#17083) * refact: udpate for req schema * refact: update for variable flags and literal * bug: visualize job model not derived state * chore: update copy * chore: fix incorrect copy * chore: deprecate variables derived state * chore: update copy * feat: enable toggle on edit * chore: prettify * refact: move conditional --------- Co-authored-by: Phil Renaud <phil.renaud@hashicorp.com>
81 lines
2.2 KiB
JavaScript
81 lines
2.2 KiB
JavaScript
/**
|
|
* Copyright (c) HashiCorp, Inc.
|
|
* SPDX-License-Identifier: MPL-2.0
|
|
*/
|
|
|
|
import { action } from '@ember/object';
|
|
import { bind } from '@ember/runloop';
|
|
import codemirror from 'codemirror';
|
|
import Modifier from 'ember-modifier';
|
|
|
|
import 'codemirror/addon/edit/matchbrackets';
|
|
import 'codemirror/addon/selection/active-line';
|
|
import 'codemirror/addon/lint/lint.js';
|
|
import 'codemirror/addon/lint/json-lint.js';
|
|
import 'codemirror/mode/javascript/javascript';
|
|
import 'codemirror/mode/ruby/ruby';
|
|
|
|
export default class CodeMirrorModifier extends Modifier {
|
|
get autofocus() {
|
|
if (Object.hasOwn({ ...this.args.named }, 'autofocus')) {
|
|
// spread (...) because proxy, and because Ember over-eagerly prevents named prop lookups for modifier args.
|
|
return this.args.named.autofocus;
|
|
} else {
|
|
return !this.args.named.readOnly;
|
|
}
|
|
}
|
|
|
|
didInstall() {
|
|
this._setup();
|
|
}
|
|
|
|
didUpdateArguments() {
|
|
this._editor.setOption('readOnly', this.args.named.readOnly);
|
|
if (!this.args.named.content) {
|
|
return;
|
|
}
|
|
if (this._editor.getValue() !== this.args.named.content) {
|
|
this._editor.setValue(this.args.named.content);
|
|
}
|
|
}
|
|
|
|
@action
|
|
_onChange(editor) {
|
|
this.args.named.onUpdate(
|
|
editor.getValue(),
|
|
this._editor,
|
|
this.args.named.type
|
|
);
|
|
}
|
|
|
|
_setup() {
|
|
if (this.element) {
|
|
const editor = codemirror(this.element, {
|
|
gutters: this.args.named.gutters || ['CodeMirror-lint-markers'],
|
|
matchBrackets: true,
|
|
lint: { lintOnChange: true },
|
|
showCursorWhenSelecting: true,
|
|
styleActiveLine: true,
|
|
tabSize: 2,
|
|
// all values we can pass into the modifier
|
|
extraKeys: this.args.named.extraKeys || '',
|
|
lineNumbers: this.args.named.lineNumbers || true,
|
|
mode: this.args.named.mode || 'application/json',
|
|
readOnly: this.args.named.readOnly || false,
|
|
theme: this.args.named.theme || 'hashi',
|
|
value: this.args.named.content || '',
|
|
viewportMargin: this.args.named.viewportMargin || '',
|
|
screenReaderLabel: this.args.named.screenReaderLabel || '',
|
|
});
|
|
|
|
if (this.autofocus) {
|
|
editor.focus();
|
|
}
|
|
|
|
editor.on('change', bind(this, this._onChange));
|
|
|
|
this._editor = editor;
|
|
}
|
|
}
|
|
}
|