Merge branch 'main' into application-wizard-2-with-api-and-tests

* main:
  web: patternfly hints as ak-web-component (#7120)
  web: fix form default submit handler (#7122)
  web/admin: add additional Flow info (#7155)
  tests: fix potential infinite wait in tests spinning up a container (#7153)
  ci: disable ghcr retention schedule while it's broken (#7154)
  translate: Updates for file locale/en/LC_MESSAGES/django.po in de (#7151)
  core: bump golang.org/x/net from 0.16.0 to 0.17.0 (#7148)
  web: bump the babel group in /web with 5 updates (#7149)
  core: bump sentry-sdk from 1.31.0 to 1.32.0 (#7150)
  website: make get started on pricing page go to customer portal (#7147)
This commit is contained in:
Ken Sternberg 2023-10-12 11:13:40 -07:00
commit b96478148e
108 changed files with 3134 additions and 2542 deletions

View File

@ -1,8 +1,8 @@
name: ghcr-retention name: ghcr-retention
on: on:
schedule: # schedule:
- cron: "0 0 * * *" # every day at midnight # - cron: "0 0 * * *" # every day at midnight
workflow_dispatch: workflow_dispatch:
jobs: jobs:

View File

@ -17,8 +17,8 @@ TestCase.maxDiff = None
class PytestTestRunner(DiscoverRunner): # pragma: no cover class PytestTestRunner(DiscoverRunner): # pragma: no cover
"""Runs pytest to discover and run tests.""" """Runs pytest to discover and run tests."""
def __init__(self, verbosity=1, failfast=False, keepdb=False, **kwargs): def __init__(self, **kwargs):
super().__init__(verbosity, failfast, keepdb, **kwargs) super().__init__(**kwargs)
self.args = [] self.args = []
if self.failfast: if self.failfast:
@ -47,6 +47,7 @@ class PytestTestRunner(DiscoverRunner): # pragma: no cover
@classmethod @classmethod
def add_arguments(cls, parser: ArgumentParser): def add_arguments(cls, parser: ArgumentParser):
"""Add more pytest-specific arguments""" """Add more pytest-specific arguments"""
DiscoverRunner.add_arguments(parser)
parser.add_argument( parser.add_argument(
"--randomly-seed", "--randomly-seed",
type=int, type=int,
@ -55,9 +56,6 @@ class PytestTestRunner(DiscoverRunner): # pragma: no cover
"Default behaviour: use random.Random().getrandbits(32), so the seed is" "Default behaviour: use random.Random().getrandbits(32), so the seed is"
"different on each run.", "different on each run.",
) )
parser.add_argument(
"--keepdb", action="store_true", help="Preserves the test DB between runs."
)
def run_tests(self, test_labels, extra_tests=None, **kwargs): def run_tests(self, test_labels, extra_tests=None, **kwargs):
"""Run pytest and return the exitcode. """Run pytest and return the exitcode.

2
go.mod
View File

@ -73,7 +73,7 @@ require (
go.opentelemetry.io/otel v1.14.0 // indirect go.opentelemetry.io/otel v1.14.0 // indirect
go.opentelemetry.io/otel/trace v1.14.0 // indirect go.opentelemetry.io/otel/trace v1.14.0 // indirect
golang.org/x/crypto v0.14.0 // indirect golang.org/x/crypto v0.14.0 // indirect
golang.org/x/net v0.16.0 // indirect golang.org/x/net v0.17.0 // indirect
golang.org/x/sys v0.13.0 // indirect golang.org/x/sys v0.13.0 // indirect
golang.org/x/text v0.13.0 // indirect golang.org/x/text v0.13.0 // indirect
google.golang.org/appengine v1.6.7 // indirect google.golang.org/appengine v1.6.7 // indirect

4
go.sum
View File

@ -437,8 +437,8 @@ golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qx
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
golang.org/x/net v0.16.0 h1:7eBu7KsSvFDtSXUIDbh3aqlK4DPsZ1rByC8PFfBThos= golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM=
golang.org/x/net v0.16.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=

File diff suppressed because it is too large Load Diff

6
poetry.lock generated
View File

@ -3468,13 +3468,13 @@ urllib3 = {version = ">=1.26,<3", extras = ["socks"]}
[[package]] [[package]]
name = "sentry-sdk" name = "sentry-sdk"
version = "1.31.0" version = "1.32.0"
description = "Python client for Sentry (https://sentry.io)" description = "Python client for Sentry (https://sentry.io)"
optional = false optional = false
python-versions = "*" python-versions = "*"
files = [ files = [
{file = "sentry-sdk-1.31.0.tar.gz", hash = "sha256:6de2e88304873484207fed836388e422aeff000609b104c802749fd89d56ba5b"}, {file = "sentry-sdk-1.32.0.tar.gz", hash = "sha256:935e8fbd7787a3702457393b74b13d89a5afb67185bc0af85c00cb27cbd42e7c"},
{file = "sentry_sdk-1.31.0-py2.py3-none-any.whl", hash = "sha256:64a7141005fb775b9db298a30de93e3b83e0ddd1232dc6f36eb38aebc1553291"}, {file = "sentry_sdk-1.32.0-py2.py3-none-any.whl", hash = "sha256:eeb0b3550536f3bbc05bb1c7e0feb3a78d74acb43b607159a606ed2ec0a33a4d"},
] ]
[package.dependencies] [package.dependencies]

View File

@ -49,13 +49,8 @@ class TestProviderOAuth2OIDC(SeleniumTestCase):
"OIDC_PROVIDER": f"{self.live_server_url}/application/o/{self.application_slug}/", "OIDC_PROVIDER": f"{self.live_server_url}/application/o/{self.application_slug}/",
}, },
) )
while True: self.wait_for_container(container)
container.reload() return container
status = container.attrs.get("State", {}).get("Health", {}).get("Status")
if status == "healthy":
return container
self.logger.info("Container failed healthcheck")
sleep(1)
@retry() @retry()
@apply_blueprint( @apply_blueprint(

View File

@ -49,13 +49,8 @@ class TestProviderOAuth2OIDCImplicit(SeleniumTestCase):
"OIDC_PROVIDER": f"{self.live_server_url}/application/o/{self.application_slug}/", "OIDC_PROVIDER": f"{self.live_server_url}/application/o/{self.application_slug}/",
}, },
) )
while True: self.wait_for_container(container)
container.reload() return container
status = container.attrs.get("State", {}).get("Health", {}).get("Status")
if status == "healthy":
return container
self.logger.info("Container failed healthcheck")
sleep(1)
@retry() @retry()
@apply_blueprint( @apply_blueprint(

View File

@ -48,13 +48,8 @@ class TestProviderSAML(SeleniumTestCase):
"SP_METADATA_URL": metadata_url, "SP_METADATA_URL": metadata_url,
}, },
) )
while True: self.wait_for_container(container)
container.reload() return container
status = container.attrs.get("State", {}).get("Health", {}).get("Status")
if status == "healthy":
return container
self.logger.info("Container failed healthcheck")
sleep(1)
@retry() @retry()
@apply_blueprint( @apply_blueprint(

View File

@ -43,7 +43,24 @@ def get_docker_tag() -> str:
return f"gh-{branch_name}" return f"gh-{branch_name}"
class SeleniumTestCase(StaticLiveServerTestCase): class DockerTestCase:
"""Mixin for dealing with containers"""
def wait_for_container(self, container: Container):
"""Check that container is health"""
attempt = 0
while True:
container.reload()
status = container.attrs.get("State", {}).get("Health", {}).get("Status")
if status == "healthy":
return container
sleep(1)
attempt += 1
if attempt >= 30:
self.failureException("Container failed to start")
class SeleniumTestCase(DockerTestCase, StaticLiveServerTestCase):
"""StaticLiveServerTestCase which automatically creates a Webdriver instance""" """StaticLiveServerTestCase which automatically creates a Webdriver instance"""
container: Optional[Container] = None container: Optional[Container] = None
@ -82,13 +99,8 @@ class SeleniumTestCase(StaticLiveServerTestCase):
state = container.attrs.get("State", {}) state = container.attrs.get("State", {})
if "Health" not in state: if "Health" not in state:
return container return container
while True: self.wait_for_container(container)
container.reload() return container
status = container.attrs.get("State", {}).get("Health", {}).get("Status")
if status == "healthy":
return container
self.logger.info("Container failed healthcheck")
sleep(1)
def output_container_logs(self, container: Optional[Container] = None): def output_container_logs(self, container: Optional[Container] = None):
"""Output the container logs to our STDOUT""" """Output the container logs to our STDOUT"""

View File

@ -1,7 +1,6 @@
"""outpost tests""" """outpost tests"""
from shutil import rmtree from shutil import rmtree
from tempfile import mkdtemp from tempfile import mkdtemp
from time import sleep
import yaml import yaml
from channels.testing import ChannelsLiveServerTestCase from channels.testing import ChannelsLiveServerTestCase
@ -20,10 +19,10 @@ from authentik.outposts.models import (
) )
from authentik.outposts.tasks import outpost_connection_discovery from authentik.outposts.tasks import outpost_connection_discovery
from authentik.providers.proxy.models import ProxyProvider from authentik.providers.proxy.models import ProxyProvider
from tests.e2e.utils import get_docker_tag from tests.e2e.utils import DockerTestCase, get_docker_tag
class OutpostDockerTests(ChannelsLiveServerTestCase): class OutpostDockerTests(DockerTestCase, ChannelsLiveServerTestCase):
"""Test Docker Controllers""" """Test Docker Controllers"""
def _start_container(self, ssl_folder: str) -> Container: def _start_container(self, ssl_folder: str) -> Container:
@ -45,12 +44,8 @@ class OutpostDockerTests(ChannelsLiveServerTestCase):
} }
}, },
) )
while True: self.wait_for_container(container)
container.reload() return container
status = container.attrs.get("State", {}).get("Health", {}).get("Status")
if status == "healthy":
return container
sleep(1)
def setUp(self): def setUp(self):
super().setUp() super().setUp()

View File

@ -1,7 +1,6 @@
"""outpost tests""" """outpost tests"""
from shutil import rmtree from shutil import rmtree
from tempfile import mkdtemp from tempfile import mkdtemp
from time import sleep
import yaml import yaml
from channels.testing.live import ChannelsLiveServerTestCase from channels.testing.live import ChannelsLiveServerTestCase
@ -20,10 +19,10 @@ from authentik.outposts.models import (
from authentik.outposts.tasks import outpost_connection_discovery from authentik.outposts.tasks import outpost_connection_discovery
from authentik.providers.proxy.controllers.docker import DockerController from authentik.providers.proxy.controllers.docker import DockerController
from authentik.providers.proxy.models import ProxyProvider from authentik.providers.proxy.models import ProxyProvider
from tests.e2e.utils import get_docker_tag from tests.e2e.utils import DockerTestCase, get_docker_tag
class TestProxyDocker(ChannelsLiveServerTestCase): class TestProxyDocker(DockerTestCase, ChannelsLiveServerTestCase):
"""Test Docker Controllers""" """Test Docker Controllers"""
def _start_container(self, ssl_folder: str) -> Container: def _start_container(self, ssl_folder: str) -> Container:
@ -45,12 +44,8 @@ class TestProxyDocker(ChannelsLiveServerTestCase):
} }
}, },
) )
while True: self.wait_for_container(container)
container.reload() return container
status = container.attrs.get("State", {}).get("Health", {}).get("Status")
if status == "healthy":
return container
sleep(1)
def setUp(self): def setUp(self):
super().setUp() super().setUp()

190
web/package-lock.json generated
View File

