From e0b80b1176f944cc94a2c9f3d900e45c9f372ff7 Mon Sep 17 00:00:00 2001 From: Cameron Perera Date: Wed, 13 May 2026 17:24:28 -0500 Subject: [PATCH] =?UTF-8?q?refactor:=20=F0=9F=92=A1=20update=20pinned=20ID?= =?UTF-8?q?s=20logic=20for=20actions=20table=20(#3269)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * chore: 🤖 Add initial page layout for code editor + sidebar (#3180) * chore: 🤖 Add initial page layout for code editor + sidebar * test: 💍 add missing a11y ignores for exisitng color issue ✅ Closes: https://hashicorp.atlassian.net/browse/ICU-18460 * Replace `Rose::CodeEditor` with `Hds::CodeEditor` (#2679) * chore: 🤖 replace Rose::CodeEditor with Hds::CodeEditor - Remove CodeEditor 5 dependency * chore: 🤖 Replace CodeMirror5 dep remove CodeMirror5 and replace existing editors with HDS::CodeEditor * chore: 🤖 deleting old codeeditor styles * feat: 🎸 changing code editor changing code editor ✅ Closes: 0 * removed unused export * pr cleanup * updating tests for new code editor * responding to PR feedback * added whitespace * fixing linting violations * chore: 🤖 self-review PR self-review PR in the course of switching to new HDS code editor * fix: 🐛 fix linting bug * fix: 🐛 unneeded dependency remove jslint dependency as this is handled in the new code editor from HDS * fix: 🐛 Fixing import bug Fix import bug caused by importing scss modules that no longer exist * Fix and refactor code editor acceptance test * Fix and refactor code editor acceptance test * chore: 🤖 remove codemirror dependency * refactor: 💡 fix merge conflict issues * test: 💍 update e2e test selectors * test: 💍 fix target spec click event * refactor: 💡 clean up test selectors for code editor * refactor: 💡 clean up storage bucket test selectors * chore: 🤖 remove code mirror modifiers --------- Co-authored-by: calcaide Co-authored-by: cameronperera * feat: 🎸 Create string formats component (#3191) * feat: 🎸 Create string formats component * Add missing copyright headers * fix: 🐛 change to readonly ✅ Closes: https://hashicorp.atlassian.net/browse/ICU-18458 * feat: 🎸 add grant schema to mirage (#3196) * feat: 🎸 add grant schema to mirage * refactor: 💡 update grant schema mirage data * refactor: 💡 fix route name in mirage * feat: 🎸 add export options flyout (#3198) * feat: 🎸 add export options flyout * fix: 🐛 update id to be ids * test: 💍 add a11y ignores * test: 💍 fix tests for grant string format ✅ Closes: https://hashicorp.atlassian.net/browse/ICU-18524 * feat: 🎸 Add autocompletion to code editor (#3207) * feat: 🎸 Add CSP nonce to code editors (#3230) Co-authored-by: Zhihe Li * feat: 🎸 Add linting to code editor (#3211) * feat: 🎸 Add linting to code editor * refactor: 💡 add missing case for wildcard type & ids field * refactor: 💡 simplify condition + add more tests * refactor: 💡 cleanup ids validation logic and add more lint erro * refactor: 💡 simplify logic and add actions linting cases * feat: 🎸 Add autocompletion to code editor (#3207) * refactor: 💡 apply PR feedback * refactor: 💡 PR feedback * refactor: 💡 add noop action * fix: 🐛 noop should not be suggested with resource type format ✅ Closes: https://hashicorp.atlassian.net/browse/ICU-18462 --------- Co-authored-by: Zhihe Li * Icu 18506 load resource IDs for autocomplete (#3247) * feat: 🎸 Add id auto completion * style: 💄 Fix code editor styling for dark mode * feat: 🎸 Add optimization for caching sqlite data ✅ Closes: https://hashicorp.atlassian.net/browse/ICU-18506 * refactor: 💡 Update string formats to use select + add options (#3256) * refactor: 💡 Update string formats to use select + add options * refactor: 💡 PR feedback * test: 💍 fix tests ✅ Closes: https://hashicorp.atlassian.net/browse/ICU-18983 * refactor: 💡 role grants tab to use code block (#3261) * refactor: 💡 grants tab to use code block * refactor: 💡 update getter comment * test: 💍 fix tests * refactor: 💡 remove language arg for codeblock ✅ Closes: https://hashicorp.atlassian.net/browse/ICU-18757 * Grant actions card (#3246) * chore: 🤖 Add initial page layout for code editor + sidebar (#3180) * chore: 🤖 Add initial page layout for code editor + sidebar * test: 💍 add missing a11y ignores for exisitng color issue ✅ Closes: https://hashicorp.atlassian.net/browse/ICU-18460 * Replace `Rose::CodeEditor` with `Hds::CodeEditor` (#2679) * chore: 🤖 replace Rose::CodeEditor with Hds::CodeEditor - Remove CodeEditor 5 dependency * chore: 🤖 Replace CodeMirror5 dep remove CodeMirror5 and replace existing editors with HDS::CodeEditor * chore: 🤖 deleting old codeeditor styles * feat: 🎸 changing code editor changing code editor ✅ Closes: 0 * removed unused export * pr cleanup * updating tests for new code editor * responding to PR feedback * added whitespace * fixing linting violations * chore: 🤖 self-review PR self-review PR in the course of switching to new HDS code editor * fix: 🐛 fix linting bug * fix: 🐛 unneeded dependency remove jslint dependency as this is handled in the new code editor from HDS * fix: 🐛 Fixing import bug Fix import bug caused by importing scss modules that no longer exist * Fix and refactor code editor acceptance test * Fix and refactor code editor acceptance test * chore: 🤖 remove codemirror dependency * refactor: 💡 fix merge conflict issues * test: 💍 update e2e test selectors * test: 💍 fix target spec click event * refactor: 💡 clean up test selectors for code editor * refactor: 💡 clean up storage bucket test selectors * chore: 🤖 remove code mirror modifiers --------- Co-authored-by: calcaide Co-authored-by: cameronperera * feat: 🎸 Create string formats component (#3191) * feat: 🎸 Create string formats component * Add missing copyright headers * fix: 🐛 change to readonly ✅ Closes: https://hashicorp.atlassian.net/browse/ICU-18458 * feat: 🎸 add grant schema to mirage (#3196) * feat: 🎸 add grant schema to mirage * refactor: 💡 update grant schema mirage data * refactor: 💡 fix route name in mirage * feat: 🎸 add export options flyout (#3198) * feat: 🎸 add export options flyout * fix: 🐛 update id to be ids * test: 💍 add a11y ignores * test: 💍 fix tests for grant string format ✅ Closes: https://hashicorp.atlassian.net/browse/ICU-18524 * feat: 🎸 Add autocompletion to code editor (#3207) * feat: 🎸 create grant actions component * feat: 🎸 add description to actions * feat: 🎸 update default logic to not show all actions * feat: 🎸 show invalid id and type message * test: 💍 create const for test selectors * feat: 🎸 trigger action suggestion when cursor moves * refactor: 💡 add createGrantLineHelpers func * refactor: 💡 small refactors * feat: 🎸 Add CSP nonce to code editors (#3230) Co-authored-by: Zhihe Li * refactor: 💡 small refactor * test: 💍 add more tests * refactor: 💡 fix merge conflicts issues * refactor: 💡 updates from PR feedback * refactor: 💡 updates for completions and linting * test: 💍 fix test issue with translations * test: 💍 fix test issue that was already fixed once * refactor: 💡 address PR feedback --------- Co-authored-by: Lisbet Alvarez <107949262+lisbet-alvarez@users.noreply.github.com> Co-authored-by: Zack Moore Co-authored-by: calcaide Co-authored-by: Zhihe Li Co-authored-by: Bharath Gajjala <120367134+bgajjala8@users.noreply.github.com> * refactor: 💡 update pinned IDs logic for actions table * refactor: 💡 use if/else in place of complex ternary * refactor: 💡 user intl.formatList --------- Co-authored-by: Lisbet Alvarez <107949262+lisbet-alvarez@users.noreply.github.com> Co-authored-by: Zack Moore Co-authored-by: calcaide Co-authored-by: Zhihe Li Co-authored-by: Bharath Gajjala <120367134+bgajjala8@users.noreply.github.com> --- addons/core/translations/resources/en-us.yaml | 14 ++++++----- .../app/components/grant-actions/index.js | 9 ++++++- ui/admin/app/utils/grant-completions.js | 24 ++++++++++++------- 3 files changed, 32 insertions(+), 15 deletions(-) diff --git a/addons/core/translations/resources/en-us.yaml b/addons/core/translations/resources/en-us.yaml index e4119f53d..6cc9cc3f0 100644 --- a/addons/core/translations/resources/en-us.yaml +++ b/addons/core/translations/resources/en-us.yaml @@ -758,13 +758,13 @@ role: id-actions: ID Actions create: Create a new {resourceType} list: List all {resourceType} resources - read: Read a {resourceType} - update: Update a {resourceType} - delete: Delete a {resourceType} + read: Read {article} {resourceType} + update: Update {article} {resourceType} + delete: Delete {article} {resourceType} read:self: Read the {resourceType} associated with the current user - delete:self: Delete a {resourceType} associated with the current user - cancel: Cancel a {resourceType} - cancel:self: Cancel a {resourceType} associated with the current user + delete:self: Delete {article} {resourceType} associated with the current user + cancel: Cancel {article} {resourceType} + cancel:self: Cancel {article} {resourceType} associated with the current user generic: create: Creates resources list: Lists resources @@ -773,6 +773,8 @@ role: delete: Deletes resources read:self: Read the resource associated with the current user delete:self: Delete a resource associated with the current user + cancel: Cancels resources + cancel:self: Cancel a resource associated with the current user add-members: Add members to a group set-members: Set the full list of members on a group remove-members: Remove members from a group diff --git a/ui/admin/app/components/grant-actions/index.js b/ui/admin/app/components/grant-actions/index.js index 18191cc46..9d703c574 100644 --- a/ui/admin/app/components/grant-actions/index.js +++ b/ui/admin/app/components/grant-actions/index.js @@ -53,7 +53,14 @@ export default class GrantActionsIndex extends Component { const genericKey = `resources.role.edit-grants.actions.generic.${action}`; if (detectedResourceType && this.intl.exists(specificKey)) { - return this.intl.t(specificKey, { resourceType: detectedResourceType }); + const resourceType = Array.isArray(detectedResourceType) + ? this.intl.formatList(detectedResourceType, { type: 'disjunction' }) + : detectedResourceType; + // Determine the appropriate article ("a" or "an") to use based on the + // detected resource type. "user" is a special case that uses "a" instead + // of "an" because it's pronounced "you" so I don't include it below. + const article = /^[aeio]/i.test(resourceType) ? 'an' : 'a'; + return this.intl.t(specificKey, { resourceType, article }); } if (this.intl.exists(genericKey)) { diff --git a/ui/admin/app/utils/grant-completions.js b/ui/admin/app/utils/grant-completions.js index 0ad07ffce..9abf0d56f 100644 --- a/ui/admin/app/utils/grant-completions.js +++ b/ui/admin/app/utils/grant-completions.js @@ -290,21 +290,29 @@ export const analyzeGrantString = (grantsSchema, grantString = '') => { schema.childResourceTypesByParentType[compatibleIdsResourceType] ?? [] ).includes(typeValue); - const detectedResourceType = - typeValue && typeValue !== '*' - ? typeValue - : idsValue - ? getCompatibleResourceTypeForIds(schema, idsValue) - : null; + let detectedResourceType = null; + if (typeValue && typeValue !== '*') { + // Explicit type specified, use it directly + detectedResourceType = typeValue; + } else if (compatibleIdsResourceType && typeValue === '*') { + // Pinned IDs with wildcard type, return the child resource types + const childTypes = + schema.childResourceTypesByParentType[compatibleIdsResourceType] ?? []; + detectedResourceType = childTypes.length ? childTypes : null; + } else if (typeValue !== '*' && idsValue) { + // No type field, infer resource type from the ID prefix + detectedResourceType = getCompatibleResourceTypeForIds(schema, idsValue); + } - const isBothWildcard = idsValue === '*' && typeValue === '*'; + const hasWildcardIds = idsValue === '*'; + const crudlOnly = hasWildcardIds && !hasExplicitType; const actions = idsValue || typeValue ? getActionOptions(schema, typeValue, idsValue) .filter( (action) => - action !== '*' && (!isBothWildcard || CRUDL_ACTIONS.has(action)), + action !== '*' && (!crudlOnly || CRUDL_ACTIONS.has(action)), ) .sort((left, right) => left.localeCompare(right)) : [];