Commit graph

1200 commits

Author SHA1 Message Date
matheus 7ca111193b
Allow adding 'locked' features to menu items and routes (#25588)
* Add locked feature options

* Remove routes from items with locked parents

* Refactor to simplify features

* Add type for LockedFeatures

* Improve comment

* Fix call to isLockedAndUpdatedRouteAndNavigationItem wrong param

* Set locked features based on usage based billing

* Add back lockedRoute and list items

* Use simpler sintax

Co-authored-by: Grzegorz Zdunek <gzdunek@users.noreply.github.com>

* Simplify isParentLocked

* Improve navigation item rendering

* Remove unucessary condition from if

* Prevent adding a route if the feature is locked

* Throw error instead of logging

* Improve if condition

---------

Co-authored-by: Grzegorz Zdunek <gzdunek@users.noreply.github.com>
2023-05-09 11:22:27 +00:00
Yassine Bounekhla 4bfdcabb9d
desktop discovery theme fixes (#25499) 2023-05-08 18:00:30 +00:00
Yassine Bounekhla 5bd7240094
fix auditlog error (#25344) 2023-05-08 17:57:00 +00:00
Grzegorz Zdunek 6875666526
Make notification more readable (#25789) 2023-05-08 11:21:04 +00:00
Grzegorz Zdunek ef0cb91b03
Update docs related to the search bar (#24515)
* Update docs related to the search bar

* Rename "more options menu" to "additional actions menu"

* Inform that terminal tabs are bound to the selected cluster

* Apply suggestions from code review

Co-authored-by: Rafał Cieślak <rafal.cieslak@goteleport.com>

* Update screenshots

* Crop app screenshots

* optimize images

* Apply @ravicious suggestions

Co-authored-by: Rafał Cieślak <rafal.cieslak@goteleport.com>

---------

Co-authored-by: Rafał Cieślak <rafal.cieslak@goteleport.com>
Co-authored-by: alexfornuto <alex.fornuto@goteleport.com>
2023-05-08 10:52:19 +00:00
Rafał Cieślak 0a6fb68550
Make TS a dev dep of root package.json, fix design dev deps (#25683)
* Make typescript a dev dep of root package.json

* Make @gravitational/build a dev dep of @gravitational/design
2023-05-08 10:41:30 +00:00
Rafał Cieślak b745a82cd1
Show errors if fetching ParameterPicker suggestions fails (#25703)
* ResultList: Reset active item on pick

* Extract inner item component with icon to ResultList

We want to reuse it in ParameterPicker.

* Remove hardcoded icon color of ResourceSearchErrorsItem

* Handle errors when getting suggestions for ParameterPicker
2023-05-08 09:41:28 +00:00
Rafał Cieślak 273d1d9a1e
Fix flaky resolveNetworkAddress test (#25249)
* Make sure code 0 is reported properly

* Ensure the test process prints to stdout before exiting

* Fix license
2023-05-08 09:37:28 +00:00
matheus 0697011eaa
Add events to cta clicks (#25325)
* (wip) add unlock feature button to support page

* Fix typo

* (wip) add locked feature join session

* Improve session join style

* Add session join lock button

* Remove hover on locked join menu

* Update copy

* Only show `join as...` when appropriate

* (wip)

* Make ButtonLockedFeature theme sensitive

* Remove debug stuff

* Adjust feature button height

* Fix session join button on locked

* Remove unused import

* typo

* Add link to cta button

* Remove teams flag

* Add cta service

* Update snapshots

* Lock button style

* Add cta to context

* Rename cta to ctaService

* Stories and tests

* Add comments clarifying that ctas are not used currently

* add showActiveSessionsCTA to useSessions

* Licenses

* Lint license

* Remove commented out code

* Add missing types

* Replace cta service for an object with cta on context

* Fix menu hack

* small refactor in styled stuff

* Update SessionJoinBtn to use master code

* Snapshot update

* Add events to cta clicks

* rebase

* revert e ref update

* Revert e change

* Update proto message to start at 1

* Use enum from proto files instead of rewriting

* Improve comments on usageevents.proto cta enum

* Fix import

* Fix type errs

* Add comments

* Rename CtaEvents > CtaEvent

* Copy the CtaEvent enum instead of importing from proto

* Add back blank line

* Fix import order

* Update proto files

* Add TODO comment
2023-05-05 18:53:02 +00:00
Grzegorz Zdunek 17394c2342
Use solid color for table row border to fix Safari rendering issue (#25682)
* Use solid color for table row border to fix Safari rendering issue

* Use `emphasize` function

* Improve comment

* Add fallback value to alpha

* Clarify comment
2023-05-05 14:32:25 +00:00
Rafał Cieślak f01e675249
Close search bar in Connect on blur (#25186)
* Remove closeAndResetInput

* Remove unnecessary input focus from `open`

As the comment in SearchBar explains, the focus wasn't actually achieving
anything. I added it only because I was testing SearchContext in separation
and depended on the input getting focused in the test.

This doesn't reflect how the input is actually used so I adjusted the test.

* Move onFocus on input, add onBlur to input

* Remove nesting from handling outside click

* SearchContext: Rename onInputValueChange to setInputValue

* Do proper type check before calling focus on previouslyActive

* Add a temp workaround for tsc issue

* Make TypeScript 4.8.4 happy
2023-05-05 10:48:33 +00:00
Rafał Cieślak ae48e31652
Remove logging of search results in Connect (#25625)
The logging was added for pre-launch debugging purposes and is no longer
needed.
2023-05-05 10:13:21 +00:00
Michael 76074b4f1c
Disable approve button after approval (#25655) 2023-05-04 20:55:13 +00:00
Cam Hutchison d3eed17856
build: Support arm64 and universal binaries for MacOS (#25460)
* build: Support ARM64 (cross)builds of fido2 et al

Add support for building/cross-building the fido2 libraries (cbor,
openssl and fido2), supporting ARM64 builds. This is done by adding the
appropriate flags to the library builds in `build-fido2-macos.sh` based
on the `C_ARCH` environment variable. If unset then the host
architecture is used. The `Makefile` defined `C_ARCH` based on the
`ARCH` variable, mapping it to an appropriate value for the C compiler.

Building the libraries should now be done through the new `build-fido2`
target, and getting the pkg-config path should be done with the
`print-fido2-pkg-path`. This is instead of calling the
`build-fido2-macos.sh` script directly as the `Makefile` takes care of
setting the `C_ARCH` environment variable appropriately.

* build: Add make target to install rust cross toolchain

Add the `rustup-set-target-toolchain` target to the Makefile to ensure
the right rust toolchain is installed for the version of Rust we use as
well as the target architecture we wish to generate code for, based on
the `ARCH` variable. This is intended to be used by CI jobs to ensure
they build with the correct toolchain.

* build: Support building MacOS packages for ARM64

Remove the restriction that allows only AMD64 packages to be built on
MacOS for the teleport and tsh packages. This is via the existing `-a`
flag to `build-package.sh` and a newly added `-a` flag to
`build-pkg-tsh.sh`.

This adds the architecture to the filename of the package to distinguish
the packages for different architectures.

Update the comments in the Makefile mentioning that `arch` is ignored.

build: add architecture to package names

* build: Build Teleport Connect with target architecture

When packaging Teleport Connect with electron-builder, pass an
architecture flag so that we can cross-build Teleport Connect. This will
allow us to build MacOS ARM64 binaries on the AMD64 runners.

Add the architecture to the `dmg` filename via the electron-builder
config, so that the filenames for different architectures don't clash.

* build: Copy Mac release artifacts to release directory

Copy the Mac release artifacts to a release artifact directory so that
the CI scripts do not have to. This makes it clearer what is and is not
a release artifact and puts the logic in the Makefile instead of the CI
yaml, so it can more easily be tested locally and to make it easier to
migrate to the next CI system.

This will also be useful for building universal binaries for Mac as the
CI system can put the architecture-specific binaries from a previous
workflow job into a common location.

We should look at copying all release artifacts for the other builds
(Linux tarballs and packages, etc) into this directory too. It may help
with unifying the GitHub Actions release workflows.

* build: Add MacOS universal builds

Add support for ARCH=universal on Darwin to produce universal (fat)
binaries from pre-built arm64 and amd64 binaries.

Packages (pkg) and disk images (dmg) for containing universal binaries
are named without an architecture in the filename, as that is the
current naming for the current AMD64-only releases. These universal ones
will replace those AMD64-only ones providing a single release artifact
working across architectures.

Co-authored-by: Grzegorz Zdunek <grzegorz.zdunek@goteleport.com>

* build: Do not clean before release-darwin

Remove the `clean` prerequisite from the `release-darwin-unsigned`
target as it is not needed when building on GitHub Actions, as it starts
with a fresh slate each run. We do not make releases manually so we
don't need to ensure a clean working directory there either.

Not doing a clean makes it easier to build a MacOS universal release as
it depends on the architecture-specific tarballs from a previous release
build. We would need to manually save the tarballs from the first
architecture release build as they would get deleted by the `clean` from
the second. So just stop cleaning as it is not needed.

---------

Co-authored-by: Grzegorz Zdunek <grzegorz.zdunek@goteleport.com>
2023-05-04 20:47:49 +00:00
matheus 57690ee961
Add IsUsageBased to features and send it to web UI (#25465)
* Add IsUsageBased to features and send to web UI

* Update flag name

* Improve comment

* Add comments and improve field name

* Remove duplicated property
2023-05-04 14:57:48 +00:00
Grzegorz Zdunek 1870c80cdb
Theme fixes (#24883)
* Make pagination icons a little more visible

* Use different color for `tr` border

* Use `opacity: 1` for placeholders

* Include `borderRadius` in `StyledPanel` to fix rounded corners in Connect custom tables

* Use `colors.text.primary` for items in `MenuLogin`

* Adjust Connect theme to the updated dark theme

* Remove unused component

* Update snapshots

* Remove `surfaceSecondary` and `sunkenSecondary` colors

* Remove unneeded `inherit`

* Do not hardcode bg color in `TextArea`

* Expand comment

* Simplify the look of top bar elements

* Remove unused component

* Remove `text.contrast`

* Use the same dark theme for WebUI and Connect

* Revert "Make pagination icons a little more visible"

This reverts commit 1fe1d7baec.

* Add shadow for the tabs

* Post-merge fixes

* Do not use Arial on custom buttons

* Revert snapshot changes

* Fix colors in `ActionPicker`

* Apply hover styles directly on `SearchBar` input

* Use white color for "Database Connection" header

* Add shadow directly to `StyledTabs`

* Run prettier

* Update e

* Add some top padding to the terminal

* Review fixes

* Move SearchBar hover to the Flex element

* Table-related improvements  (#25333)

* Use a better icon for the reverse tunnel cell

* Use `ButtonIcon` for pagination icons

* Fix rendering table border on Safari

* Manually add a visual separator between the table and the element below it

* Add bottom padding to resource tables in Connect

* Update snapshots

* Update snapshots

* Revert e
2023-05-04 14:52:17 +00:00
Rafał Cieślak 473e80fb3e
Ensure useDocumentGateway creates the gateway only on mount (#25322)
* Remove unnecessary useEffect

* Remove offline cluster handling on reconnect

We used to have to handle this manually, but nowadays it's handled by
retryWithRelogin that's used in createGateway.

* Create a gateway only once on mount

* Fix and refactor DocumentGateway story
2023-05-04 13:41:32 +00:00
Rafał Cieślak 48bf3a93f3
UI improvements for empty search input (#25314)
* ResourcesService.searchResources: Use named args

* Always show TypeToSearchItem if input is empty

* Fetch search preview after selecting a filter
2023-05-04 13:30:52 +00:00
Michael Wilson 4632105587
Add missing user groups entry to getEmptyResource state. (#25585)
* Add missing user groups entry to getEmptyResource state.

UserGroups will be requestable, so the UI needs to include user_group in the
empty resource state.

* Update test for object change.

* Add missing references to user_group.
2023-05-03 22:54:47 +00:00
Gabriel Corado 9200cae34f
Add specific message for network errors on app launch (Web UI) (#25527)
* feat(web): add network error message for app launch

* Update web/packages/teleport/src/AppLauncher/AppLauncher.tsx

Co-authored-by: Roman Tkachenko <roman@goteleport.com>

* refactor(web): update error message

* chore(web): fix linter

---------

Co-authored-by: Roman Tkachenko <roman@goteleport.com>
2023-05-03 22:48:43 +00:00
Michael f814b2d510
Add sshserver file transfer handlers (#24580)
Add web terminal handlers for file transfer requests (#24581)
2023-05-03 20:53:57 +00:00
Michael Wilson 598e09f202
Support UI methods for user groups, label match user groups in API. (#25559)
* Support UI methods for user groups, label match user groups in API.

UI methods have been added to User Groups to support the enterprise Okta
service. This will allow groups to be queried and displayed on the new
access request page appropriately.

Additionally, after adding group labels to roles, the access checking was
not added to the appropriate user groups endpoints in auth_with_roles.
This has been added to ensure that users can only see the user groups they're
supposed to see when requesting access.

* UI lint issues.
2023-05-03 18:06:49 +00:00
Michael cd3a1e2dd1
Fix vite config (#25514) 2023-05-02 22:10:17 +00:00
Ryan Clark e4995ed6af
Only pass process.env.NODE_ENV through vite (#25501) 2023-05-02 19:20:32 +00:00
Alan Parra 4d2b43442e
Use new device event layout in Web UI (#25355)
* Use new device event layout in Web UI

* Maintain compatibility with legacy/v12 events

* Update snapshots
2023-05-02 18:38:14 +00:00
Lisa Kim 7c117216e1
WebDiscover: Put back IamPolicy screen and some tweaks (#25438)
* Let count be 0 (it will be zero on error)

* Put back IamPolicy screen with updated links

* Fix typo

* Remove port for 443 from very beginning of AWS integration flow

in addition fix inconsistent animation JSON policy

* Remove hard coded colors and remove unnecessary border
2023-05-02 16:34:15 +00:00
Michelle Bergquist 3468812d22
add billing to navigation (#25192) 2023-05-02 15:46:00 +00:00
matheus e082318913
Team plan CTAs (#25073)
* (wip) add unlock feature button to support page

* Fix typo

* (wip) add locked feature join session

* Improve session join style

* Add session join lock button

* Remove hover on locked join menu

* Update copy

* Only show `join as...` when appropriate

* (wip)

* Make ButtonLockedFeature theme sensitive

* Remove debug stuff

* Adjust feature button height

* Fix session join button on locked

* Remove unused import

* typo

* Add link to cta button

* Remove teams flag

* Add cta service

* Update snapshots

* Lock button style

* Add cta to context

* Rename cta to ctaService

* Stories and tests

* Add comments clarifying that ctas are not used currently

* add showActiveSessionsCTA to useSessions

* Licenses

* Lint license

* Remove commented out code

* Add missing types

* Replace cta service for an object with cta on context

* Fix menu hack

* small refactor in styled stuff

* Update SessionJoinBtn to use master code

* Snapshot update

* Minor stuff
2023-05-02 14:02:27 +00:00
STeve (Xin) Huang a415879322
Update WebUI database type (#25270)
* Update WebUI database type

* run prettier

* Snowflake
2023-05-02 13:54:51 +00:00
Cam Hutchison 97db758e84
darwin: Use notarytool to notarize instead of altool (#25407)
Switch to using the newer `notarytool` to notarize MacOS binaries
instead of the older `altool`, as `altool` is deprecated and will no
longer work come Fall 2023. This also makes for a quieter build as
altool's output was quite verbose, and anecdotally, it seems to be more
reliable - I haven't had a single notarization failure this way as
opposed to the many we see in CI with `altool`.

We used to use `gon` as part of our notarizing tool. `gon` still has an
open issue to upgrade to `notarytool`, so we've switched away from it
and used the Apple CLI tools instead to do the notarization. This is
available now that we have moved to GitHub Actions for builds as it has
a newer Xcode that contains notarytool.

Update the Teleport Connect notarization, which was quite a bit simpler,
although we do need an extra `$TEAMID` input, so handle it when that is
not supplied and document in the README that it is needed.
2023-05-01 19:58:08 +00:00
Lisa Kim a0773f9cd0
Redo web lock feature (#25305)
Also reverts body `overflow: hidden`
Fixes https://github.com/gravitational/teleport/issues/24885
2023-05-01 18:47:25 +00:00
Isaiah Becker-Mayer 1267c72df1
webapi cleanup (#24363)
* Add isModeratedSession flag to web ssh session

* Fix lint

* Change to snakecase

* Change to moderated

* Ensures every Session has a valid Kind field.

Also cleans up the client code to distinguish between
terminalSessionPath and activeAndPendingSessionsPath.

* Entirely removes siteSessionGet which was not being used

* removes siteSessionGenerate which was not being used

* removes test testing webapi/sites/<cluster-name>/sessions post call, which is no longer used by the frontend

* removing unused struct

---------

Co-authored-by: Michael Myers <michael.myers@goteleport.com>
2023-04-28 20:49:11 +00:00
Yassine Bounekhla 4a2b422b1a
redesign participant modes join menu (#24961) 2023-04-26 20:10:08 +00:00
Yassine Bounekhla 1d7785971e
theme-related fixes (#25119) 2023-04-26 17:55:46 +00:00
Grzegorz Zdunek 5bf72af28a
Connect: Fix logout sequence (#24978)
* Fix logout sequence

* Adjust `useLoggedInUser` documentation

* Mark clusters as disconnected after logging out

* Refactor `ClusterLogout` to not use the hook/container pattern

* Run prettier

* Fix test

* Use `routing.belongsToProfile`
2023-04-26 10:01:08 +00:00
Rafał Cieślak 839afa8509
Account for request errors when displaying "no results" message in the search bar (#25061)
* Render ExtraTopComponent based on computed action picker status

* Fix formatting

* Use named args for getActionPickerStatus

* Use const for nonRetryableResourceSearchErrors

* Fix logic behind determining remaining filters
2023-04-26 09:52:52 +00:00
Rafał Cieślak e32a3e5207
Retry search in Connect if current workspace cert has expired (#24880)
* Adjust copy of db action

* Use retryWithRelogin when getting db usernames

* useAsync: Remove unnecessary useCallback

The state setter coming from useState is always stable.

https://legacy.reactjs.org/docs/hooks-reference.html#usestate

* useAsync: Expand docs with `run` return value example

* useSearch: Rename `restrictions` to `filters`

* useSearch: Remove unnecessary useState calls

* Refactor lockOpen into pauseUserInteraction

lockOpen worked great when we were concerned only about user interaction
with a modal closing the search bar as well. However, in the next commit
I'm going to add a login modal that's shown if the search fails with a
retryable error.

In that scenario, pressing Enter in the modal wouldn't work, as it would
be captured by the window listener that ResultList adds.

To work around this problem, I refactored lockOpen into pauseUserInteraction.
It still works pretty much the same way. But then instead of having checking
isLockedOpen in the close function, we have a new addWindowEventListener
function.

addWindowEventListener automatically removes the listener after
pauseUserInteraction is called. This solves both the problem of closing
the modal and the problem of using the enter key in the modal.

* Relogin & retry resource search if current workspace cert has expired

* addWindowEventListener: Name the cleanup function

* Make addWindowEventListener a prop of ResultList
2023-04-26 08:31:53 +00:00
Lisa Kim 61d0aaa77f
WebDiscover: Hookup AWS RDS Flow (#24873)
* Clean up aws oidc integration instructions

* Change ResourceSpec icon type from ReactElement to string

When storing state into location URL, it doesn't allow storing
ReactElement, so I changed the icon element into string that
refers to the correct icon. Also adds rds aurora tiles to
Select Resources screen.

* Fix the expected backend aws status value for RDS list

* For RDS list, allow refreshing the table

Helpful when user makes changes to the RDS instance
(eg. tags) and needs to get the most up to date listing

* Update rds db setup access text info

* Make create database dialog more consistent btwn states

* Fix label matching

Previously we required the agent matcher labels
be an exact match of registered db labels otherwise we
prevented the user from deploying an agent (which was wrong).

Now the only requirement is that the matcher labels are all
able to match against registered db labels.

* Implement resuming discover flow from where user left of

* Enable integration access and rds flow

* Strip 443 ports from cluster uri

* Use the labels returned from polling db instaed

* Various touch ups

- Make label matching error less confusing by showing
  error upon user trying to generate command
- Make label messaging clearer
- Emit errors when failing to fetch rds dbs

* Address CR and update test
2023-04-25 19:57:34 +00:00
Zac Bergquist c7779971b6
Create locks using the correct property (#24989)
* Create locks using the correct property

The "lock target" in Teleport's backend uses a different value
depending on the type of lock you want to create. For example,
to lock a node you use its UUID, but to lock a role you use its
name.

We were incorrectly always using the name to create a lock,
which appears to work fine in the UI but is not correctly
enforced on the backend.

This change adds a new required field called targetValue, allowing
us to specify the value to be used for the lock on a per-resource
basis.

Fixes gravitational/teleport-private#556

* Simplify useGetTargetData
2023-04-24 21:35:15 +00:00
Lisa Kim a6d6c2483d
WebDiscover: Finish implementing Enroll Database Screen (#24710)
* Finish defining rest of fields for fetching aws db list

* Define aurora postgres/mysql engine type

* Finish checking for integration access

* Remove aws related logic and pull out dialog into own file

* Refactor useCreateDatabase hook

- Remove hook prop and use context instead
- Instead of automatically taking user to nextstep after
  registering db, let user manually go to next
  step by clicking button (removes brief flashing of loading
  dialog before next step)

* Add the new fields from response to table

* Finish implementing the after user selects a database

- on submit db, re-use the hook that creates database,
  checks if a database service exists to pick up this
  database by matching labels
- while this is happening, a dialog will render showing
  the process

* Update test

* Address CR

* Apply create db feedback and apply backend changes
2023-04-24 19:48:00 +00:00
Michelle Bergquist 2e9ed857da
Adds dependencies for teleport/e #1135 (#24574)
- Adds helper methods for formatting dates
- Adds stripe dependencies to yarn lock
2023-04-21 17:16:58 +00:00
Ryan Clark bdc3db931e
Add the favicon back (#24904) 2023-04-20 23:02:26 +00:00
Michael fce1212fc5
Add lock target matcher and fix button themes (#24851) 2023-04-19 21:22:11 +00:00
Michelle Bergquist 093dab9779
fix typo (#24695) 2023-04-18 15:30:34 +00:00
Krzysztof Skrzętnicki b8eca7f6f8
Make audit log details dialog larger. (#24519)
* Make audit log details dialog larger.

* Remove empty line
2023-04-18 11:39:03 +00:00
Grzegorz Zdunek 6761b9e448
Connect: Update colors in the search bar (#24611)
* Update colors in the search bar

* Move `resourceIcons` outside the component

* Run prettier
2023-04-17 15:15:04 +00:00
Lisa Kim 62c5e0ab04
WebDiscover: Create Enroll a RDS Database Screen (#24509)
* Add new endpoint, hardcode aws regions

* Create aws region selector

* Create listing for rds databases

* Create the enroll database screen
2023-04-17 15:00:39 +00:00
Rafał Cieślak dd9c042a68
Connect: Show resource search errors in the search bar (#24520)
* Move tshd test helpers to a better location

* Support passing no props to tshd test helpers

* Refactor ResourcesService getServerByHostname tests

* Move pluralize to shared package

* SearchContext: Rename `opened` to `isOpen`

* ActionPicker story: Show auxiliary items in a separate column

* ActionPicker: Split getClusterName into two functions

getClusterName used to not return the name of the cluster if there's only
a single cluster present. Some places needed to get the cluster name
no matter what, such as the modal with resource errors that will be added
to ActionPicker.

* Refactor resource search to use Promise.allSettled

* useSearchAttempts has been renamed to useActionAttempts
* useActionAttempts returns resourceSearchAttempt in order to supply errors
  from ResourcesService.searchResources to ActionPicker.

* SearchContext: Implement lockOpen

We'll want to display error details in a modal. While the user interacts
with the modal, we don't want to close the search bar and reset the results.

So instead, we are going to force the search bar to stay open until the
user closes the modal. This will use the lockOpen function from this commit.

* Add modal for showing resource search errors

* Refactor mockedSearchContext to not be a top-level mutable var

* Show an item in search bar with resource search errors

* ResourceSearchError: Add instanceof check to tests, include clusterUri in message

* Make isLockedOpen into a ref

* Use table tests for lockOpen tests

* Revert "Make isLockedOpen into a ref"

This reverts commit 07f4206cc2.

* Move capitalization to ResourceSearchError.messageWithClusterName

* ResourceSearchError: Use `public` in constructor

* Connect: Improve focus management in search bar (#24665)
2023-04-17 12:46:39 +00:00
Krzysztof Skrzętnicki 477e1b108a
OpenSearch audit log improvements. (#24437)
* OpenSearch audit log improvements.

* Run prettier.

* Add missing license.

* Review: share event formatting code.

* Review: add comments.
2023-04-17 12:19:29 +00:00
Yassine Bounekhla 5a46f044b5
add themes to webui (#24507) 2023-04-14 21:45:23 +00:00