@ -43,14 +43,14 @@
"yaml": "^2.3.2" "yaml": "^2.3.2"
}, },
"devDependencies": { "devDependencies": {
"@babel/core": "^7.23.0", "@babel/core": "^7.23.2",
"@babel/plugin-proposal-class-properties": "^7.18.6", "@babel/plugin-proposal-class-properties": "^7.18.6",
"@babel/plugin-proposal-decorators": "^7.23.0", "@babel/plugin-proposal-decorators": "^7.23.2",
"@babel/plugin-transform-private-methods": "^7.22.5", "@babel/plugin-transform-private-methods": "^7.22.5",
"@babel/plugin-transform-private-property-in-object": "^7.22.11", "@babel/plugin-transform-private-property-in-object": "^7.22.11",
"@babel/plugin-transform-runtime": "^7.22.15", "@babel/plugin-transform-runtime": "^7.23.2",
"@babel/preset-env": "^7.22.20", "@babel/preset-env": "^7.23.2",
"@babel/preset-typescript": "^7.23.0", "@babel/preset-typescript": "^7.23.2",
"@hcaptcha/types": "^1.0.3", "@hcaptcha/types": "^1.0.3",
"@jackfranklin/rollup-plugin-markdown": "^0.4.0", "@jackfranklin/rollup-plugin-markdown": "^0.4.0",
"@jeysal/storybook-addon-css-user-preferences": "^0.2.0", "@jeysal/storybook-addon-css-user-preferences": "^0.2.0",
@ -161,18 +161,18 @@
} }
}, },
"node_modules/@babel/compat-data": { "node_modules/@babel/compat-data": {
"version": "7.22.20", "version": "7.23.2",
"resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.20.tgz", "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.2.tgz",
"integrity": "sha512-BQYjKbpXjoXwFW5jGqiizJQQT/aC7pFm9Ok1OWssonuguICi264lbgMzRp2ZMmRSlfkX6DsWDDcsrctK8Rwfiw==", "integrity": "sha512-0S9TQMmDHlqAZ2ITT95irXKfxN9bncq8ZCoJhun3nHL/lLUxd2NKBJYoNGWH7S0hz6fRQwWlAWn/ILM0C70KZQ==",
"dev": true, "dev": true,
"engines": { "engines": {
"node": ">=6.9.0" "node": ">=6.9.0"
} }
}, },
"node_modules/@babel/core": { "node_modules/@babel/core": {
"version": "7.23.0", "version": "7.23.2",
"resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.0.tgz", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.2.tgz",
"integrity": "sha512-97z/ju/Jy1rZmDxybphrBuI+jtJjFVoz7Mr9yUQVVVi+DNZE333uFQeMOqcCIy1x3WYBIbWftUSLmbNXNT7qFQ==", "integrity": "sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@ampproject/remapping": "^2.2.0", "@ampproject/remapping": "^2.2.0",
@ -180,10 +180,10 @@
"@babel/generator": "^7.23.0", "@babel/generator": "^7.23.0",
"@babel/helper-compilation-targets": "^7.22.15", "@babel/helper-compilation-targets": "^7.22.15",
"@babel/helper-module-transforms": "^7.23.0", "@babel/helper-module-transforms": "^7.23.0",
"@babel/helpers": "^7.23.0", "@babel/helpers": "^7.23.2",
"@babel/parser": "^7.23.0", "@babel/parser": "^7.23.0",
"@babel/template": "^7.22.15", "@babel/template": "^7.22.15",
"@babel/traverse": "^7.23.0", "@babel/traverse": "^7.23.2",
"@babel/types": "^7.23.0", "@babel/types": "^7.23.0",
"convert-source-map": "^2.0.0", "convert-source-map": "^2.0.0",
"debug": "^4.1.0", "debug": "^4.1.0",
@ -301,9 +301,9 @@
} }
}, },
"node_modules/@babel/helper-define-polyfill-provider": { "node_modules/@babel/helper-define-polyfill-provider": {
"version": "0.4.2", "version": "0.4.3",
"resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.2.tgz", "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.3.tgz",
"integrity": "sha512-k0qnnOqHn5dK9pZpfD5XXZ9SojAITdCKRn2Lp6rnDGzIbaP0rHyMPk/4wsSxVBVz4RfN0q6VpXWP2pDGIoQ7hw==", "integrity": "sha512-WBrLmuPP47n7PNwsZ57pqam6G/RGo1vw/87b0Blc53tZNGZ4x7YvZ6HgQe2vo1W/FR20OgjeZuGXzudPiXHFug==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@babel/helper-compilation-targets": "^7.22.6", "@babel/helper-compilation-targets": "^7.22.6",
@ -415,14 +415,14 @@
} }
}, },
"node_modules/@babel/helper-remap-async-to-generator": { "node_modules/@babel/helper-remap-async-to-generator": {
"version": "7.22.17", "version": "7.22.20",
"resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.17.tgz", "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz",
"integrity": "sha512-bxH77R5gjH3Nkde6/LuncQoLaP16THYPscurp1S8z7S9ZgezCyV3G8Hc+TZiCmY8pz4fp8CvKSgtJMW0FkLAxA==", "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@babel/helper-annotate-as-pure": "^7.22.5", "@babel/helper-annotate-as-pure": "^7.22.5",
"@babel/helper-environment-visitor": "^7.22.5", "@babel/helper-environment-visitor": "^7.22.20",
"@babel/helper-wrap-function": "^7.22.17" "@babel/helper-wrap-function": "^7.22.20"
}, },
"engines": { "engines": {
"node": ">=6.9.0" "node": ">=6.9.0"
@ -512,27 +512,27 @@
} }
}, },
"node_modules/@babel/helper-wrap-function": { "node_modules/@babel/helper-wrap-function": {
"version": "7.22.17", "version": "7.22.20",
"resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.17.tgz", "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz",
"integrity": "sha512-nAhoheCMlrqU41tAojw9GpVEKDlTS8r3lzFmF0lP52LwblCPbuFSO7nGIZoIcoU5NIm1ABrna0cJExE4Ay6l2Q==", "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@babel/helper-function-name": "^7.22.5", "@babel/helper-function-name": "^7.22.5",
"@babel/template": "^7.22.15", "@babel/template": "^7.22.15",
"@babel/types": "^7.22.17" "@babel/types": "^7.22.19"
}, },
"engines": { "engines": {
"node": ">=6.9.0" "node": ">=6.9.0"
} }
}, },
"node_modules/@babel/helpers": { "node_modules/@babel/helpers": {
"version": "7.23.1", "version": "7.23.2",
"resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.1.tgz", "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.2.tgz",
"integrity": "sha512-chNpneuK18yW5Oxsr+t553UZzzAs3aZnFm4bxhebsNTeshrC95yA7l5yl7GBAG+JG1rF0F7zzD2EixK9mWSDoA==", "integrity": "sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@babel/template": "^7.22.15", "@babel/template": "^7.22.15",
"@babel/traverse": "^7.23.0", "@babel/traverse": "^7.23.2",
"@babel/types": "^7.23.0" "@babel/types": "^7.23.0"
}, },
"engines": { "engines": {
@ -615,9 +615,9 @@
} }
}, },
"node_modules/@babel/plugin-proposal-decorators": { "node_modules/@babel/plugin-proposal-decorators": {
"version": "7.23.0", "version": "7.23.2",
"resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.23.0.tgz", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.23.2.tgz",
"integrity": "sha512-kYsT+f5ARWF6AdFmqoEEp+hpqxEB8vGmRWfw2aj78M2vTwS2uHW91EF58iFm1Z9U8Y/RrLu2XKJn46P9ca1b0w==", "integrity": "sha512-eR0gJQc830fJVGz37oKLvt9W9uUIQSAovUl0e9sJ3YeO09dlcoBVYD3CLrjCj4qHdXmfiyTyFt8yeQYSN5fxLg==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@babel/helper-create-class-features-plugin": "^7.22.15", "@babel/helper-create-class-features-plugin": "^7.22.15",
@ -991,14 +991,14 @@
} }
}, },
"node_modules/@babel/plugin-transform-async-generator-functions": { "node_modules/@babel/plugin-transform-async-generator-functions": {
"version": "7.22.15", "version": "7.23.2",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.15.tgz", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.2.tgz",
"integrity": "sha512-jBm1Es25Y+tVoTi5rfd5t1KLmL8ogLKpXszboWOTTtGFGz2RKnQe2yn7HbZ+kb/B8N0FVSGQo874NSlOU1T4+w==", "integrity": "sha512-BBYVGxbDVHfoeXbOwcagAkOQAm9NxoTdMGfTqghu1GrvadSaw6iW3Je6IcL5PNOw8VwjxqBECXy50/iCQSY/lQ==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@babel/helper-environment-visitor": "^7.22.5", "@babel/helper-environment-visitor": "^7.22.20",
"@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-plugin-utils": "^7.22.5",
"@babel/helper-remap-async-to-generator": "^7.22.9", "@babel/helper-remap-async-to-generator": "^7.22.20",
"@babel/plugin-syntax-async-generators": "^7.8.4" "@babel/plugin-syntax-async-generators": "^7.8.4"
}, },
"engines": { "engines": {
@ -1041,9 +1041,9 @@
} }
}, },
"node_modules/@babel/plugin-transform-block-scoping": { "node_modules/@babel/plugin-transform-block-scoping": {
"version": "7.22.15", "version": "7.23.0",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.22.15.tgz", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.0.tgz",
"integrity": "sha512-G1czpdJBZCtngoK1sJgloLiOHUnkb/bLZwqVZD8kXmq0ZnVfTTWUcs9OWtp0mBtYJ+4LQY1fllqBkOIPhXmFmw==", "integrity": "sha512-cOsrbmIOXmf+5YbL99/S49Y3j46k/T16b9ml8bm9lP6N9US5iQ2yBK7gpui1pg0V/WMcXdkfKbTb7HXq9u+v4g==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@babel/helper-plugin-utils": "^7.22.5" "@babel/helper-plugin-utils": "^7.22.5"
@ -1128,9 +1128,9 @@
} }
}, },
"node_modules/@babel/plugin-transform-destructuring": { "node_modules/@babel/plugin-transform-destructuring": {
"version": "7.22.15", "version": "7.23.0",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.22.15.tgz", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.0.tgz",
"integrity": "sha512-HzG8sFl1ZVGTme74Nw+X01XsUTqERVQ6/RLHo3XjGRzm7XD6QTtfS3NJotVgCGy8BzkDqRjRBD8dAyJn5TuvSQ==", "integrity": "sha512-vaMdgNXFkYrB+8lbgniSYWHsgqK5gjaMNcc84bMIOMRLH0L9AqYq3hwMdvnyqj1OPqea8UtjPEuS/DCenah1wg==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@babel/helper-plugin-utils": "^7.22.5" "@babel/helper-plugin-utils": "^7.22.5"
@ -1332,12 +1332,12 @@
} }
}, },
"node_modules/@babel/plugin-transform-modules-amd": { "node_modules/@babel/plugin-transform-modules-amd": {
"version": "7.22.5", "version": "7.23.0",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.22.5.tgz", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.0.tgz",
"integrity": "sha512-R+PTfLTcYEmb1+kK7FNkhQ1gP4KgjpSO6HfH9+f8/yfp2Nt3ggBjiVpRwmwTlfqZLafYKJACy36yDXlEmI9HjQ==", "integrity": "sha512-xWT5gefv2HGSm4QHtgc1sYPbseOyf+FFDo2JbpE25GWl5BqTGO9IMwTYJRoIdjsF85GE+VegHxSCUt5EvoYTAw==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@babel/helper-module-transforms": "^7.22.5", "@babel/helper-module-transforms": "^7.23.0",
"@babel/helper-plugin-utils": "^7.22.5" "@babel/helper-plugin-utils": "^7.22.5"
}, },
"engines": { "engines": {
@ -1365,15 +1365,15 @@
} }
}, },
"node_modules/@babel/plugin-transform-modules-systemjs": { "node_modules/@babel/plugin-transform-modules-systemjs": {
"version": "7.22.11", "version": "7.23.0",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.11.tgz", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.0.tgz",
"integrity": "sha512-rIqHmHoMEOhI3VkVf5jQ15l539KrwhzqcBO6wdCNWPWc/JWt9ILNYNUssbRpeq0qWns8svuw8LnMNCvWBIJ8wA==", "integrity": "sha512-qBej6ctXZD2f+DhlOC9yO47yEYgUh5CZNz/aBoH4j/3NOlRfJXJbY7xDQCqQVf9KbrqGzIWER1f23doHGrIHFg==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-hoist-variables": "^7.22.5",
"@babel/helper-module-transforms": "^7.22.9", "@babel/helper-module-transforms": "^7.23.0",
"@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-plugin-utils": "^7.22.5",
"@babel/helper-validator-identifier": "^7.22.5" "@babel/helper-validator-identifier": "^7.22.20"
}, },
"engines": { "engines": {
"node": ">=6.9.0" "node": ">=6.9.0"
@ -1513,9 +1513,9 @@
} }
}, },
"node_modules/@babel/plugin-transform-optional-chaining": { "node_modules/@babel/plugin-transform-optional-chaining": {
"version": "7.22.15", "version": "7.23.0",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.15.tgz", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.0.tgz",
"integrity": "sha512-ngQ2tBhq5vvSJw2Q2Z9i7ealNkpDMU0rGWnHPKqRZO0tzZ5tlaoz4hDvhXioOoaE0X2vfNss1djwg0DXlfu30A==", "integrity": "sha512-sBBGXbLJjxTzLBF5rFWaikMnOGOk/BmK6vVByIdEggZ7Vn6CvWXZyRkkLFK6WE0IF8jSliyOkUN6SScFgzCM0g==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-plugin-utils": "^7.22.5",
@ -1625,16 +1625,16 @@
} }
}, },
"node_modules/@babel/plugin-transform-runtime": { "node_modules/@babel/plugin-transform-runtime": {
"version": "7.22.15", "version": "7.23.2",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.22.15.tgz", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.23.2.tgz",
"integrity": "sha512-tEVLhk8NRZSmwQ0DJtxxhTrCht1HVo8VaMzYT4w6lwyKBuHsgoioAUA7/6eT2fRfc5/23fuGdlwIxXhRVgWr4g==", "integrity": "sha512-XOntj6icgzMS58jPVtQpiuF6ZFWxQiJavISGx5KGjRj+3gqZr8+N6Kx+N9BApWzgS+DOjIZfXXj0ZesenOWDyA==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@babel/helper-module-imports": "^7.22.15", "@babel/helper-module-imports": "^7.22.15",
"@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-plugin-utils": "^7.22.5",
"babel-plugin-polyfill-corejs2": "^0.4.5", "babel-plugin-polyfill-corejs2": "^0.4.6",
"babel-plugin-polyfill-corejs3": "^0.8.3", "babel-plugin-polyfill-corejs3": "^0.8.5",
"babel-plugin-polyfill-regenerator": "^0.5.2", "babel-plugin-polyfill-regenerator": "^0.5.3",
"semver": "^6.3.1" "semver": "^6.3.1"
}, },
"engines": { "engines": {
@ -1802,12 +1802,12 @@
} }
}, },
"node_modules/@babel/preset-env": { "node_modules/@babel/preset-env": {
"version": "7.22.20", "version": "7.23.2",
"resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.22.20.tgz", "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.2.tgz",
"integrity": "sha512-11MY04gGC4kSzlPHRfvVkNAZhUxOvm7DCJ37hPDnUENwe06npjIRAfInEMTGSb4LZK5ZgDFkv5hw0lGebHeTyg==", "integrity": "sha512-BW3gsuDD+rvHL2VO2SjAUNTBe5YrjsTiDyqamPDWY723na3/yPQ65X5oQkFVJZ0o50/2d+svm1rkPoJeR1KxVQ==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@babel/compat-data": "^7.22.20", "@babel/compat-data": "^7.23.2",
"@babel/helper-compilation-targets": "^7.22.15", "@babel/helper-compilation-targets": "^7.22.15",
"@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-plugin-utils": "^7.22.5",
"@babel/helper-validator-option": "^7.22.15", "@babel/helper-validator-option": "^7.22.15",
@ -1833,15 +1833,15 @@
"@babel/plugin-syntax-top-level-await": "^7.14.5", "@babel/plugin-syntax-top-level-await": "^7.14.5",
"@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6",
"@babel/plugin-transform-arrow-functions": "^7.22.5", "@babel/plugin-transform-arrow-functions": "^7.22.5",
"@babel/plugin-transform-async-generator-functions": "^7.22.15", "@babel/plugin-transform-async-generator-functions": "^7.23.2",
"@babel/plugin-transform-async-to-generator": "^7.22.5", "@babel/plugin-transform-async-to-generator": "^7.22.5",
"@babel/plugin-transform-block-scoped-functions": "^7.22.5", "@babel/plugin-transform-block-scoped-functions": "^7.22.5",
"@babel/plugin-transform-block-scoping": "^7.22.15", "@babel/plugin-transform-block-scoping": "^7.23.0",
"@babel/plugin-transform-class-properties": "^7.22.5", "@babel/plugin-transform-class-properties": "^7.22.5",
"@babel/plugin-transform-class-static-block": "^7.22.11", "@babel/plugin-transform-class-static-block": "^7.22.11",
"@babel/plugin-transform-classes": "^7.22.15", "@babel/plugin-transform-classes": "^7.22.15",
"@babel/plugin-transform-computed-properties": "^7.22.5", "@babel/plugin-transform-computed-properties": "^7.22.5",
"@babel/plugin-transform-destructuring": "^7.22.15", "@babel/plugin-transform-destructuring": "^7.23.0",
"@babel/plugin-transform-dotall-regex": "^7.22.5", "@babel/plugin-transform-dotall-regex": "^7.22.5",
"@babel/plugin-transform-duplicate-keys": "^7.22.5", "@babel/plugin-transform-duplicate-keys": "^7.22.5",
"@babel/plugin-transform-dynamic-import": "^7.22.11", "@babel/plugin-transform-dynamic-import": "^7.22.11",
@ -1853,9 +1853,9 @@
"@babel/plugin-transform-literals": "^7.22.5", "@babel/plugin-transform-literals": "^7.22.5",
"@babel/plugin-transform-logical-assignment-operators": "^7.22.11", "@babel/plugin-transform-logical-assignment-operators": "^7.22.11",
"@babel/plugin-transform-member-expression-literals": "^7.22.5", "@babel/plugin-transform-member-expression-literals": "^7.22.5",
"@babel/plugin-transform-modules-amd": "^7.22.5", "@babel/plugin-transform-modules-amd": "^7.23.0",
"@babel/plugin-transform-modules-commonjs": "^7.22.15", "@babel/plugin-transform-modules-commonjs": "^7.23.0",
"@babel/plugin-transform-modules-systemjs": "^7.22.11", "@babel/plugin-transform-modules-systemjs": "^7.23.0",
"@babel/plugin-transform-modules-umd": "^7.22.5", "@babel/plugin-transform-modules-umd": "^7.22.5",
"@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5",
"@babel/plugin-transform-new-target": "^7.22.5", "@babel/plugin-transform-new-target": "^7.22.5",
@ -1864,7 +1864,7 @@
"@babel/plugin-transform-object-rest-spread": "^7.22.15", "@babel/plugin-transform-object-rest-spread": "^7.22.15",
"@babel/plugin-transform-object-super": "^7.22.5", "@babel/plugin-transform-object-super": "^7.22.5",
"@babel/plugin-transform-optional-catch-binding": "^7.22.11", "@babel/plugin-transform-optional-catch-binding": "^7.22.11",
"@babel/plugin-transform-optional-chaining": "^7.22.15", "@babel/plugin-transform-optional-chaining": "^7.23.0",
"@babel/plugin-transform-parameters": "^7.22.15", "@babel/plugin-transform-parameters": "^7.22.15",
"@babel/plugin-transform-private-methods": "^7.22.5", "@babel/plugin-transform-private-methods": "^7.22.5",
"@babel/plugin-transform-private-property-in-object": "^7.22.11", "@babel/plugin-transform-private-property-in-object": "^7.22.11",
@ -1881,10 +1881,10 @@
"@babel/plugin-transform-unicode-regex": "^7.22.5", "@babel/plugin-transform-unicode-regex": "^7.22.5",
"@babel/plugin-transform-unicode-sets-regex": "^7.22.5", "@babel/plugin-transform-unicode-sets-regex": "^7.22.5",
"@babel/preset-modules": "0.1.6-no-external-plugins", "@babel/preset-modules": "0.1.6-no-external-plugins",
"@babel/types": "^7.22.19", "@babel/types": "^7.23.0",
"babel-plugin-polyfill-corejs2": "^0.4.5", "babel-plugin-polyfill-corejs2": "^0.4.6",
"babel-plugin-polyfill-corejs3": "^0.8.3", "babel-plugin-polyfill-corejs3": "^0.8.5",
"babel-plugin-polyfill-regenerator": "^0.5.2", "babel-plugin-polyfill-regenerator": "^0.5.3",
"core-js-compat": "^3.31.0", "core-js-compat": "^3.31.0",
"semver": "^6.3.1" "semver": "^6.3.1"
}, },
@ -1927,9 +1927,9 @@
} }
}, },
"node_modules/@babel/preset-typescript": { "node_modules/@babel/preset-typescript": {
"version": "7.23.0", "version": "7.23.2",
"resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.23.0.tgz", "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.23.2.tgz",
"integrity": "sha512-6P6VVa/NM/VlAYj5s2Aq/gdVg8FSENCg3wlZ6Qau9AcPaoF5LbN1nyGlR9DTRIw9PpxI94e+ReydsJHcjwAweg==", "integrity": "sha512-u4UJc1XsS1GhIGteM8rnGiIvf9rJpiVgMEeCnwlLA7WJPC+jcXWJAGxYmeqs5hOZD8BbAfnV5ezBOxQbb4OUxA==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-plugin-utils": "^7.22.5",
@ -2127,9 +2127,9 @@
} }
}, },
"node_modules/@babel/traverse": { "node_modules/@babel/traverse": {
"version": "7.23.0", "version": "7.23.2",
"resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.0.tgz", "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz",
"integrity": "sha512-t/QaEvyIoIkwzpiZ7aoSKK8kObQYeF7T2v+dazAYCb8SXtp58zEVkWW7zAnju8FNKNdr4ScAOEDmMItbyOmEYw==", "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@babel/code-frame": "^7.22.13", "@babel/code-frame": "^7.22.13",
@ -11285,13 +11285,13 @@
} }
}, },
"node_modules/babel-plugin-polyfill-corejs2": { "node_modules/babel-plugin-polyfill-corejs2": {
"version": "0.4.5", "version": "0.4.6",
"resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.5.tgz", "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.6.tgz",
"integrity": "sha512-19hwUH5FKl49JEsvyTcoHakh6BE0wgXLLptIyKZ3PijHc/Ci521wygORCUCCred+E/twuqRyAkE02BAWPmsHOg==", "integrity": "sha512-jhHiWVZIlnPbEUKSSNb9YoWcQGdlTLq7z1GHL4AjFxaoOUMuuEVJ+Y4pAaQUGOGk93YsVCKPbqbfw3m0SM6H8Q==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@babel/compat-data": "^7.22.6", "@babel/compat-data": "^7.22.6",
"@babel/helper-define-polyfill-provider": "^0.4.2", "@babel/helper-define-polyfill-provider": "^0.4.3",
"semver": "^6.3.1" "semver": "^6.3.1"
}, },
"peerDependencies": { "peerDependencies": {
@ -11299,25 +11299,25 @@
} }
}, },
"node_modules/babel-plugin-polyfill-corejs3": { "node_modules/babel-plugin-polyfill-corejs3": {
"version": "0.8.3", "version": "0.8.5",
"resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.3.tgz", "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.5.tgz",
"integrity": "sha512-z41XaniZL26WLrvjy7soabMXrfPWARN25PZoriDEiLMxAp50AUW3t35BGQUMg5xK3UrpVTtagIDklxYa+MhiNA==", "integrity": "sha512-Q6CdATeAvbScWPNLB8lzSO7fgUVBkQt6zLgNlfyeCr/EQaEQR+bWiBYYPYAFyE528BMjRhL+1QBMOI4jc/c5TA==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@babel/helper-define-polyfill-provider": "^0.4.2", "@babel/helper-define-polyfill-provider": "^0.4.3",
"core-js-compat": "^3.31.0" "core-js-compat": "^3.32.2"
}, },
"peerDependencies": { "peerDependencies": {
"@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
} }
}, },
"node_modules/babel-plugin-polyfill-regenerator": { "node_modules/babel-plugin-polyfill-regenerator": {
"version": "0.5.2", "version": "0.5.3",
"resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.2.tgz", "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.3.tgz",
"integrity": "sha512-tAlOptU0Xj34V1Y2PNTL4Y0FOJMDB6bZmoW39FeCQIhigGLkqu3Fj6uiXpxIf6Ij274ENdYx64y6Au+ZKlb1IA==", "integrity": "sha512-8sHeDOmXC8csczMrYEOf0UTNa4yE2SxV5JGeT/LP1n0OYVDUUFPxG9vdk2AlDlIit4t+Kf0xCtpgXPBwnn/9pw==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@babel/helper-define-polyfill-provider": "^0.4.2" "@babel/helper-define-polyfill-provider": "^0.4.3"
}, },
"peerDependencies": { "peerDependencies": {
"@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"

View File

@ -61,14 +61,14 @@
"yaml": "^2.3.2" "yaml": "^2.3.2"
}, },
"devDependencies": { "devDependencies": {
"@babel/core": "^7.23.0", "@babel/core": "^7.23.2",
"@babel/plugin-proposal-class-properties": "^7.18.6", "@babel/plugin-proposal-class-properties": "^7.18.6",
"@babel/plugin-proposal-decorators": "^7.23.0", "@babel/plugin-proposal-decorators": "^7.23.2",
"@babel/plugin-transform-private-methods": "^7.22.5", "@babel/plugin-transform-private-methods": "^7.22.5",
"@babel/plugin-transform-private-property-in-object": "^7.22.11", "@babel/plugin-transform-private-property-in-object": "^7.22.11",
"@babel/plugin-transform-runtime": "^7.22.15", "@babel/plugin-transform-runtime": "^7.23.2",
"@babel/preset-env": "^7.22.20", "@babel/preset-env": "^7.23.2",
"@babel/preset-typescript": "^7.23.0", "@babel/preset-typescript": "^7.23.2",
"@hcaptcha/types": "^1.0.3", "@hcaptcha/types": "^1.0.3",
"@jackfranklin/rollup-plugin-markdown": "^0.4.0", "@jackfranklin/rollup-plugin-markdown": "^0.4.0",
"@jeysal/storybook-addon-css-user-preferences": "^0.2.0", "@jeysal/storybook-addon-css-user-preferences": "^0.2.0",

View File

@ -114,7 +114,7 @@ export class ApplicationCheckAccessForm extends Form<{ forUser: number }> {
`; `;
} }
renderInlineForm(): TemplateResult { renderForm(): TemplateResult {
return html`<ak-form-element-horizontal return html`<ak-form-element-horizontal
label=${msg("User")} label=${msg("User")}
?required=${true} ?required=${true}

View File

@ -0,0 +1,69 @@
import { MessageLevel } from "@goauthentik/common/messages";
import {
ShowHintController,
ShowHintControllerHost,
} from "@goauthentik/components/ak-hint/ShowHintController";
import "@goauthentik/components/ak-hint/ak-hint";
import "@goauthentik/components/ak-hint/ak-hint-body";
import { AKElement } from "@goauthentik/elements/Base";
import "@goauthentik/elements/buttons/ActionButton/ak-action-button";
import { showMessage } from "@goauthentik/elements/messages/MessageContainer";
import { html, nothing } from "lit";
import { customElement, property, state } from "lit/decorators.js";
import PFPage from "@patternfly/patternfly/components/Page/page.css";
@customElement("ak-application-wizard-hint")
export class AkApplicationWizardHint extends AKElement implements ShowHintControllerHost {
static get styles() {
return [PFPage];
}
@property({ type: Boolean, attribute: "show-hint" })
forceHint: boolean = false;
@state()
showHint: boolean = true;
showHintController: ShowHintController;
constructor() {
super();
this.showHintController = new ShowHintController(
this,
"202310-application-wizard-announcement",
);
}
renderHint() {
return html` <section class="pf-c-page__main-section pf-m-no-padding-mobile">
<ak-hint>
<ak-hint-body>
<p>
Authentik has a new Application Wizard that can configure both an
application and its authentication provider at the same time.
<a href="(link to docs)">Learn more about the wizard here.</a>
</p>
<ak-action-button
class="pf-m-secondary"
.apiRequest=${() => {
showMessage({
message: "This would have shown the wizard",
level: MessageLevel.success,
});
}}
>Create with Wizard</ak-action-button
></ak-hint-body
>
${this.showHintController.render()}
</ak-hint>
</section>`;
}
render() {
return this.showHint || this.forceHint ? this.renderHint() : nothing;
}
}
export default AkApplicationWizardHint;

View File

@ -121,6 +121,7 @@ export class ApplicationWizardCommitApplication extends BasePanel {
} }
} }
// eslint-disable-next-line @typescript-eslint/no-explicit-any
decodeErrors(body: Record<string, any>) { decodeErrors(body: Record<string, any>) {
const spaceify = (src: Record<string, string>) => const spaceify = (src: Record<string, string>) =>
Object.values(src).map((msg) => `\u00a0\u00a0\u00a0\u00a0${msg}`); Object.values(src).map((msg) => `\u00a0\u00a0\u00a0\u00a0${msg}`);
@ -151,10 +152,14 @@ export class ApplicationWizardCommitApplication extends BasePanel {
this.dispatchWizardUpdate({ status: "submitted" }); this.dispatchWizardUpdate({ status: "submitted" });
this.commitState = successState; this.commitState = successState;
}) })
// eslint-disable-next-line @typescript-eslint/no-explicit-any
.catch((resolution: any) => { .catch((resolution: any) => {
resolution.response.json().then((body: Record<string, any>) => { resolution.response.json().then(
this.errors = this.decodeErrors(body); // eslint-disable-next-line @typescript-eslint/no-explicit-any
}); (body: Record<string, any>) => {
this.errors = this.decodeErrors(body);
},
);
this.commitState = errorState; this.commitState = errorState;
}); });
} }

