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
on:
schedule:
- cron: "0 0 * * *" # every day at midnight
# schedule:
# - cron: "0 0 * * *" # every day at midnight
workflow_dispatch:
jobs:

View File

@ -17,8 +17,8 @@ TestCase.maxDiff = None
class PytestTestRunner(DiscoverRunner): # pragma: no cover
"""Runs pytest to discover and run tests."""
def __init__(self, verbosity=1, failfast=False, keepdb=False, **kwargs):
super().__init__(verbosity, failfast, keepdb, **kwargs)
def __init__(self, **kwargs):
super().__init__(**kwargs)
self.args = []
if self.failfast:
@ -47,6 +47,7 @@ class PytestTestRunner(DiscoverRunner): # pragma: no cover
@classmethod
def add_arguments(cls, parser: ArgumentParser):
"""Add more pytest-specific arguments"""
DiscoverRunner.add_arguments(parser)
parser.add_argument(
"--randomly-seed",
type=int,
@ -55,9 +56,6 @@ class PytestTestRunner(DiscoverRunner): # pragma: no cover
"Default behaviour: use random.Random().getrandbits(32), so the seed is"
"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):
"""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/trace v1.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/text v0.13.0 // 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.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.16.0 h1:7eBu7KsSvFDtSXUIDbh3aqlK4DPsZ1rByC8PFfBThos=
golang.org/x/net v0.16.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=
golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM=
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-20190226205417-e64efc72b421/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]]
name = "sentry-sdk"
version = "1.31.0"
version = "1.32.0"
description = "Python client for Sentry (https://sentry.io)"
optional = false
python-versions = "*"
files = [
{file = "sentry-sdk-1.31.0.tar.gz", hash = "sha256:6de2e88304873484207fed836388e422aeff000609b104c802749fd89d56ba5b"},
{file = "sentry_sdk-1.31.0-py2.py3-none-any.whl", hash = "sha256:64a7141005fb775b9db298a30de93e3b83e0ddd1232dc6f36eb38aebc1553291"},
{file = "sentry-sdk-1.32.0.tar.gz", hash = "sha256:935e8fbd7787a3702457393b74b13d89a5afb67185bc0af85c00cb27cbd42e7c"},
{file = "sentry_sdk-1.32.0-py2.py3-none-any.whl", hash = "sha256:eeb0b3550536f3bbc05bb1c7e0feb3a78d74acb43b607159a606ed2ec0a33a4d"},
]
[package.dependencies]

View File

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

View File

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

View File

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

View File

@ -43,7 +43,24 @@ def get_docker_tag() -> str:
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"""
container: Optional[Container] = None
@ -82,13 +99,8 @@ class SeleniumTestCase(StaticLiveServerTestCase):
state = container.attrs.get("State", {})
if "Health" not in state:
return container
while True:
container.reload()
status = container.attrs.get("State", {}).get("Health", {}).get("Status")
if status == "healthy":
return container
self.logger.info("Container failed healthcheck")
sleep(1)
self.wait_for_container(container)
return container
def output_container_logs(self, container: Optional[Container] = None):
"""Output the container logs to our STDOUT"""

View File

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

View File

@ -1,7 +1,6 @@
"""outpost tests"""
from shutil import rmtree
from tempfile import mkdtemp
from time import sleep
import yaml
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.providers.proxy.controllers.docker import DockerController
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"""
def _start_container(self, ssl_folder: str) -> Container:
@ -45,12 +44,8 @@ class TestProxyDocker(ChannelsLiveServerTestCase):
}
},
)
while True:
container.reload()
status = container.attrs.get("State", {}).get("Health", {}).get("Status")
if status == "healthy":
return container
sleep(1)
self.wait_for_container(container)
return container
def setUp(self):
super().setUp()

190
web/package-lock.json generated
View File

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

View File

@ -61,14 +61,14 @@
"yaml": "^2.3.2"
},
"devDependencies": {
"@babel/core": "^7.23.0",
"@babel/core": "^7.23.2",
"@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-property-in-object": "^7.22.11",
"@babel/plugin-transform-runtime": "^7.22.15",
"@babel/preset-env": "^7.22.20",
"@babel/preset-typescript": "^7.23.0",
"@babel/plugin-transform-runtime": "^7.23.2",
"@babel/preset-env": "^7.23.2",
"@babel/preset-typescript": "^7.23.2",
"@hcaptcha/types": "^1.0.3",
"@jackfranklin/rollup-plugin-markdown": "^0.4.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
label=${msg("User")}
?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>) {
const spaceify = (src: Record<string, string>) =>
Object.values(src).map((msg) => `\u00a0\u00a0\u00a0\u00a0${msg}`);
@ -151,10 +152,14 @@ export class ApplicationWizardCommitApplication extends BasePanel {
this.dispatchWizardUpdate({ status: "submitted" });
this.commitState = successState;
})
// eslint-disable-next-line @typescript-eslint/no-explicit-any
.catch((resolution: any) => {
resolution.response.json().then((body: Record<string, any>) => {
this.errors = this.decodeErrors(body);
});
resolution.response.json().then(
// eslint-disable-next-line @typescript-eslint/no-explicit-any
(body: Record<string, any>) => {
this.errors = this.decodeErrors(body);
},
);
this.commitState = errorState;
});
}

View File

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

View File

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

View File

@ -40,8 +40,7 @@ export class CertificateKeyPairForm extends ModelForm<CertificateKeyPair, string
}
renderForm(): TemplateResult {
return html`<form class="pf-c-form pf-m-horizontal">
<ak-form-element-horizontal label=${msg("Name")} name="name" ?required=${true}>
return html` <ak-form-element-horizontal label=${msg("Name")} name="name" ?required=${true}>
<input
type="text"
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.",
)}
</p>
</ak-form-element-horizontal>
</form>`;
</ak-form-element-horizontal>`;
}
}

View File

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

View File

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

View File

@ -68,8 +68,7 @@ export class TransportForm extends ModelForm<NotificationTransport, string> {
}
renderForm(): TemplateResult {
return html`<form class="pf-c-form pf-m-horizontal">
<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"
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.",
)}
</p>
</ak-form-element-horizontal>
</form>`;
</ak-form-element-horizontal>`;
}
}

View File

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

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">
<input type="file" value="" class="pf-c-form-control" />
<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/FlowForm";
import "@goauthentik/admin/policies/BoundPoliciesList";
import { DesignationToLabel } from "@goauthentik/app/admin/flows/utils";
import { AndNext, DEFAULT_CONFIG } from "@goauthentik/common/api/config";
import "@goauthentik/components/events/ObjectChangelog";
import { AKElement } from "@goauthentik/elements/Base";
@ -70,13 +71,43 @@ export class FlowViewPage extends AKElement {
<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"
>
<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">
<dl class="pf-c-description-list">
<div class="pf-c-description-list__group">
<dt class="pf-c-description-list__term">
<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>
<dd class="pf-c-description-list__description">

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

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">
<ak-search-select
.fetchObjects=${async (query?: string): Promise<User[]> => {

View File

@ -41,8 +41,7 @@ export class DummyPolicyForm extends ModelForm<DummyPolicy, string> {
}
renderForm(): TemplateResult {
return html`<form class="pf-c-form pf-m-horizontal">
<span>
return html` <span>
${msg(
"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>
</div>
</ak-form-group>
</form>`;
</ak-form-group>`;
}
}

View File

@ -53,8 +53,7 @@ export class EventMatcherPolicyForm extends ModelForm<EventMatcherPolicy, string
}
renderForm(): TemplateResult {
return html`<form class="pf-c-form pf-m-horizontal">
<span>
return html` <span>
${msg(
"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>
</ak-form-element-horizontal>
</div>
</ak-form-group>
</form>`;
</ak-form-group>`;
}
}

View File

@ -41,8 +41,7 @@ export class PasswordExpiryPolicyForm extends ModelForm<PasswordExpiryPolicy, st
}
renderForm(): TemplateResult {
return html`<form class="pf-c-form pf-m-horizontal">
<span>
return html` <span>
${msg(
"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>
</ak-form-element-horizontal>
</div>
</ak-form-group>
</form>`;
</ak-form-group>`;
}
}

View File

@ -43,8 +43,7 @@ export class ExpressionPolicyForm extends ModelForm<ExpressionPolicy, string> {
}
renderForm(): TemplateResult {
return html`<form class="pf-c-form pf-m-horizontal">
<span>
return html` <span>
${msg(
"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>
</ak-form-element-horizontal>
</div>
</ak-form-group>
</form>`;
</ak-form-group>`;
}
}

View File

@ -229,8 +229,7 @@ export class PasswordPolicyForm extends ModelForm<PasswordPolicy, string> {
}
renderForm(): TemplateResult {
return html`<form class="pf-c-form pf-m-horizontal">
<span>
return html` <span>
${msg(
"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>
${this.showStatic ? this.renderStaticRules() : html``}
${this.showHIBP ? this.renderHIBP() : html``}
${this.showZxcvbn ? this.renderZxcvbn() : html``}
</form>`;
${this.showZxcvbn ? this.renderZxcvbn() : html``}`;
}
}

View File

@ -41,8 +41,7 @@ export class ReputationPolicyForm extends ModelForm<ReputationPolicy, string> {
}
renderForm(): TemplateResult {
return html`<form class="pf-c-form pf-m-horizontal">
<span>
return html` <span>
${msg("Allows/denys requests based on the users and/or the IPs reputation.")}
</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>
</div>
</ak-form-group>
</form>`;
</ak-form-group>`;
}
}

View File

@ -41,8 +41,7 @@ export class PropertyMappingLDAPForm extends ModelForm<LDAPPropertyMapping, stri
}
renderForm(): TemplateResult {
return html`<form class="pf-c-form pf-m-horizontal">
<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"
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.")}
</a>
</p>
</ak-form-element-horizontal>
</form>`;
</ak-form-element-horizontal>`;
}
}

View File

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

View File

@ -41,8 +41,7 @@ export class PropertyMappingSAMLForm extends ModelForm<SAMLPropertyMapping, stri
}
renderForm(): TemplateResult {
return html`<form class="pf-c-form pf-m-horizontal">
<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"
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.")}
</a>
</p>
</ak-form-element-horizontal>
</form>`;
</ak-form-element-horizontal>`;
}
}

View File

@ -41,8 +41,7 @@ export class PropertyMappingSCIMForm extends ModelForm<SCIMMapping, string> {
}
renderForm(): TemplateResult {
return html`<form class="pf-c-form pf-m-horizontal">
<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"
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.")}
</a>
</p>
</ak-form-element-horizontal>
</form>`;
</ak-form-element-horizontal>`;
}
}

View File

@ -41,8 +41,7 @@ export class PropertyMappingScopeForm extends ModelForm<ScopeMapping, string> {
}
renderForm(): TemplateResult {
return html`<form class="pf-c-form pf-m-horizontal">
<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"
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.")}
</a>
</p>
</ak-form-element-horizontal>
</form>`;
</ak-form-element-horizontal>`;
}
}

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">
<ak-search-select
.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
// field of the target Provider.
renderForm(): TemplateResult {
return html`<form class="pf-c-form pf-m-horizontal">
<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"
value="${ifDefined(this.instance?.name)}"
@ -266,7 +265,6 @@ export class LDAPProviderFormPage extends ModelForm<LDAPProvider, number> {
</p>
</ak-form-element-horizontal>
</div>
</ak-form-group>
</form>`;
</ak-form-group>`;
}
}

View File

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

View File

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

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
// field of the target Provider.
renderForm(): TemplateResult {
return html`<form class="pf-c-form pf-m-horizontal">
<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"
value="${ifDefined(this.instance?.name)}"
@ -108,7 +107,6 @@ export class RadiusProviderFormPage extends ModelForm<RadiusProvider, number> {
</p>
</ak-form-element-horizontal>
</div>
</ak-form-group>
</form>`;
</ak-form-group>`;
}
}

View File

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

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">
<input type="text" class="pf-c-form-control" required />
</ak-form-element-horizontal>

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -50,8 +50,7 @@ export class AuthenticatorDuoStageForm extends ModelForm<AuthenticatorDuoStage,
}
renderForm(): TemplateResult {
return html`<form class="pf-c-form pf-m-horizontal">
<span>
return html` <span>
${msg(
"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>
</ak-form-element-horizontal>
</div>
</ak-form-group>
</form>`;
</ak-form-group>`;
}
}

View File

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

View File

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

View File

@ -48,8 +48,7 @@ export class AuthenticatorStaticStageForm extends ModelForm<AuthenticatorStaticS
}
renderForm(): TemplateResult {
return html`<form class="pf-c-form pf-m-horizontal">
<span>
return html` <span>
${msg(
"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>
</ak-form-element-horizontal>
</div>
</ak-form-group>
</form>`;
</ak-form-group>`;
}
}

View File

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

View File

@ -71,8 +71,7 @@ export class AuthenticatorValidateStageForm extends ModelForm<AuthenticatorValid
}
renderForm(): TemplateResult {
return html`<form class="pf-c-form pf-m-horizontal">
<span>
return html` <span>
${msg(
"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``}
</div>
</ak-form-group>
</form>`;
</ak-form-group>`;
}
}

View File

@ -55,10 +55,9 @@ export class AuthenticateWebAuthnStageForm extends ModelForm<AuthenticateWebAuth
}
renderForm(): TemplateResult {
return html`<form class="pf-c-form pf-m-horizontal">
<span>
return html` <span>
${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>
<ak-form-element-horizontal label=${msg("Name")} ?required=${true} name="name">
@ -214,7 +213,6 @@ export class AuthenticateWebAuthnStageForm extends ModelForm<AuthenticateWebAuth
</p>
</ak-form-element-horizontal>
</div>
</ak-form-group>
</form>`;
</ak-form-group>`;
}
}

View File

@ -40,8 +40,7 @@ export class CaptchaStageForm extends ModelForm<CaptchaStage, string> {
}
renderForm(): TemplateResult {
return html`<form class="pf-c-form pf-m-horizontal">
<span>
return html` <span>
${msg(
"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>
</ak-form-element-horizontal>
</div>
</ak-form-group>
</form>`;
</ak-form-group>`;
}
}

View File

@ -49,8 +49,7 @@ export class ConsentStageForm extends ModelForm<ConsentStage, string> {
}
renderForm(): TemplateResult {
return html`<form class="pf-c-form pf-m-horizontal">
<span>
return html` <span>
${msg(
"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-form-element-horizontal>
</div>
</ak-form-group>
</form>`;
</ak-form-group>`;
}
}

View File

@ -39,8 +39,7 @@ export class DenyStageForm extends ModelForm<DenyStage, string> {
}
renderForm(): TemplateResult {
return html`<form class="pf-c-form pf-m-horizontal">
<span>
return html` <span>
${msg(
"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"
required
/>
</ak-form-element-horizontal>
</form>`;
</ak-form-element-horizontal>`;
}
}

View File

@ -40,8 +40,7 @@ export class DummyStageForm extends ModelForm<DummyStage, string> {
}
renderForm(): TemplateResult {
return html`<form class="pf-c-form pf-m-horizontal">
<span>
return html` <span>
${msg(
"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 class="pf-c-switch__label">${msg("Throw error?")}</span>
</label>
</ak-form-element-horizontal>
</form>`;
</ak-form-element-horizontal>`;
}
}

View File

@ -147,8 +147,7 @@ export class EmailStageForm extends ModelForm<EmailStage, string> {
}
renderForm(): TemplateResult {
return html`<form class="pf-c-form pf-m-horizontal">
<span>
return html` <span>
${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.",
)}
@ -256,7 +255,6 @@ export class EmailStageForm extends ModelForm<EmailStage, string> {
</ak-form-element-horizontal>
</div>
</ak-form-group>
${this.renderConnectionSettings()}
</form>`;
${this.renderConnectionSettings()}`;
}
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -60,8 +60,7 @@ export class PromptStageForm extends ModelForm<PromptStage, string> {
}
renderForm(): TemplateResult {
return html`<form class="pf-c-form pf-m-horizontal">
<span>
return html` <span>
${msg(
"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>
</ak-form-element-horizontal>
</div>
</ak-form-group>
</form>`;
</ak-form-group>`;
}
}

View File

@ -39,8 +39,7 @@ export class UserDeleteStageForm extends ModelForm<UserDeleteStage, string> {
}
renderForm(): TemplateResult {
return html`<form class="pf-c-form pf-m-horizontal">
<span>
return html` <span>
${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.",
)}
@ -52,7 +51,6 @@ export class UserDeleteStageForm extends ModelForm<UserDeleteStage, string> {
class="pf-c-form-control"
required
/>
</ak-form-element-horizontal>
</form>`;
</ak-form-element-horizontal>`;
}
}

View File

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

View File

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

View File

@ -44,8 +44,7 @@ export class UserWriteStageForm extends ModelForm<UserWriteStage, string> {
}
renderForm(): TemplateResult {
return html`<form class="pf-c-form pf-m-horizontal">
<span>
return html` <span>
${msg(
`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.`,
@ -161,7 +160,6 @@ export class UserWriteStageForm extends ModelForm<UserWriteStage, string> {
</p>
</ak-form-element-horizontal>
</div>
</ak-form-group>
</form>`;
</ak-form-group>`;
}
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -31,7 +31,7 @@ export class UserResetEmailForm extends Form<CoreUsersRecoveryEmailRetrieveReque
return new CoreApi(DEFAULT_CONFIG).coreUsersRecoveryEmailRetrieve(data);
}
renderInlineForm(): TemplateResult {
renderForm(): TemplateResult {
return html`<ak-form-element-horizontal
label=${msg("Email stage")}
?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_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.
*
* 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
* will not render at all if it's not actually in the viewport?[2]
*
* @element ak-form
*
* @slot - Where the form goes if `renderInlineForm()` returns undefined.
* @slot - Where the form goes if `renderForm()` returns undefined.
* @fires eventname - description
*
* @csspart partname - description
@ -52,7 +52,7 @@ export interface KeyUnknown {
*
* 1. Specialization: Separate this component into three different classes:
* - The base class
* - The "use `renderInlineForm` class
* - The "use `renderForm` class
* - The slotted class.
* 2. There is already specialization-by-type throughout all of our code.
* Consider refactoring serializeForm() so that the conversions are on
@ -343,21 +343,22 @@ export abstract class Form<T> extends AKElement {
}
}
renderForm(): TemplateResult {
const inline = this.renderInlineForm();
renderFormWrapper(): TemplateResult {
const inline = this.renderForm();
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}
</form>`;
}
return html`<slot></slot>`;
}
/**
* Inline form render callback when inheriting this class, should be overwritten
* instead of `this.renderForm`
*/
renderInlineForm(): TemplateResult | undefined {
renderForm(): TemplateResult | undefined {
return undefined;
}
@ -378,7 +379,7 @@ export abstract class Form<T> extends AKElement {
}
renderVisible(): TemplateResult {
return html` ${this.renderNonFieldErrors()} ${this.renderForm()}`;
return html` ${this.renderNonFieldErrors()} ${this.renderFormWrapper()}`;
}
render(): TemplateResult {

View File

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

View File

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

View File

@ -1404,10 +1404,6 @@
<source>Slug</source>
<target>Slug</target>
</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">
<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>
@ -1419,9 +1415,6 @@
<trans-unit id="s350a616ff5e145ec">
<source>Select a provider that this application should use.</source>
</trans-unit>
<trans-unit id="scd5dff009d1fd847">
<source>Backchannel providers</source>
</trans-unit>
<trans-unit id="s4c6534a118f52fdd">
<source>Select backchannel providers which augment the functionality of the main provider.</source>
</trans-unit>
@ -1712,32 +1705,9 @@
<source>Run sync again</source>
<target>Synchronisation erneut ausführen</target>
</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">
<source>Modern applications, APIs and Single-page applications.</source>
</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">
<source>LDAP</source>
<target>LDAP</target>
@ -1745,108 +1715,9 @@
<trans-unit id="sffd5481034a1bd41">
<source>Provide an LDAP interface for applications and users to authenticate against.</source>
</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">
<source>New application</source>
</trans-unit>
<trans-unit id="s8e1d308c09d1b400">
<source>Create a new application.</source>
</trans-unit>
<trans-unit id="s6ba50bb0842ba1e2">
<source>Applications</source>
<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>
<target>Wenn mehrere Stufen ausgewählt sind, kann der Benutzer wählen, welche er registrieren möchte.</target>
</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">
<source>User verification</source>
<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 id="s6827a456c9dfc6ee">
<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>
</body>
</file>

View File

@ -1475,10 +1475,6 @@
<source>Slug</source>
<target>Slug</target>
</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">
<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>
@ -1491,10 +1487,6 @@
<source>Select a provider that this application should use.</source>
<target>Select a provider that this application should use.</target>
</trans-unit>
<trans-unit id="scd5dff009d1fd847">
<source>Backchannel providers</source>
<target>Backchannel providers</target>
</trans-unit>
<trans-unit id="s4c6534a118f52fdd">
<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>
@ -1807,38 +1799,10 @@
<source>Run sync again</source>
<target>Run sync again</target>
</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">
<source>Modern applications, APIs and Single-page applications.</source>
<target>Modern applications, APIs and Single-page applications.</target>
</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">
<source>LDAP</source>
<target>LDAP</target>
@ -1847,134 +1811,10 @@
<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>
</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">
<source>New application</source>
<target>New application</target>
</trans-unit>
<trans-unit id="s8e1d308c09d1b400">
<source>Create a new application.</source>
<target>Create a new application.</target>
</trans-unit>
<trans-unit id="s6ba50bb0842ba1e2">
<source>Applications</source>
<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>
<target>When multiple stages are selected, the user can choose which one they want to enroll.</target>
</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">
<source>User verification</source>
<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 id="s6827a456c9dfc6ee">
<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>
</body>
</file>

View File

@ -1378,10 +1378,6 @@
<source>Slug</source>
<target>babosa</target>
</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">
<source>Optionally enter a group name. Applications with identical groups are shown grouped together.</source>
</trans-unit>
@ -1392,9 +1388,6 @@
<trans-unit id="s350a616ff5e145ec">
<source>Select a provider that this application should use.</source>
</trans-unit>
<trans-unit id="scd5dff009d1fd847">
<source>Backchannel providers</source>
</trans-unit>
<trans-unit id="s4c6534a118f52fdd">
<source>Select backchannel providers which augment the functionality of the main provider.</source>
</trans-unit>
@ -1684,30 +1677,9 @@
<source>Run sync again</source>
<target>Vuelve a ejecutar la sincronización</target>
</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">
<source>Modern applications, APIs and Single-page applications.</source>
</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">
<source>LDAP</source>
<target>LDAP</target>
@ -1715,103 +1687,9 @@
<trans-unit id="sffd5481034a1bd41">
<source>Provide an LDAP interface for applications and users to authenticate against.</source>
</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">
<source>New application</source>
</trans-unit>
<trans-unit id="s8e1d308c09d1b400">
<source>Create a new application.</source>
</trans-unit>
<trans-unit id="s6ba50bb0842ba1e2">
<source>Applications</source>
<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">
<source>When multiple stages are selected, the user can choose which one they want to enroll.</source>
</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">
<source>User verification</source>
<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 id="s6827a456c9dfc6ee">
<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>
</body>
</file>

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