* test: 💍 clean up worker filter component tests (#2559) * Icu 15741 add show filter generator toggle to worker filter component (#2562) * feat: 🎸 add filter generator to worker filter component ✅ Closes: https://hashicorp.atlassian.net/browse/ICU-15741 * feat: 🎸 show add worker filter when none set for targets (#2564) ✅ Closes: https://hashicorp.atlassian.net/browse/ICU-15760 * Icu 15743 tag workflow (#2565) * feat: 🎸 add tag generator workflow ✅ Closes: https://hashicorp.atlassian.net/browse/ICU-15743 * test: 💍 add test cases ✅ Closes: https://hashicorp.atlassian.net/browse/ICU-15743 * refactor: 💡 update selected type name to selectedGeneratorType ✅ Closes: https://hashicorp.atlassian.net/browse/ICU-15743 * Apply suggestions from code review minor translation change Co-authored-by: Lisbet Alvarez <107949262+lisbet-alvarez@users.noreply.github.com> * refactor: 💡 update id for generated-value ✅ Closes: https://hashicorp.atlassian.net/browse/ICU-15743 --------- Co-authored-by: Lisbet Alvarez <lisbet.alvarez@hashicorp.com> Co-authored-by: Lisbet Alvarez <107949262+lisbet-alvarez@users.noreply.github.com> * Icu 15744 name workflow (#2566) * feat: 🎸 add name workflow ✅ Closes: https://hashicorp.atlassian.net/browse/ICU-15744 * test: 💍 add "name" workflow tests for filter generator ✅ Closes: https://hashicorp.atlassian.net/browse/ICU-15744 * refactor: 💡 use const test selectors for filter generator ✅ Closes: https://hashicorp.atlassian.net/browse/ICU-15744 * refactor: 💡 add default option ✅ Closes: https://hashicorp.atlassian.net/browse/ICU-15744 * docs: ✏️ fix comment ✅ Closes: https://hashicorp.atlassian.net/browse/ICU-15744 --------- Co-authored-by: cameronperera <cameron.perera@hashicorp.com> * refactor: 💡 move worker filter generator outside of rose::form (#2574) * refactor: 💡 move worker filter generator outside of rose::form * [ICU-15718] Add worker filter route, template for empty state (#2576) * feat: 🎸 Vault Credential Store Worker Filter The Worker Filters tab will display the associated worker filter and have an empty state for when there is no worker filter assigned. * add template * Add missing copyright headers * update styling, remove Rose component * color primary is already default, remove * add rose component, remove custom css * fix test * singularize lang --------- Co-authored-by: laurenolivia <laurenolivia@users.noreply.github.com> * feat: 🎸 update worker filter field to use code editor (#2578) * feat: 🎸 update worker filter field to use code editor ✅ Closes: https://hashicorp.atlassian.net/browse/ICU-15737 * test: 💍 fix failing storage bucket tests ✅ Closes: https://hashicorp.atlassian.net/browse/ICU-15737 * test: 💍 update tests for new worker filter field (#2580) * test: 💍 update tests for new worker filter field ✅ Closes: https://hashicorp.atlassian.net/browse/ICU-15739 * Update ui/admin/tests/acceptance/storage-buckets/update-test.js Co-authored-by: Lisbet Alvarez <107949262+lisbet-alvarez@users.noreply.github.com> --------- Co-authored-by: Lisbet Alvarez <107949262+lisbet-alvarez@users.noreply.github.com> * [ICU-15719] Create edit worker filter route and template (#2582) * add codeblock to template * add cancel btn fn * add controller test * add save fn * display formatted worker filter text inside codeblock * move codeblock component outside rose::layout::centered * remove console.log * remove router.refresh() and refactor translations yaml * refactor translations, add breadcrumb::item * replace html elements with hds * move component, delete file * [ICU-15720] Add edit worker filter action to manage dropdown (#2593) * add acceptance test file * delete test file * add edit option to manage dropdown * update route in dropdown * add check for model isVault * add acceptance test file * delete test file * remove data test selectors, fix syntax * [ICU-15721] Remove worker filter input field (#2596) * remove worker filter input field from vault credential store form * revert yaml * [ICU-15838] Add vault credential store worker filter tests (#2595) * add data test elements * add subtests to update-test.js * add subtext to check for .hasText() * add subtest when worker filter exists * update subtest name * remove console.log * clean up * add new selectors * refactor: 💡 worker filter clean-up (#2592) * refactor: 💡 worker filter clean-up ✅ Closes: https://hashicorp.atlassian.net/browse/ICU-15816 * refactor: 💡 add aria labels & missing can save check ✅ Closes: https://hashicorp.atlassian.net/browse/ICU-15816 * refactor: 💡 pr feedback of using uuid ✅ Closes: https://hashicorp.atlassian.net/browse/ICU-15816 * Add missing copyright headers * refactor: 💡 use unique-id helper for aria labels (pr feedback) ✅ Closes: https://hashicorp.atlassian.net/browse/ICU-15816 --------- Co-authored-by: lisbet-alvarez <lisbet-alvarez@users.noreply.github.com> * refactor: 💡 update icon logic for egress worker filter (#2612) * refactor: 💡 update worker_filter help translation * refactor: 💡 add maxHeight to worker filter code blocks * refactor: 💡 use existing default option for dropdowns * refactor: 💡 hide copy button when no result to copy and remove unused styles --------- Co-authored-by: Lisbet Alvarez <107949262+lisbet-alvarez@users.noreply.github.com> Co-authored-by: Lisbet Alvarez <lisbet.alvarez@hashicorp.com> Co-authored-by: Lauren <lauren.burwell@hashicorp.com> Co-authored-by: laurenolivia <laurenolivia@users.noreply.github.com> Co-authored-by: lisbet-alvarez <lisbet-alvarez@users.noreply.github.com>
157 lines
3.9 KiB
JavaScript
157 lines
3.9 KiB
JavaScript
/**
|
|
* Copyright (c) HashiCorp, Inc.
|
|
* SPDX-License-Identifier: BUSL-1.1
|
|
*/
|
|
|
|
import Controller from '@ember/controller';
|
|
import { inject as service } from '@ember/service';
|
|
import { action } from '@ember/object';
|
|
import { tracked } from '@glimmer/tracking';
|
|
import { loading } from 'ember-loading';
|
|
import { confirm } from 'core/decorators/confirm';
|
|
import { debounce } from 'core/decorators/debounce';
|
|
import { notifySuccess, notifyError } from 'core/decorators/notify';
|
|
import { TYPES_CREDENTIAL_STORE } from 'api/models/credential-store';
|
|
|
|
export default class ScopesScopeCredentialStoresIndexController extends Controller {
|
|
// =services
|
|
|
|
@service can;
|
|
@service router;
|
|
@service intl;
|
|
|
|
// =attributes
|
|
|
|
queryParams = ['search', { types: { type: 'array' } }, 'page', 'pageSize'];
|
|
|
|
@tracked search;
|
|
@tracked types = [];
|
|
@tracked page = 1;
|
|
@tracked pageSize = 10;
|
|
|
|
get credStoreTypeOptions() {
|
|
return TYPES_CREDENTIAL_STORE.map((type) => ({
|
|
id: type,
|
|
name: this.intl.t(`resources.credential-store.types.${type}`),
|
|
}));
|
|
}
|
|
|
|
get filters() {
|
|
return {
|
|
allFilters: { types: this.credStoreTypeOptions },
|
|
selectedFilters: { types: this.types },
|
|
};
|
|
}
|
|
|
|
// =actions
|
|
|
|
/**
|
|
* Handle save
|
|
* @param {CredentialStoreModel} credentialStore
|
|
*/
|
|
@action
|
|
@loading
|
|
@notifyError(({ message }) => message)
|
|
@notifySuccess('notifications.save-success')
|
|
async save(credentialStore) {
|
|
await credentialStore.save();
|
|
if (this.can.can('read model', credentialStore)) {
|
|
await this.router.transitionTo(
|
|
'scopes.scope.credential-stores.credential-store',
|
|
credentialStore,
|
|
);
|
|
} else {
|
|
await this.router.transitionTo('scopes.scope.credential-stores');
|
|
}
|
|
await this.router.refresh();
|
|
}
|
|
|
|
/**
|
|
* Rollback changes on credential stores.
|
|
* @param {CredentialStoreModel} credentialStore
|
|
*/
|
|
@action
|
|
async cancel(credentialStore) {
|
|
const { isNew } = credentialStore;
|
|
credentialStore.rollbackAttributes();
|
|
if (isNew) {
|
|
this.router.transitionTo('scopes.scope.credential-stores');
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Deletes the credential store and redirects to index
|
|
* @param {CredentialStoreModel} credentialStore
|
|
*/
|
|
@action
|
|
@loading
|
|
@confirm('questions.delete-confirm')
|
|
@notifyError(({ message }) => message, { catch: true })
|
|
@notifySuccess('notifications.delete-success')
|
|
async delete(credentialStore) {
|
|
await credentialStore.destroyRecord();
|
|
this.router.replaceWith('scopes.scope.credential-stores');
|
|
await this.router.refresh();
|
|
}
|
|
|
|
/**
|
|
* Update type of credential store
|
|
* @param {string} type
|
|
*/
|
|
@action
|
|
async changeType(type) {
|
|
await this.router.replaceWith({ queryParams: { type } });
|
|
}
|
|
|
|
/**
|
|
* Handles input on each keystroke and the search queryParam
|
|
* @param {object} event
|
|
*/
|
|
@action
|
|
@debounce(250)
|
|
handleSearchInput(event) {
|
|
const { value } = event.target;
|
|
this.search = value;
|
|
this.page = 1;
|
|
}
|
|
|
|
/**
|
|
* Sets a query param to the value of selectedItems
|
|
* and resets the page to 1.
|
|
* @param {string} paramKey
|
|
* @param {[string]} selectedItems
|
|
*/
|
|
@action
|
|
applyFilter(paramKey, selectedItems) {
|
|
this[paramKey] = [...selectedItems];
|
|
this.page = 1;
|
|
}
|
|
|
|
/**
|
|
* Save worker filter
|
|
* @param {CredentialStoreModel} credentialStore
|
|
*/
|
|
@action
|
|
@loading
|
|
@notifyError(({ message }) => message, { catch: true })
|
|
@notifySuccess('notifications.add-success')
|
|
async saveWorkerFilter(credentialStore) {
|
|
await credentialStore.save();
|
|
await this.router.replaceWith(
|
|
'scopes.scope.credential-stores.credential-store.worker-filter',
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Cancel adding or editing a worker filter
|
|
* @param {CredentialStoreModel} credentialStore
|
|
*/
|
|
@action
|
|
async cancelWorkerFilter(credentialStore) {
|
|
credentialStore.rollbackAttributes();
|
|
await this.router.replaceWith(
|
|
'scopes.scope.credential-stores.credential-store.worker-filter',
|
|
);
|
|
}
|
|
}
|