View File

@ -68,8 +68,7 @@ export class BlueprintForm extends ModelForm<BlueprintInstance, string> {
} }
renderForm(): TemplateResult { renderForm(): TemplateResult {
return html`<form class="pf-c-form pf-m-horizontal"> return html` <ak-form-element-horizontal label=${msg("Name")} ?required=${true} name="name">
<ak-form-element-horizontal label=${msg("Name")} ?required=${true} name="name">
<input <input
type="text" type="text"
value="${ifDefined(this.instance?.name)}" value="${ifDefined(this.instance?.name)}"
@ -193,7 +192,6 @@ export class BlueprintForm extends ModelForm<BlueprintInstance, string> {
</p> </p>
</ak-form-element-horizontal> </ak-form-element-horizontal>
</div> </div>
</ak-form-group> </ak-form-group>`;
</form>`;
} }
} }

View File

@ -20,7 +20,7 @@ export class CertificateKeyPairForm extends Form<CertificateGenerationRequest> {
}); });
} }
renderInlineForm(): TemplateResult { renderForm(): TemplateResult {
return html`<ak-form-element-horizontal return html`<ak-form-element-horizontal
label=${msg("Common Name")} label=${msg("Common Name")}
name="commonName" name="commonName"

View File

@ -40,8 +40,7 @@ export class CertificateKeyPairForm extends ModelForm<CertificateKeyPair, string
} }
renderForm(): TemplateResult { renderForm(): TemplateResult {
return html`<form class="pf-c-form pf-m-horizontal"> return html` <ak-form-element-horizontal label=${msg("Name")} name="name" ?required=${true}>
<ak-form-element-horizontal label=${msg("Name")} name="name" ?required=${true}>
<input <input
type="text" type="text"
value="${ifDefined(this.instance?.name)}" value="${ifDefined(this.instance?.name)}"
@ -69,7 +68,6 @@ export class CertificateKeyPairForm extends ModelForm<CertificateKeyPair, string
"Optional Private Key. If this is set, you can use this keypair for encryption.", "Optional Private Key. If this is set, you can use this keypair for encryption.",
)} )}
</p> </p>
</ak-form-element-horizontal> </ak-form-element-horizontal>`;
</form>`;
} }
} }

View File

@ -46,13 +46,12 @@ export class EnterpriseLicenseForm extends ModelForm<License, string> {
renderForm(): TemplateResult { renderForm(): TemplateResult {
// prettier-ignore // prettier-ignore
return html`<form class="pf-c-form pf-m-horizontal"> return html`
<ak-form-element-horizontal label=${msg("Install ID")}> <ak-form-element-horizontal label=${msg("Install ID")}>
<input class="pf-c-form-control" readonly type="text" value="${ifDefined(this.installID)}" /> <input class="pf-c-form-control" readonly type="text" value="${ifDefined(this.installID)}" />
</ak-form-element-horizontal> </ak-form-element-horizontal>
<ak-form-element-horizontal name="key" ?writeOnly=${this.instance !== undefined} label=${msg("License key")}> <ak-form-element-horizontal name="key" ?writeOnly=${this.instance !== undefined} label=${msg("License key")}>
<textarea class="pf-c-form-control"></textarea> <textarea class="pf-c-form-control"></textarea>
</ak-form-element-horizontal> </ak-form-element-horizontal>`;
</form>`;
} }
} }

View File

@ -58,8 +58,7 @@ export class RuleForm extends ModelForm<NotificationRule, string> {
} }
renderForm(): TemplateResult { renderForm(): TemplateResult {
return html`<form class="pf-c-form pf-m-horizontal"> return html` <ak-form-element-horizontal label=${msg("Name")} ?required=${true} name="name">
<ak-form-element-horizontal label=${msg("Name")} ?required=${true} name="name">
<input <input
type="text" type="text"
value="${ifDefined(this.instance?.name)}" value="${ifDefined(this.instance?.name)}"
@ -141,7 +140,6 @@ export class RuleForm extends ModelForm<NotificationRule, string> {
.value=${this.instance?.severity} .value=${this.instance?.severity}
> >
</ak-radio> </ak-radio>
</ak-form-element-horizontal> </ak-form-element-horizontal>`;
</form>`;
} }
} }

View File

@ -68,8 +68,7 @@ export class TransportForm extends ModelForm<NotificationTransport, string> {
} }
renderForm(): TemplateResult { renderForm(): TemplateResult {
return html`<form class="pf-c-form pf-m-horizontal"> return html` <ak-form-element-horizontal label=${msg("Name")} ?required=${true} name="name">
<ak-form-element-horizontal label=${msg("Name")} ?required=${true} name="name">
<input <input
type="text" type="text"
value="${ifDefined(this.instance?.name)}" value="${ifDefined(this.instance?.name)}"
@ -169,7 +168,6 @@ export class TransportForm extends ModelForm<NotificationTransport, string> {
"Only send notification once, for example when sending a webhook into a chat channel.", "Only send notification once, for example when sending a webhook into a chat channel.",
)} )}
</p> </p>
</ak-form-element-horizontal> </ak-form-element-horizontal>`;
</form>`;
} }
} }

View File

@ -78,8 +78,7 @@ export class FlowForm extends ModelForm<Flow, string> {
} }
renderForm(): TemplateResult { renderForm(): TemplateResult {
return html`<form class="pf-c-form pf-m-horizontal"> return html` <ak-form-element-horizontal label=${msg("Name")} ?required=${true} name="name">
<ak-form-element-horizontal label=${msg("Name")} ?required=${true} name="name">
<input <input
type="text" type="text"
value="${ifDefined(this.instance?.name)}" value="${ifDefined(this.instance?.name)}"
@ -400,7 +399,6 @@ export class FlowForm extends ModelForm<Flow, string> {
</p> </p>
</ak-form-element-horizontal>`} </ak-form-element-horizontal>`}
</div> </div>
</ak-form-group> </ak-form-group>`;
</form>`;
} }
} }

View File

@ -86,7 +86,7 @@ export class FlowImportForm extends Form<Flow> {
`; `;
} }
renderInlineForm(): TemplateResult { renderForm(): TemplateResult {
return html`<ak-form-element-horizontal label=${msg("Flow")} name="flow"> return html`<ak-form-element-horizontal label=${msg("Flow")} name="flow">
<input type="file" value="" class="pf-c-form-control" /> <input type="file" value="" class="pf-c-form-control" />
<p class="pf-c-form__helper-text"> <p class="pf-c-form__helper-text">

View File

@ -2,6 +2,7 @@ import "@goauthentik/admin/flows/BoundStagesList";
import "@goauthentik/admin/flows/FlowDiagram"; import "@goauthentik/admin/flows/FlowDiagram";
import "@goauthentik/admin/flows/FlowForm"; import "@goauthentik/admin/flows/FlowForm";
import "@goauthentik/admin/policies/BoundPoliciesList"; import "@goauthentik/admin/policies/BoundPoliciesList";
import { DesignationToLabel } from "@goauthentik/app/admin/flows/utils";
import { AndNext, DEFAULT_CONFIG } from "@goauthentik/common/api/config"; import { AndNext, DEFAULT_CONFIG } from "@goauthentik/common/api/config";
import "@goauthentik/components/events/ObjectChangelog"; import "@goauthentik/components/events/ObjectChangelog";
import { AKElement } from "@goauthentik/elements/Base"; import { AKElement } from "@goauthentik/elements/Base";
@ -70,13 +71,43 @@ export class FlowViewPage extends AKElement {
<div <div
class="pf-c-card pf-l-grid__item pf-m-12-col pf-m-2-col-on-xl pf-m-2-col-on-2xl" class="pf-c-card pf-l-grid__item pf-m-12-col pf-m-2-col-on-xl pf-m-2-col-on-2xl"
> >
<div class="pf-c-card__title">${msg("Related actions")}</div> <div class="pf-c-card__title">${msg("Flow Info")}</div>
<div class="pf-c-card__body"> <div class="pf-c-card__body">
<dl class="pf-c-description-list"> <dl class="pf-c-description-list">
<div class="pf-c-description-list__group"> <div class="pf-c-description-list__group">
<dt class="pf-c-description-list__term"> <dt class="pf-c-description-list__term">
<span class="pf-c-description-list__text" <span class="pf-c-description-list__text"
>${msg("Edit")}</span >${msg("Name")}</span
>
</dt>
<dd class="pf-c-description-list__description">
<div class="pf-c-description-list__text">
${this.flow.name}
</div>
</dd>
<dt class="pf-c-description-list__term">
<span class="pf-c-description-list__text"
>${msg("Slug")}</span
>
</dt>
<dd class="pf-c-description-list__description">
<div class="pf-c-description-list__text">
<code>${this.flow.slug}</code>
</div>
</dd>
<dt class="pf-c-description-list__term">
<span class="pf-c-description-list__text"
>${msg("Designation")}</span
>
</dt>
<dd class="pf-c-description-list__description">
<div class="pf-c-description-list__text">
${DesignationToLabel(this.flow.designation)}
</div>
</dd>
<dt class="pf-c-description-list__term">
<span class="pf-c-description-list__text"
>${msg("Related actions")}</span
> >
</dt> </dt>
<dd class="pf-c-description-list__description"> <dd class="pf-c-description-list__description">

View File

@ -92,8 +92,7 @@ export class StageBindingForm extends ModelForm<FlowStageBinding, string> {
} }
renderForm(): TemplateResult { renderForm(): TemplateResult {
return html`<form class="pf-c-form pf-m-horizontal"> return html` ${this.renderTarget()}
${this.renderTarget()}
<ak-form-element-horizontal label=${msg("Stage")} ?required=${true} name="stage"> <ak-form-element-horizontal label=${msg("Stage")} ?required=${true} name="stage">
<ak-search-select <ak-search-select
.fetchObjects=${async (query?: string): Promise<Stage[]> => { .fetchObjects=${async (query?: string): Promise<Stage[]> => {
@ -224,7 +223,6 @@ export class StageBindingForm extends ModelForm<FlowStageBinding, string> {
.value=${this.instance?.policyEngineMode} .value=${this.instance?.policyEngineMode}
> >
</ak-radio> </ak-radio>
</ak-form-element-horizontal> </ak-form-element-horizontal>`;
</form>`;
} }
} }

View File

@ -58,8 +58,7 @@ export class GroupForm extends ModelForm<Group, string> {
} }
renderForm(): TemplateResult { renderForm(): TemplateResult {
return html`<form class="pf-c-form pf-m-horizontal"> return html` <ak-form-element-horizontal label=${msg("Name")} ?required=${true} name="name">
<ak-form-element-horizontal label=${msg("Name")} ?required=${true} name="name">
<input <input
type="text" type="text"
value="${ifDefined(this.instance?.name)}" value="${ifDefined(this.instance?.name)}"
@ -126,7 +125,6 @@ export class GroupForm extends ModelForm<Group, string> {
<p class="pf-c-form__helper-text"> <p class="pf-c-form__helper-text">
${msg("Set custom attributes using YAML or JSON.")} ${msg("Set custom attributes using YAML or JSON.")}
</p> </p>
</ak-form-element-horizontal> </ak-form-element-horizontal>`;
</form>`;
} }
} }

View File

@ -46,7 +46,7 @@ export class RelatedGroupAdd extends Form<{ groups: string[] }> {
return data; return data;
} }
renderInlineForm(): TemplateResult { renderForm(): TemplateResult {
return html`<ak-form-element-horizontal label=${msg("Groups to add")} name="groups"> return html`<ak-form-element-horizontal label=${msg("Groups to add")} name="groups">
<div class="pf-c-input-group"> <div class="pf-c-input-group">
<ak-user-group-select-table <ak-user-group-select-table

View File

@ -99,8 +99,7 @@ export class OutpostForm extends ModelForm<Outpost, string> {
} }
renderForm(): TemplateResult { renderForm(): TemplateResult {
return html`<form class="pf-c-form pf-m-horizontal"> return html` <ak-form-element-horizontal label=${msg("Name")} ?required=${true} name="name">
<ak-form-element-horizontal label=${msg("Name")} ?required=${true} name="name">
<input <input
type="text" type="text"
value="${ifDefined(this.instance?.name)}" value="${ifDefined(this.instance?.name)}"
@ -226,7 +225,6 @@ export class OutpostForm extends ModelForm<Outpost, string> {
>${msg("Documentation")}</a >${msg("Documentation")}</a
> >
</p> </p>
</ak-form-element-horizontal> </ak-form-element-horizontal>`;
</form>`;
} }
} }

View File

@ -42,8 +42,7 @@ export class ServiceConnectionDockerForm extends ModelForm<DockerServiceConnecti
} }
renderForm(): TemplateResult { renderForm(): TemplateResult {
return html`<form class="pf-c-form pf-m-horizontal"> return html` <ak-form-element-horizontal label=${msg("Name")} ?required=${true} name="name">
<ak-form-element-horizontal label=${msg("Name")} ?required=${true} name="name">
<input <input
type="text" type="text"
value="${ifDefined(this.instance?.name)}" value="${ifDefined(this.instance?.name)}"
@ -112,7 +111,6 @@ export class ServiceConnectionDockerForm extends ModelForm<DockerServiceConnecti
<p class="pf-c-form__helper-text"> <p class="pf-c-form__helper-text">
${msg("When connecting via SSH, this keypair is used for authentication.")} ${msg("When connecting via SSH, this keypair is used for authentication.")}
</p> </p>
</ak-form-element-horizontal> </ak-form-element-horizontal>`;
</form>`;
} }
} }

View File

@ -45,8 +45,7 @@ export class ServiceConnectionKubernetesForm extends ModelForm<
} }
renderForm(): TemplateResult { renderForm(): TemplateResult {
return html`<form class="pf-c-form pf-m-horizontal"> return html` <ak-form-element-horizontal label=${msg("Name")} ?required=${true} name="name">
<ak-form-element-horizontal label=${msg("Name")} ?required=${true} name="name">
<input <input
type="text" type="text"
value="${ifDefined(this.instance?.name)}" value="${ifDefined(this.instance?.name)}"
@ -100,7 +99,6 @@ export class ServiceConnectionKubernetesForm extends ModelForm<
>${msg("Verify Kubernetes API SSL Certificate")}</span >${msg("Verify Kubernetes API SSL Certificate")}</span
> >
</label> </label>
</ak-form-element-horizontal> </ak-form-element-horizontal>`;
</form>`;
} }
} }

View File

@ -133,8 +133,7 @@ export class PolicyBindingForm extends ModelForm<PolicyBinding, string> {
} }
renderForm(): TemplateResult { renderForm(): TemplateResult {
return html`<form class="pf-c-form pf-m-horizontal"> return html` <div class="pf-c-card pf-m-selectable pf-m-selected">
<div class="pf-c-card pf-m-selectable pf-m-selected">
<div class="pf-c-card__body">${this.renderModeSelector()}</div> <div class="pf-c-card__body">${this.renderModeSelector()}</div>
<div class="pf-c-card__footer"> <div class="pf-c-card__footer">
<ak-form-element-horizontal <ak-form-element-horizontal
@ -318,7 +317,6 @@ export class PolicyBindingForm extends ModelForm<PolicyBinding, string> {
<p class="pf-c-form__helper-text"> <p class="pf-c-form__helper-text">
${msg("Result used when policy execution fails.")} ${msg("Result used when policy execution fails.")}
</p> </p>
</ak-form-element-horizontal> </ak-form-element-horizontal>`;
</form>`;
} }
} }

View File

