Compare commits

..
421 Commits
Author SHA1 Message Date
Susmitha Girumala 7413afb11d Merge pull request #635 from hashicorp/overlay-fix
style: Fix z-index for rose-dialog in desktop
2021-06-30 19:15:57 -04:00
Susmitha Girumala e4ccf21ed8 style: Fix z-index for rose-dialog in desktop 2021-06-30 19:03:12 -04:00
Susmitha Girumala 3a96aadb99 Merge pull request #634 from hashicorp/chore-update-secret-schema
chore:  update to reflect secret { raw, decoded } schema, where decod…
2021-06-30 18:13:32 -04:00
Randall Morey 4f044db204 fix: lint error 2021-06-30 17:27:47 -04:00
Randall Morey d202c550cb chore: update to reflect secret { raw, decoded } schema, where decoded is optional 2021-06-30 17:20:51 -04:00
Randall Morey 173fa8a8e6 Merge pull request #632 from hashicorp/chore-bump-versions
chore: 🤖 bump CLI version and specify release in readme
2021-06-30 08:03:24 -04:00
Susmitha Girumala a2e6a6ba44 Merge branch 'main' into chore-bump-versions 2021-06-29 16:25:01 -04:00
Susmitha Girumala bfa3d8fd3a Merge pull request #633 from hashicorp/fix-oidc-buttons
fix: OIDC form add buttons should be enabled for new auth methods
2021-06-29 16:06:01 -04:00
Randall Morey 233cc2073b fix: OIDC form add buttons should be enabled for new auth methods 2021-06-29 15:50:57 -04:00
Randall Morey ed513ebd14 chore: 🤖 bump CLI version and specify release in readme 2021-06-29 08:25:36 -04:00
Randall Morey 6ceddce774 Merge pull request #625 from hashicorp/chore-callback-url
chore: 🤖 add callback_url to oidc form
2021-06-28 16:18:48 -04:00
Randall Morey 84fe290aeb Merge branch 'main' into chore-callback-url 2021-06-28 16:08:27 -04:00
Randall Morey 0e38cfe54a chore: 🤖 add callback_url to oidc form 2021-06-28 16:07:08 -04:00
Susmitha Girumala 7d70493a66 Merge pull request #624 from hashicorp/connect-dialog-display-name-in-header
fix: Use name in connect header
2021-06-28 15:19:12 -04:00
Susmitha Girumala d61867ab10 refactor: 💡 Display credential name in dropdown 2021-06-28 15:09:34 -04:00
Susmitha Girumala e8e83d979b fix: Use name in connect header -Remove credential purpose UI 2021-06-28 12:50:39 -04:00
Susmitha Girumala 559764a5c1 Merge pull request #623 from hashicorp/changelog-updates
docs: Update changelog with vault credential support note
2021-06-25 15:26:16 -04:00
Randall Morey bb494e83f8 Merge branch 'main' into changelog-updates 2021-06-25 14:31:21 -04:00
Susmitha Girumala d5a183abbf Merge pull request #622 from hashicorp/optional-credential-purpose
fix: Show credential purpose only when populated
2021-06-25 13:01:50 -04:00
Susmitha Girumala 7f32b871b9 Merge branch 'main' into optional-credential-purpose 2021-06-25 12:49:32 -04:00
Susmitha Girumala 0a5eb3ae98 Merge pull request #620 from hashicorp/connect-dialog-layer-fix
style: Update z-index for connect dialog and overlay
2021-06-25 12:49:23 -04:00
Carlos Alcaide Corvo 7a2ebdd3a1 Merge branch 'main' into changelog-updates 2021-06-25 09:37:33 -07:00
Susmitha Girumala 3b6e968bf8 Merge branch 'main' into connect-dialog-layer-fix 2021-06-25 12:36:34 -04:00
Carlos Alcaide Corvo 56487cdfad Merge branch 'main' into optional-credential-purpose 2021-06-25 09:35:53 -07:00
Carlos Alcaide Corvo 15b0baba34 Merge pull request #621 from hashicorp/feature-more-session-creds
feat: 🎸 Add Hidden secret component within the view
2021-06-25 09:35:40 -07:00
Susmitha Girumala 96795e450e docs: Update changelog with vault credential support 2021-06-25 12:34:26 -04:00
Susmitha Girumala 43cc25b0a5 fix: Show credential purpose only when populated 2021-06-25 12:30:29 -04:00
Carlos Alcaide Corvo f9ac2a93e5 Merge branch 'main' into feature-more-session-creds 2021-06-25 09:20:19 -07:00
Carlos Alcaide 378fcc53c2 feat: 🎸 Add Hidden secret component within the view
Add hidden secret component within the view and delete duplicate code
(perhaps from a rebase)
2021-06-25 09:19:39 -07:00
Susmitha Girumala a73c57848d style: Update z-index for connect dialog and overlay 2021-06-25 12:12:02 -04:00
Susmitha Girumala 86ebba9394 Merge pull request #619 from hashicorp/feature-more-session-creds
Feature more session creds
2021-06-25 11:57:08 -04:00
Carlos Alcaide Corvo 0ef4b2244b Merge branch 'main' into feature-more-session-creds 2021-06-25 08:33:01 -07:00
Randall Morey 3b01e84f1e Merge pull request #617 from hashicorp/connect-dialog-based-on-feature-session-creds
feat: Update connect dialog with credentials api response
2021-06-25 11:30:37 -04:00
Randall Morey 000c22bd08 Merge pull request #618 from hashicorp/feat-hidden-secret-component
feat: 🎸 Add hidden secret component
2021-06-25 11:30:19 -04:00
Randall Morey 7e2493dd82 refactor: 💡 move masked text string into component 2021-06-25 11:15:04 -04:00
Susmitha Girumala aea193c78d fix: 🐛 Conditionally show credential library name and desc 2021-06-25 10:12:56 -04:00
Carlos Alcaide 04287e72c2 Forgotten test 2021-06-24 15:19:26 -07:00
Susmitha Girumala a535991174 fix: Use library and secret objects in connect dialog 2021-06-24 18:09:53 -04:00
Carlos Alcaide 9c642b5065 feat: 🎸 Suggested changes from previous commit
Wrapped the secret within Copyable component. Adapt styles and test for
it.
2021-06-24 14:54:26 -07:00
Susmitha Girumala 4bcf061234 Merge branch 'feature-more-session-creds' into connect-dialog-based-on-feature-session-creds 2021-06-24 17:40:09 -04:00
Carlos Alcaide 09d5d1077d feat: 🎸 Add hidden secret component
Add hidden secret component adhoc to desktop client. This is the first
iteration of the component, expect changes in the near future.
2021-06-24 13:54:42 -07:00
Randall Morey 1a3dc72d57 chore: tweak credential secrets format 2021-06-24 16:26:51 -04:00
Susmitha Girumala 25c0125cd8 Merge remote-tracking branch 'origin/feature-session-creds' into connect-dialog-based-on-feature-session-creds 2021-06-24 15:54:46 -04:00
Carlos Alcaide 4daa09ca7b Revert "Comment code with plain strings"
This reverts commit a83e6af6de.
2021-06-24 12:15:34 -07:00
Carlos Alcaide 14f9635af4 chore: 🤖 Add hidden secret component
Add first iteration of hidden secret component.
2021-06-24 12:06:25 -07:00
Susmitha Girumala 4ba3af3272 fix: Show raw json when viewing raw api output in connect dia 2021-06-24 13:40:54 -04:00
Randall Morey db4964c985 chore: tweak cred card styles 2021-06-24 10:59:11 -04:00
Susmitha Girumala 1f328e54ee feat: Update connect dialog with credentials api response 2021-06-23 22:12:20 -04:00
Carlos Alcaide Corvo 295d236b35 Merge pull request #615 from hashicorp/update-connect-dialog
chore: Update components in connect dialog to latest
2021-06-23 14:28:58 -07:00
Carlos Alcaide a83e6af6de Comment code with plain strings 2021-06-23 14:08:01 -07:00
Carlos Alcaide Corvo d5959f4a94 Merge branch 'main' into update-connect-dialog 2021-06-23 13:49:24 -07:00
Carlos Alcaide 48cc8596dc chore: 🤖 Finish up some styles
Finish up some styles. Deleted old commented code and add a temporary
lint ignore comment for no-bare-strings in targets.hbs
2021-06-23 13:48:51 -07:00
Randall Morey 33e6515749 feature: decode session credentials and save onto session instances 2021-06-23 16:36:05 -04:00
Susmitha Girumala 28963a75cc Merge pull request #611 from hashicorp/feature-oidc-accounts
Feature oidc accounts
2021-06-23 15:19:08 -04:00
Susmitha Girumala 6c1e9bc944 Merge branch 'main' into feature-oidc-accounts 2021-06-23 15:10:15 -04:00
Susmitha Girumala 1e421225fa Merge pull request #616 from hashicorp/fix-syntax-error
fix: Fix syntax error in about menu option in desktop
2021-06-23 15:09:24 -04:00
Susmitha Girumala 50ba2eb73a fix: Fix syntax in about menu option in desktop 2021-06-23 14:57:56 -04:00
Carlos Alcaide 1f20e2c40c Fix padding proportions 2021-06-23 11:55:15 -07:00
Carlos Alcaide f0926cba87 Change flex CSS in card header 2021-06-23 11:37:28 -07:00
Susmitha Girumala 3278d229e8 chore: Update components in connect dialog to latest 2021-06-23 11:58:48 -04:00
Carlos Alcaide Corvo d92654776c Merge branch 'main' into feature-oidc-accounts 2021-06-23 08:03:40 -07:00
Randall Morey 34c8ad1d6f Merge pull request #605 from hashicorp/feat-desktop-reveal-component
feat: 🎸 Create reveal component for desktop client
2021-06-23 10:50:54 -04:00
Randall Morey 1208fea0a4 Merge branch 'main' into feat-desktop-reveal-component 2021-06-23 10:13:42 -04:00
Randall Morey 790cec2931 Merge pull request #614 from hashicorp/ICU-1790-key-value-dropdown-item
feat: Add KeyValue Dropdown Item
2021-06-23 09:38:24 -04:00
Susmitha Girumala c7ee9cde17 feat: Allow dropdown items to be selectable without closing 2021-06-23 09:04:08 -04:00
Randall Morey 1143fb02cc chore: 🤖 polish up reveal component 2021-06-22 16:43:02 -04:00
Randall Morey 3fcff99024 fix: template syntax error 2021-06-22 15:35:47 -04:00
Randall Morey 2b5afa0e2c chore: add more example content to credentials card 2021-06-22 15:35:19 -04:00
Randall Morey b8c4feb634 chore: 🤖 merge from main 2021-06-22 15:10:47 -04:00
Susmitha Girumala 1b5e1a7736 style: Remove unused style param 2021-06-22 13:53:34 -04:00
Susmitha Girumala 27afafa077 docs: Update dropdown storybook with key-value item 2021-06-22 13:45:46 -04:00
Susmitha Girumala 73fef6b907 feat: Add key-value item to dropdown in rose addon 2021-06-22 13:38:47 -04:00
Randall Morey 2e2ff60c8f Merge pull request #585 from hashicorp/feat-card-header-footer-component
feat: 🎸 New Card component with header, body and footer
2021-06-22 13:21:06 -04:00
Randall Morey 4abf4e5550 chore: 🤖 polish card and example card usage 2021-06-22 12:58:34 -04:00
Randall Morey 8934e44558 tweak styles 2021-06-22 12:26:20 -04:00
Randall Morey c3561a1063 chore: tweak card styles 2021-06-22 12:08:31 -04:00
Carlos Alcaide Corvo 2f50e6a980 Merge branch 'main' into feat-desktop-reveal-component 2021-06-21 07:59:36 -07:00
Carlos Alcaide Corvo ff0971ca64 Merge branch 'main' into feat-card-header-footer-component 2021-06-21 07:59:18 -07:00
Randall Morey 3f3ac19628 Merge pull request #610 from hashicorp/feat-condensed-dropdown
feat: 🎸 Add condensed style for dropdown
2021-06-21 10:54:27 -04:00
Randall Morey b946917ad8 Merge pull request #612 from hashicorp/chore-tweak-dropdown
chore: 🤖 simplify dropdown styles for consistency with Structure
2021-06-21 10:44:57 -04:00
Carlos Alcaide bfdaacc2cd feat: 🎸 Changing div for h2
Changing the heading text container from a div to an h2
2021-06-18 16:23:07 -07:00
Carlos Alcaide e47c3bd14e feat: 🎸 Change Dropdown behaviour
Now when you click inside the dropdown it does not close.
2021-06-18 15:27:52 -07:00
Randall Morey 88d47688fa chore: 🤖 simplify dropdown styles for consistency with Structur 2021-06-18 16:54:16 -04:00
Carlos Alcaide 62b097170c feat: 🎸 Changes from previous PR suggestions
- Refactor RevealComponent class to inherit from RoseDropdown, no logic
need it. Now there is no need to keep any logic or state. - Refactor
component, to toggle Summary text and set chevron icon with CSS. -
Removed old commented code. Please feel free to suggest a change to
bring it back if can be useful.
2021-06-18 12:29:39 -07:00
Randall Morey 32de6a6ed5 chore: 🤖 add serialization support for OIDC-type accounts 2021-06-18 10:23:40 -04:00
Randall Morey 1e8c8a3ba0 feat: 🎸 add OIDC-typed account form 2021-06-18 09:51:52 -04:00
Randall Morey 0a57865270 feat: 🎸 add type-aware account display in admin UI 2021-06-17 14:09:31 -04:00
Carlos Alcaide b209ff7b2a feat: 🎸 Fix commited mistake
Fix a line of code I delete by accident on my previous commit
2021-06-16 14:27:10 -07:00
Carlos Alcaide a6a33f6b56 feat: 🎸 Create reveal component for desktop client
Create reveal component for desktop client.

✅ Closes: ICU-1432
2021-06-16 14:27:10 -07:00
Carlos Alcaide 445d789344 feat: 🎸 Update PR with suggestions
- Apply forgoten padding and alignment styles for header.

BREAKING CHANGE: 🧨 - Refactor to use named block withint the card component.
2021-06-16 13:42:57 -07:00
Carlos Alcaide 939dd16409 feat: 🎸 Change component name and add attributes
Change the component name to a more generic name (card). Add heading
attributes.

✅ Closes: ICU-1432
2021-06-16 11:32:18 -07:00
Carlos Alcaide b0a2348776 Refactor component name to just card and change tests to accommodate the changes 2021-06-16 11:32:18 -07:00
Carlos Alcaide 3bfb6fe5ee feat: 🎸 New Card component with header, body and footer
Add the new Card component with header, body and footer for the desktop
client. This card will be used within the connection dialog to show
credentials

✅ Closes: ICU-1432
2021-06-16 11:32:17 -07:00
Carlos Alcaide 2fd646c2c9 feat: 🎸 Add condensed style for dropdown
First iteration to add a condensed style for dropdown.

