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');
+ });
+});