@ -115,7 +115,7 @@ export class PolicyTestForm extends Form<PolicyTestRequest> {
`; `;
} }
renderInlineForm(): TemplateResult { renderForm(): TemplateResult {
return html`<ak-form-element-horizontal label=${msg("User")} ?required=${true} name="user"> return html`<ak-form-element-horizontal label=${msg("User")} ?required=${true} name="user">
<ak-search-select <ak-search-select
.fetchObjects=${async (query?: string): Promise<User[]> => { .fetchObjects=${async (query?: string): Promise<User[]> => {

View File

@ -41,8 +41,7 @@ export class DummyPolicyForm extends ModelForm<DummyPolicy, string> {
} }
renderForm(): TemplateResult { renderForm(): TemplateResult {
return html`<form class="pf-c-form pf-m-horizontal"> return html` <span>
<span>
${msg( ${msg(
"A policy used for testing. Always returns the same result as specified below after waiting a random duration.", "A policy used for testing. Always returns the same result as specified below after waiting a random duration.",
)} )}
@ -123,7 +122,6 @@ export class DummyPolicyForm extends ModelForm<DummyPolicy, string> {
/> />
</ak-form-element-horizontal> </ak-form-element-horizontal>
</div> </div>
</ak-form-group> </ak-form-group>`;
</form>`;
} }
} }

View File

@ -53,8 +53,7 @@ export class EventMatcherPolicyForm extends ModelForm<EventMatcherPolicy, string
} }
renderForm(): TemplateResult { renderForm(): TemplateResult {
return html`<form class="pf-c-form pf-m-horizontal"> return html` <span>
<span>
${msg( ${msg(
"Matches an event against a set of criteria. If any of the configured values match, the policy passes.", "Matches an event against a set of criteria. If any of the configured values match, the policy passes.",
)} )}
@ -187,7 +186,6 @@ export class EventMatcherPolicyForm extends ModelForm<EventMatcherPolicy, string
</p> </p>
</ak-form-element-horizontal> </ak-form-element-horizontal>
</div> </div>
</ak-form-group> </ak-form-group>`;
</form>`;
} }
} }

View File

@ -41,8 +41,7 @@ export class PasswordExpiryPolicyForm extends ModelForm<PasswordExpiryPolicy, st
} }
renderForm(): TemplateResult { renderForm(): TemplateResult {
return html`<form class="pf-c-form pf-m-horizontal"> return html` <span>
<span>
${msg( ${msg(
"Checks if the request's user's password has been changed in the last x days, and denys based on settings.", "Checks if the request's user's password has been changed in the last x days, and denys based on settings.",
)} )}
@ -110,7 +109,6 @@ export class PasswordExpiryPolicyForm extends ModelForm<PasswordExpiryPolicy, st
</label> </label>
</ak-form-element-horizontal> </ak-form-element-horizontal>
</div> </div>
</ak-form-group> </ak-form-group>`;
</form>`;
} }
} }

View File

@ -43,8 +43,7 @@ export class ExpressionPolicyForm extends ModelForm<ExpressionPolicy, string> {
} }
renderForm(): TemplateResult { renderForm(): TemplateResult {
return html`<form class="pf-c-form pf-m-horizontal"> return html` <span>
<span>
${msg( ${msg(
"Executes the python snippet to determine whether to allow or deny a request.", "Executes the python snippet to determine whether to allow or deny a request.",
)} )}
@ -101,7 +100,6 @@ export class ExpressionPolicyForm extends ModelForm<ExpressionPolicy, string> {
</p> </p>
</ak-form-element-horizontal> </ak-form-element-horizontal>
</div> </div>
</ak-form-group> </ak-form-group>`;
</form>`;
} }
} }

View File

@ -229,8 +229,7 @@ export class PasswordPolicyForm extends ModelForm<PasswordPolicy, string> {
} }
renderForm(): TemplateResult { renderForm(): TemplateResult {
return html`<form class="pf-c-form pf-m-horizontal"> return html` <span>
<span>
${msg( ${msg(
"Checks the value from the policy request against several rules, mostly used to ensure password strength.", "Checks the value from the policy request against several rules, mostly used to ensure password strength.",
)} )}
@ -348,7 +347,6 @@ export class PasswordPolicyForm extends ModelForm<PasswordPolicy, string> {
</ak-form-element-horizontal> </ak-form-element-horizontal>
${this.showStatic ? this.renderStaticRules() : html``} ${this.showStatic ? this.renderStaticRules() : html``}
${this.showHIBP ? this.renderHIBP() : html``} ${this.showHIBP ? this.renderHIBP() : html``}
${this.showZxcvbn ? this.renderZxcvbn() : html``} ${this.showZxcvbn ? this.renderZxcvbn() : html``}`;
</form>`;
} }
} }

View File

@ -41,8 +41,7 @@ export class ReputationPolicyForm extends ModelForm<ReputationPolicy, string> {
} }
renderForm(): TemplateResult { renderForm(): TemplateResult {
return html`<form class="pf-c-form pf-m-horizontal"> return html` <span>
<span>
${msg("Allows/denys requests based on the users and/or the IPs reputation.")} ${msg("Allows/denys requests based on the users and/or the IPs reputation.")}
</span> </span>
<span> <span>
@ -131,7 +130,6 @@ doesn't pass when either or both of the selected options are equal or above the
/> />
</ak-form-element-horizontal> </ak-form-element-horizontal>
</div> </div>
</ak-form-group> </ak-form-group>`;
</form>`;
} }
} }

View File

@ -41,8 +41,7 @@ export class PropertyMappingLDAPForm extends ModelForm<LDAPPropertyMapping, stri
} }
renderForm(): TemplateResult { renderForm(): TemplateResult {
return html`<form class="pf-c-form pf-m-horizontal"> return html` <ak-form-element-horizontal label=${msg("Name")} ?required=${true} name="name">
<ak-form-element-horizontal label=${msg("Name")} ?required=${true} name="name">
<input <input
type="text" type="text"
value="${ifDefined(this.instance?.name)}" value="${ifDefined(this.instance?.name)}"
@ -81,7 +80,6 @@ export class PropertyMappingLDAPForm extends ModelForm<LDAPPropertyMapping, stri
${msg("See documentation for a list of all variables.")} ${msg("See documentation for a list of all variables.")}
</a> </a>
</p> </p>
</ak-form-element-horizontal> </ak-form-element-horizontal>`;
</form>`;
} }
} }

View File

@ -41,8 +41,7 @@ export class PropertyMappingNotification extends ModelForm<NotificationWebhookMa
} }
renderForm(): TemplateResult { renderForm(): TemplateResult {
return html`<form class="pf-c-form pf-m-horizontal"> return html` <ak-form-element-horizontal label=${msg("Name")} ?required=${true} name="name">
<ak-form-element-horizontal label=${msg("Name")} ?required=${true} name="name">
<input <input
type="text" type="text"
value="${ifDefined(this.instance?.name)}" value="${ifDefined(this.instance?.name)}"
@ -66,7 +65,6 @@ export class PropertyMappingNotification extends ModelForm<NotificationWebhookMa
${msg("See documentation for a list of all variables.")} ${msg("See documentation for a list of all variables.")}
</a> </a>
</p> </p>
</ak-form-element-horizontal> </ak-form-element-horizontal>`;
</form>`;
} }
} }

View File

@ -41,8 +41,7 @@ export class PropertyMappingSAMLForm extends ModelForm<SAMLPropertyMapping, stri
} }
renderForm(): TemplateResult { renderForm(): TemplateResult {
return html`<form class="pf-c-form pf-m-horizontal"> return html` <ak-form-element-horizontal label=${msg("Name")} ?required=${true} name="name">
<ak-form-element-horizontal label=${msg("Name")} ?required=${true} name="name">
<input <input
type="text" type="text"
value="${ifDefined(this.instance?.name)}" value="${ifDefined(this.instance?.name)}"
@ -93,7 +92,6 @@ export class PropertyMappingSAMLForm extends ModelForm<SAMLPropertyMapping, stri
${msg("See documentation for a list of all variables.")} ${msg("See documentation for a list of all variables.")}
</a> </a>
</p> </p>
</ak-form-element-horizontal> </ak-form-element-horizontal>`;
</form>`;
} }
} }

View File

@ -41,8 +41,7 @@ export class PropertyMappingSCIMForm extends ModelForm<SCIMMapping, string> {
} }
renderForm(): TemplateResult { renderForm(): TemplateResult {
return html`<form class="pf-c-form pf-m-horizontal"> return html` <ak-form-element-horizontal label=${msg("Name")} ?required=${true} name="name">
<ak-form-element-horizontal label=${msg("Name")} ?required=${true} name="name">
<input <input
type="text" type="text"
value="${ifDefined(this.instance?.name)}" value="${ifDefined(this.instance?.name)}"
@ -66,7 +65,6 @@ export class PropertyMappingSCIMForm extends ModelForm<SCIMMapping, string> {
${msg("See documentation for a list of all variables.")} ${msg("See documentation for a list of all variables.")}
</a> </a>
</p> </p>
</ak-form-element-horizontal> </ak-form-element-horizontal>`;
</form>`;
} }
} }

View File

@ -41,8 +41,7 @@ export class PropertyMappingScopeForm extends ModelForm<ScopeMapping, string> {
} }
renderForm(): TemplateResult { renderForm(): TemplateResult {
return html`<form class="pf-c-form pf-m-horizontal"> return html` <ak-form-element-horizontal label=${msg("Name")} ?required=${true} name="name">
<ak-form-element-horizontal label=${msg("Name")} ?required=${true} name="name">
<input <input
type="text" type="text"
value="${ifDefined(this.instance?.name)}" value="${ifDefined(this.instance?.name)}"
@ -93,7 +92,6 @@ export class PropertyMappingScopeForm extends ModelForm<ScopeMapping, string> {
${msg("See documentation for a list of all variables.")} ${msg("See documentation for a list of all variables.")}
</a> </a>
</p> </p>
</ak-form-element-horizontal> </ak-form-element-horizontal>`;
</form>`;
} }
} }

View File

@ -118,7 +118,7 @@ export class PolicyTestForm extends Form<PolicyTestRequest> {
`; `;
} }
renderInlineForm(): TemplateResult { renderForm(): TemplateResult {
return html`<ak-form-element-horizontal label=${msg("User")} ?required=${true} name="user"> return html`<ak-form-element-horizontal label=${msg("User")} ?required=${true} name="user">
<ak-search-select <ak-search-select
.fetchObjects=${async (query?: string): Promise<User[]> => { .fetchObjects=${async (query?: string): Promise<User[]> => {

View File

@ -60,8 +60,7 @@ export class LDAPProviderFormPage extends ModelForm<LDAPProvider, number> {
// weird-- we're looking up Authentication flows, but we're storing them in the Authorization // weird-- we're looking up Authentication flows, but we're storing them in the Authorization
// field of the target Provider. // field of the target Provider.
renderForm(): TemplateResult { renderForm(): TemplateResult {
return html`<form class="pf-c-form pf-m-horizontal"> return html` <ak-form-element-horizontal label=${msg("Name")} ?required=${true} name="name">
<ak-form-element-horizontal label=${msg("Name")} ?required=${true} name="name">
<input <input
type="text" type="text"
value="${ifDefined(this.instance?.name)}" value="${ifDefined(this.instance?.name)}"
@ -266,7 +265,6 @@ export class LDAPProviderFormPage extends ModelForm<LDAPProvider, number> {
</p> </p>
</ak-form-element-horizontal> </ak-form-element-horizontal>
</div> </div>
</ak-form-group> </ak-form-group>`;
</form>`;
} }
} }

View File

@ -167,8 +167,7 @@ export class OAuth2ProviderFormPage extends ModelForm<OAuth2Provider, number> {
renderForm(): TemplateResult { renderForm(): TemplateResult {
const provider = this.instance; const provider = this.instance;
return html`<form class="pf-c-form pf-m-horizontal"> return html` <ak-text-input
<ak-text-input
name="name" name="name"
label=${msg("Name")} label=${msg("Name")}
value=${ifDefined(provider?.name)} value=${ifDefined(provider?.name)}
@ -383,7 +382,6 @@ export class OAuth2ProviderFormPage extends ModelForm<OAuth2Provider, number> {
</p> </p>
</ak-form-element-horizontal> </ak-form-element-horizontal>
</div> </div>
</ak-form-group> </ak-form-group>`;
</form>`;
} }
} }

View File

@ -266,8 +266,7 @@ export class ProxyProviderFormPage extends ModelForm<ProxyProvider, number> {
} }
renderForm(): TemplateResult { renderForm(): TemplateResult {
return html`<form class="pf-c-form pf-m-horizontal"> return html` <ak-form-element-horizontal label=${msg("Name")} ?required=${true} name="name">
<ak-form-element-horizontal label=${msg("Name")} ?required=${true} name="name">
<input <input
type="text" type="text"
value="${ifDefined(this.instance?.name)}" value="${ifDefined(this.instance?.name)}"
@ -457,7 +456,6 @@ ${this.instance?.skipPathRegex}</textarea
</p> </p>
</ak-form-element-horizontal> </ak-form-element-horizontal>
</div> </div>
</ak-form-group> </ak-form-group>`;
</form>`;
} }
} }

View File

@ -49,8 +49,7 @@ export class RadiusProviderFormPage extends ModelForm<RadiusProvider, number> {
// weird-- we're looking up Authentication flows, but we're storing them in the Authorization // weird-- we're looking up Authentication flows, but we're storing them in the Authorization
// field of the target Provider. // field of the target Provider.
renderForm(): TemplateResult { renderForm(): TemplateResult {
return html`<form class="pf-c-form pf-m-horizontal"> return html` <ak-form-element-horizontal label=${msg("Name")} ?required=${true} name="name">
<ak-form-element-horizontal label=${msg("Name")} ?required=${true} name="name">
<input <input
type="text" type="text"
value="${ifDefined(this.instance?.name)}" value="${ifDefined(this.instance?.name)}"
@ -108,7 +107,6 @@ export class RadiusProviderFormPage extends ModelForm<RadiusProvider, number> {
</p> </p>
</ak-form-element-horizontal> </ak-form-element-horizontal>
</div> </div>
</ak-form-group> </ak-form-group>`;
</form>`;
} }
} }

View File

@ -66,8 +66,7 @@ export class SAMLProviderFormPage extends ModelForm<SAMLProvider, number> {
} }
renderForm(): TemplateResult { renderForm(): TemplateResult {
return html`<form class="pf-c-form pf-m-horizontal"> return html` <ak-form-element-horizontal label=${msg("Name")} ?required=${true} name="name">
<ak-form-element-horizontal label=${msg("Name")} ?required=${true} name="name">
<input <input
type="text" type="text"
value="${ifDefined(this.instance?.name)}" value="${ifDefined(this.instance?.name)}"
@ -400,7 +399,6 @@ export class SAMLProviderFormPage extends ModelForm<SAMLProvider, number> {
</ak-radio> </ak-radio>
</ak-form-element-horizontal> </ak-form-element-horizontal>
</div> </div>
</ak-form-group> </ak-form-group>`;
</form>`;
} }
} }

View File

@ -29,7 +29,7 @@ export class SAMLProviderImportForm extends Form<SAMLProvider> {
}); });
} }
renderInlineForm(): TemplateResult { renderForm(): TemplateResult {
return html`<ak-form-element-horizontal label=${msg("Name")} ?required=${true} name="name"> return html`<ak-form-element-horizontal label=${msg("Name")} ?required=${true} name="name">
<input type="text" class="pf-c-form-control" required /> <input type="text" class="pf-c-form-control" required />
</ak-form-element-horizontal> </ak-form-element-horizontal>

View File

@ -61,8 +61,7 @@ export class SCIMProviderFormPage extends ModelForm<SCIMProvider, number> {
} }
renderForm(): TemplateResult { renderForm(): TemplateResult {
return html`<form class="pf-c-form pf-m-horizontal"> return html` <ak-form-element-horizontal label=${msg("Name")} ?required=${true} name="name">
<ak-form-element-horizontal label=${msg("Name")} ?required=${true} name="name">
<input <input
type="text" type="text"
value="${ifDefined(this.instance?.name)}" value="${ifDefined(this.instance?.name)}"
@ -226,7 +225,6 @@ export class SCIMProviderFormPage extends ModelForm<SCIMProvider, number> {
</p> </p>
</ak-form-element-horizontal> </ak-form-element-horizontal>
</div> </div>
</ak-form-group> </ak-form-group>`;
</form>`;
} }
} }

View File

@ -63,8 +63,7 @@ export class LDAPSourceForm extends ModelForm<LDAPSource, string> {
} }
renderForm(): TemplateResult { renderForm(): TemplateResult {
return html`<form class="pf-c-form pf-m-horizontal"> return html` <ak-form-element-horizontal label=${msg("Name")} ?required=${true} name="name">
<ak-form-element-horizontal label=${msg("Name")} ?required=${true} name="name">
<input <input
type="text" type="text"
value="${ifDefined(this.instance?.name)}" value="${ifDefined(this.instance?.name)}"
@ -468,7 +467,6 @@ export class LDAPSourceForm extends ModelForm<LDAPSource, string> {
</p> </p>
</ak-form-element-horizontal> </ak-form-element-horizontal>
</div> </div>
</ak-form-group> </ak-form-group>`;
</form>`;
} }
} }

View File

@ -231,8 +231,7 @@ export class OAuthSourceForm extends ModelForm<OAuthSource, string> {
} }
renderForm(): TemplateResult { renderForm(): TemplateResult {
return html`<form class="pf-c-form pf-m-horizontal"> return html` <ak-form-element-horizontal label=${msg("Name")} ?required=${true} name="name">
<ak-form-element-horizontal label=${msg("Name")} ?required=${true} name="name">
<input <input
type="text" type="text"
value="${ifDefined(this.instance?.name)}" value="${ifDefined(this.instance?.name)}"
@ -436,7 +435,6 @@ export class OAuthSourceForm extends ModelForm<OAuthSource, string> {
</p> </p>
</ak-form-element-horizontal> </ak-form-element-horizontal>
</div> </div>
</ak-form-group> </ak-form-group>`;
</form>`;
} }
} }

View File

@ -178,8 +178,7 @@ export class PlexSourceForm extends ModelForm<PlexSource, string> {
} }
renderForm(): TemplateResult { renderForm(): TemplateResult {
return html`<form class="pf-c-form pf-m-horizontal"> return html` <ak-form-element-horizontal label=${msg("Name")} ?required=${true} name="name">
<ak-form-element-horizontal label=${msg("Name")} ?required=${true} name="name">
<input <input
type="text" type="text"
value="${ifDefined(this.instance?.name)}" value="${ifDefined(this.instance?.name)}"
@ -362,7 +361,6 @@ export class PlexSourceForm extends ModelForm<PlexSource, string> {
</p> </p>
</ak-form-element-horizontal> </ak-form-element-horizontal>
</div> </div>
</ak-form-group> </ak-form-group>`;
</form>`;
} }
} }

View File

@ -83,8 +83,7 @@ export class SAMLSourceForm extends ModelForm<SAMLSource, string> {
} }
renderForm(): TemplateResult { renderForm(): TemplateResult {
return html`<form class="pf-c-form pf-m-horizontal"> return html` <ak-form-element-horizontal label=${msg("Name")} ?required=${true} name="name">
<ak-form-element-horizontal label=${msg("Name")} ?required=${true} name="name">
<input <input
type="text" type="text"
value="${ifDefined(this.instance?.name)}" value="${ifDefined(this.instance?.name)}"
@ -507,7 +506,6 @@ export class SAMLSourceForm extends ModelForm<SAMLSource, string> {
</p> </p>
</ak-form-element-horizontal> </ak-form-element-horizontal>
</div> </div>
</ak-form-group> </ak-form-group>`;
</form>`;
} }
} }