✅ Closes: ICU-1431
2021-06-16 11:03:59 -07:00
Randall Morey 5659df3336 Merge pull request #602 from hashicorp/chore-update-electron-app-resolutions
chore: 🤖 Update electron app resolutions
2021-06-15 17:21:20 -04:00
Carlos Alcaide Corvo 9f66314a9e Merge branch 'main' into chore-update-electron-app-resolutions 2021-06-15 13:29:34 -07:00
Randall Morey 6ddf551d75 Merge pull request #598 from hashicorp/chore-bump-sinon-version
chore: 🤖 Bump sinon dependency bump version
2021-06-15 16:27:51 -04:00
Randall Morey 6272b1a164 Merge branch 'main' into chore-bump-sinon-version 2021-06-15 16:13:20 -04:00
Randall Morey 43cd689da0 Merge pull request #601 from hashicorp/chore-bump-node-html-parser-dep
chore: 🤖 Bump node-html-parser dependency
2021-06-15 16:07:02 -04:00
Carlos Alcaide Corvo 66601240fc Merge branch 'main' into chore-bump-sinon-version 2021-06-15 12:56:36 -07:00
Randall Morey 11daac57c2 Merge branch 'main' into chore-bump-node-html-parser-dep 2021-06-15 15:49:44 -04:00
Randall Morey 9b07969491 Merge pull request #608 from hashicorp/fix-yarn-warning-for-hosted-git-info
fix: 🐛 Fix yarn warning due to strict version declaration
2021-06-15 15:48:57 -04:00
Randall Morey 8e3362fb12 Merge branch 'main' into fix-yarn-warning-for-hosted-git-info 2021-06-15 15:37:06 -04:00
Randall Morey d9bd8fa193 Merge pull request #609 from hashicorp/dependabot/npm_and_yarn/postcss-7.0.36
chore(deps): bump postcss from 7.0.35 to 7.0.36
2021-06-15 15:32:18 -04:00
Randall Morey 3da7bfc7cc Merge branch 'main' into dependabot/npm_and_yarn/postcss-7.0.36 2021-06-15 15:18:29 -04:00
Randall Morey d82cbec7c3 Merge pull request #606 from hashicorp/chore-update-resolutions-clean-css
chore: 🤖 Update resolutions for clean-css
2021-06-15 15:17:13 -04:00
dependabot[bot] 3f9530a970 chore(deps): bump postcss from 7.0.35 to 7.0.36
Bumps [postcss](https://github.com/postcss/postcss) from 7.0.35 to 7.0.36.
- [Release notes](https://github.com/postcss/postcss/releases)
- [Changelog](https://github.com/postcss/postcss/blob/main/CHANGELOG.md)
- [Commits](https://github.com/postcss/postcss/compare/7.0.35...7.0.36)

---
updated-dependencies:
- dependency-name: postcss
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-06-15 19:05:47 +00:00
Randall Morey 804a879182 Merge branch 'main' into chore-update-resolutions-clean-css 2021-06-15 15:04:17 -04:00
Randall Morey 170fc74b7f Merge pull request #599 from hashicorp/dependabot/npm_and_yarn/ui/desktop/electron-app/normalize-url-4.5.1
chore(deps): bump normalize-url from 4.5.0 to 4.5.1 in /ui/desktop/electron-app
2021-06-15 15:03:53 -04:00
Randall Morey 2ac8818cc6 Merge branch 'main' into dependabot/npm_and_yarn/ui/desktop/electron-app/normalize-url-4.5.1 2021-06-15 12:42:23 -04:00
Carlos Alcaide Corvo 99851fce59 Merge branch 'main' into chore-update-electron-app-resolutions 2021-06-14 16:36:22 -07:00
Carlos Alcaide Corvo 93af7241f5 Merge branch 'main' into chore-update-resolutions-clean-css 2021-06-14 16:25:35 -07:00
Carlos Alcaide Corvo 503a7b9eb8 Merge branch 'main' into chore-bump-node-html-parser-dep 2021-06-14 16:25:24 -07:00
Carlos Alcaide Corvo ffcc8a25d6 Merge branch 'main' into chore-bump-sinon-version 2021-06-14 16:24:52 -07:00
Randall Morey eeb8610973 Merge pull request #577 from hashicorp/feat-new-displaying-connection-dialog-desktop
First iteration of connect dialog component
2021-06-14 18:09:31 -04:00
Randall Morey 75bb34f738 chore: 🤖 use tracked properties instead of attributes 2021-06-14 17:08:48 -04:00
Randall Morey 242c3f6370 chore: 🤖 use named blocks instead of contextual components 2021-06-14 17:02:17 -04:00
Carlos Alcaide 3d3d5ec4d2 fix: 🐛 Fix yarn warning due to strict version declaration
Fix yarn warning due to a strict version declaration of hosted-git-info.
Now the yarn warning is gone when running yarn install.
2021-06-14 12:31:10 -07:00
Carlos Alcaide f34af386c4 chore: 🤖 Update resolutions for clean-css
As per dependanbot alert, a transitive dependency is using a version of
clean-css that has a security vulnerability, With this change we force
to resolve a version of clean-css that has not such vulnerability.
2021-06-14 10:10:02 -07:00
Carlos Alcaide Corvo 9b625a642f Merge branch 'main' into chore-update-electron-app-resolutions 2021-06-14 08:25:50 -07:00
Carlos Alcaide Corvo 1ed0d24fa2 Merge branch 'main' into chore-bump-node-html-parser-dep 2021-06-14 08:25:38 -07:00
Carlos Alcaide Corvo b12b303b97 Merge branch 'main' into chore-bump-sinon-version 2021-06-14 08:25:29 -07:00
Carlos Alcaide Corvo 5e591ce5bb Merge branch 'main' into feat-new-displaying-connection-dialog-desktop 2021-06-14 08:25:04 -07:00
Randall Morey 23de0695d0 Merge pull request #604 from hashicorp/chore-windows-container-build
Chore windows container build
2021-06-09 17:05:51 -04:00
Randall Morey 8d4cb1bfea Merge branch 'main' into chore-windows-container-build 2021-06-09 16:56:51 -04:00
Randall Morey d67f6dab2f chore: add --frozen-lockfile --non-interactive commands to yarn install in docker 2021-06-09 16:41:32 -04:00
Carlos Alcaide Corvo 8ee0e0b92d Merge pull request #600 from hashicorp/chore-update-artifact-version-for-release
Bump artifact version for 0.3.0 release
2021-06-09 13:36:45 -07:00
Randall Morey be9b68eeff chore: add windows build command that builds assets inside a container 2021-06-09 16:35:17 -04:00
Carlos Alcaide Corvo 1e20f7a149 Merge branch 'main' into chore-update-artifact-version-for-release 2021-06-09 13:25:35 -07:00
Randall Morey b413e9d8dd Merge pull request #603 from hashicorp/docs-desktop-known-issue
docs:  add known issue statement to changelog for 1.1.0 desktop
2021-06-09 16:18:15 -04:00
Randall Morey fd3c9eb876 docs: add known issue statement to changelog for 1.1.0 desktop 2021-06-09 15:41:40 -04:00
Carlos Alcaide 5a76f2791a chore: 🤖 Update electron app resolutions
Update electron app resolutions so we do not get versions with security
vulnerabilities from our transitive dependencies
2021-06-09 11:42:47 -07:00
Carlos Alcaide ca2508635e chore: 🤖 Bump node-html-parser dependency
Bump node-html-parser dependency on desktop. The goal is to update the
package and solve the css-what security vulnerability. Node-html-arser
requires css-what via transitive dependency css-select. Upgrading to the
last version of node-html-parser brings the css-what version that solves
the security issue.
2021-06-09 11:25:35 -07:00
Carlos Alcaide Corvo baff01ad48 Merge branch 'main' into chore-bump-sinon-version 2021-06-09 10:41:18 -07:00
Randall Morey 3f04c209f3 chore: tweak dialog styles and language 2021-06-09 10:36:15 -07:00
Carlos Alcaide dbf2a8e43f feat: 🎸 Replace confirmation dialog with this new one
Leave this new dialog exactly as the confirmation dialog. We want to use
this one as a replacament and slowly add more fields and information
2021-06-09 10:31:26 -07:00
Carlos Alcaide db2a40b58f feat: 🎸 Modify test to fit latest changes
Modify tests to fit the latest changes within the confirmation/success
dialog and the brand new conection dialog
2021-06-09 10:31:26 -07:00
Carlos Alcaide f14346d3a4 Add uni test for dialog detail and fix lint errors 2021-06-09 10:31:26 -07:00
Carlos Alcaide c2b4c0ad8b Change model attributes to tracked 2021-06-09 10:31:26 -07:00
Carlos Alcaide 2bb9db6a67 Fix rebase mess with yarn.lock 2021-06-09 10:31:25 -07:00
Carlos Alcaide cf9166fe4a Use translation helper in targets and delete the port change in yarn start command. 2021-06-09 10:30:54 -07:00
Carlos Alcaide 50c7bfc659 Stop using a bare dialog and start using the Dialog Detail component 2021-06-09 10:30:54 -07:00
Carlos Alcaide ecda08164a Ignore test and add changes to pass prettier 2021-06-09 10:30:53 -07:00
Carlos Alcaide 2dfda037fe First iteration of connect dialog component 2021-06-09 10:30:53 -07:00
Carlos Alcaide 9979fe8464 Bump artifact version for 0.3.0 release 2021-06-09 09:33:47 -07:00
dependabot[bot] 49f6330a5d chore(deps): bump normalize-url in /ui/desktop/electron-app
Bumps [normalize-url](https://github.com/sindresorhus/normalize-url) from 4.5.0 to 4.5.1.
- [Release notes](https://github.com/sindresorhus/normalize-url/releases)
- [Commits](https://github.com/sindresorhus/normalize-url/commits)

---
updated-dependencies:
- dependency-name: normalize-url
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-06-09 16:17:26 +00:00
Randall Morey 9049bb2087 Merge pull request #597 from hashicorp/fix-desktop-about
fix: about dialog should display properly
2021-06-09 12:16:14 -04:00
Carlos Alcaide Corvo 82135a4b20 Merge branch 'main' into fix-desktop-about 2021-06-09 08:47:46 -07:00
Carlos Alcaide e737cb448c chore: 🤖 Bump sinon dependency bump version
Bump Sinon dependency version
2021-06-08 15:25:04 -07:00
Carlos Alcaide Corvo dd37718c62 Merge pull request #595 from hashicorp/chore-update-css-what-resolutions
chore: 🤖 Update resolutions for css-what
2021-06-08 14:42:54 -07:00
Carlos Alcaide Corvo e6f0166ff0 Merge branch 'main' into chore-update-css-what-resolutions 2021-06-08 14:30:00 -07:00
Carlos Alcaide Corvo 606a48ca49 Merge pull request #594 from hashicorp/chore-update-trim-newlines
chore: 🤖 Update resolutions for trim-newlines
2021-06-08 14:28:13 -07:00
Carlos Alcaide Corvo d1e46cb9b1 Merge branch 'main' into chore-update-trim-newlines 2021-06-08 14:14:23 -07:00
Carlos Alcaide Corvo 11ceb8b5ca Merge pull request #592 from hashicorp/chore-update-version-ember-a11y-testing
chore: 🤖 Upgrade ember-a11y-testing version
2021-06-08 14:14:07 -07:00
Randall Morey 3854d32e92 fix: about dialog should display properly 2021-06-08 17:07:39 -04:00
Carlos Alcaide Corvo bbb703c671 Merge branch 'main' into chore-update-version-ember-a11y-testing 2021-06-08 14:03:42 -07:00
Randall Morey f507edae03 Merge pull request #593 from hashicorp/remove-shell-config-for-cli-on-windows
fix: Remove shell option for spawning clis on windows
2021-06-08 16:40:13 -04:00
Randall Morey 9231963ac1 Merge branch 'main' into remove-shell-config-for-cli-on-windows 2021-06-08 16:28:33 -04:00
Carlos Alcaide 9bfb136247 chore: 🤖 Upgrade ember-a11y-testing version
Upgrade ember-a11y-testing package version
2021-06-08 12:11:56 -07:00
Carlos Alcaide 4af4ee7cc0 chore: 🤖 Update resolutions for css-what
Update resolution version for css-what transitive dependency.
2021-06-08 08:09:04 -07:00
Carlos Alcaide 12a9f72c68 chore: 🤖 Update resolutions for trim-newlines
Update resolution version for trim-newlines transitive dependency.
2021-06-08 07:56:09 -07:00
Carlos Alcaide Corvo bb88672aff Merge pull request #591 from hashicorp/chore-update-doctoc-version
chore: 🤖 Upgrade version of doctoc
2021-06-08 07:23:46 -07:00
Susmitha Girumala 25e004976e fix: Remove shell option for spawning clis on windows 2021-06-07 18:50:39 -04:00
Carlos Alcaide 60993e455a chore: 🤖 Upgrade version of doctoc
Upgrade version of doctoc and update some readme files in the process.
2021-06-07 14:30:21 -07:00
Susmitha Girumala 40ee317f47 Merge pull request #588 from hashicorp/frameless-desktop-shell-on-windows-os
Use frameless desktop shell on Windows OS
2021-06-07 16:45:20 -04:00
Susmitha Girumala 530cd0298a chore: Simplify Windows styles and cli name population 2021-06-07 14:18:07 -04:00
Susmitha Girumala 374a13cd07 fix: Remove debugger statement 2021-06-07 11:53:15 -04:00
Randall Morey 6f5da333e0 Merge branch 'main' into frameless-desktop-shell-on-windows-os 2021-06-07 10:53:42 -04:00
Randall Morey d121bcf204 Merge pull request #590 from hashicorp/fix-oidc-create
fix: 🐛 add read-only hmac field and enable oidc auth creation
2021-06-07 10:53:30 -04:00
Susmitha Girumala 2acd555966 docs: Update changelog for next release 2021-06-06 11:58:57 -04:00
Susmitha Girumala 820843c51d chore: Fix desktop tests 2021-06-06 11:29:23 -04:00
Susmitha Girumala 243f165644 chore: clean yarn.lock 2021-06-06 10:15:34 -04:00
Susmitha Girumala 5036c62740 Merge remote-tracking branch 'origin/main' into frameless-desktop-shell-on-windows-os 2021-06-06 02:59:09 -04:00
Susmitha Girumala 3ffe70cf5d fix: Ignore app updater for windows
Ignore app updater for windows until first release. Use version packaged
at build time in app updater.
2021-06-06 02:58:42 -04:00
Susmitha Girumala c5b0061428 feat: Use tree-kill module to kill sessions on Windows 2021-06-06 02:47:00 -04:00
Susmitha Girumala fefae2b73d fix: Fix scrollbars and window minimize/close actions for win 2021-06-06 02:12:39 -04:00
Susmitha Girumala 196d01aae2 fix: Fix cli path on windows to launch connect shell 2021-06-05 22:11:47 -04:00
Randall Morey 96707ebe15 fix: 🐛 add read-only hmac field and enable oidc auth creation 2021-06-05 12:29:12 -04:00
Randall Morey 79f5db0441 Merge pull request #587 from hashicorp/feature-oidc-array-fields-crud
Feature oidc array fields crud
2021-06-04 16:50:03 -04:00
Randall Morey d4fee0af34 chore: manual merge from main 2021-06-04 14:35:45 -04:00
Randall Morey a8c65e73f5 Merge pull request #589 from hashicorp/feature-oidc-accounts
Feature oidc accounts
2021-06-04 14:32:09 -04:00
Randall Morey 13df776c18 feat: 🎸 add OIDC account listing 2021-06-04 14:23:08 -04:00
Randall Morey 12588a17ab refactor: 💡 type-specific account serialization 2021-06-04 13:38:23 -04:00
Susmitha Girumala 7b2c8b7d58 Merge remote-tracking branch 'origin/main' into frameless-desktop-shell-on-windows-os 2021-06-04 12:21:49 -04:00
Susmitha Girumala 873965d7b7 feat: Hook in browser actions into electon's BrowserWindow 2021-06-04 12:21:08 -04:00
Randall Morey f02f488edd Merge pull request #583 from hashicorp/ICU-1369-oidc-status-change
[draft] feat: Add oidc status change dropdown to auth method actions
2021-06-04 11:48:16 -04:00
Susmitha Girumala a2ee17e918 Merge pull request #586 from hashicorp/fix-sass-division-deprecation-warning
fix: 🐛 Deprecate Slash as division operator
2021-06-04 11:16:02 -04:00
Randall Morey bf8620d75c chore: 🤖 clean up change-state handler 2021-06-04 10:11:07 -04:00
Randall Morey d0eb41e03b feat: 🎸 add icons and clean up state change language 2021-06-03 17:08:40 -04:00
Carlos Alcaide 6e932f8054 fix: 🐛 Deprecate Slash as division operator
Deprecation of slash as division operator as we were getting warnings in
the terminal about it. More info
[here](https://sass-lang.com/documentation/breaking-changes/slash-div)
2021-06-03 11:32:24 -07:00
Susmitha Girumala 76291896c3 feat: Add window action buttons for windows OS only 2021-06-03 14:28:44 -04:00
Susmitha Girumala c803adccc1 feat: Remove header brand icon padding on windows OS only 2021-06-03 14:03:04 -04:00
Susmitha Girumala f7854b642c chore: Add in-progress oidc test for visibility 2021-06-02 22:44:40 -04:00
Susmitha Girumala a7a6bdedf9 refactor: API: Add AuthMethodOIDC class to hold static states 2021-06-02 22:22:02 -04:00
Carlos Alcaide Corvo 4bcd0e7d06 Merge pull request #580 from hashicorp/chore-update-ember-cli-storybook
chore: 🤖 Update ember-cli-storybook
2021-06-02 15:17:12 -07:00
Carlos Alcaide 895a25218e Fix merge conflict 2021-06-02 15:04:25 -07:00
Carlos Alcaide 8356e7d47a chore: 🤖 Update ember-cli-storybook
Update the version of @storybook/ember-cli-storybook we are using.
2021-06-02 15:01:38 -07:00
Susmitha Girumala 680ae9980b Merge pull request #581 from hashicorp/ICU-1356-enable-windows-platform-support
[desktop] Enable windows platform support
2021-06-02 17:37:12 -04:00
Susmitha Girumala e106454bb5 Merge remote-tracking branch 'origin' into ICU-1356-enable-windows-platform-support 2021-06-02 17:21:28 -04:00
Carlos Alcaide Corvo aa227a0db8 Merge pull request #584 from hashicorp/chore-ws-security-vulnerability
chore: 🤖 Fix WS security vulnerability
2021-06-02 11:59:01 -07:00
Carlos Alcaide 8aca872c66 chore: 🤖 Fix WS security vulnerability
Update the resolutions to resolve a version of WS that has no security
vulnerabilities.
2021-06-02 11:40:33 -07:00
Randall Morey 269c56bf83 fix: lint issue 2021-06-02 14:33:31 -04:00
Randall Morey a89b27c813 Merge branch 'ICU-1369-oidc-status-change' of https://github.com/hashicorp/boundary-ui into ICU-1369-oidc-status-change 2021-06-02 14:25:36 -04:00
Randall Morey 2804b4322b manual merge 2021-06-02 14:25:19 -04:00
Randall Morey 66d16d84d0 fix: 🐛 use flattened attrs to capture oidc field errors 2021-06-02 14:23:54 -04:00
Carlos Alcaide f420d01fb8 fix: 🐛 Fix lint errors
Fix lint errors
2021-06-02 11:19:44 -07:00
Susmitha Girumala 4bd80a716e Revert "Merge branch 'ICU-1369-oidc-status-change' of github.com:hashicorp/boundary-ui into ICU-1369-oidc-status-change"
This reverts commit 8098beb450, reversing
changes made to a6672ecef4.
2021-06-02 14:07:38 -04:00
Susmitha Girumala 8098beb450 Merge branch 'ICU-1369-oidc-status-change' of github.com:hashicorp/boundary-ui into ICU-1369-oidc-status-change 2021-06-02 14:06:06 -04:00
Susmitha Girumala a6672ecef4 chore: Rebase onto feature-oidc-array-fields-crud branch 2021-06-02 14:03:53 -04:00
Susmitha Girumala 79b6737aaa chore: clean yarn install 2021-06-02 13:55:12 -04:00
Susmitha Girumala 31afafff4e Merge branch 'main' into ICU-1356-enable-windows-platform-support 2021-06-02 13:33:04 -04:00
Susmitha Girumala d4a4828b67 Merge pull request #568 from hashicorp/generate-forge-config-on-build
feat: Generate config file for desktop build
2021-06-02 13:32:09 -04:00
Susmitha Girumala 44fa206619 feat: Add oidc status change dropdown to auth method actions 2021-06-02 13:10:34 -04:00
Carlos Alcaide bc10b00874 chore: 🤖 Fix lint errors
Fix lint errors
2021-06-02 13:10:33 -04:00
Susmitha Girumala bbd73b36d1 chore: Fix js lint errors 2021-06-02 13:10:33 -04:00
Randall Morey 3a52b40214 chore: add meta description 2021-06-02 13:10:33 -04:00
Randall Morey c41855ccc4 chore: 🤖 fix imports that don't make sense 2021-06-02 13:10:32 -04:00
Randall Morey c013b178d7 feat: 🎸 add oidc-account-crud feature flag 2021-06-02 12:38:15 -04:00
Randall Morey 683fffaa0e fix: correct path to logo-app 2021-06-02 12:09:34 -04:00
Randall Morey 31f67e568c chore: add missing translations 2021-06-02 12:09:17 -04:00
Susmitha Girumala 9c15d02080 Merge branch 'main' into generate-forge-config-on-build 2021-06-02 11:28:10 -04:00
Susmitha Girumala c14be070f7 feat: Add oidc status change dropdown to auth method actions 2021-06-01 22:29:24 -04:00
Randall Morey 7b1410d832 chore: move squirrel maker to devdeps 2021-06-01 15:25:53 -04:00
Randall Morey 06cf112b61 chore: bump CLI version 2021-06-01 15:25:02 -04:00
Susmitha Girumala 95e3410540 Merge pull request #582 from hashicorp/fix-lint-error
chore: Fix js lint errors
2021-06-01 14:20:17 -04:00
Carlos Alcaide 77d7187116 chore: 🤖 Fix lint errors
Fix lint errors
2021-06-01 11:07:48 -07:00
Susmitha Girumala 28d18e389c chore: Fix js lint errors 2021-06-01 12:55:35 -04:00
Susmitha Girumala d95ae373ab refactor: Move windows app icon to new assets folder 2021-06-01 11:28:47 -04:00
Susmitha Girumala a784eeecc2 Merge branch 'ICU-1356-enable-windows-platform-support' of https://github.com/hashicorp/boundary-ui into ICU-1356-enable-windows-platform-support 2021-06-01 10:20:42 -04:00
Susmitha Girumala 84962c9ed3 docs: Add windows build to readme 2021-06-01 10:20:25 -04:00
Susmitha Girumala cfd2e13832 refactor: Reset titlebarstyle to mac 2021-06-01 09:58:43 -04:00
Susmitha Girumala 880f8f6b39 refactor: Cleanup frameless windows shell work for a futurePR 2021-06-01 09:55:46 -04:00
Susmitha Girumala c5b1cc1498 Merge branch 'main' into generate-forge-config-on-build 2021-06-01 09:35:07 -04:00
Susmitha Girumala 343f85f8e7 Merge remote-tracking branch 'origin/generate-forge-config-on-build' into ICU-1356-enable-windows-platform-support 2021-05-27 10:36:00 -04:00
Susmitha Girumala 654bc18422 chore: Separate desktop ember app build from electron build 2021-05-27 10:34:13 -04:00
Susmitha Girumala 81b59af3b4 Merge pull request #575 from hashicorp/chore-contextual-form-components
feat: 🎸 textarea and select should support contexual usage
2021-05-27 09:22:14 -04:00
Randall Morey e50d0ac00b feat: 🎸 add account claim map support 2021-05-26 18:09:28 -04:00
Randall Morey 9fe89c9b18 feature: add addItem functionality to array fields 2021-05-26 17:12:51 -04:00
Randall Morey 8c20d29806 feat: 🎸 add remove array item support to oidc form 2021-05-26 15:28:41 -04:00
Susmitha Girumala 10d93992d4 refactor: Move assets out of config folder in desktop 2021-05-26 15:05:30 -04:00
Randall Morey 0552d1db5a Merge branch 'chore-contextual-form-components' into feature-oidc-array-fields-crud 2021-05-26 11:14:20 -04:00
Susmitha Girumala 07919409d9 refactor: Static electron config to contain windows platform 2021-05-26 10:39:52 -04:00
Susmitha Girumala d691c1fa11 Merge remote-tracking branch 'origin/generate-forge-config-on-build' into ICU-1356-enable-windows-platform-support 2021-05-26 10:32:57 -04:00
Susmitha Girumala b632df901b Merge remote-tracking branch 'origin/main' into ICU-1356-enable-windows-platform-support 2021-05-26 10:16:25 -04:00
Randall Morey ecb67ea344 Merge branch 'main' into chore-contextual-form-components 2021-05-26 09:29:55 -04:00
Susmitha Girumala 4c2e8f7a76 Merge remote-tracking branch 'origin/main' into generate-forge-config-on-build 2021-05-25 18:07:26 -04:00
Susmitha Girumala 22c4581d4d refactor: 💡 Import generated config into electron forge config 2021-05-25 18:07:04 -04:00
Randall Morey 34c668b4d9 feat: 🎸 textarea and select should support contexual usage 2021-05-25 17:56:22 -04:00
Randall Morey 9437edbf8a Merge pull request #574 from hashicorp/chore-embroider
chore: 🤖 fix imports that don't make sense
2021-05-25 17:50:53 -04:00
Randall Morey 5890b1b2e8 Merge branch 'main' into chore-embroider 2021-05-25 17:36:49 -04:00
Randall Morey 5ea26dc7ea feature: add array fields to oidc form 2021-05-25 17:36:28 -04:00
Susmitha Girumala 6afde1fb18 Merge pull request #572 from hashicorp/chore-meta-description
chore: add meta description
2021-05-25 16:44:39 -04:00
Susmitha Girumala 708a0836cc Merge branch 'main' into chore-meta-description 2021-05-25 15:21:58 -04:00
Susmitha Girumala 3fc51ee54a Merge pull request #571 from hashicorp/fix-logo-app
fix:  logo-app.svg should load properly
2021-05-25 15:21:37 -04:00
Randall Morey e85a75305f Merge branch 'main' into fix-logo-app 2021-05-25 15:10:21 -04:00
Randall Morey 9f469aec38 Merge pull request #569 from hashicorp/chore-dependabot
chore: 🤖 bump browserslist version for dependabot
2021-05-25 15:10:13 -04:00
Susmitha Girumala dd7907da8c Merge remote-tracking branch 'origin/main' into generate-forge-config-on-build 2021-05-25 15:00:29 -04:00
Susmitha Girumala 634c522eaf refactor: Update electron config console log tag 2021-05-25 15:00:20 -04:00
Randall Morey 57a924703e Merge branch 'main' into chore-dependabot 2021-05-25 14:56:51 -04:00
Randall Morey 89285dcfba Merge branch 'main' into fix-logo-app 2021-05-25 14:56:41 -04:00
Randall Morey 05c14d7bbb Merge pull request #570 from hashicorp/chore-docker-builds
Add desktop static assets Docker build support
2021-05-25 14:56:33 -04:00
Randall Morey 8c4228016c Merge branch 'main' into chore-dependabot 2021-05-25 14:54:52 -04:00
Randall Morey 8d00730653 chore: 🤖 fix imports that don't make sense 2021-05-25 14:52:20 -04:00
Randall Morey 38ed272fc2 Merge branch 'main' into fix-logo-app 2021-05-25 14:51:58 -04:00
Randall Morey d0a11d6054 Merge branch 'main' into chore-meta-description 2021-05-25 14:51:52 -04:00
Susmitha Girumala 8022234e84 Merge branch 'main' into chore-docker-builds 2021-05-25 14:26:56 -04:00
Susmitha Girumala b58bde0461 Merge branch 'main' into generate-forge-config-on-build 2021-05-25 14:26:31 -04:00
Susmitha Girumala 48c7538172 Merge pull request #566 from hashicorp/ICU-1560-fix-app-update-prompt-desktop
fix: Desktop should show update prompt for 1.0.1 release
2021-05-25 14:26:18 -04:00
Susmitha Girumala cb938d0e33 Merge branch 'main' into ICU-1560-fix-app-update-prompt-desktop 2021-05-25 13:43:21 -04:00
Susmitha Girumala f2544684ec Merge pull request #573 from hashicorp/remove-yarn-audit-precommit-check
chore: Remove yarn audit check
2021-05-25 13:43:01 -04:00
Susmitha Girumala 131ce44ecc chore: Remove yarn audit from github actions 2021-05-25 13:24:58 -04:00
Randall Morey b91f8c1661 chore: add meta description 2021-05-25 13:14:32 -04:00
Susmitha Girumala 3943a740bc chore: Remove yarn audit check
Json output option for yarn audit is broken:
https://github.com/yarnpkg/yarn/issues/7404
2021-05-25 13:14:16 -04:00
Randall Morey d88a4ac103 fix: logo-app.svg should load properly 2021-05-25 12:55:43 -04:00
Randall Morey afeaf3a671 chore: 🤖 bump browserslist version for dependabot 2021-05-25 11:08:26 -04:00
Randall Morey 1a968a7d24 chore: fix typo 2021-05-24 18:20:00 -04:00
Randall Morey ac5f7fa1c9 chore: add desktop build support with docker-compose 2021-05-24 17:33:03 -04:00
Susmitha Girumala c1cd762da4 chore: Make windows electron shell frameless 2021-05-24 16:37:35 -04:00
Susmitha Girumala 5f9230c458 Merge branch 'main' into ICU-1560-fix-app-update-prompt-desktop 2021-05-24 16:04:33 -04:00
Susmitha Girumala 2381b3372c Merge pull request #567 from hashicorp/feature-oidc-standard-crud
OIDC standard crud - ICU-1365
2021-05-24 16:04:20 -04:00
Susmitha Girumala 4a07478f1e fix: Use os.platform instead of os.type in desktop for platfo 2021-05-24 15:53:10 -04:00
Susmitha Girumala 5c4ceb7f0f Merge branch 'main' into feature-oidc-standard-crud 2021-05-24 15:47:49 -04:00
Susmitha Girumala e940ec98d4 Merge pull request #565 from hashicorp/feature-checkbox-helper-text
feat: 🎸 add helper text option to checkbox component
2021-05-24 15:47:34 -04:00
Susmitha Girumala b7e0f42d47 Merge remote-tracking branch 'origin/generate-forge-config-on-build' into ICU-1356-enable-windows-platform-support 2021-05-24 15:27:03 -04:00
Susmitha Girumala 1b300c676b Merge branch 'main' into feature-checkbox-helper-text 2021-05-24 15:20:37 -04:00
Susmitha Girumala a7cc1b9ba2 Merge pull request #563 from hashicorp/feature-more-oidc-modeling
Feature more oidc modeling
2021-05-24 15:20:24 -04:00
Susmitha Girumala c99449d8e5 refactor: Rename forge config generator to electron.js 2021-05-24 15:20:02 -04:00
Susmitha Girumala 2038a463db Merge branch 'main' into feature-more-oidc-modeling 2021-05-24 14:48:36 -04:00
Susmitha Girumala 4f0e2794ec chore: Add windows icon in desktop 2021-05-24 11:21:34 -04:00
Susmitha Girumala 89891a401a refactor: Use platform helper instead of os api in desktop 2021-05-24 10:41:09 -04:00
Susmitha Girumala d572d5157d chore: desktop: use OS agnostic paths 2021-05-22 18:18:16 -04:00
Susmitha Girumala 6ffb4a2350 chore: Add cross-os package to desktop 2021-05-22 17:12:01 -04:00
Susmitha Girumala 1e1ea1c49a chore: Add cross-env package to desktop 2021-05-22 17:00:48 -04:00
Susmitha Girumala fb4238b035 chore: Refactor windows electron config to use new generator 2021-05-22 16:53:56 -04:00
Susmitha Girumala 3d6d7c99c2 Merge remote-tracking branch 'origin/generate-forge-config-on-build' into ICU-1356-enable-windows-platform-support 2021-05-22 15:59:21 -04:00
Susmitha Girumala 5bb7d41903 feat: Add copyright info to 'About' menu option
Ignore generated forge config file
2021-05-21 17:38:26 -04:00
Susmitha Girumala 47c453e979 feat: Generate forge config file based on platform
In addition, store release variables in forge config for display in
"About" menu option
2021-05-21 17:20:49 -04:00
Randall Morey e16bfdfb03 feat: 🎸 add OIDC crud without array fields or state change 2021-05-21 16:49:07 -04:00
Randall Morey 3138aecc37 chore: add OIDC form field translations 2021-05-21 16:40:29 -04:00
Randall Morey b19583c08d chore: 🤖 tweak oidc attributes serialization 2021-05-21 16:38:59 -04:00
Randall Morey 3d8a70d676 chore: 🤖 remove unnecessary awaits 2021-05-21 15:26:26 -04:00
Randall Morey 7e6158b847 feat: 🎸 add helper text option to checkbox component 2021-05-21 14:12:48 -04:00
Susmitha Girumala 23e82b352e fix: Desktop should show update prompt for 1.0.1 release 2021-05-21 14:12:23 -04:00
Carlos Alcaide Corvo 2ccd08a8d4 Merge pull request #564 from hashicorp/clean-default-tests-comment
style: 💄 Clean default tests comments
2021-05-21 10:13:14 -07:00
Carlos Alcaide 6159378a52 style: 💄 Clean default tests comments
Clean the default test comment added when creating a new test file with
ember-cli.
2021-05-21 08:19:48 -07:00
Susmitha Girumala 65039ce820 fix: Use robocopy in windows instead of xcopy 2021-05-21 10:27:00 -04:00
Randall Morey fde633331c feat: 🎸 add missing array fields to auth method attributes 2021-05-20 18:00:48 -04:00
Randall Morey 597b945aca chore: 🤖 complete the fragment-string serializer with normalize 2021-05-20 17:54:00 -04:00
Susmitha Girumala d23684c42f chore: Update desktop build vars to work on windows 2021-05-20 16:53:18 -04:00
Randall Morey cb3bcf1b9e Merge pull request #558 from hashicorp/feature-oidc-account-claim-maps
Feature oidc account claim maps
2021-05-20 16:18:30 -04:00
Randall Morey c8c5c2e7ef Merge branch 'main' into feature-oidc-account-claim-maps 2021-05-20 16:00:43 -04:00
Randall Morey 8886f14996 Merge pull request #557 from hashicorp/feature-oidc-state-change
feat: 🎸 add OIDC change state custom method
2021-05-20 16:00:32 -04:00
Randall Morey e8c7e81828 Merge branch 'main' into feature-oidc-state-change 2021-05-20 15:37:15 -04:00
Randall Morey 1f47ca8ea9 Merge pull request #556 from hashicorp/feature-oidc-modeling
feat: 🎸 implement basic OIDC auth method attributes modeling
2021-05-20 15:37:08 -04:00
Randall Morey f61cad986f Merge branch 'main' into feature-oidc-modeling 2021-05-20 15:16:56 -04:00
Carlos Alcaide Corvo 6256bfc3cf Merge pull request #554 from hashicorp/new-table-style
Refactor rose table component
2021-05-19 13:37:39 -07:00
Carlos Alcaide 3133997e78 feat: 🎸 Deleting forgot test
Deleting a test that is not need it anymore after last changes
2021-05-19 13:15:04 -07:00
Carlos Alcaide Corvo ed9324a0de Merge branch 'main' into new-table-style 2021-05-19 11:17:43 -07:00
Carlos Alcaide ab668d74eb feat: 🎸 Delete key-value row and other tweaks
Delete the recently introduced key-value class for rows, for they
key-value lookalike, when editing we want to use 3 colums on the table
rather than 2. Some style's tweaks to simplify
2021-05-19 11:16:30 -07:00
Randall Morey 4fa5b924c9 Merge pull request #562 from hashicorp/chore-bump-cli-version
chore:  bump CLI version and update changelog
2021-05-19 13:23:22 -04:00
Susmitha Girumala 7876de8e2d feat: Add windows electron maker in desktop 2021-05-19 13:06:32 -04:00
Randall Morey e86a4fc27d chore: bump CLI version and update changelog 2021-05-19 13:04:40 -04:00
Randall Morey d72b02ad29 Merge pull request #555 from hashicorp/ICU-1335-close-all-sessions-on-exit
feat: Prompt before quitting inprogress session on desktop client quit
2021-05-19 12:52:19 -04:00
Randall Morey 545e7d5a7f fix: import session manager correctly and reconstruct origin URL without extra colons 2021-05-19 09:45:07 -04:00
Randall Morey 4055f3a06e Merge pull request #560 from hashicorp/refactor-session-management
refactor:  change isActive to isRunning and related language to reduc…
2021-05-18 17:34:01 -04:00
Randall Morey 4fed7f3d94 refactor: rename to "running" 2021-05-17 17:23:18 -04:00
Randall Morey ee29f3c599 refactor: change isActive to isRunning and related language to reduce confusion with the API concept of session status "active" 2021-05-17 16:33:34 -04:00
Randall Morey 06f00ac8f6 Merge branch 'main' into new-table-style 2021-05-17 16:13:00 -04:00
Susmitha Girumala 97ee639d62 fix: Fix improper use of url.protocol 2021-05-17 15:28:45 -04:00
Susmitha Girumala a1b0481db9 Merge branch 'main' into ICU-1335-close-all-sessions-on-exit 2021-05-17 14:52:39 -04:00
Susmitha Girumala 314aa62828 feat: Update windows platform specific menu options in deskto 2021-05-17 10:20:21 -04:00
Susmitha Girumala bcf27ae048 feat: Download windows cli archive in desktop 2021-05-17 09:23:30 -04:00
Susmitha Girumala 685ddeac7e Merge pull request #549 from hashicorp/ICU-1335-close-session-on-cancel
feat: Close local proxy on session cancellation in Desktop
2021-05-17 08:29:51 -04:00
Carlos Alcaide ce9503fc5b feat: 🎸 Refactor table component with PR suggestions
Add shrink style to cells and deprecate expand. Add Key/value style for
table rows. Refactor storybook table page with all the changes. Refactor
styles for new feature and simplification.
2021-05-14 15:40:18 -07:00
Susmitha Girumala f2f5a46cdf refactor: Add conditional chaining to session-manager call 2021-05-14 15:08:06 -04:00
Susmitha Girumala 1a0650ff7c fix: Add url validation to origin validation in desktop 2021-05-14 15:00:24 -04:00
Susmitha Girumala 82a0c7c17c refactor: Rename origin service to runtime-settings 2021-05-14 14:29:26 -04:00
Randall Morey dead74c825 feat: 🎸 add OIDC account_claim_maps modeling 2021-05-14 12:05:09 -04:00
Susmitha Girumala 1397df807f fix: Add url validation to origin addr in desktop 2021-05-14 10:40:50 -04:00
Randall Morey 24e37d3faa feat: 🎸 add OIDC change state custom method 2021-05-13 14:10:37 -04:00
Susmitha Girumala cc01bddea3 refactor: Create net-request-promise helper for runtimesettin 2021-05-13 12:50:01 -04:00
Carlos Alcaide 385ea34c98 Swap @style='expand' to boolean @expand='true' 2021-05-13 09:41:13 -07:00
Susmitha Girumala 9f32b8cdc3 refactor: Origin runtime settings into origin service desktop 2021-05-13 10:36:28 -04:00
Susmitha Girumala ae8e20b8e1 refactor: Create services folder in desktop/electron-app 2021-05-13 10:23:22 -04:00
Randall Morey e91612b313 feat: 🎸 implement basic OIDC auth method attributes modeling 2021-05-12 17:12:59 -04:00
Susmitha Girumala aab980a7dc Merge remote-tracking branch 'origin/ICU-1335-close-session-on-cancel' into ICU-1335-close-all-sessions-on-exit 2021-05-12 17:01:29 -04:00
Susmitha Girumala 13146975e2 fix: Add missing cli folder in electron-app 2021-05-12 16:57:27 -04:00
Susmitha Girumala 542b469ad8 chore: Reapply stopping all session in desktop after merge 2021-05-12 15:46:40 -04:00
Susmitha Girumala c2c63294f4 Merge branch 'ICU-1335-close-session-on-cancel' into ICU-1335-close-all-sessions-on-exit 2021-05-12 15:41:47 -04:00
Susmitha Girumala 56936f78b8 chore: Update cancel to stop for ipc sessions call
Additional cleanup: remove unused async calls, separate session and
associated manager models, & attempt encoding origin url as part of
sanitization for cli command
2021-05-12 15:31:28 -04:00
Susmitha Girumala dcc77153bf feat: Do not allow desktop to quit without closing sessions 2021-05-12 14:27:01 -04:00
Susmitha Girumala 4b587d35fa docs: Add feature note to changelog 2021-05-12 12:48:03 -04:00
Susmitha Girumala ce7cdba0bc feat: Prompt for quitting session on desktop quit 2021-05-12 12:45:05 -04:00
Susmitha Girumala 4e13ea56c3 Add bug fix to changelog 2021-05-12 12:35:17 -04:00
Susmitha Girumala 3ef7436f3f chore: Cleanup SessionManager interface 2021-05-12 11:40:50 -04:00
Susmitha Girumala ee748de5c9 chore: Run cancellation tests in electron 2021-05-12 11:10:11 -04:00
Susmitha Girumala 74501a440f refactor: Create structure in desktop/electron-app 2021-05-12 10:27:38 -04:00
Susmitha Girumala 828faf2be4 refactor: Create helpers folder in desktop/electron 2021-05-12 09:53:10 -04:00
Susmitha Girumala dfb9d6e686 Merge remote-tracking branch 'origin/main' into ICU-1335-close-session-on-cancel 2021-05-11 18:09:50 -04:00
Susmitha Girumala 2be18bcf6f chore: Cleanup 2021-05-11 18:09:38 -04:00
Carlos Alcaide 8feeaa47dc feat: 🎸 Refactor rose table component
We refactor the component adding a condensed variant of the table,
refactor the hidden feature. We also provide different alignments for a
cell. Updated tests and storybook page
2021-05-11 15:08:01 -07:00
Susmitha Girumala ec9d953bad test: Add Rose::Table::Row::Cell tests 2021-05-11 15:08:01 -07:00
Susmitha Girumala 84051e4b72 chore: Refactor Rose::Table::Row visually-hidden to hidden 2021-05-11 15:08:01 -07:00
Susmitha Girumala 6b93032a78 style: Update Rose::Table storybook 2021-05-11 15:08:01 -07:00
Susmitha Girumala a909ba67df chore: Minor cleanup in Rose::Table::Row template 2021-05-11 15:08:01 -07:00
Susmitha Girumala cf40b53fd0 chore: Format newly added files in rose 2021-05-11 15:08:01 -07:00
Susmitha Girumala 3425dc89be chore: Setup Rose::Table cell alignment config 2021-05-11 15:08:01 -07:00
Susmitha Girumala 8e1e2b6b36 feat: Add Rose::Table::Row::Cell for cells to expand/shrink 2021-05-11 15:08:01 -07:00
Susmitha Girumala 4ace04de7a feat: Add condensed style to Rose::Table 2021-05-11 15:08:01 -07:00
Susmitha Girumala 3bef3e4bc5 Merge pull request #553 from hashicorp/chore-desktop-hbs-prettier
upgrade prettier and apply HBS formatting to desktop
2021-05-11 18:01:49 -04:00
Susmitha Girumala 81447e65c8 Merge pull request #552 from hashicorp/chore-admin-hbs-prettier-lint
chore: 🤖 add prettier hbs linting plugin
2021-05-11 18:01:19 -04:00
Susmitha Girumala 2e71beee81 Merge pull request #551 from hashicorp/chore-admin-hbs-prettier
chore: 🤖 upgrade prettier and apply HBS formatting to admin
2021-05-11 17:58:42 -04:00
Susmitha Girumala dfbb54a1ee refactor: Add SessionManager and Session classes to electron 2021-05-11 16:42:30 -04:00
Randall Morey 0d67b512a2 chore: 🤖 add prettier 2.3 and apply hbs formatting and linting 2021-05-11 15:39:59 -04:00
Randall Morey e551ec4008 chore: 🤖 add prettier hbs linting plugin 2021-05-11 15:29:46 -04:00
Randall Morey 49a85f1a7f chore: 🤖 upgrade prettier and apply HBS formatting to admin 2021-05-11 14:13:24 -04:00
Susmitha Girumala 15d3520408 Merge pull request #550 from hashicorp/fix-trim-package-vulnerability
fix: 🐛 Update trim package version resolution
2021-05-11 12:38:11 -04:00
Carlos Alcaide 5d7c0180d5 fix: 🐛 Update trim package version resolution
Update the version we resolve of dependency package trim since older
version has a security vulnerability.
2021-05-11 08:33:44 -07:00
Susmitha Girumala 053e16dca8 Merge branch 'main' into ICU-1335-close-session-on-cancel 2021-05-11 11:13:37 -04:00
Susmitha Girumala 3e2ed2dc27 Merge pull request #548 from hashicorp/fix-flaky-origin-test
fix: 🐛 migrate IPC to service-based window for reliable testing
2021-05-10 11:07:32 -04:00
Susmitha Girumala faaf7352c1 Merge branch 'main' into fix-flaky-origin-test 2021-05-10 10:32:57 -04:00
Susmitha Girumala 58252ee6f5 Merge pull request #547 from hashicorp/refactor-oidc-inline
Enable inline OIDC flow for admin
2021-05-10 10:32:43 -04:00
Randall Morey 85ddd7fc4b chore: remove empty comments 2021-05-08 12:10:41 -04:00
Randall Morey 863e81bc01 fix: 🐛 migrate IPC to service-based window for reliable testing
This resolves a longstanding issue where IPC tests rely on the real
window.postMessage and MessageChannel APIs.  These are evented and
asynchronous, resulting in nondeterministic tests.  This commit updates
tests with synchronous mocked APIs.
2021-05-08 12:08:56 -04:00
Randall Morey 4b212e1ae0 Merge branch 'refactor-oidc-inline' of https://github.com/hashicorp/boundary-ui into refactor-oidc-inline 2021-05-08 07:50:28 -04:00
Randall Morey 343f73bc21 style: set max width for SVG in dialog 2021-05-08 07:50:16 -04:00
Randall Morey cf5f41acbd fix: 🐛 handle null window in case of popup blocker 2021-05-08 07:49:53 -04:00
Susmitha Girumala 2f12cc91f2 feat: Cancelling session should close associated spawned proc 2021-05-07 15:31:32 -04:00
Susmitha Girumala 99125dbb77 feat: Cleanup spawned session after process termination 2021-05-07 15:31:31 -04:00
Randall Morey 3bfae4b33d Merge branch 'main' into refactor-oidc-inline 2021-05-07 15:24:12 -04:00
Randall Morey da6b34b337 feat: 🎸 enable inline OIDC authentication 2021-05-07 14:32:37 -04:00
Randall Morey 9a909c0ec1 chore: 🤖 retry oidc should also restart with boundary
rather than just re-opening the external window
2021-05-07 13:21:18 -04:00
Randall Morey 42c01100ad Merge branch 'main' into refactor-oidc-inline 2021-05-07 13:04:58 -04:00
Carlos Alcaide Corvo fe56acd57f Merge pull request #545 from hashicorp/feat-fieldset-component
feat: 🎸 Add Form fieldset component
2021-05-07 08:34:09 -07:00
Carlos Alcaide e4fb2e7c4d feat: 🎸 Fix ARIA issues and add tests
Fix an ARIA issue where fieldset aria-describedby was pointing the
legend when it should point to description. Also no aria-describedby
will show if description (optional) is not provided.
2021-05-06 15:33:59 -07:00
Carlos Alcaide b1361bcb83 feat: 🎸 Applying PR suggested changes
Apply the changes suggested on the PR. Also modified tests to could test
the rendering of the componet without description field.
2021-05-06 14:55:13 -07:00
Carlos Alcaide 30090d82e3 feat: 🎸 Add Form fieldset component
Add a simple form fieldset component, basic storybook page and tests.

✅ Closes: ICU-1428
2021-05-06 14:55:13 -07:00
Susmitha Girumala fbe8aefcb4 Merge pull request #546 from hashicorp/chore-bump-deps
chore: 🤖 bump deps due to security audit
2021-05-06 16:45:16 -04:00
Randall Morey fa02fd3f89 chore: 🤖 bump deps due to security audit 2021-05-06 15:30:02 -04:00
Randall Morey f021719d8b refactor: open and close oidc windows via window manager 2021-05-06 15:19:12 -04:00
Randall Morey be9ee8f672 Merge pull request #544 from hashicorp/chore-dependabot
chore: 🤖 bump dep version for dependabot
2021-05-05 17:45:23 -04:00
Randall Morey 48ca4c5ac0 chore: 🤖 bump dep version for dependabot 2021-05-05 15:06:32 -04:00
Randall Morey ac7db55be2 Merge pull request #542 from hashicorp/refactor-browser-services
chore: 🤖 replace admin window usage with ember browser services
2021-05-05 14:51:40 -04:00
Randall Morey dea79d785b feat: 🎸 add WindowManager service for simple open/close 2021-05-05 14:34:26 -04:00
Randall Morey f597901140 Merge branch 'main' into refactor-browser-services 2021-05-05 13:51:01 -04:00
Randall Morey 0c1b5bf879 Merge pull request #543 from hashicorp/fix-vulnerability-merge-package
fix: 🐛 Fix merge package vulnerability
2021-05-05 13:50:36 -04:00
Carlos Alcaide bab68f4507 fix: 🐛 Fix merge package vulnerability
Merge package has a security vulnerability that is fixed in a newer
version. We do not resolve merge directly, but as a dependecy of a
dependecy, so we especify a version range via selective dependecy
resolution.
2021-05-05 10:23:11 -07:00
Carlos Alcaide Corvo c6e4a24dab Merge pull request #541 from hashicorp/docs-connect-ui-to-boundary-local
docs: ✏️ Connect Boundary UI to Boundary local instance
2021-05-04 07:44:48 -07:00
Carlos Alcaide 0bcb91ede0 docs: ✏️ Update docs for PR
Update documentation with suggestions from PR
2021-05-03 14:13:52 -07:00
Carlos Alcaide fbeb764c76 Merge branch 'docs-connect-ui-to-boundary-local' of github.com:hashicorp/boundary-ui into docs-connect-ui-to-boundary-local 2021-05-03 14:04:18 -07:00
Carlos Alcaide 67959d7a58 docs: ✏️ Update docs from PR
Update documentation with comments from team members on my initial PR.
2021-05-03 14:03:43 -07:00
Susmitha Girumala c4bb5173d2 Merge branch 'main' into docs-connect-ui-to-boundary-local 2021-05-03 15:44:24 -04:00
Carlos Alcaide ea011592a7 docs: ✏️ Connect Boundary UI to Boundary local instance
Add documentation on how to connect Boundary UI, admin and desktop
version, to a Boundary local instance.
2021-05-03 12:42:55 -07:00
Susmitha Girumala e761e0e4af Merge pull request #540 from hashicorp/docs-m1
docs:  add troubleshooting note for M1 users
2021-05-03 15:39:57 -04:00
Randall Morey fa36f9008b docs: add troubleshooting note for M1 users 2021-04-30 17:16:21 -04:00
Randall Morey 15d360abc5 Merge pull request #539 from hashicorp/chore-update-node-engines
chore: 🤖 Update node version engines
2021-04-30 17:10:30 -04:00
Randall Morey 9914954d08 docs: ✏️ add engines to top-level package.json 2021-04-30 16:58:54 -04:00
Carlos Alcaide ec184ff4f1 chore: 🤖 Update UI's to could use node v15
Update UI's engines in package.json to could use node v15. The change is
motivated for apple M1 chip. If you have an apple M1 chip you need to
use node v15 to avoid errors while building the UI.
2021-04-29 14:39:48 -07:00
Randall Morey bb2d0420d9 chore: 🤖 replace admin window usage with ember browser services 2021-04-28 17:55:30 -04:00
Carlos Alcaide e3cabe3102 chore: 🤖 Update node version engines for addons
Update the versions of node addons can use to be aligned with the node
versions defined in our UI's.
2021-04-28 14:26:46 -07:00
Carlos Alcaide 7065f462cd chore: 🤖 Update node version engines
Update the node versions our UI's can use. These versions are specified
on the engines key in the package.json of each UI (admin and desktop).
Our UI's can run from node v10 to v14, we can not run on v15 because
ember-cli does not support it yet.
2021-04-28 11:35:52 -07:00
404 changed files with 8689 additions and 4118 deletions

No files matched your search

-17
View File
@@ -19,23 +19,6 @@ jobs:
if: steps.cache.outputs.cache-hit != 'true'
- run: yarn run compliance:licenses
audit:
name: Security Audit
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/cache@v2
id: cache
with:
path: '**/node_modules'
key: ${{ runner.os }}-${{ hashFiles('**/yarn.lock') }}
- uses: actions/setup-node@v1
with:
node-version: '12.x'
- run: yarn install
if: steps.cache.outputs.cache-hit != 'true'
- run: yarn run compliance:audit
lint:
name: Lint
runs-on: ubuntu-latest
+41 -1
View File
@@ -24,6 +24,9 @@ subproject, e.g. running or testing.
- [Building Admin UI for Production](#building-admin-ui-for-production)
- [Building with a Container](#building-with-a-container)
- [Building Desktop UI for Production](#building-desktop-ui-for-production)
- [Connect Boundary UI to Boundary local instance](#connect-boundary-ui-to-boundary-local-instance)
- [For admin](#for-admin)
- [For desktop](#for-desktop)
- [Committing](#committing)
- [License Checking](#license-checking)
@@ -35,6 +38,9 @@ You will need the following things properly installed on your computer.
* [Git][git]
* [Node.js][node]
* v10–v15
* **Apple Silicon Users**: if you experience problems building or running
Boundary UIs, try Node v15.
* [Yarn][yarn] installed globally
* [Google Chrome][chrome]
* [Firefox][firefox]
@@ -116,11 +122,45 @@ yarn install
yarn build:ui:desktop
```
In windows, UI is generated using docker to provide a stable UI across platforms.
```cmd
yarn install
docker-compose -f docker-compose-embedding.yml run build-desktop-production
yarn build:ui:desktop:app
```
To provide a signing identify for macOS build, use `BOUNDARY_DESKTOP_SIGNING_IDENTITY`
environment variable to set signing certificate name (e.g Developer ID Application: * (*)).
environment variable to set signing certificate name (e.g Developer ID Application: * (*)) when building desktop app using `yarn build:ui:desktop:app`.
Assets are saved to `ui/desktop/electron-app/out/make/`.
DMG packaged desktop UI is available at asset location as `boundary.dmg`.
EXE archived desktop UI is available at asset location under `zip` folder.
### Connect Boundary UI to Boundary local instance
This describes how to connect local Boundary UI to your local instance of Boundary.
This assumes you already have up and running a Boundary dev instance in your local environment with a listener `127.0.0.1:9200` (default behaviour). [Learn how to start a local Boundary dev instance](https://learn.hashicorp.com/tutorials/boundary/getting-started-dev?in=boundary/getting-started#start-a-dev-environment).
#### For admin
This assumes you are within `boundary-ui/ui/admin`.
You will need to turn `off` mirage, tell the UI where to find Boundary and run it: `$ ENABLE_MIRAGE=false API_HOST=http://localhost:9200 yarn start`.
Following terminal instructions, open in your browser: `http://localhost:4200/`.
Once you open the UI you will see the login screen, authenticate using generated admin login name and password.
#### For desktop
This assumes you are within `boundary-ui/ui/desktop`.
You will need to turn `off` mirage and run it: `$ ENABLE_MIRAGE=false yarn start:desktop`.
In login screen, authenticate using generated admin login name and password.
Enter the origin of your Boundary dev instance, by default is: `http://localhost:9200`.
### Committing
+5 -1
View File
@@ -248,7 +248,11 @@ export default class ApplicationAdapter extends RESTAdapter.extend(
// Normalize field-specific errors, if any.
const errors = fieldErrors.map((error) => ({
detail: error.description,
source: { pointer: `/data/attributes/${error.name}` },
// Ember Data cannot handle errors on nested attributes, so these are
// flattened (e.g. `attributes.foobar` becomes `attributes_foobar`).
// To capture these errors, add read-only fields on the model
// corresponding to the underscored field name.
source: { pointer: `/data/attributes/${error.name.replace('.', '_')}` },
}));
// Return a list of JSON API errors rooted under the `errors` key.
return {
@@ -0,0 +1,15 @@
// app/initializers/fragment-serializer.js
import FragmentAuthMethodAttributesAccountClaimMapSerializer from '../serializers/fragment-auth-method-attributes-account-claim-map';
export function initialize(application) {
application.register(
'serializer:fragment-auth-method-attributes-account-claim-map',
FragmentAuthMethodAttributesAccountClaimMapSerializer
);
}
// Fragment serializers must be manually registered
export default {
name: 'fragment-auth-method-attributes-account-claim-map',
initialize: initialize,
};
@@ -0,0 +1,12 @@
// app/initializers/fragment-serializer.js
import FragmentStringSerializer from '../serializers/fragment-string';
export function initialize(application) {
application.register('serializer:fragment-string', FragmentStringSerializer);
}
// Fragment serializers must be manually registered
export default {
name: 'fragment-string',
initialize: initialize,
};
+9 -9
View File
@@ -17,19 +17,19 @@ export default class AccountModel extends GeneratedAccountModel {
*/
@equal('type', 'password') isPassword;
/**
* @type {boolean}
*/
@equal('type', 'oidc') isOIDC;
/**
* Convenience for getting username in account.
* @type {string}
*/
@computed('type', 'attributes.login_name')
get username() {
let username = '';
switch (this.type) {
case 'password':
username = this.attributes.login_name;
break;
}
return username;
@computed('attributes.{email,full_name,login_name}')
get accountName() {
const { email, full_name, login_name } = this.attributes;
return email || full_name || login_name;
}
// =methods
+98
View File
@@ -1,9 +1,61 @@
import GeneratedAuthMethodModel from '../generated/models/auth-method';
import { attr } from '@ember-data/model';
import { fragment } from 'ember-data-model-fragments/attributes';
import { equal } from '@ember/object/computed';
/**
* Enum options per auth method type and field.
*/
export const options = {
oidc: {
signing_algorithms: [
'RS256',
'RS384',
'RS512',
'ES256',
'ES384',
'ES512',
'PS256',
'PS384',
'PS512',
'EdDSA',
],
state: ['inactive', 'active-private', 'active-public'],
account_claim_maps: {
to: ['sub', 'name', 'email'],
},
},
};
export default class AuthMethodModel extends GeneratedAuthMethodModel {
// =error attributes
// These attributes exist solely to capture errors on nested fields.
// See the application adapter's error normalization method for
// more information.
@attr('string', { readOnly: true }) attributes_state;
@attr('string', { readOnly: true }) attributes_issuer;
@attr('string', { readOnly: true }) attributes_client_id;
@attr('string', { readOnly: true }) attributes_client_secret;
@attr('string', { readOnly: true }) attributes_max_age;
@attr('string', { readOnly: true }) attributes_api_url_prefix;
@attr('string', { readOnly: true })
attributes_disable_discovered_config_validation;
@attr('string', { readOnly: true }) attributes_dry_run;
@attr('string', { readOnly: true }) attributes_account_claim_maps;
@attr('string', { readOnly: true }) attributes_claims_scopes;
@attr('string', { readOnly: true }) attributes_signing_algorithms;
@attr('string', { readOnly: true }) attributes_allowed_audiences;
@attr('string', { readOnly: true }) attributes_idp_ca_certs;
// =attributes
/**
* Attributes of this resource, if any, represented as a JSON fragment.
* @type {FragmentAuthMethodAttributesModel}
*/
@fragment('fragment-auth-method-attributes', { defaultValue: {} }) attributes;
/**
* @type {boolean}
*/
@@ -22,4 +74,50 @@ export default class AuthMethodModel extends GeneratedAuthMethodModel {
get isOIDC() {
return this.type === 'oidc';
}
/**
* @type {boolean}
*/
get isInactive() {
return this.attributes.state === 'inactive';
}
/**
* @type {boolean}
*/
get isPrivate() {
return this.attributes.state === 'active-private';
}
/**
* @type {boolean}
*/
get isPublic() {
return this.attributes.state === 'active-public';
}
// =methods
/**
* Change the active and visibility state of an OIDC auth method
* given its ID.
* For OIDC auth methods only.
* @param {[string]} state
* @param {object} options
* @param {object} options.adapterOptions
* @return {Promise}
*/
changeState(state, options = { adapterOptions: {} }) {
const defaultAdapterOptions = {
method: 'change-state',
state,
};
return this.save({
...options,
adapterOptions: {
...defaultAdapterOptions,
...options.adapterOptions,
},
});
}
}
@@ -2,8 +2,16 @@ import Fragment from 'ember-data-model-fragments/fragment';
import { attr } from '@ember-data/model';
export default class FragmentAccountAttributesModel extends Fragment {
// =attributes (password)
@attr('string', {
for: 'password',
description: 'The account login name',
})
login_name;
// =attributes (OIDC)
@attr('string', { for: 'oidc' }) subject;
@attr('string', { for: 'oidc' }) issuer;
@attr('string', { for: 'oidc', readOnly: true }) email;
@attr('string', { for: 'oidc', readOnly: true }) full_name;
}
@@ -0,0 +1,9 @@
import Fragment from 'ember-data-model-fragments/fragment';
import { attr } from '@ember-data/model';
export default class FragmentAuthMethodAttributesAccountClaimMapModel extends Fragment {
// =attributes (OIDC)
@attr('string') from;
@attr('string') to;
}
@@ -0,0 +1,40 @@
import Fragment from 'ember-data-model-fragments/fragment';
import { attr } from '@ember-data/model';
import { fragmentArray } from 'ember-data-model-fragments/attributes';
export default class FragmentAuthMethodAttributesModel extends Fragment {
// =attributes (OIDC)
@attr('string', { readOnly: true }) state;
@attr('string') issuer;
@attr('string') client_id;
@attr('string') client_secret;
@attr('string', { readOnly: true }) client_secret_hmac;
@attr('number') max_age;
@attr('string') api_url_prefix;
@attr('string', { readOnly: true }) callback_url;
@attr('boolean') disable_discovered_config_validation;
@attr('boolean') dry_run;
@fragmentArray('fragment-auth-method-attributes-account-claim-map', {
emptyArrayIfMissing: true,
})
account_claim_maps;
@fragmentArray('fragment-string', {
emptyArrayIfMissing: true,
})
claims_scopes;
@fragmentArray('fragment-string', {
emptyArrayIfMissing: true,
})
signing_algorithms;
@fragmentArray('fragment-string', {
emptyArrayIfMissing: true,
})
allowed_audiences;
@fragmentArray('fragment-string', { emptyArrayIfMissing: true }) idp_ca_certs;
}
+92 -3
View File
@@ -1,13 +1,95 @@
import GeneratedSessionModel from '../generated/models/session';
import { computed } from '@ember/object';
import { equal } from '@ember/object/computed';
import { attr } from '@ember-data/model';
import { tracked } from '@glimmer/tracking';
import { A } from '@ember/array';
/**
*
*/
class SessionCredential {
// =classes
/**
*
*/
static Library = class Library {
id;
name;
description;
type;
constructor(id, name, description, type) {
this.id = id;
this.name = name;
this.description = description;
this.type = type;
}
};
/**
*
*/
static SecretItem = class SecretItem {
key;
value;
constructor(key, value) {
this.key = key;
this.value = value;
}
};
// =attributes
rawCredential;
library;
#payloadSecret;
/**
* The incoming payload may contain a JSON object under the `decoded` key only
* if it can be JSON-decoded. Some credential stores may not provide JSON,
* however, in which case we may have only the raw base64-encoded secret
* string. In the former case, we convert the key/value pairs of the JSON to
* an array of `SecretItem` instances. In the latter case, we return an
* array containing a single `SecretItem` instance with key `secret` and a
* string value equal to the base64-decoded raw secret.
* The credential secret as an array of key/value objects.
* @type {SessionCredential.SecretItem[]}
*/
get secrets() {
if (this.#payloadSecret?.decoded) {
const secretJSON = this.#payloadSecret.decoded;
return Object.keys(secretJSON).map(
(key) => new SessionCredential.SecretItem(key, secretJSON[key])
);
} else {
// decode from base64
const decodedString = atob(this.#payloadSecret.raw);
return [new SessionCredential.SecretItem('secret', decodedString)];
}
}
// =methods
constructor(cred) {
const { id, name, description, type } = cred.credential_library;
this.library = new SessionCredential.Library(id, name, description, type);
this.#payloadSecret = cred.secret;
this.rawCredential = cred;
}
}
export default class SessionModel extends GeneratedSessionModel {
// =attributes
@attr('string', { readOnly: true }) proxy_address;
@attr('number', { readOnly: true }) proxy_port;
// These transient attributes are used for values that come from the CLI
// `connect` command as triggered by Desktop. These attributes represent
// transient read-only values.
@tracked acknowledged;
@tracked started_desktop_client;
@tracked proxy_address;
@tracked proxy_port;
credentials = A();
@equal('status', 'active') isActive;
@equal('status', 'pending') isPending;
@@ -41,6 +123,13 @@ export default class SessionModel extends GeneratedSessionModel {
// =methods
/**
*
*/
addCredential(cred) {
this.credentials.pushObject(new SessionCredential(cred));
}
/**
* Cancels the session via the `cancel` method.
* See serializer and adapter for more information.
+42
View File
@@ -20,13 +20,55 @@ export default class AccountSerializer extends ApplicationSerializer {
* @return {object}
*/
serialize(snapshot) {
switch (snapshot.record.type) {
case 'password':
return this.serializePassword(...arguments);
case 'oidc':
return this.serializeOIDC(...arguments);
}
}
/**
* OIDC serialization limits the `attributes` posted on create and omits
* `attributes` entirely on update.
*/
serializeOIDC(snapshot) {
const { isNew } = snapshot?.record;
let serialized = super.serialize(...arguments);
delete serialized.attributes;
if (isNew) {
serialized.attributes = {};
const { issuer, subject } = snapshot.attr('attributes').record;
if (issuer) serialized.attributes.issuer = issuer;
if (subject) serialized.attributes.subject = subject;
}
return serialized;
}
/**
* Password serialization omits `attributes` and handles password-related
* custom methods.
* @param {Snapshot} snapshot
* @return {object}
*/
serializePassword(snapshot) {
const password = snapshot?.adapterOptions?.password;
let serialized = super.serialize(...arguments);
// Only login_name is serialized into password attributes.
const { login_name } = serialized.attributes;
if (login_name) {
serialized.attributes = { login_name };
} else {
serialized.attributes = {};
}
// New record case
if (password && snapshot?.record?.isNew)
serialized.attributes.password = password;
// Set password custom method
if (snapshot?.adapterOptions?.method === 'set-password') {
serialized = this.serializeForSetPassword(snapshot, password);
}
// Change password custom method
if (snapshot?.adapterOptions?.method === 'change-password') {
const { currentPassword, newPassword } = snapshot?.adapterOptions;
serialized = this.serializeForChangePassword(
+70 -3
View File
@@ -1,6 +1,64 @@
import ApplicationSerializer from './application';
import { copy } from 'ember-copy';
export default class AuthMethodSerializer extends ApplicationSerializer {
// =methods
/**
* Delegates to a type-specific serialization, or default.
* @override
* @param {Snapshot} snapshot
* @return {object}
*/
serialize(snapshot) {
switch (snapshot.record.type) {
case 'oidc':
return this.serializeOIDC(...arguments);
default:
return this.serializeDefault(...arguments);
}
}
/**
* Default serialization omits `attributes`.
* @return {object}
*/
serializeDefault() {
let serialized = super.serialize(...arguments);
delete serialized.attributes;
return serialized;
}
/**
* If `adapterOptions.state` is set, the serialization should
* include **only state** and version. Normally, this is not serialized.
* @param {Snapshot} snapshot
* @return {object}
*/
serializeOIDC(snapshot) {
let serialized = super.serialize(...arguments);
const state = snapshot?.adapterOptions?.state;
if (state) {
serialized = this.serializeOIDCWithState(snapshot, state);
} else {
delete serialized.attributes.state;
}
return serialized;
}
/**
* Returns a payload containing only state and version.
* @param {Snapshot} snapshot
* @param {string} state
* @return {object}
*/
serializeOIDCWithState(snapshot, state) {
return {
version: snapshot.attr('version'),
attributes: { state },
};
}
/**
* Sorts the array in order of "is_primary" such that the primary method
* appears first. The "natural" order of auth methods places primary first.
@@ -23,10 +81,19 @@ export default class AuthMethodSerializer extends ApplicationSerializer {
*
* TODO: generalize this so that all zero values are reified.
* @override
* @return {object}
* @see FragmentScope
* @param {Model} typeClass
* @param {Object} hash
* @return {Object}
*/
normalize() {
const normalized = super.normalize(...arguments);
normalize(typeClass, hash, ...rest) {
let normalizedHash = copy(hash, true);
// switch (normalizedHash.type) {
// case 'oidc':
// normalizedHash = this.normalizeOIDC(normalizedHash);
// break;
// }
const normalized = super.normalize(typeClass, normalizedHash, ...rest);
if (!normalized.data.attributes.is_primary) {
normalized.data.attributes.is_primary = false;
}
@@ -0,0 +1,26 @@
import JSONSerializer from '@ember-data/serializer/json';
export default class FragmentAccountAttributesSerializer extends JSONSerializer {
/**
* If an attribute is annotated as readOnly in the model, don't serialize it.
* Otherwise delegate to default attribute serializer.
*
* @override
* @method serializeAttribute
* @param {Snapshot} snapshot
* @param {Object} json
* @param {String} key
* @param {Object} attribute
*/
serializeAttribute(snapshot, json, key, attribute) {
const { type, options } = attribute;
let value = super.serializeAttribute(...arguments);
// Convert empty strings to null.
if (type === 'string' && json[key] === '') json[key] = null;
// Do not serialize read-only attributes.
if (options.readOnly) delete json[key];
// Client secret cannot be unset. If it's falsy, it must be removed.
if (key === 'client_secret' && !json[key]) delete json[key];
return value;
}
}
@@ -0,0 +1,30 @@
import JSONSerializer from '@ember-data/serializer/json';
export default class FragmentHostSetSerializer extends JSONSerializer {
// =methods
/**
* Serializes an account claim to string.
* @param {Snapshot} snapshot
* @return {string}
*/
serialize(snapshot) {
const from = snapshot.attr('from');
const to = snapshot.attr('to');
return `${from}=${to}`;
}
/**
* Normalizes account claim strings into JSON API objects.
* @param {Model} typeClass
* @param {string} value
* @return {object}
*/
normalize(typeClass, value) {
const normalizedHash = {
from: value.split('=')[0],
to: value.split('=')[1],
};
return super.normalize(typeClass, normalizedHash);
}
}
@@ -0,0 +1,26 @@
import JSONSerializer from '@ember-data/serializer/json';
export default class FragmentAuthMethodAttributesSerializer extends JSONSerializer {
/**
* If an attribute is annotated as readOnly in the model, don't serialize it.
* Otherwise delegate to default attribute serializer.
*
* @override
* @method serializeAttribute
* @param {Snapshot} snapshot
* @param {Object} json
* @param {String} key
* @param {Object} attribute
*/
serializeAttribute(snapshot, json, key, attribute) {
const { type, options } = attribute;
let value = super.serializeAttribute(...arguments);
// Convert empty strings to null.
if (type === 'string' && json[key] === '') json[key] = null;
// Do not serialize read-only attributes.
if (options.readOnly) delete json[key];
// Client secret cannot be unset. If it's falsy, it must be removed.
if (key === 'client_secret' && !json[key]) delete json[key];
return value;
}
}
@@ -0,0 +1,24 @@
import JSONSerializer from '@ember-data/serializer/json';
export default class FragmentStringSerializer extends JSONSerializer {
// =methods
/**
* Serializes a to string.
* @param {Snapshot} snapshot
* @return {string}
*/
serialize(snapshot) {
return snapshot.attr('value');
}
/**
* Normalizes from strings.
* @param {Model} typeClass
* @param {string} value
* @return {object}
*/
normalize(typeClass, value) {
return super.normalize(typeClass, { value });
}
}
-17
View File
@@ -37,21 +37,4 @@ export default class HostSetSerializer extends ApplicationSerializer {
host_ids: hostIDs,
};
}
/**
* Converts string arrays to object arrays for use with `fragment-string`.
* E.g. `"foo"` -> `{value: "foo"}`
* @override
* @param {Model} modelClass
* @param {Object} resourceHash
* @return {Object}
*/
normalize(modelClass, resourceHash) {
// TODO: can fragment string normalization be handled generically?
// TODO: host_ids might actually be attributes.host_ids
if (resourceHash.host_ids) {
resourceHash.host_ids = resourceHash.host_ids.map((value) => ({ value }));
}
return super.normalize(modelClass, resourceHash);
}
}
+3 -2
View File
@@ -76,8 +76,9 @@ export default class StorageService extends Service {
const inMemory = get(config, 'storage.memory');
// Get the global context object (window) via service lookup,
// because just reaching for a global is icky
const globalContext = getOwner(this).lookup('service:-document')
.documentElement.parentNode.defaultView;
const globalContext =
getOwner(this).lookup('service:-document').documentElement.parentNode
.defaultView;
// If memory storage enabled, return the memory storage instance,
// otherwise return localStorage.
return inMemory ? this.#memoryStorage : globalContext.localStorage;
@@ -0,0 +1,4 @@
export {
default,
initialize,
} from 'api/initializers/fragment-auth-method-attributes-account-claim-map-serializer';
@@ -0,0 +1 @@
export { default, initialize } from 'api/initializers/fragment-string';
@@ -0,0 +1 @@
export { default } from 'api/models/fragment-auth-method-attributes-account-claim-map';
@@ -0,0 +1 @@
export { default } from 'api/models/fragment-auth-method-attributes';
@@ -0,0 +1 @@
export { default } from 'api/serializers/fragment-account-attributes';
@@ -0,0 +1 @@
export { default } from 'api/serializers/fragment-auth-method-attributes';
@@ -0,0 +1 @@
export { default } from 'api/serializers/fragment-string';
+3 -2
View File
@@ -13,7 +13,7 @@ export default function () {
// make this `/api`, for example, if your API is namespaced
this.namespace = config.api.namespace;
// delay for each request, automatically set to 0 during testing
this.timing = 350;
this.timing = 1;
// Allow any configured API host to passthrough, which is useful in
// development for testing against a locally running backend.
@@ -106,8 +106,9 @@ export default function () {
}
);
// Authenticate/deauthenticate routes
// Authenticate + auth methods custom routes
this.post('/auth-methods/:id_method', authHandler);
// Deauthenticate route
this.post('/scopes/:id_method', deauthHandler);
// IAM : Users
+16 -1
View File
@@ -1,3 +1,18 @@
import factory from '../generated/factories/account';
import { random, internet } from 'faker';
export default factory.extend();
export default factory.extend({
attributes() {
switch (this.type) {
case 'password':
return { login_name: random.words() };
case 'oidc':
return {
issuer: internet.ip(),
subject: 'sub',
email: internet.email(),
full_name: random.words(),
};
}
},
});
+2 -2
View File
@@ -14,9 +14,9 @@ export default factory.extend({
*/
withAccountsAndUsers: trait({
afterCreate(authMethod, server) {
const { scope } = authMethod;
const { scope, type } = authMethod;
server.createList('user', 5, { scope }).map((user) => {
const { id } = server.create('account', { scope, authMethod });
const { id } = server.create('account', { scope, type, authMethod });
user.update({ accountIds: [id] });
});
},
@@ -1,15 +1,14 @@
import { Factory } from 'ember-cli-mirage';
import { random, date, datatype } from 'faker';
import { date, datatype } from 'faker';
/**
* GeneratedAccountFactory
*/
export default Factory.extend({
type: 'password',
name: () => random.words(),
description: () => random.words(),
// name: () => random.words(),
// description: () => random.words(),
created_time: () => date.recent(),
updated_time: () => date.recent(),
version: () => datatype.number(),
attributes: () => ({ login_name: random.words() }),
});
@@ -11,4 +11,29 @@ export default Factory.extend({
created_time: () => date.recent(),
updated_time: () => date.recent(),
disabled: () => datatype.boolean(),
attributes: function () {
let attrs;
switch (this.type) {
case 'oidc':
attrs = {
api_url_prefix: 'http://127.0.0.1:9200',
callback_url:
'http://127.0.0.1:9200/v1/auth-methods/oidc:authenticate:callback',
client_id: 'YTwdJBB55LpKnuXb9n65',
client_secret_hmac: 'GY7blb4ynM5TEPNi_qnphJ9aDWhW8FpmN3D-eP_L7Zk',
issuer: 'http://127.0.0.1:57070',
max_age: 1800,
disable_discovered_config_validation: false,
state: 'active-public',
account_claim_maps: ['oid=sub', 'full_name=name'],
claims_scopes: ['profile', 'email'],
signing_algorithms: ['RS256', 'RS384'],
allowed_audiences: ['www.alice.com', 'www.alice.com/admin'],
idp_ca_certs: ['certificate-1234', 'certificate-5678'],
};
break;
}
return attrs;
},
});
+26 -6
View File
@@ -107,14 +107,34 @@ const commandHandlers = {
},
};
// Handles all custom methods on /auth-methods/:id route
export function authHandler({ scopes, authMethods }, request) {
const payload = JSON.parse(request.requestBody);
const [, id] = request.params.id_method.match(/(?<id>.[^:]*)/);
const { command } = payload;
const [, id, method] = request.params.id_method.match(
/(?<id>.[^:]*):(?<method>(.*))/
);
const authMethod = authMethods.find(id);
const scope = scopes.find(authMethod.scopeId);
const scopeAttrs = this.serialize(scopes.find(scope.id));
return commandHandlers[authMethod.type][command](payload, scopeAttrs);
if (method === 'authenticate') {
const payload = JSON.parse(request.requestBody);
const { command } = payload;
const scope = scopes.find(authMethod.scopeId);
const scopeAttrs = this.serialize(scopes.find(scope.id));
return commandHandlers[authMethod.type][command](payload, scopeAttrs);
}
// TODO: this handler doesn't really belong here, but we already route
// POST requests on existing auth methods to this route handler file under the
// assumption it would be for authentication. While authentication should
// still occur here, we should handle other custom methods in the
// mirage config and route here only for auth.
if (method === 'change-state') {
const attrs = this.normalizedRequestAttrs();
return authMethod.update({
attributes: {
state: attrs.attributes.state,
},
});
}
}
export function deauthHandler() {
+80
View File
@@ -53,13 +53,93 @@ export default function initializeMockIPC(server) {
type,
created_time: new Date().toISOString(),
});
const decoded = {
key1: 'value 1',
key2: true,
key3: 'test',
};
const raw = btoa(JSON.stringify(decoded));
return {
address: window.location.hostname,
port: datatype.number(),
protocol: type,
session_id: newSession.id,
credentials: [
{
credential_library: {
id: 'clvlt_4cvscMTl0N',
name: 'Library Name',
description: 'Library Description',
credential_store_id: 'csvlt_Q1HFGt7Jpm',
type: 'vault',
},
secret: {
raw: btoa('just-a-random-string'),
},
},
{
credential_library: {
id: 'clvlt_4cvscMTl0N',
name: 'Library Name',
description: 'Library Description',
credential_store_id: 'csvlt_Q1HFGt7Jpm',
type: 'vault',
},
secret: {
raw,
decoded,
},
},
{
credential_library: {
id: 'clvlt_9KWscxpcY7',
name: 'Library Name',
description: 'Library Description',
credential_store_id: 'csvlt_Q1HFGt7Jpm',
type: 'vault',
},
secret: {
raw: btoa('just-a-random-string'),
},
},
{
credential_library: {
id: 'clvlt_9KWscxpcY7',
name: 'Library Name',
description: 'Library Description',
credential_store_id: 'csvlt_Q1HFGt7Jpm',
type: 'vault',
},
secret: {
raw,
decoded,
},
},
],
};
}
/**
* Check for browsers running on mac OS
*/
isMacOS() {
return Boolean(window.navigator.userAgent.match(/(macintosh)/i));
}
/**
* Check for browsers running on windows OS
*/
isWindowsOS() {
return Boolean(window.navigator.userAgent.match(/(windows)/i));
}
/**
* Do nothing when attempting to minimize, toggle fullscreen,
* and close a browser window
*/
minimizeWindow() {}
closeWindow() {}
toggleFullScreenWindow() {}
}
/**
+3 -3
View File
@@ -28,7 +28,7 @@
"ember-cli-htmlbars": "^5.3.1",
"ember-cli-mirage": "^1.1.8",
"ember-data": "^3.20.0",
"ember-data-model-fragments": "5.0.0-beta.0",
"ember-data-model-fragments": "5.0.0-beta.2",
"ember-fetch": "^8.0.1"
},
"devDependencies": {
@@ -38,7 +38,7 @@
"@glimmer/tracking": "^1.0.3",
"babel-eslint": "^10.1.0",
"broccoli-asset-rev": "^3.0.0",
"doctoc": "^1.4.0",
"doctoc": "^2.0.0",
"ember-auto-import": "^1.10.1",
"ember-cli": "~3.24.0",
"ember-cli-dependency-checker": "^3.2.0",
@@ -71,7 +71,7 @@
"qunit-dom": "^1.6.0"
},
"engines": {
"node": "10.* || >= 12"
"node": ">=10 <=15"
},
"ember": {
"edition": "octane"
@@ -0,0 +1,35 @@
import Application from '@ember/application';
import { initialize } from 'dummy/initializers/fragment-auth-method-attributes-account-claim-map-serializer';
import { module, test } from 'qunit';
import Resolver from 'ember-resolver';
import { run } from '@ember/runloop';
module(
'Unit | Initializer | fragment-auth-method-attributes-account-claim-map-serializer',
function (hooks) {
hooks.beforeEach(function () {
this.TestApplication = class TestApplication extends Application {};
this.TestApplication.initializer({
name: 'initializer under test',
initialize,
});
this.application = this.TestApplication.create({
autoboot: false,
Resolver,
});
});
hooks.afterEach(function () {
run(this.application, 'destroy');
});
// TODO: Replace this with your real tests.
test('it works', async function (assert) {
await this.application.boot();
assert.ok(true);
});
}
);
@@ -0,0 +1,32 @@
import Application from '@ember/application';
import { initialize } from 'dummy/initializers/fragment-string';
import { module, test } from 'qunit';
import Resolver from 'ember-resolver';
import { run } from '@ember/runloop';
module('Unit | Initializer | fragment-string', function (hooks) {
hooks.beforeEach(function () {
this.TestApplication = class TestApplication extends Application {};
this.TestApplication.initializer({
name: 'initializer under test',
initialize,
});
this.application = this.TestApplication.create({
autoboot: false,
Resolver,
});
});
hooks.afterEach(function () {
run(this.application, 'destroy');
});
// TODO: Replace this with your real tests.
test('it works', async function (assert) {
await this.application.boot();
assert.ok(true);
});
});
+4 -5
View File
@@ -10,15 +10,14 @@ module('Unit | Model | account', function (hooks) {
assert.ok(model);
});
test('it has an username attribute for password account', function (assert) {
test('it has an accountName attribute for password account', function (assert) {
assert.expect(2);
const store = this.owner.lookup('service:store');
let model = store.createRecord('account', {
name: 'name',
type: 'password',
});
assert.notOk(model.username);
model.attributes.login_name = 'username';
assert.equal(model.username, 'username');
assert.notOk(model.accountName);
model.attributes.login_name = 'foobar';
assert.equal(model.accountName, 'foobar');
});
});
@@ -1,13 +1,49 @@
import { module, test } from 'qunit';
import { setupTest } from 'ember-qunit';
import setupMirage from 'ember-cli-mirage/test-support/setup-mirage';
module('Unit | Model | auth method', function (hooks) {
setupTest(hooks);
setupMirage(hooks);
// Replace this with your real tests.
test('it exists', function (assert) {
let store = this.owner.lookup('service:store');
let model = store.createRecord('auth-method', {});
assert.ok(model);
});
test('it has a `changeState` method that targets a specific POST API endpoint and serialization', async function (assert) {
assert.expect(1);
this.server.post(
'/v1/auth-methods/123abc:change-state',
(schema, request) => {
const body = JSON.parse(request.requestBody);
assert.deepEqual(body, {
attributes: {
state: 'foobar',
},
version: 1,
});
return { id: '123abc' };
}
);
const store = this.owner.lookup('service:store');
store.push({
data: {
id: '123abc',
type: 'auth-method',
attributes: {
type: 'oidc',
state: 'foobar',
version: 1,
scope: {
scope_id: 'o_1',
type: 'scope',
},
},
},
});
const model = store.peekRecord('auth-method', '123abc');
await model.changeState('foobar');
});
});
@@ -4,7 +4,6 @@ import { setupTest } from 'ember-qunit';
module('Unit | Model | auth token', function (hooks) {
setupTest(hooks);
// Replace this with your real tests.
test('it exists', function (assert) {
let store = this.owner.lookup('service:store');
let model = store.createRecord('auth-token', {});
@@ -0,0 +1,18 @@
import { module, test } from 'qunit';
import { setupTest } from 'ember-qunit';
module(
'Unit | Model | fragment auth method attributes account claim map',
function (hooks) {
setupTest(hooks);
test('it exists', function (assert) {
let store = this.owner.lookup('service:store');
let model = store.createRecord(
'fragment-auth-method-attributes-account-claim-map',
{}
);
assert.ok(model);
});
}
);
@@ -0,0 +1,12 @@
import { module, test } from 'qunit';
import { setupTest } from 'ember-qunit';
module('Unit | Model | fragment auth method attributes', function (hooks) {
setupTest(hooks);
test('it exists', function (assert) {
let store = this.owner.lookup('service:store');
let model = store.createRecord('fragment-auth-method-attributes', {});
assert.ok(model);
});
});
@@ -4,7 +4,6 @@ import { setupTest } from 'ember-qunit';
module('Unit | Model | fragment host set', function (hooks) {
setupTest(hooks);
// Replace this with your real tests.
test('it exists', function (assert) {
let store = this.owner.lookup('service:store');
let model = store.createRecord('fragment-host-set', {});
@@ -4,7 +4,6 @@ import { setupTest } from 'ember-qunit';
module('Unit | Model | fragment principal', function (hooks) {
setupTest(hooks);
// Replace this with your real tests.
test('it exists', function (assert) {
let store = this.owner.lookup('service:store');
let model = store.createRecord('fragment-principal', {});
@@ -4,7 +4,6 @@ import { setupTest } from 'ember-qunit';
module('Unit | Model | fragment string', function (hooks) {
setupTest(hooks);
// Replace this with your real tests.
test('it exists', function (assert) {
let store = this.owner.lookup('service:store');
let model = store.createRecord('fragment-string', {});
@@ -4,7 +4,6 @@ import { setupTest } from 'ember-qunit';
module('Unit | Model | host', function (hooks) {
setupTest(hooks);
// Replace this with your real tests.
test('it exists', function (assert) {
let store = this.owner.lookup('service:store');
let model = store.createRecord('host', {});
@@ -4,7 +4,75 @@ import { setupTest } from 'ember-qunit';
module('Unit | Serializer | account', function (hooks) {
setupTest(hooks);
test('it serializes normally', function (assert) {
test('it serializes OIDC-type with only issuer and subject in `attributes` on create', function (assert) {
assert.expect(1);
const store = this.owner.lookup('service:store');
const serializer = store.serializerFor('account');
const record = store.createRecord('account', {
type: 'oidc',
name: 'Name',
auth_method_id: '1',
description: 'Description',
attributes: {
issuer: 'issuer',
subject: 'sub',
full_name: 'full_name',
email: 'email',
},
version: 1,
});
const snapshot = record._createSnapshot();
const serializedRecord = serializer.serialize(snapshot);
assert.deepEqual(serializedRecord, {
type: 'oidc',
name: 'Name',
auth_method_id: '1',
description: 'Description',
version: 1,
attributes: {
issuer: 'issuer',
subject: 'sub',
},
});
});
test('it serializes OIDC-type without `attributes` on update', function (assert) {
assert.expect(2);
const store = this.owner.lookup('service:store');
const serializer = store.serializerFor('account');
store.push({
data: {
id: '1',
type: 'account',
attributes: {
type: 'oidc',
name: 'Name',
auth_method_id: '1',
description: 'Description',
attributes: {
issuer: 'issuer',
subject: 'sub',
full_name: 'full_name',
email: 'email',
},
version: 1,
},
},
});
const record = store.peekRecord('account', '1');
const snapshot = record._createSnapshot();
const serializedRecord = serializer.serialize(snapshot);
assert.notOk(serializedRecord.attributes);
assert.deepEqual(serializedRecord, {
type: 'oidc',
name: 'Name',
auth_method_id: '1',
description: 'Description',
version: 1,
});
});
test('it serializes password-type normally', function (assert) {
assert.expect(1);
const store = this.owner.lookup('service:store');
const serializer = store.serializerFor('account');
@@ -19,7 +87,6 @@ module('Unit | Serializer | account', function (hooks) {
version: 1,
});
const snapshot = record._createSnapshot();
snapshot.adapterOptions = {};
const serializedRecord = serializer.serialize(snapshot);
assert.deepEqual(serializedRecord, {
type: 'password',
@@ -1,10 +1,11 @@
import { module, test } from 'qunit';
import { setupTest } from 'ember-qunit';
import setupMirage from 'ember-cli-mirage/test-support/setup-mirage';
module('Unit | Serializer | auth method', function (hooks) {
setupTest(hooks);
setupMirage(hooks);
// Replace this with your real tests.
test('it exists', function (assert) {
let store = this.owner.lookup('service:store');
let serializer = store.serializerFor('auth-method');
@@ -12,13 +13,94 @@ module('Unit | Serializer | auth method', function (hooks) {
assert.ok(serializer);
});
test('it serializes records', function (assert) {
test('it serializes password records', function (assert) {
assert.expect(2);
let store = this.owner.lookup('service:store');
let record = store.createRecord('auth-method', {});
let record = store.createRecord('auth-method', { type: 'password' });
let serializedRecord = record.serialize();
assert.ok(serializedRecord);
assert.notOk(
serializedRecord.attributes,
'Password should not have attributes'
);
});
test('it serializes OIDC records without state', function (assert) {
assert.expect(1);
let store = this.owner.lookup('service:store');
let record = store.createRecord('auth-method', {
type: 'oidc',
name: 'OIDC Auth Method',
attributes: {
state: 'foo',
account_claim_maps: [{ from: 'foo', to: 'bar' }],
claims_scopes: [{ value: 'profile' }, { value: 'email' }],
signing_algorithms: [{ value: 'RS256' }, { value: 'RS384' }],
allowed_audiences: [
{ value: 'www.alice.com' },
{ value: 'www.alice.com/admin' },
],
idp_ca_certs: [
{ value: 'certificate-1234' },
{ value: 'certificate-5678' },
],
api_url_prefix: 'protocol://host:port/foo',
client_id: 'id123',
client_secret: 'secret456',
disable_discovered_config_validation: true,
dry_run: true,
issuer: 'http://www.example.net',
max_age: 500,
},
});
let serializedRecord = record.serialize();
assert.deepEqual(serializedRecord, {
type: 'oidc',
name: 'OIDC Auth Method',
description: null,
attributes: {
account_claim_maps: ['foo=bar'],
claims_scopes: ['profile', 'email'],
signing_algorithms: ['RS256', 'RS384'],
allowed_audiences: ['www.alice.com', 'www.alice.com/admin'],
idp_ca_certs: ['certificate-1234', 'certificate-5678'],
api_url_prefix: 'protocol://host:port/foo',
client_id: 'id123',
client_secret: 'secret456',
disable_discovered_config_validation: true,
dry_run: true,
issuer: 'http://www.example.net',
max_age: 500,
},
});
});
test('it serializes OIDC records with only state and version when `adapterOptions.state` is passed', function (assert) {
assert.expect(1);
const store = this.owner.lookup('service:store');
const serializer = store.serializerFor('auth-method');
const record = store.createRecord('auth-method', {
type: 'oidc',
attributes: {
state: 'foo',
},
version: 1,
});
const snapshot = record._createSnapshot();
snapshot.adapterOptions = {
state: 'bar',
};
const serializedRecord = serializer.serialize(snapshot);
assert.deepEqual(serializedRecord, {
attributes: {
state: 'bar',
},
version: 1,
});
});
test('it sorts primary first in normalizeArrayResponse', function (assert) {
@@ -63,4 +145,22 @@ module('Unit | Serializer | auth method', function (hooks) {
'First normalized item is primary'
);
});
test('it normalizes OIDC records', async function (assert) {
const store = this.owner.lookup('service:store');
this.server.get('/v1/auth-methods/oidc123', () => ({
attributes: {
account_claim_maps: ['from=to', 'foo=bar'],
},
version: 1,
type: 'oidc',
id: 'oidc123',
}));
const record = await store.findRecord('auth-method', 'oidc123');
const { account_claim_maps } = record.attributes;
assert.equal(account_claim_maps.firstObject.from, 'from');
assert.equal(account_claim_maps.firstObject.to, 'to');
assert.equal(account_claim_maps.lastObject.from, 'foo');
assert.equal(account_claim_maps.lastObject.to, 'bar');
});
});
@@ -0,0 +1,23 @@
import { module, test } from 'qunit';
import { setupTest } from 'ember-qunit';
module('Unit | Serializer | fragment account attributes', function (hooks) {
setupTest(hooks);
// Replace this with your real tests.
test('it exists', function (assert) {
let store = this.owner.lookup('service:store');
let serializer = store.serializerFor('fragment-account-attributes');
assert.ok(serializer);
});
test('it serializes records', function (assert) {
let store = this.owner.lookup('service:store');
let record = store.createRecord('fragment-account-attributes', {});
let serializedRecord = record.serialize();
assert.ok(serializedRecord);
});
});
@@ -0,0 +1,37 @@
import { module, test } from 'qunit';
import { setupTest } from 'ember-qunit';
module('Unit | Serializer | fragment auth method attributes', function (hooks) {
setupTest(hooks);
test('it serializes empty strings to null', function (assert) {
assert.expect(1);
const store = this.owner.lookup('service:store');
const record = store.createRecord('user', {
name: '',
description: '',
version: null,
});
let serializedRecord = record.serialize();
assert.deepEqual(serializedRecord, {
name: null,
description: null,
});
});
test('it does not serialize client_secret if present but falsy', function (assert) {
assert.expect(1);
const store = this.owner.lookup('service:store');
const record = store.createRecord('user', {
name: '',
description: '',
version: null,
client_secret: false,
});
let serializedRecord = record.serialize();
assert.deepEqual(serializedRecord, {
name: null,
description: null,
});
});
});
@@ -0,0 +1,49 @@
import { module, test } from 'qunit';
import { setupTest } from 'ember-qunit';
module('Unit | Serializer | fragment string', function (hooks) {
setupTest(hooks);
// Replace this with your real tests.
test('it exists', function (assert) {
let store = this.owner.lookup('service:store');
let serializer = store.serializerFor('fragment-string');
assert.ok(serializer);
});
test('it serializes records', function (assert) {
let store = this.owner.lookup('service:store');
let record = store.createRecord('fragment-string', {
value: 'string value',
});
let serializedRecord = record.serialize();
assert.equal(serializedRecord, 'string value');
});
test('it normalizes records', function (assert) {
assert.expect(1);
const store = this.owner.lookup('service:store');
const serializer = store.serializerFor('fragment-string');
const modelClass = store.createRecord('fragment-string').constructor;
const payload = 'string value';
const normalized = serializer.normalizeSingleResponse(
store,
modelClass,
payload
);
assert.deepEqual(normalized, {
included: [],
data: {
id: null,
type: 'fragment-string',
attributes: {
value: 'string value',
},
relationships: {},
},
});
});
});
@@ -4,7 +4,6 @@ import { setupTest } from 'ember-qunit';
module('Unit | Serializer | host', function (hooks) {
setupTest(hooks);
// Replace this with your real tests.
test('it exists', function (assert) {
let store = this.owner.lookup('service:store');
let serializer = store.serializerFor('host');
@@ -4,7 +4,6 @@ import { setupTest } from 'ember-qunit';
module('Unit | Serializer | session', function (hooks) {
setupTest(hooks);
// Replace this with your real tests.
test('it exists', function (assert) {
let store = this.owner.lookup('service:store');
let serializer = store.serializerFor('session');
+3 -4
View File
@@ -72,10 +72,9 @@ export default class BaseAuthenticator extends SimpleAuthBaseAuthenticator {
*/
async restore(data) {
if (!data) return reject();
return this.validateToken(
data.attributes.token,
data.attributes.id
).then(() => this.normalizeData(data));
return this.validateToken(data.attributes.token, data.attributes.id).then(
() => this.normalizeData(data)
);
}
/**
+2 -2
View File
@@ -33,7 +33,7 @@
"babel-eslint": "^10.1.0",
"broccoli-asset-rev": "^3.0.0",
"core": "*",
"doctoc": "^1.4.0",
"doctoc": "^2.0.0",
"ember-auto-import": "^1.10.1",
"ember-cli": "~3.24.0",
"ember-cli-dependency-checker": "^3.2.0",
@@ -65,7 +65,7 @@
"qunit-dom": "^1.6.0"
},
"engines": {
"node": "10.* || >= 12"
"node": ">=10 <=15"
},
"ember": {
"edition": "octane"
+19
View File
@@ -7,6 +7,25 @@ helpers.
<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->
<!-- END doctoc generated TOC please keep comment here to allow auto update -->
- [Add core to an App](#add-core-to-an-app)
- [Installation](#installation)
- [I18n](#i18n)
- [Notifications](#notifications)
- [Confirmations](#confirmations)
- [App and Company Names](#app-and-company-names)
- [Documentation URLs](#documentation-urls)
- [Loading Helper](#loading-helper)
- [Scope Service](#scope-service)
- [Yarn Commands](#yarn-commands)
- [Linting](#linting)
- [Formatting](#formatting)
- [Running tests](#running-tests)
- [Running the dummy application](#running-the-dummy-application)
- [Contributing](#contributing)
- [Building ToC](#building-toc)
<!-- END doctoc generated TOC please keep comment here to allow auto update -->
- [Add core to an App](#add-core-to-an-app)
- [Installation](#installation)
- [Yarn Commands](#yarn-commands)
+2 -2
View File
@@ -76,8 +76,8 @@ export default class OIDCAuthenticator extends BaseOIDCAuthenticator {
* @param {string} token
*/
addTokenToAuthorization(token) {
const adapterPrototype = this.store.adapterFor('application').constructor
.prototype;
const adapterPrototype =
this.store.adapterFor('application').constructor.prototype;
const headers = adapterPrototype?.headers;
if (!headers) adapterPrototype.headers = {};
adapterPrototype.headers.Authorization = null;
+2 -2
View File
@@ -91,8 +91,8 @@ export default class PasswordAuthenticator extends BasePasswordAuthenticator {
* @param {string} token
*/
addTokenToAuthorization(token) {
const adapterPrototype = this.store.adapterFor('application').constructor
.prototype;
const adapterPrototype =
this.store.adapterFor('application').constructor.prototype;
const headers = adapterPrototype?.headers;
if (!headers) adapterPrototype.headers = {};
adapterPrototype.headers.Authorization = null;
+1 -1
View File
@@ -1 +1 @@
export { default, appName } from 'core/helpers/app-name';
export { default } from 'core/helpers/app-name';
+1 -1
View File
@@ -1 +1 @@
export { default, companyCopyright } from 'core/helpers/company-copyright';
export { default } from 'core/helpers/company-copyright';
+1 -1
View File
@@ -1 +1 @@
export { default, companyName } from 'core/helpers/company-name';
export { default } from 'core/helpers/company-name';
+1 -1
View File
@@ -1 +1 @@
export { default, docUrl } from 'core/helpers/doc-url';
export { default } from 'core/helpers/doc-url';
@@ -1,4 +1 @@
export {
default,
formatDateIsoHuman,
} from 'core/helpers/format-date-iso-human';
export { default } from 'core/helpers/format-date-iso-human';
+1 -1
View File
@@ -1 +1 @@
export { default, formatDateIso } from 'core/helpers/format-date-iso';
export { default } from 'core/helpers/format-date-iso';
+1 -1
View File
@@ -1 +1 @@
export { default, isLoading } from 'core/helpers/is-loading';
export { default } from 'core/helpers/is-loading';
+4 -3
View File
@@ -30,14 +30,15 @@
"dependencies": {
"api": "*",
"auth": "*",
"ember-browser-services": "^1.1.6",
"ember-cli-babel": "^7.23.0",
"ember-cli-htmlbars": "^5.3.1",
"ember-feature-flags": "^6.0.0",
"ember-get-config": "^0.3.0",
"ember-intl": "^5.5.0",
"ember-loading": "^0.4.0",
"ember-page-title": "^6.0.3",
"ember-route-action-helper": "^2.0.8",
"ember-feature-flags": "^6.0.0",
"rose": "*"
},
"devDependencies": {
@@ -47,7 +48,7 @@
"@glimmer/tracking": "^1.0.3",
"babel-eslint": "^10.1.0",
"broccoli-asset-rev": "^3.0.0",
"doctoc": "^1.4.0",
"doctoc": "^2.0.0",
"ember-auto-import": "^1.10.1",
"ember-cli": "~3.24.0",
"ember-cli-dependency-checker": "^3.2.0",
@@ -80,7 +81,7 @@
"qunit-dom": "^1.6.0"
},
"engines": {
"node": "10.* || >= 12"
"node": ">=10 <=15"
},
"ember": {
"edition": "octane"
@@ -0,0 +1,4 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M12.5832 1.67511L5.68872 7.36908L10.6547 13.3821L13.4227 11.0961L17.298 15.5239L13.8483 18.5432L15.3301 20.2363L18.7798 17.217L20.2352 18.8797L16.7874 21.8973L18.2693 23.5904L23.4101 19.091L15.1582 9.66276L17.5492 7.68814L12.5832 1.67511Z" fill="black"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M6.06114 10.6154C3.9843 10.3626 2.37549 8.59326 2.37549 6.44818C2.37549 4.12959 4.25508 2.25 6.57366 2.25C7.31363 2.25 8.00889 2.44144 8.6126 2.7775L10.4051 1.26126C9.33393 0.468662 8.00853 0 6.57366 0C3.01243 0 0.125488 2.88695 0.125488 6.44818C0.125488 10.0094 3.01243 12.8964 6.57366 12.8964C7.02078 12.8964 7.45727 12.8508 7.87875 12.7642L6.06114 10.6154Z" fill="black"/>
</svg>

After

Width:  |  Height:  |  Size: 832 B

@@ -0,0 +1,9 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M12.4577 1.67511L5.56323 7.36908L10.5292 13.3821L13.2972 11.0961L17.1724 15.5238L13.7226 18.5433L15.2044 20.2364L18.6543 17.2169L20.1097 18.8797L16.662 21.8973L18.1438 23.5904L23.2846 19.091L15.0328 9.66276L17.4237 7.68814L12.4577 1.67511Z" fill="black"/>
<mask id="path-2-inside-1" fill="white">
<path fill-rule="evenodd" clip-rule="evenodd" d="M12.766 4.35302L5.62911 4.255L5.53249 11.2901L9.12206 11.3394L9.20978 17.2227L4.62573 17.2911L4.6593 19.5409L9.24333 19.4725L9.27627 21.682L4.69506 21.7503L4.7286 24L11.5596 23.8982L11.3728 11.3703L12.6694 11.3882L12.766 4.35302Z"/>
</mask>
<path fill-rule="evenodd" clip-rule="evenodd" d="M12.766 4.35302L5.62911 4.255L5.53249 11.2901L9.12206 11.3394L9.20978 17.2227L4.62573 17.2911L4.6593 19.5409L9.24333 19.4725L9.27627 21.682L4.69506 21.7503L4.7286 24L11.5596 23.8982L11.3728 11.3703L12.6694 11.3882L12.766 4.35302Z" fill="black"/>
<path d="M5.62911 4.255L5.64971 2.75515L4.14985 2.73455L4.12925 4.23441L5.62911 4.255ZM12.766 4.35302L14.2659 4.37362L14.2865 2.87376L12.7866 2.85316L12.766 4.35302ZM5.53249 11.2901L4.03264 11.2695L4.01204 12.7694L5.5119 12.79L5.53249 11.2901ZM9.12206 11.3394L10.6219 11.3171L10.6002 9.85959L9.14265 9.83958L9.12206 11.3394ZM9.20978 17.2227L9.23216 18.7226L10.732 18.7002L10.7096 17.2004L9.20978 17.2227ZM4.62573 17.2911L4.60335 15.7913L3.10352 15.8137L3.1259 17.3135L4.62573 17.2911ZM4.6593 19.5409L3.15947 19.5633L3.18185 21.0631L4.68168 21.0407L4.6593 19.5409ZM9.24333 19.4725L10.7432 19.4501L10.7208 17.9503L9.22095 17.9727L9.24333 19.4725ZM9.27627 21.682L9.29863 23.1818L10.7985 23.1594L10.7761 21.6596L9.27627 21.682ZM4.69506 21.7503L4.6727 20.2504L3.17286 20.2728L3.19522 21.7726L4.69506 21.7503ZM4.7286 24L3.22877 24.0224L3.25113 25.5222L4.75096 25.4998L4.7286 24ZM11.5596 23.8982L11.5819 25.398L13.0818 25.3756L13.0594 23.8758L11.5596 23.8982ZM11.3728 11.3703L11.3934 9.87048L9.84992 9.84929L9.87293 11.3927L11.3728 11.3703ZM12.6694 11.3882L12.6488 12.888L14.1487 12.9086L14.1693 11.4087L12.6694 11.3882ZM5.60851 5.75486L12.7454 5.85288L12.7866 2.85316L5.64971 2.75515L5.60851 5.75486ZM7.03235 11.3107L7.12897 4.2756L4.12925 4.23441L4.03264 11.2695L7.03235 11.3107ZM9.14265 9.83958L5.55309 9.79028L5.5119 12.79L9.10146 12.8393L9.14265 9.83958ZM7.62222 11.3618L7.70995 17.2451L10.7096 17.2004L10.6219 11.3171L7.62222 11.3618ZM9.1874 15.7229L4.60335 15.7913L4.64811 18.791L9.23216 18.7226L9.1874 15.7229ZM3.1259 17.3135L3.15947 19.5633L6.15913 19.5185L6.12557 17.2688L3.1259 17.3135ZM4.68168 21.0407L9.2657 20.9723L9.22095 17.9727L4.63692 18.0411L4.68168 21.0407ZM7.74349 19.4949L7.77644 21.7043L10.7761 21.6596L10.7432 19.4501L7.74349 19.4949ZM9.25391 20.1821L4.6727 20.2504L4.71742 23.2501L9.29863 23.1818L9.25391 20.1821ZM3.19522 21.7726L3.22877 24.0224L6.22843 23.9777L6.19489 21.7279L3.19522 21.7726ZM4.75096 25.4998L11.5819 25.398L11.5372 22.3983L4.70624 22.5002L4.75096 25.4998ZM13.0594 23.8758L12.8726 11.348L9.87293 11.3927L10.0597 23.9205L13.0594 23.8758ZM12.69 9.88829L11.3934 9.87048L11.3522 12.8702L12.6488 12.888L12.69 9.88829ZM11.2662 4.33242L11.1696 11.3676L14.1693 11.4087L14.2659 4.37362L11.2662 4.33242Z" fill="black" mask="url(#path-2-inside-1)"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M10.2796 1.26121C9.20838 0.46864 7.88301 0 6.44818 0C2.88695 0 0 2.88695 0 6.44818C0 9.00798 1.4916 11.2194 3.65306 12.2607L3.68943 9.61275C2.80735 8.84314 2.25 7.71075 2.25 6.44818C2.25 4.12959 4.12959 2.25 6.44818 2.25C7.18811 2.25 7.88333 2.44143 8.48703 2.77746L10.2796 1.26121Z" fill="black"/>
</svg>

After

Width:  |  Height:  |  Size: 3.6 KiB

@@ -31,3 +31,5 @@ set-password: Set Password
change-password: Change Password
edit-form: Edit Form
change-origin: Change Origin URL
change-state: Change State
close: Close
+2
View File
@@ -27,6 +27,8 @@ titles:
abandon-confirm: Discard unsaved changes?
toggle-color-theme: Toggle Color Theme
welcome-to-boundary: Welcome to Boundary
label: Label
value: Value
descriptions:
empty-set: There are no items to display yet. You may be able to add items or try back later.
origin-initialization: To get started, please enter your origin URL
+64
View File
@@ -51,3 +51,67 @@ origin:
description: The Boundary URL to which to connect (e.g. protocol://host:port)
proxy:
label: Proxy
issuer:
label: Issuer
help: The issuer URL. Boundary expects only the schema, host, and port and will strip off ".well-known/openid-configuration" if present. This will be used for configuration discovery as well as for validation of the "iss" claim.
client_id:
label: Client ID
help: An OAuth 2.0 Client Identifier valid at the Authorization Server.
client_secret:
label: Client Secret
help: The client secret is set-only and may not be unset.
client_secret_hmac:
label: Client Secret HMAC
max_age:
label: Maximum Age
help: The OIDC "max_age" parameter sent to the Authorization Server indicating a maximum acceptable time in seconds since the user's last authentication before requiring the user to reauthenticate. 0 indicates an immediate need to reauthenticate.
api_url_prefix:
label: API URL Prefix
help: The prefix that should be used for any URLs needed during the authentication flow. This includes the callback URL, the token retrieval URL, and the redirection URL used by the OIDC Authorization Server.
disable_discovered_config_validation:
label: Disable discovered config validation
help: >
If the Authorization Server's discovered configuration contains values that do not match the configuration set on this auth method, this can be set to force the local configuration to override the discovered values. This is useful in the case of slow-changing or incorrect values announced by the Authorization Server. NOTE: For safety, not providing this value will be treated the same as "false"; that is, every time the method is updated or the state is changed, this value must be set to "true" or it will be disabled.
idp_ca_certs:
label: Certificates
help: Optional PEM-encoded X.509 CA certificates that can be used as trust anchors when connecting to an OIDC provider.
certificate:
label: Certificate
allowed_audiences:
label: Allowed Audiences
help: Allowed audience claims for this auth method.
claim:
label: Claim
claims_scopes:
label: Claims Scopes
help: Optional claims scopes that will be requested during authentication.
claims_scope:
label: Claims Scope
account_claim_maps:
label: Account Claim Maps
help: >
Optional claim maps from custom claims to the standard claims of sub, name and email. These maps are represented as key=value where the key equals the from_claim and the value equals the to_claim. For example "oid=sub".
account_claim_map:
label: Account Claim Map
from_claim:
label: From Claim
to_claim:
label: To Claim
signing_algorithms:
label: Signing Algorithms
help: The signing algorithms allowed for the auth method.
algorithm:
label: Algorithm
subject:
label: Subject
email:
label: Email
full_name:
label: Full Name
key:
label: Key
value:
label: Value
callback_url:
label: Callback URL
help: The URL to which the third-party provider sends the authentication response. Paste this into the provider configuration.
@@ -10,6 +10,7 @@ account:
description: Set a password for the account.
types:
password: Password
oidc: OIDC
actions:
create: Create Account
delete: Delete Account
@@ -30,6 +31,13 @@ auth-method:
pending:
title: Authentication Pending
description: Complete authentication in the newly-opened window.
titles:
new-signing-algorithm: New Signing Algorithm
new-allowed-audience: New Allowed Audience
new-claims-scope: New Claims Scope
new-from-claim: New From Claim
new-to-claim: New To Claim
new-certificate: New Certificate
types:
password: Password
oidc: OIDC
@@ -139,6 +147,17 @@ session:
description: No active sessions available to display yet.
actions:
connect: Connect
credential:
title: Credential
title_plural: Credentials
secret:
label: Secret
credential_library:
title: Credential Library
actions:
raw-api:
show: View raw API output
hide: Hide raw API output
org:
title: Org
title_plural: Orgs
@@ -225,6 +244,12 @@ target:
none:
title: No Targets Available
description: No Targets to display yet. Contact your Boundary admin if you don't see a Target you expect access to.
connection-success:
title: Successfully Connected
connection-details:
title: Target Connection Details
proxy_url:
title: Proxy URL
actions:
create: New Target
delete: Delete Target
@@ -242,3 +267,4 @@ target:
add:
title: Add Host Sets
description: Select host sets to assign to this target.
secret: ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
+3 -3
View File
@@ -4,7 +4,7 @@ success: Success
warning: Warning
error: Error
copied: Copied
connection:
success:
description: "Local proxy address ({protocol}): {address}:{port}"
primary: Primary
inactive: Inactive
active-private: Private
active-public: Public
+1
View File
@@ -13,6 +13,7 @@ Boundary UIs.
- [Linting](#linting)
- [Formatting](#formatting)
- [Building Components](#building-components)
- [Using Components](#using-components)
- [Running tests](#running-tests)
- [Running the dummy application](#running-the-dummy-application)
- [Contributing](#contributing)
@@ -1,6 +1,6 @@
<details
...attributes
class="rose-dropdown {{if @dropdownRight "rose-dropdown-right"}}"
class="rose-dropdown {{if @dropdownRight "rose-dropdown-right"}} {{if @style (concat "rose-dropdown-" @style)}}"
{{on-click-outside this.close}}
>
@@ -22,14 +22,28 @@
</summary>
<div class="rose-dropdown-content" {{on-click-inside this.close}}>
{{yield (hash
link=(component "rose/dropdown/link" style=this.style)
button=(component "rose/dropdown/button" style=this.style)
item=(component "rose/anonymous" class="rose-dropdown-item")
separator=(component "rose/anonymous" tagName="hr" class="rose-dropdown-separator")
section=(component "rose/dropdown/section" style=this.style)
)}}
</div>
{{#if @ignoreClickInside}}
<div class="rose-dropdown-content">
{{yield (hash
link=(component "rose/dropdown/link" style=this.style)
button=(component "rose/dropdown/button" style=this.style)
item=(component "rose/anonymous" class="rose-dropdown-item")
separator=(component "rose/anonymous" tagName="hr" class="rose-dropdown-separator")
section=(component "rose/dropdown/section" style=this.style)
key-value=(component "rose/dropdown/key-value")
)}}
</div>
{{else}}
<div class="rose-dropdown-content" {{on-click-inside this.close}}>
{{yield (hash
link=(component "rose/dropdown/link" style=this.style)
button=(component "rose/dropdown/button" style=this.style)
item=(component "rose/anonymous" class="rose-dropdown-item")
separator=(component "rose/anonymous" tagName="hr" class="rose-dropdown-separator")
section=(component "rose/dropdown/section" style=this.style)
key-value=(component "rose/dropdown/key-value")
)}}
</div>
{{/if}}
</details>
@@ -63,6 +63,24 @@ A simple dropdown component with support for links and buttons.
}}</Story>
</Preview>
<Preview>
<Story name="Dropdown with Key Value Items" height="13rem">{{
template: hbs`
<Rose::Dropdown @text="View details" @showCaret={{showCaret}} @ignoreClickInside={{true}} as |dropdown|>
<dropdown.key-value>
<:key>Name</:key>
<:value>Key/Value</:value>
</dropdown.key-value>
<dropdown.separator />
<dropdown.key-value>
<:key>Description</:key>
<:value>Lorem ipsum dolor sit amet consectetur adipisicing elit. Assumenda illo ratione libero ducimus magnam, porro sed provident repellat mollitia a, repellendus placeat. Magni consequuntur cumque, debitis obcaecati dolores quasi natus?</:value>
</dropdown.key-value>
</Rose::Dropdown>
`,
}}</Story>
</Preview>
```html
<Rose::Dropdown @text="Choose One&hellip;" as |dropdown|>
@@ -125,3 +143,14 @@ form field.
</form.radioGroup>
</Rose::Form>
```
Closing dropdown after clicking inside it's content can be ignored using `ignoreClickInside`. This is useful when dropdown contains keyvalue items that users need to select/copy/interact with.
```html
<Rose::Dropdown @text="View details" @showCaret={{true}} @ignoreClickInside={{true}} as |dropdown|>
<dropdown.key-value>
<:key>ID</:key>
<:value>cl_nbv9375hLHs</:value>
</dropdown.key-value>
</Rose::Dropdown>
```
@@ -0,0 +1,9 @@
<dl class='rose-dropdown-key-value rose-dropdown-item'>
<dt class='rose-dropdown-key'>
{{yield to='key'}}
</dt>
<dd class='rose-dropdown-value'>
{{yield to='value'}}
</dd>
</dl>
@@ -8,7 +8,7 @@
disabled={{@disabled}}
@type="checkbox"
@checked={{if @checked true false}}
aria-describedby="{{if @error (concat 'errors-' this.id)}}" />
aria-describedby="{{if @helperText (concat 'helper-text-' this.id)}} {{if @error (concat 'errors-' this.id)}}" />
<label class="rose-form-checkbox-label" for={{this.id}}>
<span class="rose-form-checkbox-label-text">{{@label}}</span>
@@ -17,6 +17,12 @@
{{/if}}
</label>
{{#if @helperText}}
<Rose::Form::HelperText @id="helper-text-{{this.id}}" @error={{@error}}>
{{@helperText}}
</Rose::Form::HelperText>
{{/if}}
{{yield (hash
errors=(component 'rose/form/errors' id=(concat 'errors-' this.id))
)}}
@@ -26,6 +26,7 @@ Renders a form input checkbox.
@name={{name}}
@label={{label}}
@description={{description}}
@helperText={{helperText}}
@checked={{checked}}
@error={{error}}
@disabled={{disabled}}
@@ -33,7 +34,8 @@ Renders a form input checkbox.
`,
context: {
label: text('text', 'Checkbox 🛎'),
description: text('description', 'This is an optional description paragraph.'),
description: text('description', 'Short description in label'),
helperText: text('helperText', 'This is an optional help text.'),
name: text('name', 'checkbox-1'),
checked: boolean('checked', false),
error: boolean('error', false),
@@ -0,0 +1,21 @@
<fieldset ...attributes class='rose-form-fieldset' aria-describedby={{if (has-block "description") (concat 'description-' this.id)}}>
<legend
id={{concat 'title-' this.id}}
class='rose-form-fieldset-title'
>
{{yield to='title'}}
</legend>
{{#if (has-block "description")}}
<div
id={{concat 'description-' this.id}}
class='rose-form-fieldset-description'
>
{{yield to='description'}}
</div>
{{/if}}
<div class='rose-form-fieldset-body'>
{{yield to='body'}}
</div>
</fieldset>
@@ -0,0 +1,11 @@
import Component from '@glimmer/component';
import { generateComponentID } from '../../../../utilities/component-auto-id';
export default class RoseFormFieldsetComponent extends Component {
// =attributes
/**
* @type {string}
*/
id = generateComponentID();
}
@@ -0,0 +1,29 @@
import { Meta, Story, Preview } from '@storybook/addon-docs/blocks';
import { hbs } from 'ember-cli-htmlbars';
import { action } from '@storybook/addon-actions';
import { text, boolean, select } from '@storybook/addon-knobs';
<Meta title="Rose|Form/Fieldset" component="Form/Fieldset" />
# Form Fieldset
Renders a simple fieldset with title, description and body.
```html
<Rose::Form::Fieldset>
<:title>Title</:title>
<:description>Description</:description>
<:body>Rest of the form</:body>
</Rose::Form::Fieldset>
```
<Preview>
<Story name="Basic Fieldset">{{
template: hbs`
<Rose::Form::Fieldset>
<:title>Title</:title>
<:description>Description</:description>
<:body>Rest of the form</:body>
</Rose::Form::Fieldset>`
}}</Story>
</Preview>
@@ -30,5 +30,6 @@
cancel=this.handleCancel
enableEdit=this.enableEdit
)
isEditable=this.isEditable
)}}
</form>
@@ -1,16 +1,13 @@
<div class="rose-form-select">
<Rose::Form::Label @for={{this.id}} @error={{@error}}>
{{@label}}
</Rose::Form::Label>
{{#if @helperText}}
<Rose::Form::HelperText @id="helper-text-{{this.id}}" @error={{@error}}>
{{@helperText}}
</Rose::Form::HelperText>
{{/if}}
{{#if @contextual}}
{{yield (hash
label=(component 'rose/form/label'
for=this.id
error=@error
)
helperText=(component 'rose/form/helper-text'
id=(concat 'helper-text-' this.id)
error=@error
)
field=(component 'rose/form/select/select'
id=this.id
name=@name
@@ -20,7 +17,35 @@
error=@error
aria-describedby=(concat (if @helperText (concat 'helper-text-' this.id)) (if @error (concat ' errors-' this.id)))
)
errors=(component 'rose/form/errors' id=(concat 'errors-' this.id))
errors=(component 'rose/form/errors'
id=(concat 'errors-' this.id)
)
)}}
{{else}}
<div class="rose-form-select">
</div>
<Rose::Form::Label @for={{this.id}} @error={{@error}}>
{{@label}}
</Rose::Form::Label>
{{#if @helperText}}
<Rose::Form::HelperText @id="helper-text-{{this.id}}" @error={{@error}}>
{{@helperText}}
</Rose::Form::HelperText>
{{/if}}
{{yield (hash
field=(component 'rose/form/select/select'
id=this.id
name=@name
value=@value
onChange=@onChange
disabled=@disabled
error=@error
aria-describedby=(concat (if @helperText (concat 'helper-text-' this.id)) (if @error (concat ' errors-' this.id)))
)
errors=(component 'rose/form/errors' id=(concat 'errors-' this.id))
)}}
</div>
{{/if}}
@@ -112,3 +112,28 @@ Renders a form select element.
}
}}</Story>
</Preview>
<Preview>
<Story name="Fully Contextual Select">{{
template: hbs`
<Rose::Form::Select @value="value-3" @error={{true}} @contextual={{true}} as |field|>
<hr />
<field.label>Label</field.label>
<hr />
<field.helperText>Help</field.helperText>
<hr />
<field.field as |select|>
<select.option @value="value-1">Value 1</select.option>
<select.option @value="value-2">Value 2</select.option>
<select.option @value="value-3">Value 3</select.option>
</field.field>
<hr />
<field.errors as |errors|>
<errors.message>An error occurred.</errors.message>
</field.errors>
<hr />
</Rose::Form::Select>
`,
context: {},
}}</Story>
</Preview>
@@ -1,26 +1,50 @@
<div class="rose-form-input">
<Rose::Form::Label @for={{this.id}} @error={{@error}}>
{{@label}}
</Rose::Form::Label>
{{#if @helperText}}
<Rose::Form::HelperText @id="helper-text-{{this.id}}" @error={{@error}}>
{{@helperText}}
</Rose::Form::HelperText>
{{/if}}
<Rose::Form::Textarea::Textarea
...attributes
@id={{this.id}}
@name={{@name}}
@value={{@value}}
@disabled={{@disabled}}
@error={{@error}}
@aria-describedby="{{if @helperText (concat 'helper-text-' this.id)}} {{if @error (concat 'errors-' this.id)}}" />
{{#if @contextual}}
{{yield (hash
errors=(component 'rose/form/errors' id=(concat 'errors-' this.id))
label=(component 'rose/form/label'
for=this.id
error=@error
)
helperText=(component 'rose/form/helper-text'
id=(concat 'helper-text-' this.id)
error=@error
)
field=(component 'rose/form/textarea/textarea'
id=this.id
name=@name
value=@value
disabled=@disabled
error=@error
aria-describedby=(concat (if @helperText (concat 'helper-text-' this.id)) (if @error (concat ' errors-' this.id)))
)
errors=(component 'rose/form/errors'
id=(concat 'errors-' this.id)
)
)}}
{{else}}
<div class="rose-form-input">
</div>
<Rose::Form::Label @for={{this.id}} @error={{@error}}>
{{@label}}
</Rose::Form::Label>
{{#if @helperText}}
<Rose::Form::HelperText @id="helper-text-{{this.id}}" @error={{@error}}>
{{@helperText}}
</Rose::Form::HelperText>
{{/if}}
<Rose::Form::Textarea::Textarea
...attributes
@id={{this.id}}
@name={{@name}}
@value={{@value}}
@disabled={{@disabled}}
@error={{@error}}
@aria-describedby="{{if @helperText (concat 'helper-text-' this.id)}} {{if @error (concat 'errors-' this.id)}}" />
{{yield (hash
errors=(component 'rose/form/errors' id=(concat 'errors-' this.id))
)}}
</div>
{{/if}}
@@ -70,3 +70,24 @@ Renders a simple form textarea.
}
}}</Story>
</Preview>
<Preview>
<Story name="Fully Contextual Textarea">{{
template: hbs`
<Rose::Form::Textarea @value="Text" @error={{true}} @contextual={{true}} as |field|>
<hr />
<field.label>Label</field.label>
<hr />
<field.helperText>Help</field.helperText>
<hr />
<field.field />
<hr />
<field.errors as |errors|>
<errors.message>An error occurred.</errors.message>
</field.errors>
<hr />
</Rose::Form::Textarea>
`,
context: {},
}}</Story>
</Preview>
@@ -1,4 +1,4 @@
<table ...attributes class="rose-table">
<table ...attributes class="rose-table {{if @style (concat "rose-table-" @style)}}">
{{#if @caption}}
<caption>{{@caption}}</caption>
{{/if}}
@@ -1,27 +1,42 @@
import { Meta, Story, Preview } from '@storybook/addon-docs/blocks';
import { hbs } from 'ember-cli-htmlbars';
import { boolean, select } from '@storybook/addon-knobs';
<Meta title="Rose|Table" component="Table" />
# Table
A table component to display data in structure of rows and columns. It supports `header`, `body` and `footer` optional definitions. Each definition allows for a table `row` to be defined with either a `cell` or `headerCell` table element.
A table component to display data in structure of rows and columns. It supports `header`, `body` and `footer` optional definitions. Each definition allows for a table `row` to be defined with either a `cell` or `headerCell` table element. Rows can be visually hidden, and cells can be shrinked to its content with, and center/right cell alignment is supported.
```htmlbars
<Rose::Table as |table|>
Cell shrink should be applied to all the cells in a row. Otherwise the bigger cell with shrink applied will determinate the width of the row.
```html
<Rose::Table @style={{style}} as |table|>
<table.header as |header|>
<header.row as |row|>
<header.row @hidden={{hideHeaderRow}} as |row|>
<row.headerCell>Address</row.headerCell>
<row.headerCell>Host Set</row.headerCell>
<row.headerCell>Name</row.headerCell>
<row.headerCell>Description</row.headerCell>
<row.headerCell @alignCenter={{true}}>Description</row.headerCell>
</header.row>
</table.header>
<table.body as |body|>
<body.row as |row|>
<row.cell>1.1.1.1</row.cell>
<row.cell>host-set-1, host-set-2</row.cell>
<row.cell>optional name</row.cell>
<row.cell @shrink={{true}}>optional name</row.cell>
<row.cell @alignCenter={{true}}>description</row.cell>
</body.row>
<body.row as |row|>
<row.cell>1.1.1.1</row.cell>
<row.cell>host-set-2</row.cell>
<row.cell @shrink={{true}} @alignCenter={{true}}>optional name</row.cell>
<row.cell @alignRight={{true}}>description</row.cell>
</body.row>
<body.row as |row|>
<row.cell>1.1.1.1</row.cell>
<row.cell>host-set-1</row.cell>
<row.cell @shrink={{true}}>optional name</row.cell>
<row.cell>description</row.cell>
</body.row>
</table.body>
@@ -36,22 +51,34 @@ A table component to display data in structure of rows and columns. It supports
<Preview>
<Story name="Basic">{{
template: hbs`
<Rose::Table as |table|>
<Rose::Table @style={{style}} as |table|>
<table.header as |header|>
<header.row as |row|>
<row.headerCell>Address</row.headerCell>
<row.headerCell>Host Set</row.headerCell>
<row.headerCell>Name</row.headerCell>
<row.headerCell>Description</row.headerCell>
<header.row @hidden={{hideHeaderRow}} as |row|>
<row.headerCell @shrink={{cellShrink}} @alignCenter={{cellAlignmentCenter}} @alignRight={{cellAlignmentRight}}>Address</row.headerCell>
<row.headerCell @alignCenter={{cellAlignmentCenter}} @alignRight={{cellAlignmentRight}}>Host Set</row.headerCell>
<row.headerCell @shrink={{cellShrink}} @alignCenter={{cellAlignmentCenter}} @alignRight={{cellAlignmentRight}}>Name</row.headerCell>
<row.headerCell @alignCenter={{cellAlignmentCenter}} @alignRight={{cellAlignmentRight}}>Description</row.headerCell>
</header.row>
</table.header>
<table.body as |body|>
<body.row as |row|>
<row.cell>1.1.1.1</row.cell>
<row.cell @shrink={{cellShrink}}>1.1.1.1</row.cell>
<row.cell>host-set-1, host-set-2</row.cell>
<row.cell>optional name</row.cell>
<row.cell @shrink={{cellShrink}}>optional name</row.cell>
<row.cell>description</row.cell>
</body.row>
<body.row as |row|>
<row.cell @shrink={{cellShrink}} @alignCenter={{cellAlignmentCenter}}>1.1.1.1</row.cell>
<row.cell @alignCenter={{cellAlignmentCenter}}>host-set-2</row.cell>
<row.cell @shrink={{cellShrink}} @alignCenter={{cellAlignmentCenter}}>optional name</row.cell>
<row.cell @alignCenter={{cellAlignmentCenter}}>description</row.cell>
</body.row>
<body.row as |row|>
<row.cell @shrink={{cellShrink}} @alignRight={{cellAlignmentRight}}>1.1.1.1</row.cell>
<row.cell @alignRight={{cellAlignmentRight}}>host-set-1</row.cell>
<row.cell @shrink={{cellShrink}} @alignRight={{cellAlignmentRight}}>optional name</row.cell>
<row.cell @alignRight={{cellAlignmentRight}}>description</row.cell>
</body.row>
</table.body>
<table.footer as |footer|>
<footer.row as |row|>
@@ -60,6 +87,102 @@ A table component to display data in structure of rows and columns. It supports
</table.footer>
</Rose::Table>
`,
context: {}
context: {
hideHeaderRow: boolean('hideHeaderRow', false),
cellShrink: boolean('cellShrink', false),
style: select(
'style',
{
'default': '',
'condensed': 'condensed'
}
),
cellAlignmentCenter: boolean('cellAlignmentCenter', false),
cellAlignmentRight: boolean('cellAlignmentRight', false),
},
}}</Story>
</Preview>
<Preview>
<Story name="Basic Key/Value Table">{{
template: hbs`
<Rose::Table @style={{style}} as |table|>
<table.header as |header|>
<header.row as |row|>
<row.headerCell @shrink={{true}}>Key</row.headerCell>
<row.headerCell colspan="2">Value</row.headerCell>
</header.row>
</table.header>
<table.body as |body|>
<body.row as |row|>
<row.cell>Key</row.cell>
<row.cell>
<Rose::Form::Input @contextual={{true}} as |input|>
<input.field />
</Rose::Form::Input>
</row.cell>
<row.cell @shrink={{true}} @alignRight={{true}}>
<Rose::Button @style="secondary" @iconOnly="trash" title="Remove">Remove</Rose::Button>
</row.cell>
</body.row>
<body.row as |row|>
<row.cell>Key</row.cell>
<row.cell>
<Rose::Form::Select
@name="Test select"
as |field|
>
<field.field as |select|>
<select.option>Choose an option</select.option>
<select.option @value="value-1">Value 1</select.option>
<select.option @value="value-2">Value 2</select.option>
<select.option @value="value-3">Value 3</select.option>
</field.field>
</Rose::Form::Select>
</row.cell>
<row.cell @shrink={{true}} @alignRight={{true}}>
<Rose::Button @style="secondary">Add</Rose::Button>
</row.cell>
</body.row>
<body.row as |row|>
<row.cell>Key</row.cell>
<row.cell>
<Rose::Form::Input @contextual={{true}} as |input|>
<input.field />
</Rose::Form::Input>
</row.cell>
<row.cell @alignRight={{true}}>
<Rose::Button @style="secondary">Add</Rose::Button>
</row.cell>
</body.row>
<body.row as |row|>
<row.cell>Key</row.cell>
<row.cell>
<Rose::Form::Textarea
@name="field"
readonly={{false}}
/>
</row.cell>
<row.cell @alignRight={{true}}>
<Rose::Button @style="secondary">Add</Rose::Button>
</row.cell>
</body.row>
</table.body>
<table.footer @hidden={{true}} as |footer|>
<footer.row as |row|>
<row.cell colspan="3">Footer</row.cell>
</footer.row>
</table.footer>
</Rose::Table>
`,
context: {
style: select(
'style',
{
'condensed': 'condensed',
'default': ''
}
)
}
}}</Story>
</Preview>
@@ -0,0 +1 @@
{{yield}}
@@ -0,0 +1,28 @@
import Component from '@ember/component';
import layout from './index';
import { computed } from '@ember/object';
export default Component.extend({
layout,
tagName: 'td',
classNameBindings: ['cellTypeStyle', 'cellShrink', 'cellAlignmentStyle'],
cellTypeStyle: computed(function () {
return this.tagName.match('th')
? `rose-table-header-cell`
: 'rose-table-cell';
}),
cellShrink: computed(function () {
if (this.shrink) {
return 'rose-table-cell-shrink';
}
}),
cellAlignmentStyle: computed(function () {
if (this.alignRight) {
return 'align-right';
}
if (this.alignCenter) {
return 'align-center';
}
}),
});
@@ -1,12 +1,6 @@
<tr ...attributes class='rose-table-row'>
<tr ...attributes class='rose-table-row {{if @hidden (concat "rose-table-row-visually-hidden")}} {{if @style (concat "rose-table-row-" @style)}}'>
{{yield (hash
cell=(component 'rose/anonymous'
tagName='td'
class='rose-table-cell'
)
headerCell=(component 'rose/anonymous'
tagName='th'
class='rose-table-header-cell'
)
cell=(component 'rose/table/row/cell')
headerCell=(component 'rose/table/row/cell' tagName='th')
)}}
</tr>
@@ -1,5 +1,6 @@
@use '../../variables/sizing';
@use '../../utilities/type';
@use 'sass:math';
.rose-dropdown-button {
@include type.type(s);
@@ -11,7 +12,7 @@
padding: 0 sizing.rems(s);
text-decoration: none;
text-align: left;
$line-height: 36 / 14;
$line-height: math.div(36, 14);
line-height: $line-height;
--background-color: transparent;
@@ -5,6 +5,7 @@ $xs: sizing.rems(xs); // 8
$xxs: sizing.rems(xxs); // 4
$chevron: url("data:image/svg+xml;utf-8,<svg viewBox='0 0 24 24' fill='%231b1f26' xmlns='http://www.w3.org/2000/svg'><path fill-rule='evenodd' clip-rule='evenodd' d='M16.59 8.59L12 13.17 7.41 8.59 6 10l6 6 6-6-1.41-1.41z'></path></svg>");
$chevronWhite: url("data:image/svg+xml;utf-8,<svg viewBox='0 0 24 24' fill='%23ffffff' xmlns='http://www.w3.org/2000/svg'><path fill-rule='evenodd' clip-rule='evenodd' d='M16.59 8.59L12 13.17 7.41 8.59 6 10l6 6 6-6-1.41-1.41z'></path></svg>");
$chevronGrey: url("data:image/svg+xml;utf-8,<svg viewBox='0 0 24 24' fill='%23626873' xmlns='http://www.w3.org/2000/svg'><path fill-rule='evenodd' clip-rule='evenodd' d='M16.59 8.59L12 13.17 7.41 8.59 6 10l6 6 6-6-1.41-1.41z'></path></svg>");
.rose-dropdown {
--background-image-light: #{$chevron};
@@ -121,4 +122,26 @@ $chevronWhite: url("data:image/svg+xml;utf-8,<svg viewBox='0 0 24 24' fill='%23f
border: none;
margin: $xxs 0;
}
// Styles for condensed verion. Some are overrides
&.rose-dropdown-condensed {
--background-image: #{$chevronGrey};
border: sizing.rems(xxxxs) solid var(--ui-border);
border-radius: sizing.rems(xxs);
.rose-dropdown-trigger {
color: var(--ui-gray-starker-1);
padding: 0 sizing.rems(s); // To clear the inherit padding.
&.show-caret {
padding-right: sizing.rems(l) + sizing.rems(xs); // 32
background-position: right sizing.rems(xs) center;
}
}
.rose-dropdown-content {
border: none;
border: sizing.rems(xxxxs) solid var(--ui-border);
}
}
}
@@ -3,3 +3,4 @@
@import 'link';
@import 'item';
@import 'section';
@import 'key-value';
@@ -1,13 +1,20 @@
@use '../../variables/sizing';
@use '../../utilities/type';
@use 'sass:math';
$checkmark: url("data:image/svg+xml;utf-8,<svg viewBox='0 0 24 24' fill='%231563ff' xmlns='http://www.w3.org/2000/svg'><path fill-rule='evenodd' clip-rule='evenodd' d='M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41L9 16.17z'></path></svg>");
.rose-dropdown-item {
@include type.type(s);
min-width: (sizing.rems(m)) * 20;
$line-height: 36 / 14;
line-height: $line-height;
$paddingY: math.div(
sizing.rems(xl) - (sizing.rems(m) + sizing.rems(xxxs)),
2
);
$paddingX: sizing.rems(s);
padding: $paddingY $paddingX;
//$line-height: math.div(36, 14);
//line-height: $line-height;
--color: var(--stark);
--background-color: transparent;
@@ -15,26 +22,22 @@ $checkmark: url("data:image/svg+xml;utf-8,<svg viewBox='0 0 24 24' fill='%231563
color: var(--color);
background-color: var(--background-color);
&:hover {
--background-color: var(--ui-gray-subtler-5);
}
.rose-form-radio {
color: currentColor;
margin-bottom: 0;
.rose-form-radio-label {
display: block;
margin: -#{$paddingY} -#{$paddingX};
padding-top: sizing.rems(xs) + sizing.rems(xxxxs);
padding-bottom: sizing.rems(xs) + sizing.rems(xxxxs);
padding-left: sizing.rems(s);
padding-right: sizing.rems(xl);
font-weight: normal;
// &::before,
// &::after {
// display: none;
// }
&:hover {
background-color: var(--ui-gray-subtler-5);
}
&::after {
top: sizing.rems(xxs) + sizing.rems(xxxs);
@@ -56,11 +59,6 @@ $checkmark: url("data:image/svg+xml;utf-8,<svg viewBox='0 0 24 24' fill='%231563
~ .rose-form-radio-label {
color: var(--action);
background-color: var(--action-subtler-1h);
// background-image: #{$checkmark};
// background-repeat: no-repeat;
// background-position: right sizing.rems(m) center;
// background-size: sizing.rems(m);
}
}
@@ -0,0 +1,11 @@
@use '../../variables/sizing';
.rose-dropdown-key-value {
.rose-dropdown-key {
text-transform: capitalize;
}
.rose-dropdown-value {
color: var(--ui-gray);
padding: sizing.rems(xxs) sizing.rems(s) 0 0;
}
}
@@ -1,5 +1,6 @@
@use '../../variables/sizing';
@use '../../utilities/type';
@use 'sass:math';
.rose-dropdown-link {
@include type.type(s);
@@ -11,7 +12,7 @@
padding: 0 sizing.rems(s);
text-decoration: none;
text-align: left;
$line-height: 36 / 14;
$line-height: math.div(36, 14);
line-height: $line-height;
--background-color: transparent;
@@ -1,5 +1,6 @@
@use '../../variables/sizing';
@use '../../utilities/type';
@use 'sass:math';
.rose-dropdown-section {
.rose-dropdown-section-title {
@@ -7,7 +8,7 @@
text-transform: uppercase;
padding: 0 sizing.rems(s);
margin: 0;
$line-height: 36 / 14;
$line-height: math.div(36, 14);
line-height: $line-height;
color: var(--ui-gray);
}
@@ -4,14 +4,17 @@
.rose-form-checkbox {
@include type.type(m);
position: relative;
margin-bottom: sizing.rems(xs);
color: var(--ui-gray);
margin-bottom: sizing.rems(m);
.rose-form-errors {
margin-top: sizing.rems(xs);
margin-bottom: sizing.rems(xs);
}
.rose-form-helper-text {
padding-left: sizing.rems(l);
}
.rose-form-checkbox-label {
// label styles
@include type.type(s, semibold);
@@ -23,6 +26,7 @@
}
.rose-form-checkbox-label-description {
margin-bottom: 0;
margin-top: sizing.rems(xs);
}
@@ -54,6 +58,10 @@
}
}
.rose-form-helper-text {
margin-top: sizing.rems(xs);
}
.rose-form-checkbox-field {
// mostly this just visually hides the native checkbox
position: absolute;
@@ -0,0 +1,16 @@
@use '../../variables/sizing';
@use '../../utilities/type';
.rose-form-fieldset {
margin-bottom: sizing.rems(m);
.rose-form-fieldset-title {
@include type.type(l, bold);
}
.rose-form-fieldset-description {
margin: sizing.rems(xxs) 0;
@include type.type(xs);
color: var(--ui-gray);
}
}
Loaded 100 of 404 files, more files were not shown because too many files have changed in this diff. Show more