diff --git a/addons/core/translations/form/en-us.yaml b/addons/core/translations/form/en-us.yaml index 8f602a0932..e140dc39e8 100644 --- a/addons/core/translations/form/en-us.yaml +++ b/addons/core/translations/form/en-us.yaml @@ -186,3 +186,8 @@ other_fields: help: This information is provided by the server and cannot be edited in Boundary worker_filter: label: Worker Filter +variable-time-field: + days: Days + hours: Hours + minutes: Minutes + set-to-max: Set to Max diff --git a/addons/rose/package.json b/addons/rose/package.json index 6314579664..56e010139b 100644 --- a/addons/rose/package.json +++ b/addons/rose/package.json @@ -30,7 +30,7 @@ }, "dependencies": { "@babel/core": "^7.26.10", - "@hashicorp/design-system-components": "^4.20.2", + "@hashicorp/design-system-components": "^4.24.1", "@hashicorp/design-system-tokens": "^2.3.0", "@hashicorp/flight-icons": "^3.10.0", "@nullvoxpopuli/ember-composable-helpers": "^5.2.10", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9d979f5630..ca0eb18f50 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -541,8 +541,8 @@ importers: specifier: ^7.26.10 version: 7.27.1 '@hashicorp/design-system-components': - specifier: ^4.20.2 - version: 4.20.2(@babel/core@7.27.1)(@ember/test-helpers@5.2.2(@babel/core@7.27.1)(@glint/template@1.5.2))(@glimmer/component@2.0.0)(@glint/template@1.5.2)(ember-basic-dropdown@8.6.1(@babel/core@7.27.1)(@ember/string@3.1.1)(@ember/test-helpers@5.2.2(@babel/core@7.27.1)(@glint/template@1.5.2))(@glimmer/component@2.0.0)(@glint/template@1.5.2)(ember-source@5.12.0(@glimmer/component@2.0.0)(@glint/template@1.5.2)(rsvp@4.8.5)(webpack@5.99.8)))(ember-source@5.12.0(@glimmer/component@2.0.0)(@glint/template@1.5.2)(rsvp@4.8.5)(webpack@5.99.8)) + specifier: ^4.24.1 + version: 4.24.1(@babel/core@7.27.1)(@ember/string@4.0.1)(@ember/test-helpers@5.2.2(@babel/core@7.27.1)(@glint/template@1.5.2))(@glimmer/component@2.0.0)(@glint/template@1.5.2)(ember-basic-dropdown@8.6.1(@babel/core@7.27.1)(@ember/string@4.0.1)(@ember/test-helpers@5.2.2(@babel/core@7.27.1)(@glint/template@1.5.2))(@glimmer/component@2.0.0)(@glint/template@1.5.2)(ember-source@5.12.0(@glimmer/component@2.0.0)(@glint/template@1.5.2)(rsvp@4.8.5)(webpack@5.99.8)))(ember-source@5.12.0(@glimmer/component@2.0.0)(@glint/template@1.5.2)(rsvp@4.8.5)(webpack@5.99.8)) '@hashicorp/design-system-tokens': specifier: ^2.3.0 version: 2.3.0 @@ -2050,10 +2050,6 @@ packages: '@glint/template': optional: true - '@ember/string@3.1.1': - resolution: {integrity: sha512-UbXJ+k3QOrYN4SRPHgXCqYIJ+yWWUg1+vr0H4DhdQPTy8LJfyqwZ2tc5uqpSSnEXE+/1KopHBE5J8GDagAg5cg==} - engines: {node: 12.* || 14.* || >= 16} - '@ember/string@4.0.1': resolution: {integrity: sha512-VWeng8BSWrIsdPfffOQt/bKwNKJL7+37gPFh/6iZZ9bke+S83kKqkS30poo4bTGfRcMnvAE0ie7txom+iDu81Q==} @@ -2089,6 +2085,15 @@ packages: '@glint/template': optional: true + '@embroider/macros@1.19.4': + resolution: {integrity: sha512-x4wrnkE6fPN6mOyJeJv2I+lpKE2pHPq25S8bCiRJJb3H3RyiTm2LjSeB4AOVTi8YUjiWToI4PBgZOtx44hM4LA==} + engines: {node: 12.* || 14.* || >= 16} + peerDependencies: + '@glint/template': ^1.0.0 + peerDependenciesMeta: + '@glint/template': + optional: true + '@embroider/shared-internals@2.9.0': resolution: {integrity: sha512-8untWEvGy6av/oYibqZWMz/yB+LHsKxEOoUZiLvcpFwWj2Sipc0DcXeTJQZQZ++otNkLCWyDrDhOLrOkgjOPSg==} engines: {node: 12.* || 14.* || >= 16} @@ -2097,6 +2102,10 @@ packages: resolution: {integrity: sha512-5J5ipUMCAinQS38WW7wedruq5Z4VnHvNo+ZgOduw0PtI9w0CQWx7/HE+98PBDW8jclikeF+aHwF317vc1hwuzg==} engines: {node: 12.* || 14.* || >= 16} + '@embroider/shared-internals@3.0.1': + resolution: {integrity: sha512-d7RQwDwqqHo7YvjE9t1rtIrCCYtbSoO0uRq2ikVhRh4hGS5OojZNu2ZtS0Wqrg+V72CRtMFr/hibTvHNsRM2Lg==} + engines: {node: 12.* || 14.* || >= 16} + '@embroider/test-setup@4.0.0': resolution: {integrity: sha512-1S3Ebk0CEh3XDqD93AWSwQZBCk+oGv03gtkaGgdgyXGIR7jrVyDgEnEuslN/hJ0cuU8TqhiXrzHMw7bJwIGhWw==} engines: {node: 12.* || 14.* || >= 16} @@ -2112,8 +2121,8 @@ packages: '@embroider/webpack': optional: true - '@embroider/util@1.13.2': - resolution: {integrity: sha512-6/0sK4dtFK7Ld+t5Ovn9EilBVySoysMRdDAf/jGteOO7jdLKNgHnONg0w1T7ZZaMFUQfwJdRrk3u0dM+Idhiew==} + '@embroider/util@1.13.3': + resolution: {integrity: sha512-fb9S137zZqSI1IeWpGKVJ+WZHsRiIrD9D2A4aVwVH0dZeBKDg6lMaMN2MiXJ/ldUAG3DUFxnClnpiG5m2g3JFA==} engines: {node: 12.* || 14.* || >= 16} peerDependencies: '@glint/environment-ember-loose': ^1.0.0 @@ -2125,8 +2134,8 @@ packages: '@glint/template': optional: true - '@embroider/util@1.13.3': - resolution: {integrity: sha512-fb9S137zZqSI1IeWpGKVJ+WZHsRiIrD9D2A4aVwVH0dZeBKDg6lMaMN2MiXJ/ldUAG3DUFxnClnpiG5m2g3JFA==} + '@embroider/util@1.13.4': + resolution: {integrity: sha512-TqA0SNQarSJUdYGv+39MBCHkiuxhr2u0iKJP/JnDmQkCiVhvuFWy3P3n5sI26fVrVwG3DJLfxE2XVnB37udFOA==} engines: {node: 12.* || 14.* || >= 16} peerDependencies: '@glint/environment-ember-loose': ^1.0.0 @@ -2468,18 +2477,25 @@ packages: '@handlebars/parser@2.0.0': resolution: {integrity: sha512-EP9uEDZv/L5Qh9IWuMUGJRfwhXJ4h1dqKTT4/3+tY0eu7sPis7xh23j61SYUnNF4vqCQvvUXpDo9Bh/+q1zASA==} - '@hashicorp/design-system-components@4.20.2': - resolution: {integrity: sha512-0FDaDlvaQQVVXoSoWsExmW1TUgmuJNoCz11JuwaOwin59Vl4ttVLsNvY8DviGJlh6VhV1yYlGJa7X2xhQG+ESQ==} + '@hashicorp/design-system-components@4.24.1': + resolution: {integrity: sha512-rcRbBKc9MWngtVTRKr1i0ixbQypj4tEF8ZnsFrUVZLm7CMS8R5/+cfSu3pgbPriOOqZDCx7qAhNqAeTim4AYag==} engines: {node: '>= 18'} peerDependencies: + '@ember/string': ^3.1.1 || ^4.0.0 ember-engines: '>= 0.11.0' + ember-intl: ^7.3.0 peerDependenciesMeta: ember-engines: optional: true + ember-intl: + optional: true '@hashicorp/design-system-tokens@2.3.0': resolution: {integrity: sha512-T2XhcgUeiGkNqvPu73yittDghEccUpIZc7Fh/g4PG7KEvJwbXItFWTRWoHSGR8T6r6LpOP5E6CC4hSVwGRugRg==} + '@hashicorp/design-system-tokens@3.0.0': + resolution: {integrity: sha512-ODOtuwDvOdAHQNnhVgqi43enCVWjXTnweYrxHDi3QkVUY1ysLkGrfAySnr4hVwd3UHmzT5HkQQbjN5zgr8l94w==} + '@hashicorp/ember-asciinema-player@https://codeload.github.com/hashicorp/ember-asciinema-player/tar.gz/e047a096039cff70234c232efe75dcad74c6358a': resolution: {tarball: https://codeload.github.com/hashicorp/ember-asciinema-player/tar.gz/e047a096039cff70234c232efe75dcad74c6358a} version: 0.0.0 @@ -2490,8 +2506,8 @@ packages: '@hashicorp/flight-icons@3.10.0': resolution: {integrity: sha512-wtufYZ5Ntihmy+vbR0dM+Q7X56xPX/dtpcfVs4nCRgvYZZic5ayqE8tefs2FGtxauH6zuzzVk48s5S6psv9g+g==} - '@hashicorp/flight-icons@3.11.1': - resolution: {integrity: sha512-FQOHB2qCzHoG3dm6zidS39D4U0ida/7Sge5EG+KqcebH5jsbJQiMyB/qMc3YQBo5vGBe8XUa+rVW8v4JNpzk1Q==} + '@hashicorp/flight-icons@3.14.0': + resolution: {integrity: sha512-nyLDApaZsAHpAf2sRNwYX1MnJQU9UI3euiwE6wHPl2l/+Yt8wba1oXkmWL/Ptc4QgJxxnRUUhf66jGcB/AIOyQ==} '@humanwhocodes/config-array@0.13.0': resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} @@ -2673,6 +2689,9 @@ packages: '@nullvoxpopuli/ember-composable-helpers@5.2.10': resolution: {integrity: sha512-60lzfYZ3Gn5f5NX7KKh01vOUeMYCgNFMxVwRBtxcyotCmBob3eoW6JL1hO3zStv79k/n/vijdr1o/G1N3+l8Fg==} + '@nullvoxpopuli/ember-composable-helpers@5.3.0': + resolution: {integrity: sha512-pjuYVAxJJETaFFmDME9sPH++kSNcTJjxHqHUSJOwoYvxSRBHIysJbCFD/CHQjJtbI5D4pVouYU80ugmyGrZoFA==} + '@nuxt/opencollective@0.4.1': resolution: {integrity: sha512-GXD3wy50qYbxCJ652bDrDzgMr3NFEkIS374+IgFQKkCvk9yiYcLvX2XDYr7UyQxf4wK0e+yqDYRubZ0DtOxnmQ==} engines: {node: ^14.18.0 || >=16.10.0, npm: '>=5.10.0'} @@ -10573,12 +10592,6 @@ snapshots: - '@babel/core' - supports-color - '@ember/string@3.1.1': - dependencies: - ember-cli-babel: 7.26.11 - transitivePeerDependencies: - - supports-color - '@ember/string@4.0.1': {} '@ember/test-helpers@5.2.2(@babel/core@7.27.1)(@glint/template@1.5.2)': @@ -10650,6 +10663,21 @@ snapshots: transitivePeerDependencies: - supports-color + '@embroider/macros@1.19.4(@glint/template@1.5.2)': + dependencies: + '@embroider/shared-internals': 3.0.1 + assert-never: 1.4.0 + babel-import-util: 3.0.1 + ember-cli-babel: 7.26.11 + find-up: 5.0.0 + lodash: 4.17.21 + resolve: 1.22.10 + semver: 7.7.2 + optionalDependencies: + '@glint/template': 1.5.2 + transitivePeerDependencies: + - supports-color + '@embroider/shared-internals@2.9.0': dependencies: babel-import-util: 2.1.1 @@ -10685,14 +10713,32 @@ snapshots: transitivePeerDependencies: - supports-color + '@embroider/shared-internals@3.0.1': + dependencies: + babel-import-util: 3.0.1 + debug: 4.4.1 + ember-rfc176-data: 0.3.18 + fs-extra: 9.1.0 + is-subdir: 1.2.0 + js-string-escape: 1.0.1 + lodash: 4.17.21 + minimatch: 3.1.2 + pkg-entry-points: 1.1.1 + resolve-package-path: 4.0.3 + resolve.exports: 2.0.3 + semver: 7.7.2 + typescript-memoize: 1.1.1 + transitivePeerDependencies: + - supports-color + '@embroider/test-setup@4.0.0': dependencies: lodash: 4.17.21 resolve: 1.22.10 - '@embroider/util@1.13.2(@glint/template@1.5.2)(ember-source@5.12.0(@glimmer/component@2.0.0)(@glint/template@1.5.2)(rsvp@4.8.5)(webpack@5.99.8))': + '@embroider/util@1.13.3(@glint/template@1.5.2)(ember-source@5.12.0(@glimmer/component@2.0.0)(@glint/template@1.5.2)(rsvp@4.8.5)(webpack@5.99.8))': dependencies: - '@embroider/macros': 1.18.0(@glint/template@1.5.2) + '@embroider/macros': 1.16.13(@glint/template@1.5.2) broccoli-funnel: 3.0.8 ember-cli-babel: 7.26.11 ember-source: 5.12.0(@glimmer/component@2.0.0)(@glint/template@1.5.2)(rsvp@4.8.5)(webpack@5.99.8) @@ -10701,9 +10747,9 @@ snapshots: transitivePeerDependencies: - supports-color - '@embroider/util@1.13.3(@glint/template@1.5.2)(ember-source@5.12.0(@glimmer/component@2.0.0)(@glint/template@1.5.2)(rsvp@4.8.5)(webpack@5.99.8))': + '@embroider/util@1.13.4(@glint/template@1.5.2)(ember-source@5.12.0(@glimmer/component@2.0.0)(@glint/template@1.5.2)(rsvp@4.8.5)(webpack@5.99.8))': dependencies: - '@embroider/macros': 1.16.13(@glint/template@1.5.2) + '@embroider/macros': 1.19.4(@glint/template@1.5.2) broccoli-funnel: 3.0.8 ember-cli-babel: 7.26.11 ember-source: 5.12.0(@glimmer/component@2.0.0)(@glint/template@1.5.2)(rsvp@4.8.5)(webpack@5.99.8) @@ -11092,7 +11138,7 @@ snapshots: '@handlebars/parser@2.0.0': {} - '@hashicorp/design-system-components@4.20.2(@babel/core@7.27.1)(@ember/test-helpers@5.2.2(@babel/core@7.27.1)(@glint/template@1.5.2))(@glimmer/component@2.0.0)(@glint/template@1.5.2)(ember-basic-dropdown@8.6.1(@babel/core@7.27.1)(@ember/string@3.1.1)(@ember/test-helpers@5.2.2(@babel/core@7.27.1)(@glint/template@1.5.2))(@glimmer/component@2.0.0)(@glint/template@1.5.2)(ember-source@5.12.0(@glimmer/component@2.0.0)(@glint/template@1.5.2)(rsvp@4.8.5)(webpack@5.99.8)))(ember-source@5.12.0(@glimmer/component@2.0.0)(@glint/template@1.5.2)(rsvp@4.8.5)(webpack@5.99.8))': + '@hashicorp/design-system-components@4.24.1(@babel/core@7.27.1)(@ember/string@4.0.1)(@ember/test-helpers@5.2.2(@babel/core@7.27.1)(@glint/template@1.5.2))(@glimmer/component@2.0.0)(@glint/template@1.5.2)(ember-basic-dropdown@8.6.1(@babel/core@7.27.1)(@ember/string@4.0.1)(@ember/test-helpers@5.2.2(@babel/core@7.27.1)(@glint/template@1.5.2))(@glimmer/component@2.0.0)(@glint/template@1.5.2)(ember-source@5.12.0(@glimmer/component@2.0.0)(@glint/template@1.5.2)(rsvp@4.8.5)(webpack@5.99.8)))(ember-source@5.12.0(@glimmer/component@2.0.0)(@glint/template@1.5.2)(rsvp@4.8.5)(webpack@5.99.8))': dependencies: '@codemirror/commands': 6.8.1 '@codemirror/lang-go': 6.0.1 @@ -11107,16 +11153,16 @@ snapshots: '@codemirror/state': 6.5.2 '@codemirror/view': 6.36.8 '@ember/render-modifiers': 2.1.0(@babel/core@7.27.1)(@glint/template@1.5.2)(ember-source@5.12.0(@glimmer/component@2.0.0)(@glint/template@1.5.2)(rsvp@4.8.5)(webpack@5.99.8)) - '@ember/string': 3.1.1 + '@ember/string': 4.0.1 '@ember/test-waiters': 3.1.0 '@embroider/addon-shim': 1.10.0 - '@embroider/macros': 1.18.0(@glint/template@1.5.2) - '@embroider/util': 1.13.2(@glint/template@1.5.2)(ember-source@5.12.0(@glimmer/component@2.0.0)(@glint/template@1.5.2)(rsvp@4.8.5)(webpack@5.99.8)) + '@embroider/macros': 1.19.4(@glint/template@1.5.2) + '@embroider/util': 1.13.4(@glint/template@1.5.2)(ember-source@5.12.0(@glimmer/component@2.0.0)(@glint/template@1.5.2)(rsvp@4.8.5)(webpack@5.99.8)) '@floating-ui/dom': 1.7.0 - '@hashicorp/design-system-tokens': 2.3.0 - '@hashicorp/flight-icons': 3.11.1 + '@hashicorp/design-system-tokens': 3.0.0 + '@hashicorp/flight-icons': 3.14.0 '@lezer/highlight': 1.2.1 - '@nullvoxpopuli/ember-composable-helpers': 5.2.10(@babel/core@7.27.1)(ember-source@5.12.0(@glimmer/component@2.0.0)(@glint/template@1.5.2)(rsvp@4.8.5)(webpack@5.99.8)) + '@nullvoxpopuli/ember-composable-helpers': 5.3.0(@babel/core@7.27.1) clipboard-polyfill: 4.1.1 codemirror-lang-hcl: 0.0.0-beta.2 decorator-transforms: 2.3.0(@babel/core@7.27.1) @@ -11127,15 +11173,16 @@ snapshots: ember-focus-trap: 1.1.1(ember-source@5.12.0(@glimmer/component@2.0.0)(@glint/template@1.5.2)(rsvp@4.8.5)(webpack@5.99.8)) ember-get-config: 2.1.1(@glint/template@1.5.2) ember-modifier: 4.2.2(@babel/core@7.27.1) - ember-power-select: 8.7.1(@babel/core@7.27.1)(@ember/test-helpers@5.2.2(@babel/core@7.27.1)(@glint/template@1.5.2))(@glimmer/component@2.0.0)(@glint/template@1.5.2)(ember-basic-dropdown@8.6.1(@babel/core@7.27.1)(@ember/string@3.1.1)(@ember/test-helpers@5.2.2(@babel/core@7.27.1)(@glint/template@1.5.2))(@glimmer/component@2.0.0)(@glint/template@1.5.2)(ember-source@5.12.0(@glimmer/component@2.0.0)(@glint/template@1.5.2)(rsvp@4.8.5)(webpack@5.99.8)))(ember-concurrency@4.0.4(@babel/core@7.27.1)(@glint/template@1.5.2))(ember-source@5.12.0(@glimmer/component@2.0.0)(@glint/template@1.5.2)(rsvp@4.8.5)(webpack@5.99.8)) + ember-power-select: 8.7.1(@babel/core@7.27.1)(@ember/test-helpers@5.2.2(@babel/core@7.27.1)(@glint/template@1.5.2))(@glimmer/component@2.0.0)(@glint/template@1.5.2)(ember-basic-dropdown@8.6.1(@babel/core@7.27.1)(@ember/string@4.0.1)(@ember/test-helpers@5.2.2(@babel/core@7.27.1)(@glint/template@1.5.2))(@glimmer/component@2.0.0)(@glint/template@1.5.2)(ember-source@5.12.0(@glimmer/component@2.0.0)(@glint/template@1.5.2)(rsvp@4.8.5)(webpack@5.99.8)))(ember-concurrency@4.0.4(@babel/core@7.27.1)(@glint/template@1.5.2))(ember-source@5.12.0(@glimmer/component@2.0.0)(@glint/template@1.5.2)(rsvp@4.8.5)(webpack@5.99.8)) ember-stargate: 0.6.0(@babel/core@7.27.1)(@glint/template@1.5.2)(ember-source@5.12.0(@glimmer/component@2.0.0)(@glint/template@1.5.2)(rsvp@4.8.5)(webpack@5.99.8)) - ember-style-modifier: 4.4.0(@babel/core@7.27.1)(@ember/string@3.1.1)(ember-source@5.12.0(@glimmer/component@2.0.0)(@glint/template@1.5.2)(rsvp@4.8.5)(webpack@5.99.8)) + ember-style-modifier: 4.4.0(@babel/core@7.27.1)(@ember/string@4.0.1)(ember-source@5.12.0(@glimmer/component@2.0.0)(@glint/template@1.5.2)(rsvp@4.8.5)(webpack@5.99.8)) ember-truth-helpers: 4.0.3(ember-source@5.12.0(@glimmer/component@2.0.0)(@glint/template@1.5.2)(rsvp@4.8.5)(webpack@5.99.8)) luxon: 3.6.1 prismjs: 1.30.0 sass: 1.88.0 tabbable: 6.2.0 tippy.js: 6.3.7 + tracked-built-ins: 4.0.0(@babel/core@7.27.1) transitivePeerDependencies: - '@babel/core' - '@ember/test-helpers' @@ -11148,6 +11195,8 @@ snapshots: '@hashicorp/design-system-tokens@2.3.0': {} + '@hashicorp/design-system-tokens@3.0.0': {} + '@hashicorp/ember-asciinema-player@https://codeload.github.com/hashicorp/ember-asciinema-player/tar.gz/e047a096039cff70234c232efe75dcad74c6358a(@glint/template@1.5.2)(ember-source@5.12.0(@glimmer/component@2.0.0)(@glint/template@1.5.2)(rsvp@4.8.5)(webpack@5.99.8))(webpack@5.99.8)': dependencies: asciinema-player: 3.4.0 @@ -11162,7 +11211,7 @@ snapshots: '@hashicorp/flight-icons@3.10.0': {} - '@hashicorp/flight-icons@3.11.1': {} + '@hashicorp/flight-icons@3.14.0': {} '@humanwhocodes/config-array@0.13.0': dependencies: @@ -11369,6 +11418,14 @@ snapshots: - ember-source - supports-color + '@nullvoxpopuli/ember-composable-helpers@5.3.0(@babel/core@7.27.1)': + dependencies: + '@embroider/addon-shim': 1.10.0 + decorator-transforms: 2.3.0(@babel/core@7.27.1) + transitivePeerDependencies: + - '@babel/core' + - supports-color + '@nuxt/opencollective@0.4.1': dependencies: consola: 3.4.2 @@ -13674,7 +13731,7 @@ snapshots: - supports-color - webpack - ember-basic-dropdown@8.6.1(@babel/core@7.27.1)(@ember/string@3.1.1)(@ember/test-helpers@5.2.2(@babel/core@7.27.1)(@glint/template@1.5.2))(@glimmer/component@2.0.0)(@glint/template@1.5.2)(ember-source@5.12.0(@glimmer/component@2.0.0)(@glint/template@1.5.2)(rsvp@4.8.5)(webpack@5.99.8)): + ember-basic-dropdown@8.6.1(@babel/core@7.27.1)(@ember/string@4.0.1)(@ember/test-helpers@5.2.2(@babel/core@7.27.1)(@glint/template@1.5.2))(@glimmer/component@2.0.0)(@glint/template@1.5.2)(ember-source@5.12.0(@glimmer/component@2.0.0)(@glint/template@1.5.2)(rsvp@4.8.5)(webpack@5.99.8)): dependencies: '@ember/test-helpers': 5.2.2(@babel/core@7.27.1)(@glint/template@1.5.2) '@embroider/addon-shim': 1.10.0 @@ -13685,7 +13742,7 @@ snapshots: ember-element-helper: 0.8.8 ember-lifeline: 7.0.0(@ember/test-helpers@5.2.2(@babel/core@7.27.1)(@glint/template@1.5.2)) ember-modifier: 4.2.2(@babel/core@7.27.1) - ember-style-modifier: 4.4.0(@babel/core@7.27.1)(@ember/string@3.1.1)(ember-source@5.12.0(@glimmer/component@2.0.0)(@glint/template@1.5.2)(rsvp@4.8.5)(webpack@5.99.8)) + ember-style-modifier: 4.4.0(@babel/core@7.27.1)(@ember/string@4.0.1)(ember-source@5.12.0(@glimmer/component@2.0.0)(@glint/template@1.5.2)(rsvp@4.8.5)(webpack@5.99.8)) ember-truth-helpers: 4.0.3(ember-source@5.12.0(@glimmer/component@2.0.0)(@glint/template@1.5.2)(rsvp@4.8.5)(webpack@5.99.8)) transitivePeerDependencies: - '@babel/core' @@ -14415,7 +14472,7 @@ snapshots: ember-get-config@2.1.1(@glint/template@1.5.2): dependencies: - '@embroider/macros': 1.18.0(@glint/template@1.5.2) + '@embroider/macros': 1.19.4(@glint/template@1.5.2) ember-cli-babel: 7.26.11 transitivePeerDependencies: - '@glint/template' @@ -14561,15 +14618,15 @@ snapshots: transitivePeerDependencies: - supports-color - ember-power-select@8.7.1(@babel/core@7.27.1)(@ember/test-helpers@5.2.2(@babel/core@7.27.1)(@glint/template@1.5.2))(@glimmer/component@2.0.0)(@glint/template@1.5.2)(ember-basic-dropdown@8.6.1(@babel/core@7.27.1)(@ember/string@3.1.1)(@ember/test-helpers@5.2.2(@babel/core@7.27.1)(@glint/template@1.5.2))(@glimmer/component@2.0.0)(@glint/template@1.5.2)(ember-source@5.12.0(@glimmer/component@2.0.0)(@glint/template@1.5.2)(rsvp@4.8.5)(webpack@5.99.8)))(ember-concurrency@4.0.4(@babel/core@7.27.1)(@glint/template@1.5.2))(ember-source@5.12.0(@glimmer/component@2.0.0)(@glint/template@1.5.2)(rsvp@4.8.5)(webpack@5.99.8)): + ember-power-select@8.7.1(@babel/core@7.27.1)(@ember/test-helpers@5.2.2(@babel/core@7.27.1)(@glint/template@1.5.2))(@glimmer/component@2.0.0)(@glint/template@1.5.2)(ember-basic-dropdown@8.6.1(@babel/core@7.27.1)(@ember/string@4.0.1)(@ember/test-helpers@5.2.2(@babel/core@7.27.1)(@glint/template@1.5.2))(@glimmer/component@2.0.0)(@glint/template@1.5.2)(ember-source@5.12.0(@glimmer/component@2.0.0)(@glint/template@1.5.2)(rsvp@4.8.5)(webpack@5.99.8)))(ember-concurrency@4.0.4(@babel/core@7.27.1)(@glint/template@1.5.2))(ember-source@5.12.0(@glimmer/component@2.0.0)(@glint/template@1.5.2)(rsvp@4.8.5)(webpack@5.99.8)): dependencies: '@ember/test-helpers': 5.2.2(@babel/core@7.27.1)(@glint/template@1.5.2) '@embroider/addon-shim': 1.10.0 - '@embroider/util': 1.13.2(@glint/template@1.5.2)(ember-source@5.12.0(@glimmer/component@2.0.0)(@glint/template@1.5.2)(rsvp@4.8.5)(webpack@5.99.8)) + '@embroider/util': 1.13.4(@glint/template@1.5.2)(ember-source@5.12.0(@glimmer/component@2.0.0)(@glint/template@1.5.2)(rsvp@4.8.5)(webpack@5.99.8)) '@glimmer/component': 2.0.0 decorator-transforms: 2.3.0(@babel/core@7.27.1) ember-assign-helper: 0.5.1 - ember-basic-dropdown: 8.6.1(@babel/core@7.27.1)(@ember/string@3.1.1)(@ember/test-helpers@5.2.2(@babel/core@7.27.1)(@glint/template@1.5.2))(@glimmer/component@2.0.0)(@glint/template@1.5.2)(ember-source@5.12.0(@glimmer/component@2.0.0)(@glint/template@1.5.2)(rsvp@4.8.5)(webpack@5.99.8)) + ember-basic-dropdown: 8.6.1(@babel/core@7.27.1)(@ember/string@4.0.1)(@ember/test-helpers@5.2.2(@babel/core@7.27.1)(@glint/template@1.5.2))(@glimmer/component@2.0.0)(@glint/template@1.5.2)(ember-source@5.12.0(@glimmer/component@2.0.0)(@glint/template@1.5.2)(rsvp@4.8.5)(webpack@5.99.8)) ember-concurrency: 4.0.4(@babel/core@7.27.1)(@glint/template@1.5.2) ember-lifeline: 7.0.0(@ember/test-helpers@5.2.2(@babel/core@7.27.1)(@glint/template@1.5.2)) ember-modifier: 4.2.2(@babel/core@7.27.1) @@ -14626,7 +14683,7 @@ snapshots: ember-resources@7.0.4(@glimmer/component@2.0.0)(@glint/template@1.5.2): dependencies: '@embroider/addon-shim': 1.10.0 - '@embroider/macros': 1.18.0(@glint/template@1.5.2) + '@embroider/macros': 1.19.4(@glint/template@1.5.2) '@glint/template': 1.5.2 optionalDependencies: '@glimmer/component': 2.0.0 @@ -14780,9 +14837,9 @@ snapshots: - ember-source - supports-color - ember-style-modifier@4.4.0(@babel/core@7.27.1)(@ember/string@3.1.1)(ember-source@5.12.0(@glimmer/component@2.0.0)(@glint/template@1.5.2)(rsvp@4.8.5)(webpack@5.99.8)): + ember-style-modifier@4.4.0(@babel/core@7.27.1)(@ember/string@4.0.1)(ember-source@5.12.0(@glimmer/component@2.0.0)(@glint/template@1.5.2)(rsvp@4.8.5)(webpack@5.99.8)): dependencies: - '@ember/string': 3.1.1 + '@ember/string': 4.0.1 '@embroider/addon-shim': 1.10.0 csstype: 3.1.3 decorator-transforms: 2.3.0(@babel/core@7.27.1) diff --git a/ui/admin/app/components/variable-time-field/index.hbs b/ui/admin/app/components/variable-time-field/index.hbs new file mode 100644 index 0000000000..d2067cac26 --- /dev/null +++ b/ui/admin/app/components/variable-time-field/index.hbs @@ -0,0 +1,53 @@ +{{! + Copyright (c) HashiCorp, Inc. + SPDX-License-Identifier: BUSL-1.1 +}} + + <:header as |H|> + {{@legend}} + + <:row as |R|> + + + {{t 'form.variable-time-field.days'}} + + + + + + {{t 'form.variable-time-field.hours'}} + + + + + + {{t 'form.variable-time-field.minutes'}} + + + + {{#if @max}} + + + + {{/if}} + + \ No newline at end of file diff --git a/ui/admin/app/components/variable-time-field/index.js b/ui/admin/app/components/variable-time-field/index.js new file mode 100644 index 0000000000..0148702179 --- /dev/null +++ b/ui/admin/app/components/variable-time-field/index.js @@ -0,0 +1,68 @@ +/** + * Copyright (c) HashiCorp, Inc. + * SPDX-License-Identifier: BUSL-1.1 + */ + +import Component from '@glimmer/component'; +import { action } from '@ember/object'; +import { tracked } from '@glimmer/tracking'; + +const SECONDS_PER_MINUTE = 60; +const SECONDS_PER_HOUR = 3600; +const SECONDS_PER_DAY = 86400; + +export default class VariableTimeFieldIndex extends Component { + @tracked days; + @tracked hours; + @tracked minutes; + @tracked data; + + constructor() { + super(...arguments); + this.initializeTimeFields(); + } + + initializeTimeFields() { + let totalSeconds = this.args.time || 0; + this.days = Math.floor(totalSeconds / SECONDS_PER_DAY); + totalSeconds %= SECONDS_PER_DAY; + this.hours = Math.floor(totalSeconds / SECONDS_PER_HOUR); + totalSeconds %= SECONDS_PER_HOUR; + this.minutes = Math.floor(totalSeconds / SECONDS_PER_MINUTE); + this.data = this.createDataRow(); + } + + createDataRow() { + return [{ days: this.days, hours: this.hours, minutes: this.minutes }]; + } + + @action + updateTime(key, { target: { value } }) { + this.data[0][key] = Number(value); + const days = this.data[0].days; + const hours = this.data[0].hours; + const minutes = this.data[0].minutes; + + let totalSeconds = + (days || 0) * SECONDS_PER_DAY + + (hours || 0) * SECONDS_PER_HOUR + + (minutes || 0) * SECONDS_PER_MINUTE; + this.args.updateTime(totalSeconds); + } + + @action + setMax() { + if (this.args.max == null) { + return; + } + let maxSeconds = this.args.max; + this.days = Math.floor(maxSeconds / SECONDS_PER_DAY); + maxSeconds %= SECONDS_PER_DAY; + this.hours = Math.floor(maxSeconds / SECONDS_PER_HOUR); + maxSeconds %= SECONDS_PER_HOUR; + this.minutes = Math.floor(maxSeconds / SECONDS_PER_MINUTE); + this.data = this.createDataRow(); + + this.args.updateTime(this.args.max); + } +} diff --git a/ui/admin/tests/integration/components/variable-time-field/index-test.js b/ui/admin/tests/integration/components/variable-time-field/index-test.js new file mode 100644 index 0000000000..f24e4b635e --- /dev/null +++ b/ui/admin/tests/integration/components/variable-time-field/index-test.js @@ -0,0 +1,142 @@ +/** + * Copyright (c) HashiCorp, Inc. + * SPDX-License-Identifier: BUSL-1.1 + */ + +import { module, test } from 'qunit'; +import { setupRenderingTest } from 'admin/tests/helpers'; +import { click, fillIn, render } from '@ember/test-helpers'; +import { hbs } from 'ember-cli-htmlbars'; +import { setupIntl } from 'ember-intl/test-support'; + +module('Integration | Component | variable-time-field/index', function (hooks) { + setupRenderingTest(hooks); + setupIntl(hooks, 'en-us'); + + const DAYS_INPUT = 'input[name="days"]'; + const HOURS_INPUT = 'input[name="hours"]'; + const MINUTES_INPUT = 'input[name="minutes"]'; + const SET_TO_MAX_BUTTON = 'button'; + const LEGEND = 'Test Legend'; + const ONE_HOUR = 3600; // in seconds + const ONE_DAY = 86400; // in seconds + + hooks.beforeEach(function () { + this.set('legend', LEGEND); + this.set('time', ONE_HOUR); + this.set('max', ONE_DAY); + this.set('updateTime', () => {}); + }); + + test('it renders', async function (assert) { + await render(hbs``); + + assert.dom('legend').containsText(LEGEND); + assert.dom(DAYS_INPUT).hasValue('0'); + assert.dom(HOURS_INPUT).hasValue('1'); + assert.dom(MINUTES_INPUT).hasValue('0'); + + await render(hbs` + + `); + + assert.dom(SET_TO_MAX_BUTTON).hasText('Set to Max'); + assert.dom(DAYS_INPUT).hasValue('0'); + assert.dom(HOURS_INPUT).hasValue('1'); + assert.dom(MINUTES_INPUT).hasValue('0'); + }); + + const testCases = [ + { + input: DAYS_INPUT, + value: '2', + expectedSeconds: 176400, // 2 days + 1 hour + expectedValues: { days: '2', hours: '1', minutes: '0' }, + }, + { + input: HOURS_INPUT, + value: '2', + expectedSeconds: 7200, // 2 hours + expectedValues: { days: '0', hours: '2', minutes: '0' }, + }, + { + input: MINUTES_INPUT, + value: '15', + expectedSeconds: 4500, // 2 days + 1 minute + expectedValues: { days: '0', hours: '1', minutes: '15' }, + }, + ]; + + test.each( + 'it updates time on change', + testCases, + async function (assert, { input, value, expectedSeconds, expectedValues }) { + this.set('updateTime', (seconds) => { + if (seconds === expectedSeconds) { + assert.ok( + true, + `updateTime called with correct calculated seconds value: ${seconds}`, + ); + } else { + assert.ok( + false, + `Unexpected seconds value: ${seconds}, expected: ${expectedSeconds}`, + ); + } + }); + + await render(hbs``); + + assert.dom(DAYS_INPUT).hasValue('0'); + assert.dom(HOURS_INPUT).hasValue('1'); + assert.dom(MINUTES_INPUT).hasValue('0'); + + await fillIn(input, value); + + assert.dom(DAYS_INPUT).hasValue(expectedValues.days); + assert.dom(HOURS_INPUT).hasValue(expectedValues.hours); + assert.dom(MINUTES_INPUT).hasValue(expectedValues.minutes); + }, + ); + + test('it sets to max time on button click', async function (assert) { + assert.expect(4); + this.set('legend', 'Test Legend'); + this.set('time', 0); + this.set('max', 90061); // 1 day, 1 hour, 1 minute, and 1 second in seconds + this.set('updateTime', (totalSeconds) => { + assert.strictEqual( + totalSeconds, + 90061, + 'updateTime called with max total seconds', + ); + }); + + await render(hbs``); + + await click('button'); + + assert.dom('input[name="days"]').hasValue('1'); + assert.dom('input[name="hours"]').hasValue('1'); + assert.dom('input[name="minutes"]').hasValue('1'); + }); +});