View File

@ -50,8 +50,7 @@ export class AuthenticatorDuoStageForm extends ModelForm<AuthenticatorDuoStage,
} }
renderForm(): TemplateResult { renderForm(): TemplateResult {
return html`<form class="pf-c-form pf-m-horizontal"> return html` <span>
<span>
${msg( ${msg(
"Stage used to configure a duo-based authenticator. This stage should be used for configuration flows.", "Stage used to configure a duo-based authenticator. This stage should be used for configuration flows.",
)} )}
@ -189,7 +188,6 @@ export class AuthenticatorDuoStageForm extends ModelForm<AuthenticatorDuoStage,
</p> </p>
</ak-form-element-horizontal> </ak-form-element-horizontal>
</div> </div>
</ak-form-group> </ak-form-group>`;
</form>`;
} }
} }

View File

@ -42,10 +42,10 @@ export class DuoDeviceImportForm extends ModelForm<AuthenticatorDuoStage, string
} }
renderForm(): TemplateResult { renderForm(): TemplateResult {
return html` <form class="pf-c-form pf-m-horizontal"> return html` ${this.instance?.adminIntegrationKey !== ""
${this.instance?.adminIntegrationKey !== "" ? this.renderFormAutomatic() : html``} ? this.renderFormAutomatic()
${this.renderFormManual()} : html``}
</form>`; ${this.renderFormManual()}`;
} }
renderFormManual(): TemplateResult { renderFormManual(): TemplateResult {

View File

@ -207,8 +207,9 @@ export class AuthenticatorSMSStageForm extends ModelForm<AuthenticatorSMSStage,
} }
renderForm(): TemplateResult { renderForm(): TemplateResult {
return html`<form class="pf-c-form pf-m-horizontal"> return html` <span>
<span> ${msg("Stage used to configure an SMS-based TOTP authenticator.")} </span> ${msg("Stage used to configure an SMS-based TOTP authenticator.")}
</span>
<ak-form-element-horizontal label=${msg("Name")} ?required=${true} name="name"> <ak-form-element-horizontal label=${msg("Name")} ?required=${true} name="name">
<input <input
type="text" type="text"
@ -341,7 +342,6 @@ export class AuthenticatorSMSStageForm extends ModelForm<AuthenticatorSMSStage,
</p> </p>
</ak-form-element-horizontal> </ak-form-element-horizontal>
</div> </div>
</ak-form-group> </ak-form-group>`;
</form>`;
} }
} }

View File

@ -48,8 +48,7 @@ export class AuthenticatorStaticStageForm extends ModelForm<AuthenticatorStaticS
} }
renderForm(): TemplateResult { renderForm(): TemplateResult {
return html`<form class="pf-c-form pf-m-horizontal"> return html` <span>
<span>
${msg( ${msg(
"Stage used to configure a static authenticator (i.e. static tokens). This stage should be used for configuration flows.", "Stage used to configure a static authenticator (i.e. static tokens). This stage should be used for configuration flows.",
)} )}
@ -156,7 +155,6 @@ export class AuthenticatorStaticStageForm extends ModelForm<AuthenticatorStaticS
</p> </p>
</ak-form-element-horizontal> </ak-form-element-horizontal>
</div> </div>
</ak-form-group> </ak-form-group>`;
</form>`;
} }
} }

View File

@ -50,8 +50,7 @@ export class AuthenticatorTOTPStageForm extends ModelForm<AuthenticatorTOTPStage
} }
renderForm(): TemplateResult { renderForm(): TemplateResult {
return html`<form class="pf-c-form pf-m-horizontal"> return html` <span>
<span>
${msg( ${msg(
"Stage used to configure a TOTP authenticator (i.e. Authy/Google Authenticator).", "Stage used to configure a TOTP authenticator (i.e. Authy/Google Authenticator).",
)} )}
@ -146,7 +145,6 @@ export class AuthenticatorTOTPStageForm extends ModelForm<AuthenticatorTOTPStage
</p> </p>
</ak-form-element-horizontal> </ak-form-element-horizontal>
</div> </div>
</ak-form-group> </ak-form-group>`;
</form>`;
} }
} }

View File

@ -71,8 +71,7 @@ export class AuthenticatorValidateStageForm extends ModelForm<AuthenticatorValid
} }
renderForm(): TemplateResult { renderForm(): TemplateResult {
return html`<form class="pf-c-form pf-m-horizontal"> return html` <span>
<span>
${msg( ${msg(
"Stage used to validate any authenticator. This stage should be used during authentication or authorization flows.", "Stage used to validate any authenticator. This stage should be used during authentication or authorization flows.",
)} )}
@ -254,7 +253,6 @@ export class AuthenticatorValidateStageForm extends ModelForm<AuthenticatorValid
` `
: html``} : html``}
</div> </div>
</ak-form-group> </ak-form-group>`;
</form>`;
} }
} }

View File

@ -55,10 +55,9 @@ export class AuthenticateWebAuthnStageForm extends ModelForm<AuthenticateWebAuth
} }
renderForm(): TemplateResult { renderForm(): TemplateResult {
return html`<form class="pf-c-form pf-m-horizontal"> return html` <span>
<span>
${msg( ${msg(
"Stage used to configure a WebAutnn authenticator (i.e. Yubikey, FaceID/Windows Hello).", "Stage used to configure a WebAuthn authenticator (i.e. Yubikey, FaceID/Windows Hello).",
)} )}
</span> </span>
<ak-form-element-horizontal label=${msg("Name")} ?required=${true} name="name"> <ak-form-element-horizontal label=${msg("Name")} ?required=${true} name="name">
@ -214,7 +213,6 @@ export class AuthenticateWebAuthnStageForm extends ModelForm<AuthenticateWebAuth
</p> </p>
</ak-form-element-horizontal> </ak-form-element-horizontal>
</div> </div>
</ak-form-group> </ak-form-group>`;
</form>`;
} }
} }

View File

@ -40,8 +40,7 @@ export class CaptchaStageForm extends ModelForm<CaptchaStage, string> {
} }
renderForm(): TemplateResult { renderForm(): TemplateResult {
return html`<form class="pf-c-form pf-m-horizontal"> return html` <span>
<span>
${msg( ${msg(
"This stage checks the user's current session against the Google reCaptcha (or compatible) service.", "This stage checks the user's current session against the Google reCaptcha (or compatible) service.",
)} )}
@ -133,7 +132,6 @@ export class CaptchaStageForm extends ModelForm<CaptchaStage, string> {
</p> </p>
</ak-form-element-horizontal> </ak-form-element-horizontal>
</div> </div>
</ak-form-group> </ak-form-group>`;
</form>`;
} }
} }

View File

@ -49,8 +49,7 @@ export class ConsentStageForm extends ModelForm<ConsentStage, string> {
} }
renderForm(): TemplateResult { renderForm(): TemplateResult {
return html`<form class="pf-c-form pf-m-horizontal"> return html` <span>
<span>
${msg( ${msg(
"Prompt for the user's consent. The consent can either be permanent or expire in a defined amount of time.", "Prompt for the user's consent. The consent can either be permanent or expire in a defined amount of time.",
)} )}
@ -120,7 +119,6 @@ export class ConsentStageForm extends ModelForm<ConsentStage, string> {
<ak-utils-time-delta-help></ak-utils-time-delta-help> <ak-utils-time-delta-help></ak-utils-time-delta-help>
</ak-form-element-horizontal> </ak-form-element-horizontal>
</div> </div>
</ak-form-group> </ak-form-group>`;
</form>`;
} }
} }

View File

@ -39,8 +39,7 @@ export class DenyStageForm extends ModelForm<DenyStage, string> {
} }
renderForm(): TemplateResult { renderForm(): TemplateResult {
return html`<form class="pf-c-form pf-m-horizontal"> return html` <span>
<span>
${msg( ${msg(
"Statically deny the flow. To use this stage effectively, disable *Evaluate when flow is planned* on the respective binding.", "Statically deny the flow. To use this stage effectively, disable *Evaluate when flow is planned* on the respective binding.",
)} )}
@ -52,7 +51,6 @@ export class DenyStageForm extends ModelForm<DenyStage, string> {
class="pf-c-form-control" class="pf-c-form-control"
required required
/> />
</ak-form-element-horizontal> </ak-form-element-horizontal>`;
</form>`;
} }
} }

View File

@ -40,8 +40,7 @@ export class DummyStageForm extends ModelForm<DummyStage, string> {
} }
renderForm(): TemplateResult { renderForm(): TemplateResult {
return html`<form class="pf-c-form pf-m-horizontal"> return html` <span>
<span>
${msg( ${msg(
"Dummy stage used for testing. Shows a simple continue button and always passes.", "Dummy stage used for testing. Shows a simple continue button and always passes.",
)} )}
@ -68,7 +67,6 @@ export class DummyStageForm extends ModelForm<DummyStage, string> {
</span> </span>
<span class="pf-c-switch__label">${msg("Throw error?")}</span> <span class="pf-c-switch__label">${msg("Throw error?")}</span>
</label> </label>
</ak-form-element-horizontal> </ak-form-element-horizontal>`;
</form>`;
} }
} }

View File

@ -147,8 +147,7 @@ export class EmailStageForm extends ModelForm<EmailStage, string> {
} }
renderForm(): TemplateResult { renderForm(): TemplateResult {
return html`<form class="pf-c-form pf-m-horizontal"> return html` <span>
<span>
${msg( ${msg(
"Verify the user's email address by sending them a one-time-link. Can also be used for recovery to verify the user's authenticity.", "Verify the user's email address by sending them a one-time-link. Can also be used for recovery to verify the user's authenticity.",
)} )}
@ -256,7 +255,6 @@ export class EmailStageForm extends ModelForm<EmailStage, string> {
</ak-form-element-horizontal> </ak-form-element-horizontal>
</div> </div>
</ak-form-group> </ak-form-group>
${this.renderConnectionSettings()} ${this.renderConnectionSettings()}`;
</form>`;
} }
} }

View File

@ -68,8 +68,7 @@ export class IdentificationStageForm extends ModelForm<IdentificationStage, stri
} }
renderForm(): TemplateResult { renderForm(): TemplateResult {
return html`<form class="pf-c-form pf-m-horizontal"> return html` <span>
<span>
${msg("Let the user identify themselves with their username or Email address.")} ${msg("Let the user identify themselves with their username or Email address.")}
</span> </span>
<ak-form-element-horizontal label=${msg("Name")} ?required=${true} name="name"> <ak-form-element-horizontal label=${msg("Name")} ?required=${true} name="name">
@ -299,7 +298,6 @@ export class IdentificationStageForm extends ModelForm<IdentificationStage, stri
</p> </p>
</ak-form-element-horizontal> </ak-form-element-horizontal>
</div> </div>
</ak-form-group> </ak-form-group>`;
</form>`;
} }
} }

View File

@ -43,8 +43,7 @@ export class InvitationForm extends ModelForm<Invitation, string> {
} }
renderForm(): TemplateResult { renderForm(): TemplateResult {
return html`<form class="pf-c-form pf-m-horizontal"> return html` <ak-form-element-horizontal
<ak-form-element-horizontal
?slugMode=${true} ?slugMode=${true}
label=${msg("Name")} label=${msg("Name")}
?required=${true} ?required=${true}
@ -107,7 +106,6 @@ export class InvitationForm extends ModelForm<Invitation, string> {
<p class="pf-c-form__helper-text"> <p class="pf-c-form__helper-text">
${msg("When enabled, the invitation will be deleted after usage.")} ${msg("When enabled, the invitation will be deleted after usage.")}
</p> </p>
</ak-form-element-horizontal> </ak-form-element-horizontal>`;
</form>`;
} }
} }

View File

@ -40,8 +40,7 @@ export class InvitationStageForm extends ModelForm<InvitationStage, string> {
} }
renderForm(): TemplateResult { renderForm(): TemplateResult {
return html`<form class="pf-c-form pf-m-horizontal"> return html` <span>
<span>
${msg("This stage can be included in enrollment flows to accept invitations.")} ${msg("This stage can be included in enrollment flows to accept invitations.")}
</span> </span>
<ak-form-element-horizontal label=${msg("Name")} ?required=${true} name="name"> <ak-form-element-horizontal label=${msg("Name")} ?required=${true} name="name">
@ -81,7 +80,6 @@ export class InvitationStageForm extends ModelForm<InvitationStage, string> {
</p> </p>
</ak-form-element-horizontal> </ak-form-element-horizontal>
</div> </div>
</ak-form-group> </ak-form-group>`;
</form>`;
} }
} }

View File

@ -62,8 +62,9 @@ export class PasswordStageForm extends ModelForm<PasswordStage, string> {
} }
renderForm(): TemplateResult { renderForm(): TemplateResult {
return html`<form class="pf-c-form pf-m-horizontal"> return html` <span>
<span> ${msg("Validate the user's password against the selected backend(s).")} </span> ${msg("Validate the user's password against the selected backend(s).")}
</span>
<ak-form-element-horizontal label=${msg("Name")} ?required=${true} name="name"> <ak-form-element-horizontal label=${msg("Name")} ?required=${true} name="name">
<input <input
type="text" type="text"
@ -180,7 +181,6 @@ export class PasswordStageForm extends ModelForm<PasswordStage, string> {
</p> </p>
</ak-form-element-horizontal> </ak-form-element-horizontal>
</div> </div>
</ak-form-group> </ak-form-group>`;
</form>`;
} }
} }

View File

@ -283,8 +283,7 @@ export class PromptForm extends ModelForm<Prompt, string> {
} }
renderEditForm(): TemplateResult { renderEditForm(): TemplateResult {
return html`<form class="pf-c-form pf-m-horizontal"> return html` <ak-form-element-horizontal label=${msg("Name")} ?required=${true} name="name">
<ak-form-element-horizontal label=${msg("Name")} ?required=${true} name="name">
<input <input
type="text" type="text"
value="${ifDefined(this.instance?.name)}" value="${ifDefined(this.instance?.name)}"
@ -454,7 +453,6 @@ export class PromptForm extends ModelForm<Prompt, string> {
class="pf-c-form-control" class="pf-c-form-control"
required required
/> />
</ak-form-element-horizontal> </ak-form-element-horizontal>`;
</form>`;
} }
} }

View File

@ -60,8 +60,7 @@ export class PromptStageForm extends ModelForm<PromptStage, string> {
} }
renderForm(): TemplateResult { renderForm(): TemplateResult {
return html`<form class="pf-c-form pf-m-horizontal"> return html` <span>
<span>
${msg( ${msg(
"Show arbitrary input fields to the user, for example during enrollment. Data is saved in the flow context under the 'prompt_data' variable.", "Show arbitrary input fields to the user, for example during enrollment. Data is saved in the flow context under the 'prompt_data' variable.",
)} )}
@ -146,7 +145,6 @@ export class PromptStageForm extends ModelForm<PromptStage, string> {
</p> </p>
</ak-form-element-horizontal> </ak-form-element-horizontal>
</div> </div>
</ak-form-group> </ak-form-group>`;
</form>`;
} }
} }

View File

@ -39,8 +39,7 @@ export class UserDeleteStageForm extends ModelForm<UserDeleteStage, string> {
} }
renderForm(): TemplateResult { renderForm(): TemplateResult {
return html`<form class="pf-c-form pf-m-horizontal"> return html` <span>
<span>
${msg( ${msg(
"Delete the currently pending user. CAUTION, this stage does not ask for confirmation. Use a consent stage to ensure the user is aware of their actions.", "Delete the currently pending user. CAUTION, this stage does not ask for confirmation. Use a consent stage to ensure the user is aware of their actions.",
)} )}
@ -52,7 +51,6 @@ export class UserDeleteStageForm extends ModelForm<UserDeleteStage, string> {
class="pf-c-form-control" class="pf-c-form-control"
required required
/> />
</ak-form-element-horizontal> </ak-form-element-horizontal>`;
</form>`;
} }
} }

View File

@ -42,8 +42,7 @@ export class UserLoginStageForm extends ModelForm<UserLoginStage, string> {
} }
renderForm(): TemplateResult { renderForm(): TemplateResult {
return html`<form class="pf-c-form pf-m-horizontal"> return html` <span>${msg("Log the currently pending user in.")}</span>
<span>${msg("Log the currently pending user in.")}</span>
<ak-form-element-horizontal label=${msg("Name")} ?required=${true} name="name"> <ak-form-element-horizontal label=${msg("Name")} ?required=${true} name="name">
<input <input
type="text" type="text"
@ -125,7 +124,6 @@ export class UserLoginStageForm extends ModelForm<UserLoginStage, string> {
</p> </p>
</ak-form-element-horizontal> </ak-form-element-horizontal>
</div> </div>
</ak-form-group> </ak-form-group>`;
</form>`;
} }
} }

View File

@ -39,8 +39,7 @@ export class UserLogoutStageForm extends ModelForm<UserLogoutStage, string> {
} }
renderForm(): TemplateResult { renderForm(): TemplateResult {
return html`<form class="pf-c-form pf-m-horizontal"> return html` <span>${msg("Remove the user from the current session.")}</span>
<span>${msg("Remove the user from the current session.")}</span>
<ak-form-element-horizontal label=${msg("Name")} ?required=${true} name="name"> <ak-form-element-horizontal label=${msg("Name")} ?required=${true} name="name">
<input <input
type="text" type="text"
@ -48,7 +47,6 @@ export class UserLogoutStageForm extends ModelForm<UserLogoutStage, string> {
class="pf-c-form-control" class="pf-c-form-control"
required required
/> />
</ak-form-element-horizontal> </ak-form-element-horizontal>`;
</form>`;
} }
} }

View File

@ -44,8 +44,7 @@ export class UserWriteStageForm extends ModelForm<UserWriteStage, string> {
} }
renderForm(): TemplateResult { renderForm(): TemplateResult {
return html`<form class="pf-c-form pf-m-horizontal"> return html` <span>
<span>
${msg( ${msg(
`Write any data from the flow's context's 'prompt_data' to the currently pending user. If no user `Write any data from the flow's context's 'prompt_data' to the currently pending user. If no user
is pending, a new user is created, and data is written to them.`, is pending, a new user is created, and data is written to them.`,
@ -161,7 +160,6 @@ export class UserWriteStageForm extends ModelForm<UserWriteStage, string> {
</p> </p>
</ak-form-element-horizontal> </ak-form-element-horizontal>
</div> </div>
</ak-form-group> </ak-form-group>`;
</form>`;
} }
} }

View File

@ -46,8 +46,11 @@ export class TenantForm extends ModelForm<Tenant, string> {
} }
renderForm(): TemplateResult { renderForm(): TemplateResult {
return html`<form class="pf-c-form pf-m-horizontal"> return html` <ak-form-element-horizontal
<ak-form-element-horizontal label=${msg("Domain")} ?required=${true} name="domain"> label=${msg("Domain")}
?required=${true}
name="domain"
>
<input <input
type="text" type="text"
value="${first(this.instance?.domain, window.location.host)}" value="${first(this.instance?.domain, window.location.host)}"
@ -275,7 +278,6 @@ export class TenantForm extends ModelForm<Tenant, string> {
</p> </p>
</ak-form-element-horizontal> </ak-form-element-horizontal>
</div> </div>
</ak-form-group> </ak-form-group>`;
</form>`;
} }
} }

View File

@ -58,8 +58,7 @@ export class TokenForm extends ModelForm<Token, string> {
} }
renderForm(): TemplateResult { renderForm(): TemplateResult {
return html`<form class="pf-c-form pf-m-horizontal"> return html` <ak-form-element-horizontal
<ak-form-element-horizontal
label=${msg("Identifier")} label=${msg("Identifier")}
name="identifier" name="identifier"
?required=${true} ?required=${true}
@ -151,7 +150,6 @@ export class TokenForm extends ModelForm<Token, string> {
)} )}
</p> </p>
</ak-form-element-horizontal> </ak-form-element-horizontal>
${this.showExpiry ? this.renderExpiry() : html``} ${this.showExpiry ? this.renderExpiry() : html``}`;
</form>`;
} }
} }

View File

@ -68,7 +68,7 @@ export class RelatedUserAdd extends Form<{ users: number[] }> {
return data; return data;
} }
renderInlineForm(): TemplateResult { renderForm(): TemplateResult {
return html`${this.group?.isSuperuser ? html`` : html``} return html`${this.group?.isSuperuser ? html`` : html``}
<ak-form-element-horizontal label=${msg("Users to add")} name="users"> <ak-form-element-horizontal label=${msg("Users to add")} name="users">
<div class="pf-c-input-group"> <div class="pf-c-input-group">

View File

@ -34,7 +34,7 @@ export class ServiceAccountForm extends Form<UserServiceAccountRequest> {
this.result = undefined; this.result = undefined;
} }
renderInlineForm(): TemplateResult { renderForm(): TemplateResult {
return html`<ak-form-element-horizontal return html`<ak-form-element-horizontal
label=${msg("Username")} label=${msg("Username")}
?required=${true} ?required=${true}
@ -118,10 +118,10 @@ export class ServiceAccountForm extends Form<UserServiceAccountRequest> {
</form>`; </form>`;
} }
renderForm(): TemplateResult { renderFormWrapper(): TemplateResult {
if (this.result) { if (this.result) {
return this.renderResponseForm(); return this.renderResponseForm();
} }
return super.renderForm(); return super.renderFormWrapper();
} }
} }

View File

@ -64,8 +64,11 @@ export class UserForm extends ModelForm<User, number> {
} }
renderForm(): TemplateResult { renderForm(): TemplateResult {
return html`<form class="pf-c-form pf-m-horizontal"> return html` <ak-form-element-horizontal
<ak-form-element-horizontal label=${msg("Username")} ?required=${true} name="username"> label=${msg("Username")}
?required=${true}
name="username"
>
<input <input
type="text" type="text"
value="${ifDefined(this.instance?.username)}" value="${ifDefined(this.instance?.username)}"
@ -165,7 +168,6 @@ export class UserForm extends ModelForm<User, number> {
<p class="pf-c-form__helper-text"> <p class="pf-c-form__helper-text">
${msg("Set custom attributes using YAML or JSON.")} ${msg("Set custom attributes using YAML or JSON.")}
</p> </p>
</ak-form-element-horizontal> </ak-form-element-horizontal>`;
</form>`;
} }
} }

View File

@ -25,7 +25,7 @@ export class UserPasswordForm extends Form<UserPasswordSetRequest> {
}); });
} }
renderInlineForm(): TemplateResult { renderForm(): TemplateResult {
return html`<ak-form-element-horizontal return html`<ak-form-element-horizontal
label=${msg("Password")} label=${msg("Password")}
?required=${true} ?required=${true}

View File

@ -31,7 +31,7 @@ export class UserResetEmailForm extends Form<CoreUsersRecoveryEmailRetrieveReque
return new CoreApi(DEFAULT_CONFIG).coreUsersRecoveryEmailRetrieve(data); return new CoreApi(DEFAULT_CONFIG).coreUsersRecoveryEmailRetrieve(data);
} }
renderInlineForm(): TemplateResult { renderForm(): TemplateResult {
return html`<ak-form-element-horizontal return html`<ak-form-element-horizontal
label=${msg("Email stage")} label=${msg("Email stage")}
?required=${true} ?required=${true}

View File

@ -22,3 +22,5 @@ export const EVENT_THEME_CHANGE = "ak-theme-change";
export const WS_MSG_TYPE_MESSAGE = "message"; export const WS_MSG_TYPE_MESSAGE = "message";
export const WS_MSG_TYPE_REFRESH = "refresh"; export const WS_MSG_TYPE_REFRESH = "refresh";
export const LOCALSTORAGE_AUTHENTIK_KEY = "authentik-local-settings";

View File

@ -0,0 +1,63 @@
import { LOCALSTORAGE_AUTHENTIK_KEY } from "@goauthentik/common/constants";
import { msg } from "@lit/localize";
import { LitElement, ReactiveController, ReactiveControllerHost, html } from "lit";
type ReactiveLitElement = LitElement & ReactiveControllerHost;
export interface ShowHintControllerHost extends ReactiveLitElement {
showHint: boolean;
showHintController: ShowHintController;
}
const getCurrentStorageValue = (): Record<string, unknown> => {
try {
return JSON.parse(window?.localStorage.getItem(LOCALSTORAGE_AUTHENTIK_KEY) ?? "{}");
} catch (_err: unknown) {
return {};
}
};
export class ShowHintController implements ReactiveController {
host: ShowHintControllerHost;
hintToken: string;
constructor(host: ShowHintControllerHost, hintToken: string) {
(this.host = host).addController(this);
this.hintToken = hintToken;
this.hideTheHint = this.hideTheHint.bind(this);
}
hideTheHint() {
window?.localStorage.setItem(
LOCALSTORAGE_AUTHENTIK_KEY,
JSON.stringify({
...getCurrentStorageValue(),
[this.hintToken]: false,
}),
);
this.host.showHint = false;
}
hostConnected() {
const localStores = getCurrentStorageValue();
if (!(this.hintToken in localStores)) {
return;
}
// Note that we only do this IF the field exists and is defined. `undefined` means "do the
// default thing of showing the hint."
this.host.showHint = localStores[this.hintToken] as boolean;
}
render() {
return html`<ak-hint-footer
><div style="text-align: right">
<input type="checkbox" @input=${this.hideTheHint} />${msg(
"Don't show this message again.",
)}
</div></ak-hint-footer
>`;
}
}

View File

@ -0,0 +1,32 @@
import { AKElement } from "@goauthentik/app/elements/Base";
import { css, html } from "lit";
import { customElement } from "lit/decorators.js";
const style = css`
div {
display: inline-grid;
grid-row: 1;
grid-column: 2;
grid-auto-flow: column;
margin-left: var(--ak-hint__actions--MarginLeft);
text-align: right;
}
::slotted(ak-hint-body) {
grid-column: 1;
}
`;
@customElement("ak-hint-actions")
export class AkHintActions extends AKElement {
static get styles() {
return [style];
}
render() {
return html`<div part="ak-hint-actions"><slot></slot></div>`;
}
}
export default AkHintActions;

View File

@ -0,0 +1,24 @@
import { AKElement } from "@goauthentik/app/elements/Base";
import { css, html } from "lit";
import { customElement } from "lit/decorators.js";
const style = css`
div {
grid-column: 1 / -1;
font-size: var(--ak-hint__body--FontSize);
}
`;
@customElement("ak-hint-body")
export class AkHintBody extends AKElement {
static get styles() {
return [style];
}
render() {
return html`<div part="ak-hint-body"><slot></slot></div>`;
}
}
export default AkHintBody;

View File

@ -0,0 +1,26 @@
import { AKElement } from "@goauthentik/app/elements/Base";
import { css, html } from "lit";
import { customElement } from "lit/decorators.js";
const style = css`
#host {
grid-column: 1 / -1;
}
::slotted(div#host > *:not(:last-child)) {
margin-right: var(--ak-hint__footer--child--MarginRight);
}
`;
@customElement("ak-hint-footer")
export class AkHintFooter extends AKElement {
static get styles() {
return [style];
}
render() {
return html`<div id="host" part="ak-hint-footer"><slot></slot></div>`;
}
}
export default AkHintFooter;

View File

@ -0,0 +1,23 @@
import { AKElement } from "@goauthentik/app/elements/Base";
import { css, html } from "lit";
import { customElement } from "lit/decorators.js";
const style = css`
#host {
font-size: var(--ak-hint__title--FontSize);
}
`;
@customElement("ak-hint-title")
export class AkHintTitle extends AKElement {
static get styles() {
return [style];
}
render() {
return html`<div id="host" part="ak-hint-title"><slot></slot></div>`;
}
}
export default AkHintTitle;

View File

@ -0,0 +1,137 @@
import { MessageLevel } from "@goauthentik/common/messages";
import "@goauthentik/elements/buttons/ActionButton/ak-action-button";
import { showMessage } from "@goauthentik/elements/messages/MessageContainer";
import { Meta } from "@storybook/web-components";
import { TemplateResult, html } from "lit";
import "../ak-radio-input";
import "./ak-hint";
import AkHint from "./ak-hint";
import "./ak-hint-body";
import "./ak-hint-title";
const metadata: Meta<AkHint> = {
title: "Components / Patternfly Hint",
component: "ak-hint",
parameters: {
docs: {
description: {
component: "A stylized hint box",
},
},
},
};
export default metadata;
const container = (testItem: TemplateResult) =>
html` <div style="background: #fff; padding: 2em">
<style>
li {
display: block;
}
p {
color: black;
margin-top: 1em;
}
* {
--ak-hint--Color: black !important;
}
ak-hint-title::part(ak-hint-title),
ak-hint-footer::part(ak-hint-footer),
slotted::(*) {
color: black;
}
</style>
${testItem}
<ul id="radio-message-pad" style="margin-top: 1em"></ul>
</div>`;
export const Default = () => {
return container(
html` <section class="pf-c-page__main-section pf-m-no-padding-mobile">
<ak-hint>
<ak-hint-body>
<p style="padding-bottom: 1rem;">
Authentik has a new Application Wizard that can configure both an
application and its authentication provider at the same time.
<a href="(link to docs)">Learn more about the wizard here.</a>
</p>
<ak-action-button
class="pf-m-secondary"
.apiRequest=${() => {
showMessage({
message: "This would have shown the wizard",
level: MessageLevel.success,
});
}}
>Create with Wizard</ak-action-button
></ak-hint-body
>
</ak-hint>
</section>`,
);
};
export const WithTitle = () => {
return container(
html` <section class="pf-c-page__main-section pf-m-no-padding-mobile">
<ak-hint>
<ak-hint-title>New Application Wizard</ak-hint-title>
<ak-hint-body>
<p style="padding-bottom: 1rem;">
Authentik has a new Application Wizard that can configure both an
application and its authentication provider at the same time.
<a href="(link to docs)">Learn more about the wizard here.</a>
</p>
<ak-action-button
class="pf-m-secondary"
.apiRequest=${() => {
showMessage({
message: "This would have shown the wizard",
level: MessageLevel.success,
});
}}
>Create with Wizard</ak-action-button
></ak-hint-body
>
</ak-hint>
</section>`,
);
};
export const WithTitleAndFooter = () => {
return container(
html` <section class="pf-c-page__main-section pf-m-no-padding-mobile">
<ak-hint>
<ak-hint-title>New Application Wizard</ak-hint-title>
<ak-hint-body>
<p style="padding-bottom: 1rem;">
Authentik has a new Application Wizard that can configure both an
application and its authentication provider at the same time.
<a href="(link to docs)">Learn more about the wizard here.</a>
</p>
<ak-action-button
class="pf-m-secondary"
.apiRequest=${() => {
showMessage({
message: "This would have shown the wizard",
level: MessageLevel.success,
});
}}
>Create with Wizard</ak-action-button
></ak-hint-body
>
<ak-hint-footer
><div style="text-align: right">
<input type="checkbox" /> Don't show this message again.
</div></ak-hint-footer
>
</ak-hint>
</section>`,
);
};

View File

@ -0,0 +1,72 @@
import { AKElement } from "@goauthentik/app/elements/Base";
import { css, html } from "lit";
import { customElement } from "lit/decorators.js";
const styles = css`
:host {
--ak-hint--GridRowGap: var(--pf-global--spacer--md);
--ak-hint--PaddingTop: var(--pf-global--spacer--md);
--ak-hint--PaddingRight: var(--pf-global--spacer--lg);
--ak-hint--PaddingBottom: var(--pf-global--spacer--md);
--ak-hint--PaddingLeft: var(--pf-global--spacer--lg);
--ak-hint--BackgroundColor: var(--pf-global--palette--blue-50);
--ak-hint--BorderColor: var(--pf-global--palette--blue-100);
--ak-hint--BorderWidth: var(--pf-global--BorderWidth--sm);
--ak-hint--BoxShadow: var(--pf-global--BoxShadow--sm);
--ak-hint--Color: var(--pf-global--Color--100);
/* Hint Title */
--ak-hint__title--FontSize: var(--pf-global--FontSize--lg);
/* Hint Body */
--ak-hint__body--FontSize: var(--pf-global--FontSize--md);
/* Hint Footer */
--ak-hint__footer--child--MarginRight: var(--pf-global--spacer--md);
/* Hint Actions */
--ak-hint__actions--MarginLeft: var(--pf-global--spacer--2xl);
--ak-hint__actions--c-dropdown--MarginTop: calc(
var(--pf-global--spacer--form-element) * -1
);
}
:host([theme="dark"]) {
--ak-hint--BackgroundColor: var(--ak-dark-background-darker);
--ak-hint--BorderColor: var(--ak-dark-background-lighter);
--ak-hint--Color: var(--ak-dark-foreground);
}
div#host {
display: flex;
flex-direction: column;
gap: var(--ak-hint--GridRowGap);
background-color: var(--ak-hint--BackgroundColor);
color: var(--ak-hint--Color);
border: var(--ak-hint--BorderWidth) solid var(--ak-hint--BorderColor);
box-shadow: var(--ak-hint--BoxShadow);
padding: var(--ak-hint--PaddingTop) var(--ak-hint--PaddingRight)
var(--ak-hint--PaddingBottom) var(--ak-hint--PaddingLeft);
}
::slotted(ak-hint-title),
::slotted(ak-hint-body) {
display: grid;
grid-template-columns: 1fr auto;
grid-row-gap: var(--ak-hint--GridRowGap);
}
`;
@customElement("ak-hint")
export class AkHint extends AKElement {
static get styles() {
return [styles];
}
render() {
return html`<div part="ak-hint" id="host"><slot></slot></div>`;
}
}
export default AkHint;

View File

@ -36,13 +36,13 @@ export interface KeyUnknown {
* *
* The base form element for interacting with user inputs. * The base form element for interacting with user inputs.
* *
* All forms either[1] inherit from this class and implement the `renderInlineForm()` method to * All forms either[1] inherit from this class and implement the `renderForm()` method to
* produce the actual form, or include the form in-line as a slotted element. Bizarrely, this form * produce the actual form, or include the form in-line as a slotted element. Bizarrely, this form
* will not render at all if it's not actually in the viewport?[2] * will not render at all if it's not actually in the viewport?[2]
* *
* @element ak-form * @element ak-form
* *
* @slot - Where the form goes if `renderInlineForm()` returns undefined. * @slot - Where the form goes if `renderForm()` returns undefined.
* @fires eventname - description * @fires eventname - description
* *
* @csspart partname - description * @csspart partname - description
@ -52,7 +52,7 @@ export interface KeyUnknown {
* *
* 1. Specialization: Separate this component into three different classes: * 1. Specialization: Separate this component into three different classes:
* - The base class * - The base class
* - The "use `renderInlineForm` class * - The "use `renderForm` class
* - The slotted class. * - The slotted class.
* 2. There is already specialization-by-type throughout all of our code. * 2. There is already specialization-by-type throughout all of our code.
* Consider refactoring serializeForm() so that the conversions are on * Consider refactoring serializeForm() so that the conversions are on
@ -343,21 +343,22 @@ export abstract class Form<T> extends AKElement {
} }
} }
renderForm(): TemplateResult { renderFormWrapper(): TemplateResult {
const inline = this.renderInlineForm(); const inline = this.renderForm();
if (inline) { if (inline) {
return html`<form class="pf-c-form pf-m-horizontal" @submit=${this.submit}> return html`<form
class="pf-c-form pf-m-horizontal"
@submit=${(ev: Event) => {
ev.preventDefault();
}}
>
${inline} ${inline}
</form>`; </form>`;
} }
return html`<slot></slot>`; return html`<slot></slot>`;
} }
/** renderForm(): TemplateResult | undefined {
* Inline form render callback when inheriting this class, should be overwritten
* instead of `this.renderForm`
*/
renderInlineForm(): TemplateResult | undefined {
return undefined; return undefined;
} }
@ -378,7 +379,7 @@ export abstract class Form<T> extends AKElement {
} }
renderVisible(): TemplateResult { renderVisible(): TemplateResult {
return html` ${this.renderNonFieldErrors()} ${this.renderForm()}`; return html` ${this.renderNonFieldErrors()} ${this.renderFormWrapper()}`;
} }
render(): TemplateResult { render(): TemplateResult {

View File

@ -64,15 +64,13 @@ export class MFADeviceForm extends ModelForm<Device, number> {
} }
renderForm(): TemplateResult { renderForm(): TemplateResult {
return html`<form class="pf-c-form pf-m-horizontal"> return html` <ak-form-element-horizontal label=${msg("Name")} ?required=${true} name="name">
<ak-form-element-horizontal label=${msg("Name")} ?required=${true} name="name"> <input
<input type="text"
type="text" value="${ifDefined(this.instance?.name)}"
value="${ifDefined(this.instance?.name)}" class="pf-c-form-control"
class="pf-c-form-control" required
required />
/> </ak-form-element-horizontal>`;
</ak-form-element-horizontal>
</form>`;
} }
} }

View File

@ -43,8 +43,7 @@ export class UserTokenForm extends ModelForm<Token, string> {
} }
renderForm(): TemplateResult { renderForm(): TemplateResult {
return html`<form class="pf-c-form pf-m-horizontal"> return html` <ak-form-element-horizontal
<ak-form-element-horizontal
label=${msg("Identifier")} label=${msg("Identifier")}
?required=${true} ?required=${true}
name="identifier" name="identifier"
@ -62,7 +61,6 @@ export class UserTokenForm extends ModelForm<Token, string> {
value="${ifDefined(this.instance?.description)}" value="${ifDefined(this.instance?.description)}"
class="pf-c-form-control" class="pf-c-form-control"
/> />
</ak-form-element-horizontal> </ak-form-element-horizontal>`;
</form>`;
} }
} }

View File

@ -1404,10 +1404,6 @@
<source>Slug</source> <source>Slug</source>
<target>Slug</target> <target>Slug</target>
</trans-unit> </trans-unit>
<trans-unit id="seb8407fa6607c683">
<source>Internal application name, used in URLs.</source>
<target>Interner Applikationsname, wird in URLs verwendet.</target>
</trans-unit>
<trans-unit id="sdae55084f6cb2662"> <trans-unit id="sdae55084f6cb2662">
<source>Optionally enter a group name. Applications with identical groups are shown grouped together.</source> <source>Optionally enter a group name. Applications with identical groups are shown grouped together.</source>
<target>Geben Sie optional einen Gruppennamen ein. Anwendungen in gleicher Gruppe werden gruppiert angezeigt.</target> <target>Geben Sie optional einen Gruppennamen ein. Anwendungen in gleicher Gruppe werden gruppiert angezeigt.</target>
@ -1419,9 +1415,6 @@
<trans-unit id="s350a616ff5e145ec"> <trans-unit id="s350a616ff5e145ec">
<source>Select a provider that this application should use.</source> <source>Select a provider that this application should use.</source>
</trans-unit> </trans-unit>
<trans-unit id="scd5dff009d1fd847">
<source>Backchannel providers</source>
</trans-unit>
<trans-unit id="s4c6534a118f52fdd"> <trans-unit id="s4c6534a118f52fdd">
<source>Select backchannel providers which augment the functionality of the main provider.</source> <source>Select backchannel providers which augment the functionality of the main provider.</source>
</trans-unit> </trans-unit>
@ -1712,32 +1705,9 @@
<source>Run sync again</source> <source>Run sync again</source>
<target>Synchronisation erneut ausführen</target> <target>Synchronisation erneut ausführen</target>
</trans-unit> </trans-unit>
<trans-unit id="sf6a518045ea398f7">
<source>Application details</source>
</trans-unit>
<trans-unit id="s51b0102a7d31d0bf">
<source>Create application</source>
</trans-unit>
<trans-unit id="sdae3a34cfb38c10f">
<source>Additional UI settings</source>
<target>Weitere UI-Einstellungen</target>
</trans-unit>
<trans-unit id="s233d106d13420dd2">
<source>OAuth2/OIDC</source>
</trans-unit>
<trans-unit id="sc2cedfb22488ccb2"> <trans-unit id="sc2cedfb22488ccb2">
<source>Modern applications, APIs and Single-page applications.</source> <source>Modern applications, APIs and Single-page applications.</source>
</trans-unit> </trans-unit>
<trans-unit id="s1d93562422eeac10">
<source>SAML</source>
<target>SAML</target>
</trans-unit>
<trans-unit id="s5923f8a2226a414c">
<source>XML-based SSO standard. Use this if your application only supports SAML.</source>
</trans-unit>
<trans-unit id="s22f7a7ec3bc2c118">
<source>Legacy applications which don't natively support SSO.</source>
</trans-unit>
<trans-unit id="sc3259eb55cf91e8c"> <trans-unit id="sc3259eb55cf91e8c">
<source>LDAP</source> <source>LDAP</source>
<target>LDAP</target> <target>LDAP</target>
@ -1745,108 +1715,9 @@
<trans-unit id="sffd5481034a1bd41"> <trans-unit id="sffd5481034a1bd41">
<source>Provide an LDAP interface for applications and users to authenticate against.</source> <source>Provide an LDAP interface for applications and users to authenticate against.</source>
</trans-unit> </trans-unit>
<trans-unit id="s3cf89cb47fdde7e9">
<source>Link</source>
<target>Link</target>
</trans-unit>
<trans-unit id="s7ccc013f41f0a2c2">
<source>Authentication method</source>
</trans-unit>
<trans-unit id="sd45fc6453f617152">
<source>LDAP details</source>
<target>LDAP-Details</target>
</trans-unit>
<trans-unit id="scf72690719b7a8a1">
<source>Create service account</source>
</trans-unit>
<trans-unit id="sbda06adbba493976">
<source>Create provider</source>
<target>Anbieter erstellen</target>
</trans-unit>
<trans-unit id="s12d0cb01d9f6f3b3">
<source>Application Link</source>
</trans-unit>
<trans-unit id="s54a13196915fd76c">
<source>URL which will be opened when a user clicks on the application.</source>
</trans-unit>
<trans-unit id="sa34866db5e891cc6">
<source>Method details</source>
</trans-unit>
<trans-unit id="saf840955862a8cd0">
<source>This configuration can be used to authenticate to authentik with other APIs other otherwise programmatically.</source>
</trans-unit>
<trans-unit id="sb2f3a45baaa52dfd">
<source>By default, all service accounts can authenticate as this application, as long as they have a valid token of the type app-password.</source>
</trans-unit>
<trans-unit id="se0df976add086ec3">
<source>Web application</source>
</trans-unit>
<trans-unit id="s042fb9b0f9acc21f">
<source>Applications which handle the authentication server-side (for example, Python, Go, Rust, Java, PHP)</source>
</trans-unit>
<trans-unit id="sdf4bd51375026222">
<source>Single-page applications</source>
</trans-unit>
<trans-unit id="s7fa3c3306b77187d">
<source>Single-page applications which handle authentication in the browser (for example, Javascript, Angular, React, Vue)</source>
</trans-unit>
<trans-unit id="s3db92162f63a12b4">
<source>Native application</source>
</trans-unit>
<trans-unit id="s2f43274a59b0d384">
<source>Applications which redirect users to a non-web callback (for example, Android, iOS)</source>
</trans-unit>
<trans-unit id="sfa5f0019a09be6a7">
<source>API</source>
<target>API</target>
</trans-unit>
<trans-unit id="s4d53cad956dfc4e4">
<source>Authentication without user interaction, or machine-to-machine authentication.</source>
</trans-unit>
<trans-unit id="s134083b4613bcf87">
<source>Application type</source>
</trans-unit>
<trans-unit id="s649e7d74f27635f8">
<source>Flow used when users access this application.</source>
</trans-unit>
<trans-unit id="s9c1422a7e3d5c619">
<source>Proxy details</source>
<target>Proxy-Details</target>
</trans-unit>
<trans-unit id="s7714fdf13df8b682">
<source>External domain</source>
</trans-unit>
<trans-unit id="sf5a280bdcc775c49">
<source>External domain you will be accessing the domain from.</source>
</trans-unit>
<trans-unit id="sb11e750b3de9bb72">
<source>Import SAML Metadata</source>
</trans-unit>
<trans-unit id="s0955bd1d1b1dc710">
<source>Import the metadata document of the applicaation you want to configure.</source>
</trans-unit>
<trans-unit id="s0be509fcae72af45">
<source>Manual configuration</source>
</trans-unit>
<trans-unit id="s485b90ede24fdb19">
<source>Manually configure SAML</source>
</trans-unit>
<trans-unit id="se7d73f906d358a46">
<source>SAML details</source>
<target>SAML-Details</target>
</trans-unit>
<trans-unit id="s982a7cdc93aa6fbe">
<source>URL that authentik will redirect back to after successful authentication.</source>
</trans-unit>
<trans-unit id="sc9e75f44b775aa52">
<source>Import SAML metadata</source>
</trans-unit>
<trans-unit id="s0c9670f429e74283"> <trans-unit id="s0c9670f429e74283">
<source>New application</source> <source>New application</source>
</trans-unit> </trans-unit>
<trans-unit id="s8e1d308c09d1b400">
<source>Create a new application.</source>
</trans-unit>
<trans-unit id="s6ba50bb0842ba1e2"> <trans-unit id="s6ba50bb0842ba1e2">
<source>Applications</source> <source>Applications</source>
<target>Anwendungen</target> <target>Anwendungen</target>
@ -4021,10 +3892,6 @@ doesn't pass when either or both of the selected options are equal or above the
<source>When multiple stages are selected, the user can choose which one they want to enroll.</source> <source>When multiple stages are selected, the user can choose which one they want to enroll.</source>
<target>Wenn mehrere Stufen ausgewählt sind, kann der Benutzer wählen, welche er registrieren möchte.</target> <target>Wenn mehrere Stufen ausgewählt sind, kann der Benutzer wählen, welche er registrieren möchte.</target>
</trans-unit> </trans-unit>
<trans-unit id="s9a823993c07e5d64">
<source>Stage used to configure a WebAutnn authenticator (i.e. Yubikey, FaceID/Windows Hello).</source>
<target>Phase zum Konfigurieren eines WebAutnn-Authentifikators (z. B. Yubikey, FaceID/Windows Hello).</target>
</trans-unit>
<trans-unit id="s34b23ebbac9f6ab9"> <trans-unit id="s34b23ebbac9f6ab9">
<source>User verification</source> <source>User verification</source>
<target>Benutzerüberprüfung</target> <target>Benutzerüberprüfung</target>
@ -5930,6 +5797,84 @@ Bindings to groups/users are checked against the user of the event.</source>
</trans-unit> </trans-unit>
<trans-unit id="s6827a456c9dfc6ee"> <trans-unit id="s6827a456c9dfc6ee">
<source>When using IDP-initiated logins, the relay state will be set to this value.</source> <source>When using IDP-initiated logins, the relay state will be set to this value.</source>
</trans-unit>
<trans-unit id="s01794c0ee3629c1b">
<source>Flow Info</source>
</trans-unit>
<trans-unit id="s24bce955914b1f0a">
<source>Stage used to configure a WebAuthn authenticator (i.e. Yubikey, FaceID/Windows Hello).</source>
</trans-unit>
<trans-unit id="s1cffe58249b04669">
<source>Internal application name used in URLs.</source>
</trans-unit>
<trans-unit id="sb3d4f79d9d8b71e5">
<source>Submit</source>
</trans-unit>
<trans-unit id="se2b29e6cfe59414c">
<source>UI Settings</source>
</trans-unit>
<trans-unit id="sf45734291c57c606">
<source>OAuth2/OpenID</source>
</trans-unit>
<trans-unit id="s836148f721d8913b">
<source>Transparent Reverse Proxy</source>
</trans-unit>
<trans-unit id="s945a6b94361ee45b">
<source>For transparent reverse proxies with required authentication</source>
</trans-unit>
<trans-unit id="s60e79e1793e6bd56">
<source>Forward Auth Single Application</source>
</trans-unit>
<trans-unit id="sadf073913458acbd">
<source>For nginx's auth_request or traefix's forwardAuth</source>
</trans-unit>
<trans-unit id="s4425a1002597151e">
<source>Forward Auth Domain Level</source>
</trans-unit>
<trans-unit id="se770e9498b3bacf6">
<source>For nginx's auth_request or traefix's forwardAuth per root domain</source>
</trans-unit>
<trans-unit id="s40830ec037f34626">
<source>Configure SAML provider manually</source>
</trans-unit>
<trans-unit id="s154eea2a61d44655">
<source>RADIUS Configuration</source>
</trans-unit>
<trans-unit id="sea9fc40dfd1d18b1">
<source>Configure RADIUS provider manually</source>
</trans-unit>
<trans-unit id="s5a8f04c6ef292743">
<source>SCIM configuration</source>
</trans-unit>
<trans-unit id="sa1b0052ae095b9b3">
<source>Configure SCIM provider manually</source>
</trans-unit>
<trans-unit id="s15831fa50a116545">
<source>Saving Application...</source>
</trans-unit>
<trans-unit id="s823abdb61543a826">
<source>Authentik was unable to save this application:</source>
</trans-unit>
<trans-unit id="s848288f8c2265aad">
<source>Your application has been saved</source>
</trans-unit>
<trans-unit id="sf60f1e5b76897c93">
<source>In the Application:</source>
</trans-unit>
<trans-unit id="s7ce65cf482b7bff0">
<source>In the Provider:</source>
</trans-unit>
<trans-unit id="s67d858051b34c38b">
<source>Method's display Name.</source>
</trans-unit>
<trans-unit id="h10ef80d434185070">
<source>Use this provider with nginx's <x id="0" equiv-text="&lt;code&gt;"/>auth_request<x id="1" equiv-text="&lt;/code&gt;"/> or traefik's
<x id="2" equiv-text="&lt;code&gt;"/>forwardAuth<x id="3" equiv-text="&lt;/code&gt;"/>. Each application/domain needs its own provider.
Additionally, on each domain, <x id="4" equiv-text="&lt;code&gt;"/>/outpost.goauthentik.io<x id="5" equiv-text="&lt;/code&gt;"/> must be
routed to the outpost (when using a managed outpost, this is done for you).</source>
</trans-unit>
<trans-unit id="s71c5d51d5a357dbd">
<source>Don't show this message again.</source>
</trans-unit> </trans-unit>
</body> </body>
</file> </file>

View File

@ -1475,10 +1475,6 @@
<source>Slug</source> <source>Slug</source>
<target>Slug</target> <target>Slug</target>
</trans-unit> </trans-unit>
<trans-unit id="seb8407fa6607c683">
<source>Internal application name, used in URLs.</source>
<target>Internal application name, used in URLs.</target>
</trans-unit>
<trans-unit id="sdae55084f6cb2662"> <trans-unit id="sdae55084f6cb2662">
<source>Optionally enter a group name. Applications with identical groups are shown grouped together.</source> <source>Optionally enter a group name. Applications with identical groups are shown grouped together.</source>
<target>Optionally enter a group name. Applications with identical groups are shown grouped together.</target> <target>Optionally enter a group name. Applications with identical groups are shown grouped together.</target>
@ -1491,10 +1487,6 @@
<source>Select a provider that this application should use.</source> <source>Select a provider that this application should use.</source>
<target>Select a provider that this application should use.</target> <target>Select a provider that this application should use.</target>
</trans-unit> </trans-unit>
<trans-unit id="scd5dff009d1fd847">
<source>Backchannel providers</source>
<target>Backchannel providers</target>
</trans-unit>
<trans-unit id="s4c6534a118f52fdd"> <trans-unit id="s4c6534a118f52fdd">
<source>Select backchannel providers which augment the functionality of the main provider.</source> <source>Select backchannel providers which augment the functionality of the main provider.</source>
<target>Select backchannel providers which augment the functionality of the main provider.</target> <target>Select backchannel providers which augment the functionality of the main provider.</target>
@ -1807,38 +1799,10 @@
<source>Run sync again</source> <source>Run sync again</source>
<target>Run sync again</target> <target>Run sync again</target>
</trans-unit> </trans-unit>
<trans-unit id="sf6a518045ea398f7">
<source>Application details</source>
<target>Application details</target>
</trans-unit>
<trans-unit id="s51b0102a7d31d0bf">
<source>Create application</source>
<target>Create application</target>
</trans-unit>
<trans-unit id="sdae3a34cfb38c10f">
<source>Additional UI settings</source>
<target>Additional UI settings</target>
</trans-unit>
<trans-unit id="s233d106d13420dd2">
<source>OAuth2/OIDC</source>
<target>OAuth2/OIDC</target>
</trans-unit>
<trans-unit id="sc2cedfb22488ccb2"> <trans-unit id="sc2cedfb22488ccb2">
<source>Modern applications, APIs and Single-page applications.</source> <source>Modern applications, APIs and Single-page applications.</source>
<target>Modern applications, APIs and Single-page applications.</target> <target>Modern applications, APIs and Single-page applications.</target>
</trans-unit> </trans-unit>
<trans-unit id="s1d93562422eeac10">
<source>SAML</source>
<target>SAML</target>
</trans-unit>
<trans-unit id="s5923f8a2226a414c">
<source>XML-based SSO standard. Use this if your application only supports SAML.</source>
<target>XML-based SSO standard. Use this if your application only supports SAML.</target>
</trans-unit>
<trans-unit id="s22f7a7ec3bc2c118">
<source>Legacy applications which don't natively support SSO.</source>
<target>Legacy applications which don't natively support SSO.</target>
</trans-unit>
<trans-unit id="sc3259eb55cf91e8c"> <trans-unit id="sc3259eb55cf91e8c">
<source>LDAP</source> <source>LDAP</source>
<target>LDAP</target> <target>LDAP</target>
@ -1847,134 +1811,10 @@
<source>Provide an LDAP interface for applications and users to authenticate against.</source> <source>Provide an LDAP interface for applications and users to authenticate against.</source>
<target>Provide an LDAP interface for applications and users to authenticate against.</target> <target>Provide an LDAP interface for applications and users to authenticate against.</target>
</trans-unit> </trans-unit>
<trans-unit id="s3cf89cb47fdde7e9">
<source>Link</source>
<target>Link</target>
</trans-unit>
<trans-unit id="s7ccc013f41f0a2c2">
<source>Authentication method</source>
<target>Authentication method</target>
</trans-unit>
<trans-unit id="sd45fc6453f617152">
<source>LDAP details</source>
<target>LDAP details</target>
</trans-unit>
<trans-unit id="scf72690719b7a8a1">
<source>Create service account</source>
<target>Create service account</target>
</trans-unit>
<trans-unit id="sbda06adbba493976">
<source>Create provider</source>
<target>Create provider</target>
</trans-unit>
<trans-unit id="s12d0cb01d9f6f3b3">
<source>Application Link</source>
<target>Application Link</target>
</trans-unit>
<trans-unit id="s54a13196915fd76c">
<source>URL which will be opened when a user clicks on the application.</source>
<target>URL which will be opened when a user clicks on the application.</target>
</trans-unit>
<trans-unit id="sa34866db5e891cc6">
<source>Method details</source>
<target>Method details</target>
</trans-unit>
<trans-unit id="saf840955862a8cd0">
<source>This configuration can be used to authenticate to authentik with other APIs other otherwise programmatically.</source>
<target>This configuration can be used to authenticate to authentik with other APIs other otherwise programmatically.</target>
</trans-unit>
<trans-unit id="sb2f3a45baaa52dfd">
<source>By default, all service accounts can authenticate as this application, as long as they have a valid token of the type app-password.</source>
<target>By default, all service accounts can authenticate as this application, as long as they have a valid token of the type app-password.</target>
</trans-unit>
<trans-unit id="se0df976add086ec3">
<source>Web application</source>
<target>Web application</target>
</trans-unit>
<trans-unit id="s042fb9b0f9acc21f">
<source>Applications which handle the authentication server-side (for example, Python, Go, Rust, Java, PHP)</source>
<target>Applications which handle the authentication server-side (for example, Python, Go, Rust, Java, PHP)</target>
</trans-unit>
<trans-unit id="sdf4bd51375026222">
<source>Single-page applications</source>
<target>Single-page applications</target>
</trans-unit>
<trans-unit id="s7fa3c3306b77187d">
<source>Single-page applications which handle authentication in the browser (for example, Javascript, Angular, React, Vue)</source>
<target>Single-page applications which handle authentication in the browser (for example, Javascript, Angular, React, Vue)</target>
</trans-unit>
<trans-unit id="s3db92162f63a12b4">
<source>Native application</source>
<target>Native application</target>
</trans-unit>
<trans-unit id="s2f43274a59b0d384">
<source>Applications which redirect users to a non-web callback (for example, Android, iOS)</source>
<target>Applications which redirect users to a non-web callback (for example, Android, iOS)</target>
</trans-unit>
<trans-unit id="sfa5f0019a09be6a7">
<source>API</source>
<target>API</target>
</trans-unit>
<trans-unit id="s4d53cad956dfc4e4">
<source>Authentication without user interaction, or machine-to-machine authentication.</source>
<target>Authentication without user interaction, or machine-to-machine authentication.</target>
</trans-unit>
<trans-unit id="s134083b4613bcf87">
<source>Application type</source>
<target>Application type</target>
</trans-unit>
<trans-unit id="s649e7d74f27635f8">
<source>Flow used when users access this application.</source>
<target>Flow used when users access this application.</target>
</trans-unit>
<trans-unit id="s9c1422a7e3d5c619">
<source>Proxy details</source>
<target>Proxy details</target>
</trans-unit>
<trans-unit id="s7714fdf13df8b682">
<source>External domain</source>
<target>External domain</target>
</trans-unit>
<trans-unit id="sf5a280bdcc775c49">
<source>External domain you will be accessing the domain from.</source>
<target>External domain you will be accessing the domain from.</target>
</trans-unit>
<trans-unit id="sb11e750b3de9bb72">
<source>Import SAML Metadata</source>
<target>Import SAML Metadata</target>
</trans-unit>
<trans-unit id="s0955bd1d1b1dc710">
<source>Import the metadata document of the applicaation you want to configure.</source>
<target>Import the metadata document of the applicaation you want to configure.</target>
</trans-unit>
<trans-unit id="s0be509fcae72af45">
<source>Manual configuration</source>
<target>Manual configuration</target>
</trans-unit>
<trans-unit id="s485b90ede24fdb19">
<source>Manually configure SAML</source>
<target>Manually configure SAML</target>
</trans-unit>
<trans-unit id="se7d73f906d358a46">
<source>SAML details</source>
<target>SAML details</target>
</trans-unit>
<trans-unit id="s982a7cdc93aa6fbe">
<source>URL that authentik will redirect back to after successful authentication.</source>
<target>URL that authentik will redirect back to after successful authentication.</target>
</trans-unit>
<trans-unit id="sc9e75f44b775aa52">
<source>Import SAML metadata</source>
<target>Import SAML metadata</target>
</trans-unit>
<trans-unit id="s0c9670f429e74283"> <trans-unit id="s0c9670f429e74283">
<source>New application</source> <source>New application</source>
<target>New application</target> <target>New application</target>
</trans-unit> </trans-unit>
<trans-unit id="s8e1d308c09d1b400">
<source>Create a new application.</source>
<target>Create a new application.</target>
</trans-unit>
<trans-unit id="s6ba50bb0842ba1e2"> <trans-unit id="s6ba50bb0842ba1e2">
<source>Applications</source> <source>Applications</source>
<target>Applications</target> <target>Applications</target>
@ -4245,10 +4085,6 @@ doesn't pass when either or both of the selected options are equal or above the
<source>When multiple stages are selected, the user can choose which one they want to enroll.</source> <source>When multiple stages are selected, the user can choose which one they want to enroll.</source>
<target>When multiple stages are selected, the user can choose which one they want to enroll.</target> <target>When multiple stages are selected, the user can choose which one they want to enroll.</target>
</trans-unit> </trans-unit>
<trans-unit id="s9a823993c07e5d64">
<source>Stage used to configure a WebAutnn authenticator (i.e. Yubikey, FaceID/Windows Hello).</source>
<target>Stage used to configure a WebAutnn authenticator (i.e. Yubikey, FaceID/Windows Hello).</target>
</trans-unit>
<trans-unit id="s34b23ebbac9f6ab9"> <trans-unit id="s34b23ebbac9f6ab9">
<source>User verification</source> <source>User verification</source>
<target>User verification</target> <target>User verification</target>
@ -6244,6 +6080,84 @@ Bindings to groups/users are checked against the user of the event.</source>
</trans-unit> </trans-unit>
<trans-unit id="s6827a456c9dfc6ee"> <trans-unit id="s6827a456c9dfc6ee">
<source>When using IDP-initiated logins, the relay state will be set to this value.</source> <source>When using IDP-initiated logins, the relay state will be set to this value.</source>
</trans-unit>
<trans-unit id="s01794c0ee3629c1b">
<source>Flow Info</source>
</trans-unit>
<trans-unit id="s24bce955914b1f0a">
<source>Stage used to configure a WebAuthn authenticator (i.e. Yubikey, FaceID/Windows Hello).</source>
</trans-unit>
<trans-unit id="s1cffe58249b04669">
<source>Internal application name used in URLs.</source>
</trans-unit>
<trans-unit id="sb3d4f79d9d8b71e5">
<source>Submit</source>
</trans-unit>
<trans-unit id="se2b29e6cfe59414c">
<source>UI Settings</source>
</trans-unit>
<trans-unit id="sf45734291c57c606">
<source>OAuth2/OpenID</source>
</trans-unit>
<trans-unit id="s836148f721d8913b">
<source>Transparent Reverse Proxy</source>
</trans-unit>
<trans-unit id="s945a6b94361ee45b">
<source>For transparent reverse proxies with required authentication</source>
</trans-unit>
<trans-unit id="s60e79e1793e6bd56">
<source>Forward Auth Single Application</source>
</trans-unit>
<trans-unit id="sadf073913458acbd">
<source>For nginx's auth_request or traefix's forwardAuth</source>
</trans-unit>
<trans-unit id="s4425a1002597151e">
<source>Forward Auth Domain Level</source>
</trans-unit>
<trans-unit id="se770e9498b3bacf6">
<source>For nginx's auth_request or traefix's forwardAuth per root domain</source>
</trans-unit>
<trans-unit id="s40830ec037f34626">
<source>Configure SAML provider manually</source>
</trans-unit>
<trans-unit id="s154eea2a61d44655">
<source>RADIUS Configuration</source>
</trans-unit>
<trans-unit id="sea9fc40dfd1d18b1">
<source>Configure RADIUS provider manually</source>
</trans-unit>
<trans-unit id="s5a8f04c6ef292743">
<source>SCIM configuration</source>
</trans-unit>
<trans-unit id="sa1b0052ae095b9b3">
<source>Configure SCIM provider manually</source>
</trans-unit>
<trans-unit id="s15831fa50a116545">
<source>Saving Application...</source>
</trans-unit>
<trans-unit id="s823abdb61543a826">
<source>Authentik was unable to save this application:</source>
</trans-unit>
<trans-unit id="s848288f8c2265aad">
<source>Your application has been saved</source>
</trans-unit>
<trans-unit id="sf60f1e5b76897c93">
<source>In the Application:</source>
</trans-unit>
<trans-unit id="s7ce65cf482b7bff0">
<source>In the Provider:</source>
</trans-unit>
<trans-unit id="s67d858051b34c38b">
<source>Method's display Name.</source>
</trans-unit>
<trans-unit id="h10ef80d434185070">
<source>Use this provider with nginx's <x id="0" equiv-text="&lt;code&gt;"/>auth_request<x id="1" equiv-text="&lt;/code&gt;"/> or traefik's
<x id="2" equiv-text="&lt;code&gt;"/>forwardAuth<x id="3" equiv-text="&lt;/code&gt;"/>. Each application/domain needs its own provider.
Additionally, on each domain, <x id="4" equiv-text="&lt;code&gt;"/>/outpost.goauthentik.io<x id="5" equiv-text="&lt;/code&gt;"/> must be
routed to the outpost (when using a managed outpost, this is done for you).</source>
</trans-unit>
<trans-unit id="s71c5d51d5a357dbd">
<source>Don't show this message again.</source>
</trans-unit> </trans-unit>
</body> </body>
</file> </file>

View File

@ -1378,10 +1378,6 @@
<source>Slug</source> <source>Slug</source>
<target>babosa</target> <target>babosa</target>
</trans-unit> </trans-unit>
<trans-unit id="seb8407fa6607c683">
<source>Internal application name, used in URLs.</source>
<target>Nombre de la aplicación interna, utilizado en las URL.</target>
</trans-unit>
<trans-unit id="sdae55084f6cb2662"> <trans-unit id="sdae55084f6cb2662">
<source>Optionally enter a group name. Applications with identical groups are shown grouped together.</source> <source>Optionally enter a group name. Applications with identical groups are shown grouped together.</source>
</trans-unit> </trans-unit>
@ -1392,9 +1388,6 @@
<trans-unit id="s350a616ff5e145ec"> <trans-unit id="s350a616ff5e145ec">
<source>Select a provider that this application should use.</source> <source>Select a provider that this application should use.</source>
</trans-unit> </trans-unit>
<trans-unit id="scd5dff009d1fd847">
<source>Backchannel providers</source>
</trans-unit>
<trans-unit id="s4c6534a118f52fdd"> <trans-unit id="s4c6534a118f52fdd">
<source>Select backchannel providers which augment the functionality of the main provider.</source> <source>Select backchannel providers which augment the functionality of the main provider.</source>
</trans-unit> </trans-unit>
@ -1684,30 +1677,9 @@
<source>Run sync again</source> <source>Run sync again</source>
<target>Vuelve a ejecutar la sincronización</target> <target>Vuelve a ejecutar la sincronización</target>
</trans-unit> </trans-unit>
<trans-unit id="sf6a518045ea398f7">
<source>Application details</source>
</trans-unit>
<trans-unit id="s51b0102a7d31d0bf">
<source>Create application</source>
</trans-unit>
<trans-unit id="sdae3a34cfb38c10f">
<source>Additional UI settings</source>
</trans-unit>
<trans-unit id="s233d106d13420dd2">
<source>OAuth2/OIDC</source>
</trans-unit>
<trans-unit id="sc2cedfb22488ccb2"> <trans-unit id="sc2cedfb22488ccb2">
<source>Modern applications, APIs and Single-page applications.</source> <source>Modern applications, APIs and Single-page applications.</source>
</trans-unit> </trans-unit>
<trans-unit id="s1d93562422eeac10">
<source>SAML</source>
</trans-unit>
<trans-unit id="s5923f8a2226a414c">
<source>XML-based SSO standard. Use this if your application only supports SAML.</source>
</trans-unit>
<trans-unit id="s22f7a7ec3bc2c118">
<source>Legacy applications which don't natively support SSO.</source>
</trans-unit>
<trans-unit id="sc3259eb55cf91e8c"> <trans-unit id="sc3259eb55cf91e8c">
<source>LDAP</source> <source>LDAP</source>
<target>LDAP</target> <target>LDAP</target>
@ -1715,103 +1687,9 @@
<trans-unit id="sffd5481034a1bd41"> <trans-unit id="sffd5481034a1bd41">
<source>Provide an LDAP interface for applications and users to authenticate against.</source> <source>Provide an LDAP interface for applications and users to authenticate against.</source>
</trans-unit> </trans-unit>
<trans-unit id="s3cf89cb47fdde7e9">
<source>Link</source>
</trans-unit>
<trans-unit id="s7ccc013f41f0a2c2">
<source>Authentication method</source>
</trans-unit>
<trans-unit id="sd45fc6453f617152">
<source>LDAP details</source>
</trans-unit>
<trans-unit id="scf72690719b7a8a1">
<source>Create service account</source>
</trans-unit>
<trans-unit id="sbda06adbba493976">
<source>Create provider</source>
<target>Crear proveedor</target>
</trans-unit>
<trans-unit id="s12d0cb01d9f6f3b3">
<source>Application Link</source>
</trans-unit>
<trans-unit id="s54a13196915fd76c">
<source>URL which will be opened when a user clicks on the application.</source>
</trans-unit>
<trans-unit id="sa34866db5e891cc6">
<source>Method details</source>
</trans-unit>
<trans-unit id="saf840955862a8cd0">
<source>This configuration can be used to authenticate to authentik with other APIs other otherwise programmatically.</source>
</trans-unit>
<trans-unit id="sb2f3a45baaa52dfd">
<source>By default, all service accounts can authenticate as this application, as long as they have a valid token of the type app-password.</source>
</trans-unit>
<trans-unit id="se0df976add086ec3">
<source>Web application</source>
</trans-unit>
<trans-unit id="s042fb9b0f9acc21f">
<source>Applications which handle the authentication server-side (for example, Python, Go, Rust, Java, PHP)</source>
</trans-unit>
<trans-unit id="sdf4bd51375026222">
<source>Single-page applications</source>
</trans-unit>
<trans-unit id="s7fa3c3306b77187d">
<source>Single-page applications which handle authentication in the browser (for example, Javascript, Angular, React, Vue)</source>
</trans-unit>
<trans-unit id="s3db92162f63a12b4">
<source>Native application</source>
</trans-unit>
<trans-unit id="s2f43274a59b0d384">
<source>Applications which redirect users to a non-web callback (for example, Android, iOS)</source>
</trans-unit>
<trans-unit id="sfa5f0019a09be6a7">
<source>API</source>
</trans-unit>
<trans-unit id="s4d53cad956dfc4e4">
<source>Authentication without user interaction, or machine-to-machine authentication.</source>
</trans-unit>
<trans-unit id="s134083b4613bcf87">
<source>Application type</source>
</trans-unit>
<trans-unit id="s649e7d74f27635f8">
<source>Flow used when users access this application.</source>
</trans-unit>
<trans-unit id="s9c1422a7e3d5c619">
<source>Proxy details</source>
</trans-unit>
<trans-unit id="s7714fdf13df8b682">
<source>External domain</source>
</trans-unit>
<trans-unit id="sf5a280bdcc775c49">
<source>External domain you will be accessing the domain from.</source>
</trans-unit>
<trans-unit id="sb11e750b3de9bb72">
<source>Import SAML Metadata</source>
</trans-unit>
<trans-unit id="s0955bd1d1b1dc710">
<source>Import the metadata document of the applicaation you want to configure.</source>
</trans-unit>
<trans-unit id="s0be509fcae72af45">
<source>Manual configuration</source>
</trans-unit>
<trans-unit id="s485b90ede24fdb19">
<source>Manually configure SAML</source>
</trans-unit>
<trans-unit id="se7d73f906d358a46">
<source>SAML details</source>
</trans-unit>
<trans-unit id="s982a7cdc93aa6fbe">
<source>URL that authentik will redirect back to after successful authentication.</source>
</trans-unit>
<trans-unit id="sc9e75f44b775aa52">
<source>Import SAML metadata</source>
</trans-unit>
<trans-unit id="s0c9670f429e74283"> <trans-unit id="s0c9670f429e74283">
<source>New application</source> <source>New application</source>
</trans-unit> </trans-unit>
<trans-unit id="s8e1d308c09d1b400">
<source>Create a new application.</source>
</trans-unit>
<trans-unit id="s6ba50bb0842ba1e2"> <trans-unit id="s6ba50bb0842ba1e2">
<source>Applications</source> <source>Applications</source>
<target>Aplicaciones</target> <target>Aplicaciones</target>
@ -3948,10 +3826,6 @@ doesn't pass when either or both of the selected options are equal or above the
<trans-unit id="s7e5af9c6ba6f5cc6"> <trans-unit id="s7e5af9c6ba6f5cc6">
<source>When multiple stages are selected, the user can choose which one they want to enroll.</source> <source>When multiple stages are selected, the user can choose which one they want to enroll.</source>
</trans-unit> </trans-unit>
<trans-unit id="s9a823993c07e5d64">
<source>Stage used to configure a WebAutnn authenticator (i.e. Yubikey, FaceID/Windows Hello).</source>
<target>Etapa utilizada para configurar un autenticador WebAutnn (es decir, Yubikey, FaceID/Windows Hello).</target>
</trans-unit>
<trans-unit id="s34b23ebbac9f6ab9"> <trans-unit id="s34b23ebbac9f6ab9">
<source>User verification</source> <source>User verification</source>
<target>Verificación del usuario</target> <target>Verificación del usuario</target>
@ -5838,6 +5712,84 @@ Bindings to groups/users are checked against the user of the event.</source>
</trans-unit> </trans-unit>
<trans-unit id="s6827a456c9dfc6ee"> <trans-unit id="s6827a456c9dfc6ee">
<source>When using IDP-initiated logins, the relay state will be set to this value.</source> <source>When using IDP-initiated logins, the relay state will be set to this value.</source>
</trans-unit>
<trans-unit id="s01794c0ee3629c1b">
<source>Flow Info</source>
</trans-unit>
<trans-unit id="s24bce955914b1f0a">
<source>Stage used to configure a WebAuthn authenticator (i.e. Yubikey, FaceID/Windows Hello).</source>
</trans-unit>
<trans-unit id="s1cffe58249b04669">
<source>Internal application name used in URLs.</source>
</trans-unit>
<trans-unit id="sb3d4f79d9d8b71e5">
<source>Submit</source>
</trans-unit>
<trans-unit id="se2b29e6cfe59414c">
<source>UI Settings</source>
</trans-unit>
<trans-unit id="sf45734291c57c606">
<source>OAuth2/OpenID</source>
</trans-unit>
<trans-unit id="s836148f721d8913b">
<source>Transparent Reverse Proxy</source>
</trans-unit>
<trans-unit id="s945a6b94361ee45b">
<source>For transparent reverse proxies with required authentication</source>
</trans-unit>
<trans-unit id="s60e79e1793e6bd56">
<source>Forward Auth Single Application</source>
</trans-unit>
<trans-unit id="sadf073913458acbd">
<source>For nginx's auth_request or traefix's forwardAuth</source>
</trans-unit>
<trans-unit id="s4425a1002597151e">
<source>Forward Auth Domain Level</source>
</trans-unit>
<trans-unit id="se770e9498b3bacf6">
<source>For nginx's auth_request or traefix's forwardAuth per root domain</source>
</trans-unit>
<trans-unit id="s40830ec037f34626">
<source>Configure SAML provider manually</source>
</trans-unit>
<trans-unit id="s154eea2a61d44655">
<source>RADIUS Configuration</source>
</trans-unit>
<trans-unit id="sea9fc40dfd1d18b1">
<source>Configure RADIUS provider manually</source>
</trans-unit>
<trans-unit id="s5a8f04c6ef292743">
<source>SCIM configuration</source>
</trans-unit>
<trans-unit id="sa1b0052ae095b9b3">
<source>Configure SCIM provider manually</source>
</trans-unit>
<trans-unit id="s15831fa50a116545">
<source>Saving Application...</source>
</trans-unit>
<trans-unit id="s823abdb61543a826">
<source>Authentik was unable to save this application:</source>
</trans-unit>
<trans-unit id="s848288f8c2265aad">
<source>Your application has been saved</source>
</trans-unit>
<trans-unit id="sf60f1e5b76897c93">
<source>In the Application:</source>
</trans-unit>
<trans-unit id="s7ce65cf482b7bff0">
<source>In the Provider:</source>
</trans-unit>
<trans-unit id="s67d858051b34c38b">
<source>Method's display Name.</source>
</trans-unit>
<trans-unit id="h10ef80d434185070">
<source>Use this provider with nginx's <x id="0" equiv-text="&lt;code&gt;"/>auth_request<x id="1" equiv-text="&lt;/code&gt;"/> or traefik's
<x id="2" equiv-text="&lt;code&gt;"/>forwardAuth<x id="3" equiv-text="&lt;/code&gt;"/>. Each application/domain needs its own provider.
Additionally, on each domain, <x id="4" equiv-text="&lt;code&gt;"/>/outpost.goauthentik.io<x id="5" equiv-text="&lt;/code&gt;"/> must be
routed to the outpost (when using a managed outpost, this is done for you).</source>
</trans-unit>
<trans-unit id="s71c5d51d5a357dbd">
<source>Don't show this message again.</source>
</trans-unit> </trans-unit>
</body> </body>
</file> </file>

Some files were not shown because too many files have changed in this diff Show More