Merge branch 'main' into next

This commit is contained in:
Livio Spring 2023-10-31 07:35:25 +01:00
commit 233b90f004
No known key found for this signature in database
GPG Key ID: 26BB1C2FA5952CF0
690 changed files with 10676 additions and 5424 deletions

View File

@ -30,6 +30,7 @@ jobs:
- -
uses: actions/cache/restore@v3 uses: actions/cache/restore@v3
timeout-minutes: 1 timeout-minutes: 1
continue-on-error: true
id: cache id: cache
with: with:
key: console-${{ hashFiles('console', 'proto', '!console/dist') }} key: console-${{ hashFiles('console', 'proto', '!console/dist') }}

View File

@ -56,6 +56,7 @@ jobs:
uses: actions/cache/restore@v3 uses: actions/cache/restore@v3
id: cache id: cache
timeout-minutes: 1 timeout-minutes: 1
continue-on-error: true
name: restore previous results name: restore previous results
with: with:
key: integration-test-postgres-${{ inputs.core_cache_key }} key: integration-test-postgres-${{ inputs.core_cache_key }}

View File

@ -40,6 +40,7 @@ jobs:
uses: actions/cache/restore@v3 uses: actions/cache/restore@v3
id: cache id: cache
timeout-minutes: 1 timeout-minutes: 1
continue-on-error: true
name: restore previous results name: restore previous results
with: with:
key: unit-test-${{ inputs.core_cache_key }} key: unit-test-${{ inputs.core_cache_key }}

View File

@ -41,6 +41,7 @@ jobs:
- -
uses: actions/cache/restore@v3 uses: actions/cache/restore@v3
timeout-minutes: 1 timeout-minutes: 1
continue-on-error: true
id: cache id: cache
with: with:
key: core-${{ hashFiles( 'go.*', 'openapi', 'cmd', 'pkg/grpc/**/*.go', 'proto', 'internal') }} key: core-${{ hashFiles( 'go.*', 'openapi', 'cmd', 'pkg/grpc/**/*.go', 'proto', 'internal') }}

View File

@ -83,7 +83,7 @@ console_build: console_dependencies console_client
.PHONY: clean .PHONY: clean
clean: clean:
$(RM) .artifacts/grpc $(RM) -r .artifacts/grpc
$(RM) $(gen_authopt_path) $(RM) $(gen_authopt_path)
$(RM) $(gen_zitadel_path) $(RM) $(gen_zitadel_path)

View File

@ -30,16 +30,37 @@
<img src="./docs/static/logos/oidc-cert.png" /></a> <img src="./docs/static/logos/oidc-cert.png" /></a>
</p> </p>
Do you look for a user management that's quickly set up like Auth0 and open source like Keycloak?
Are you searching for a user management tool that is quickly set up like Auth0 and open source like Keycloak?
Do you have a project that requires multi-tenant user management with self-service for your customers? Do you have a project that requires multi-tenant user management with self-service for your customers?
Look no further — ZITADEL is the identity infrastructure, simplified for you. Look no further — ZITADEL is the identity infrastructure, simplified for you.
We provide you with a wide range of out-of-the-box features to accelerate your project. We provide you with a wide range of out-of-the-box features to accelerate your project, including:
Multi-tenancy with branding customization, secure login, self-service, OpenID Connect, OAuth2.x, SAML2, LDAP, Passkeys / FIDO2, OTP, U2F, and an unlimited audit trail is there for you, ready to use.
With ZITADEL you can rely on a hardened and extensible turnkey solution to solve all of your authentication and authorization needs. :white_check_mark: Multi-tenancy with branding customization
:white_check_mark: Secure login
:white_check_mark: Self-service
:white_check_mark: OpenID Connect
:white_check_mark: OAuth2.x
:white_check_mark: SAML2
:white_check_mark: LDAP
:white_check_mark: Passkeys / FIDO2
:white_check_mark: OTP
:white_check_mark: U2F, and an unlimited audit trail is there for you, ready to use.
With ZITADEL, you are assured of a robust and customizable turnkey solution for all your authentication and authorization needs.
--- ---
@ -51,7 +72,7 @@ With ZITADEL you can rely on a hardened and extensible turnkey solution to solve
### Deploy ZITADEL (Self-Hosted) ### Deploy ZITADEL (Self-Hosted)
Deploying ZITADEL locally takes less than 3 minutes. So go ahead and give it a try! Deploying ZITADEL locally takes less than 3 minutes. Go ahead and give it a try!
* [Linux](https://zitadel.com/docs/self-hosting/deploy/linux) * [Linux](https://zitadel.com/docs/self-hosting/deploy/linux)
* [MacOS](https://zitadel.com/docs/self-hosting/deploy/macos) * [MacOS](https://zitadel.com/docs/self-hosting/deploy/macos)
@ -67,7 +88,7 @@ See all guides [here](https://zitadel.com/docs/self-hosting/deploy/overview)
If you want to experience a hands-free ZITADEL, you should use [ZITADEL Cloud](https://zitadel.cloud). If you want to experience a hands-free ZITADEL, you should use [ZITADEL Cloud](https://zitadel.cloud).
ZITADEL Cloud comes with a free tier and provides you all the features that you find in the open source version. ZITADEL Cloud comes with a free tier, providing you with all the same features as the open-source version.
Learn more about the [pay-as-you-go pricing](https://zitadel.com/pricing). Learn more about the [pay-as-you-go pricing](https://zitadel.com/pricing).
### Example applications ### Example applications
@ -122,14 +143,14 @@ Self-Service
- [Administration UI (Console)](https://zitadel.com/docs/guides/manage/console/overview) - [Administration UI (Console)](https://zitadel.com/docs/guides/manage/console/overview)
Deployment Deployment
- [Postgres](https://zitadel.com/docs/self-hosting/manage/database#postgres) (version >= 14) or [CockroachDB](https://zitadel.com/docs/self-hosting/manage/database#cockroach) (version >= 22.0) - [Postgres](https://zitadel.com/docs/self-hosting/manage/database#postgres) (version >= 14) or [CockroachDB](https://zitadel.com/docs/self-hosting/manage/database#cockroach) (version latest stable)
- [Zero Downtime Updates](https://zitadel.com/docs/concepts/architecture/solution#zero-downtime-updates) - [Zero Downtime Updates](https://zitadel.com/docs/concepts/architecture/solution#zero-downtime-updates)
Track upcoming features on our [roadmap](https://zitadel.com/roadmap). Track upcoming features on our [roadmap](https://zitadel.com/roadmap).
## How To Contribute ## How To Contribute
Details about how to contribute you can find in the [Contribution Guide](./CONTRIBUTING.md) Find details about how you can contribute in our [Contribution Guide](./CONTRIBUTING.md)
## Contributors ## Contributors
@ -161,13 +182,13 @@ Use [Console](https://zitadel.com/docs/guides/manage/console/overview) or our [A
## Security ## Security
See the policy [here](./SECURITY.md). You can find our security policy [here](./SECURITY.md).
[Technical Advisories](https://zitadel.com/docs/support/technical_advisory) are published regarding major issues with the ZITADEL platform that could potentially impact security or stability in production environments. [Technical Advisories](https://zitadel.com/docs/support/technical_advisory) are published regarding major issues with the ZITADEL platform that could potentially impact security or stability in production environments.
## License ## License
See the exact licensing terms [here](./LICENSE) [here](./LICENSE) are our exact licensing terms.
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and limitations under the License. See our [license](./LICENSE) for detailed information governing permissions and limitations on use.

View File

@ -103,7 +103,7 @@ COPY --from=core-assets /go/src/github.com/zitadel/zitadel/internal ./internal
# ####################################### # #######################################
# download console dependencies # download console dependencies
# ####################################### # #######################################
FROM node:18-buster AS console-deps FROM node:20-buster AS console-deps
WORKDIR /zitadel/console WORKDIR /zitadel/console
@ -115,7 +115,7 @@ RUN yarn install --frozen-lockfile
# ####################################### # #######################################
# generate console client # generate console client
# ####################################### # #######################################
FROM node:18-buster AS console-client FROM node:20-buster AS console-client
WORKDIR /zitadel/console WORKDIR /zitadel/console

View File

@ -201,6 +201,9 @@ Projections:
Customizations: Customizations:
Projects: Projects:
TransactionDuration: 2s TransactionDuration: 2s
custom_texts:
TransactionDuration: 2s
BulkLimit: 400
# The Notifications projection is used for sending emails and SMS to users # The Notifications projection is used for sending emails and SMS to users
Notifications: Notifications:
# As notification projections don't result in database statements, retries don't have an effect # As notification projections don't result in database statements, retries don't have an effect
@ -389,11 +392,27 @@ EncryptionKeys:
UserAgentCookieKeyID: "userAgentCookieKey" # ZITADEL_ENCRYPTIONKEYS_USERAGENTCOOKIEKEYID UserAgentCookieKeyID: "userAgentCookieKey" # ZITADEL_ENCRYPTIONKEYS_USERAGENTCOOKIEKEYID
SystemAPIUsers: SystemAPIUsers:
# Add keys for authentication of the systemAPI here: # # Add keys for authentication of the systemAPI here:
# you can specify any name for the user, but they will have to match the `issuer` and `sub` claim in the JWT: # # you can specify any name for the user, but they will have to match the `issuer` and `sub` claim in the JWT:
# - superuser: # - superuser:
# Path: /path/to/superuser/key.pem # you can provide the key either by reference with the path # Path: /path/to/superuser/ey.pem # you can provide the key either by reference with the path
# Memberships:
# # MemberType System allows the user to access all APIs for all instances or organizations
# - MemberType: System
# Roles:
# - "SYSTEM_OWNER"
# # Actually, we don't recommend adding IAM_OWNER and ORG_OWNER to the System membership, as this basically enables god mode for the system user
# - "IAM_OWNER"
# - "ORG_OWNER"
# # MemberType IAM and Organization let you restrict access to a specific instance or organization by specifying the AggregateID
# - MemberType: IAM
# Roles: "IAM_OWNER"
# AggregateID: "123456789012345678"
# - MemberType: Organization
# Roles: "ORG_OWNER"
# AggregateID: "123456789012345678"
# - superuser2: # - superuser2:
# # If no memberships are specified, the user has a membership of type System with the role "SYSTEM_OWNER"
# KeyData: <base64 encoded key> # or you can directly embed it as base64 encoded value # KeyData: <base64 encoded key> # or you can directly embed it as base64 encoded value
#TODO: remove as soon as possible #TODO: remove as soon as possible
@ -767,7 +786,7 @@ DefaultInstance:
PreHeader: Verify email PreHeader: Verify email
Subject: Verify email Subject: Verify email
Greeting: Hello {{.DisplayName}}, Greeting: Hello {{.DisplayName}},
Text: A new email has been added. Please use the button below to verify your mail. (Code {{.Code}}) If you din't add a new email, please ignore this email. Text: A new email has been added. Please use the button below to verify your email. (Code {{.Code}}) If you din't add a new email, please ignore this email.
ButtonText: Verify email ButtonText: Verify email
- MessageTextType: VerifyPhone - MessageTextType: VerifyPhone
Language: en Language: en
@ -795,7 +814,11 @@ DefaultInstance:
ButtonText: Login ButtonText: Login
Features: Features:
- FeatureLoginDefaultOrg: true - FeatureLoginDefaultOrg: true
Limits:
# AuditLogRetention limits the number of events that can be queried via the events API by their age.
# A value of "0s" means that all events are available.
# If this value is set, it overwrites the system default unless it is not reset via the admin API.
AuditLogRetention: # ZITADEL_DEFAULTINSTANCE_LIMITS_AUDITLOGRETENTION
Quotas: Quotas:
# Items take a slice of quota configurations, whereas, for each unit type and instance, one or zero quotas may exist. # Items take a slice of quota configurations, whereas, for each unit type and instance, one or zero quotas may exist.
# The following unit types are supported # The following unit types are supported
@ -830,10 +853,36 @@ DefaultInstance:
# # CallURL is called when a relative amount of the quota is used. # # CallURL is called when a relative amount of the quota is used.
# CallURL: "https://httpbin.org/post" # CallURL: "https://httpbin.org/post"
AuditLogRetention: 0s # AuditLogRetention limits the number of events that can be queried via the events API by their age.
# A value of "0s" means that all events are available.
# If an audit log retention is set using an instance limit, it will overwrite the system default.
AuditLogRetention: 0s # ZITADEL_AUDITLOGRETENTION
InternalAuthZ: InternalAuthZ:
RolePermissionMappings: RolePermissionMappings:
- Role: "SYSTEM_OWNER"
Permissions:
- "system.instance.read"
- "system.instance.write"
- "system.instance.delete"
- "system.domain.read"
- "system.domain.write"
- "system.domain.delete"
- "system.debug.read"
- "system.debug.write"
- "system.debug.delete"
- "system.feature.write"
- "system.limits.write"
- "system.limits.delete"
- "system.quota.write"
- "system.quota.delete"
- "system.iam.member.read"
- Role: "SYSTEM_OWNER_VIEWER"
Permissions:
- "system.instance.read"
- "system.domain.read"
- "system.debug.read"
- "system.iam.member.read"
- Role: "IAM_OWNER" - Role: "IAM_OWNER"
Permissions: Permissions:
- "iam.read" - "iam.read"
@ -904,6 +953,7 @@ InternalAuthZ:
- "project.grant.member.write" - "project.grant.member.write"
- "project.grant.member.delete" - "project.grant.member.delete"
- "events.read" - "events.read"
- "milestones.read"
- Role: "IAM_OWNER_VIEWER" - Role: "IAM_OWNER_VIEWER"
Permissions: Permissions:
- "iam.read" - "iam.read"
@ -929,6 +979,7 @@ InternalAuthZ:
- "project.grant.read" - "project.grant.read"
- "project.grant.member.read" - "project.grant.member.read"
- "events.read" - "events.read"
- "milestones.read"
- Role: "IAM_ORG_MANAGER" - Role: "IAM_ORG_MANAGER"
Permissions: Permissions:
- "org.read" - "org.read"

View File

@ -7,7 +7,9 @@ import (
"github.com/spf13/viper" "github.com/spf13/viper"
"github.com/zitadel/logging" "github.com/zitadel/logging"
internal_authz "github.com/zitadel/zitadel/internal/api/authz"
"github.com/zitadel/zitadel/internal/config/hook" "github.com/zitadel/zitadel/internal/config/hook"
"github.com/zitadel/zitadel/internal/domain"
) )
type Config struct { type Config struct {
@ -23,7 +25,8 @@ func MustNewConfig(v *viper.Viper) *Config {
mapstructure.StringToTimeDurationHookFunc(), mapstructure.StringToTimeDurationHookFunc(),
mapstructure.StringToTimeHookFunc(time.RFC3339), mapstructure.StringToTimeHookFunc(time.RFC3339),
mapstructure.StringToSliceHookFunc(","), mapstructure.StringToSliceHookFunc(","),
hook.StringToFeatureHookFunc(), hook.EnumHookFunc(domain.FeatureString),
hook.EnumHookFunc(internal_authz.MemberTypeString),
)), )),
) )
logging.OnError(err).Fatal("unable to read default config") logging.OnError(err).Fatal("unable to read default config")

View File

@ -32,6 +32,9 @@ func ready(config *Config) bool {
return false return false
} }
defer res.Body.Close() defer res.Body.Close()
logging.WithFields("status", res.StatusCode).Warn("ready check failed") if res.StatusCode != 200 {
return res.StatusCode == 200 logging.WithFields("status", res.StatusCode).Warn("ready check failed")
return false
}
return true
} }

View File

@ -15,6 +15,7 @@ import (
"github.com/zitadel/zitadel/internal/config/systemdefaults" "github.com/zitadel/zitadel/internal/config/systemdefaults"
"github.com/zitadel/zitadel/internal/crypto" "github.com/zitadel/zitadel/internal/crypto"
"github.com/zitadel/zitadel/internal/database" "github.com/zitadel/zitadel/internal/database"
"github.com/zitadel/zitadel/internal/domain"
"github.com/zitadel/zitadel/internal/eventstore" "github.com/zitadel/zitadel/internal/eventstore"
"github.com/zitadel/zitadel/internal/id" "github.com/zitadel/zitadel/internal/id"
"github.com/zitadel/zitadel/internal/query/projection" "github.com/zitadel/zitadel/internal/query/projection"
@ -45,7 +46,8 @@ func MustNewConfig(v *viper.Viper) *Config {
mapstructure.StringToTimeHookFunc(time.RFC3339), mapstructure.StringToTimeHookFunc(time.RFC3339),
mapstructure.StringToSliceHookFunc(","), mapstructure.StringToSliceHookFunc(","),
database.DecodeHook, database.DecodeHook,
hook.StringToFeatureHookFunc(), hook.EnumHookFunc(domain.FeatureString),
hook.EnumHookFunc(authz.MemberTypeString),
)), )),
) )
logging.OnError(err).Fatal("unable to read default config") logging.OnError(err).Fatal("unable to read default config")
@ -101,7 +103,7 @@ func MustNewSteps(v *viper.Viper) *Steps {
mapstructure.StringToTimeDurationHookFunc(), mapstructure.StringToTimeDurationHookFunc(),
mapstructure.StringToTimeHookFunc(time.RFC3339), mapstructure.StringToTimeHookFunc(time.RFC3339),
mapstructure.StringToSliceHookFunc(","), mapstructure.StringToSliceHookFunc(","),
hook.StringToFeatureHookFunc(), hook.EnumHookFunc(domain.FeatureString),
)), )),
) )
logging.OnError(err).Fatal("unable to read steps") logging.OnError(err).Fatal("unable to read steps")

View File

@ -35,8 +35,8 @@ FirstInstance:
# If FirstInstance.Org.Machine.Machine is defined, a service user is created with the IAM_OWNER role, not a human user. # If FirstInstance.Org.Machine.Machine is defined, a service user is created with the IAM_OWNER role, not a human user.
Machine: Machine:
Machine: Machine:
Username: # ZITADEL_FIRSTINSTANCE_ORG_MACHINE_USERNAME Username: # ZITADEL_FIRSTINSTANCE_ORG_MACHINE_MACHINE_USERNAME
Name: # ZITADEL_FIRSTINSTANCE_ORG_MACHINE_NAME Name: # ZITADEL_FIRSTINSTANCE_ORG_MACHINE_MACHINE_NAME
MachineKey: MachineKey:
# date format: 2023-01-01T00:00:00Z # date format: 2023-01-01T00:00:00Z
ExpirationDate: # ZITADEL_FIRSTINSTANCE_ORG_MACHINE_MACHINEKEY_EXPIRATIONDATE ExpirationDate: # ZITADEL_FIRSTINSTANCE_ORG_MACHINE_MACHINEKEY_EXPIRATIONDATE

View File

@ -24,6 +24,7 @@ import (
"github.com/zitadel/zitadel/internal/config/systemdefaults" "github.com/zitadel/zitadel/internal/config/systemdefaults"
"github.com/zitadel/zitadel/internal/crypto" "github.com/zitadel/zitadel/internal/crypto"
"github.com/zitadel/zitadel/internal/database" "github.com/zitadel/zitadel/internal/database"
"github.com/zitadel/zitadel/internal/domain"
"github.com/zitadel/zitadel/internal/eventstore" "github.com/zitadel/zitadel/internal/eventstore"
"github.com/zitadel/zitadel/internal/id" "github.com/zitadel/zitadel/internal/id"
"github.com/zitadel/zitadel/internal/logstore" "github.com/zitadel/zitadel/internal/logstore"
@ -92,7 +93,8 @@ func MustNewConfig(v *viper.Viper) *Config {
database.DecodeHook, database.DecodeHook,
actions.HTTPConfigDecodeHook, actions.HTTPConfigDecodeHook,
systemAPIUsersDecodeHook, systemAPIUsersDecodeHook,
hook.StringToFeatureHookFunc(), hook.EnumHookFunc(domain.FeatureString),
hook.EnumHookFunc(internal_authz.MemberTypeString),
)), )),
) )
logging.OnError(err).Fatal("unable to read config") logging.OnError(err).Fatal("unable to read config")

84
cmd/start/config_test.go Normal file
View File

@ -0,0 +1,84 @@
package start
import (
"reflect"
"strings"
"testing"
"github.com/spf13/viper"
"github.com/stretchr/testify/require"
"github.com/zitadel/logging"
"github.com/zitadel/zitadel/internal/actions"
"github.com/zitadel/zitadel/internal/api/authz"
"github.com/zitadel/zitadel/internal/command"
"github.com/zitadel/zitadel/internal/domain"
)
func TestMustNewConfig(t *testing.T) {
type args struct {
yaml string
}
tests := []struct {
name string
args args
want *Config
}{{
name: "features ok",
args: args{yaml: `
DefaultInstance:
Features:
- FeatureLoginDefaultOrg: true
`},
want: &Config{
DefaultInstance: command.InstanceSetup{
Features: map[domain.Feature]any{
domain.FeatureLoginDefaultOrg: true,
},
},
},
}, {
name: "membership types ok",
args: args{yaml: `
SystemAPIUsers:
- superuser:
Memberships:
- MemberType: System
- MemberType: Organization
- MemberType: IAM
`},
want: &Config{
SystemAPIUsers: map[string]*authz.SystemAPIUser{
"superuser": {
Memberships: authz.Memberships{{
MemberType: authz.MemberTypeSystem,
}, {
MemberType: authz.MemberTypeOrganization,
}, {
MemberType: authz.MemberTypeIAM,
}},
},
},
},
}}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
v := viper.New()
v.SetConfigType("yaml")
err := v.ReadConfig(strings.NewReader(`Log:
Level: info
Actions:
HTTP:
DenyList: []
` + tt.args.yaml))
require.NoError(t, err)
tt.want.Log = &logging.Config{Level: "info"}
tt.want.Actions = &actions.Config{HTTP: actions.HTTPConfig{DenyList: []actions.AddressChecker{}}}
require.NoError(t, tt.want.Log.SetLogger())
got := MustNewConfig(v)
if !reflect.DeepEqual(got, tt.want) {
t.Errorf("MustNewConfig() = %v, want %v", got, tt.want)
}
})
}
}

View File

@ -19,7 +19,7 @@ import (
"github.com/spf13/cobra" "github.com/spf13/cobra"
"github.com/spf13/viper" "github.com/spf13/viper"
"github.com/zitadel/logging" "github.com/zitadel/logging"
"github.com/zitadel/oidc/v2/pkg/op" "github.com/zitadel/oidc/v3/pkg/op"
"github.com/zitadel/saml/pkg/provider" "github.com/zitadel/saml/pkg/provider"
"golang.org/x/net/http2" "golang.org/x/net/http2"
"golang.org/x/net/http2/h2c" "golang.org/x/net/http2/h2c"
@ -164,6 +164,7 @@ func startZitadel(config *Config, masterKey string, server chan<- *Server) error
return internal_authz.CheckPermission(ctx, &authz_es.UserMembershipRepo{Queries: q}, config.InternalAuthZ.RolePermissionMappings, permission, orgID, resourceID) return internal_authz.CheckPermission(ctx, &authz_es.UserMembershipRepo{Queries: q}, config.InternalAuthZ.RolePermissionMappings, permission, orgID, resourceID)
} }
}, },
config.AuditLogRetention,
config.SystemAPIUsers, config.SystemAPIUsers,
) )
if err != nil { if err != nil {
@ -315,9 +316,17 @@ func startAPIs(
authZRepo, authZRepo,
queries, queries,
} }
oidcPrefixes := []string{"/.well-known/openid-configuration", "/oidc/v1", "/oauth/v2"}
// always set the origin in the context if available in the http headers, no matter for what protocol // always set the origin in the context if available in the http headers, no matter for what protocol
router.Use(middleware.OriginHandler) router.Use(middleware.OriginHandler)
verifier := internal_authz.Start(repo, http_util.BuildHTTP(config.ExternalDomain, config.ExternalPort, config.ExternalSecure), config.SystemAPIUsers) // adds used HTTPPathPattern and RequestMethod to context
router.Use(middleware.ActivityHandler)
systemTokenVerifier, err := internal_authz.StartSystemTokenVerifierFromConfig(http_util.BuildHTTP(config.ExternalDomain, config.ExternalPort, config.ExternalSecure), config.SystemAPIUsers)
if err != nil {
return err
}
accessTokenVerifer := internal_authz.StartAccessTokenVerifierFromRepo(repo)
verifier := internal_authz.StartAPITokenVerifier(repo, accessTokenVerifer, systemTokenVerifier)
tlsConfig, err := config.TLS.Config() tlsConfig, err := config.TLS.Config()
if err != nil { if err != nil {
return err return err
@ -364,10 +373,10 @@ func startAPIs(
if err := apis.RegisterServer(ctx, admin.CreateServer(config.Database.DatabaseName(), commands, queries, config.SystemDefaults, config.ExternalSecure, keys.User, config.AuditLogRetention)); err != nil { if err := apis.RegisterServer(ctx, admin.CreateServer(config.Database.DatabaseName(), commands, queries, config.SystemDefaults, config.ExternalSecure, keys.User, config.AuditLogRetention)); err != nil {
return err return err
} }
if err := apis.RegisterServer(ctx, management.CreateServer(commands, queries, config.SystemDefaults, keys.User, config.ExternalSecure, config.AuditLogRetention)); err != nil { if err := apis.RegisterServer(ctx, management.CreateServer(commands, queries, config.SystemDefaults, keys.User, config.ExternalSecure)); err != nil {
return err return err
} }
if err := apis.RegisterServer(ctx, auth.CreateServer(commands, queries, authRepo, config.SystemDefaults, keys.User, config.ExternalSecure, config.AuditLogRetention)); err != nil { if err := apis.RegisterServer(ctx, auth.CreateServer(commands, queries, authRepo, config.SystemDefaults, keys.User, config.ExternalSecure)); err != nil {
return err return err
} }
if err := apis.RegisterService(ctx, user_v2.CreateServer(commands, queries, keys.User, keys.IDPConfig, idp.CallbackURL(config.ExternalSecure), idp.SAMLRootURL(config.ExternalSecure))); err != nil { if err := apis.RegisterService(ctx, user_v2.CreateServer(commands, queries, keys.User, keys.IDPConfig, idp.CallbackURL(config.ExternalSecure), idp.SAMLRootURL(config.ExternalSecure))); err != nil {
@ -408,11 +417,11 @@ func startAPIs(
} }
apis.RegisterHandlerOnPrefix(openapi.HandlerPrefix, openAPIHandler) apis.RegisterHandlerOnPrefix(openapi.HandlerPrefix, openAPIHandler)
oidcProvider, err := oidc.NewProvider(config.OIDC, login.DefaultLoggedOutPath, config.ExternalSecure, commands, queries, authRepo, keys.OIDC, keys.OIDCKey, eventstore, dbClient, userAgentInterceptor, instanceInterceptor.Handler, limitingAccessInterceptor) oidcServer, err := oidc.NewServer(config.OIDC, login.DefaultLoggedOutPath, config.ExternalSecure, commands, queries, authRepo, keys.OIDC, keys.OIDCKey, eventstore, dbClient, userAgentInterceptor, instanceInterceptor.Handler, limitingAccessInterceptor, config.Log.Slog())
if err != nil { if err != nil {
return fmt.Errorf("unable to start oidc provider: %w", err) return fmt.Errorf("unable to start oidc provider: %w", err)
} }
apis.RegisterHandlerPrefixes(oidcProvider.HttpHandler(), "/.well-known/openid-configuration", "/oidc/v1", "/oauth/v2") apis.RegisterHandlerPrefixes(oidcServer, oidcPrefixes...)
samlProvider, err := saml.NewProvider(config.SAML, config.ExternalSecure, commands, queries, authRepo, keys.OIDC, keys.SAML, eventstore, dbClient, instanceInterceptor.Handler, userAgentInterceptor, limitingAccessInterceptor) samlProvider, err := saml.NewProvider(config.SAML, config.ExternalSecure, commands, queries, authRepo, keys.OIDC, keys.SAML, eventstore, dbClient, instanceInterceptor.Handler, userAgentInterceptor, limitingAccessInterceptor)
if err != nil { if err != nil {
@ -420,7 +429,7 @@ func startAPIs(
} }
apis.RegisterHandlerOnPrefix(saml.HandlerPrefix, samlProvider.HttpHandler()) apis.RegisterHandlerOnPrefix(saml.HandlerPrefix, samlProvider.HttpHandler())
c, err := console.Start(config.Console, config.ExternalSecure, oidcProvider.IssuerFromRequest, middleware.CallDurationHandler, instanceInterceptor.Handler, limitingAccessInterceptor, config.CustomerPortal) c, err := console.Start(config.Console, config.ExternalSecure, oidcServer.IssuerFromRequest, middleware.CallDurationHandler, instanceInterceptor.Handler, limitingAccessInterceptor, config.CustomerPortal)
if err != nil { if err != nil {
return fmt.Errorf("unable to start console: %w", err) return fmt.Errorf("unable to start console: %w", err)
} }
@ -433,11 +442,11 @@ func startAPIs(
authRepo, authRepo,
store, store,
console.HandlerPrefix+"/", console.HandlerPrefix+"/",
op.AuthCallbackURL(oidcProvider), oidcServer.AuthCallbackURL(),
provider.AuthCallbackURL(samlProvider), provider.AuthCallbackURL(samlProvider),
config.ExternalSecure, config.ExternalSecure,
userAgentInterceptor, userAgentInterceptor,
op.NewIssuerInterceptor(oidcProvider.IssuerFromRequest).Handler, op.NewIssuerInterceptor(oidcServer.IssuerFromRequest).Handler,
provider.NewIssuerInterceptor(samlProvider.IssuerFromRequest).Handler, provider.NewIssuerInterceptor(samlProvider.IssuerFromRequest).Handler,
instanceInterceptor.Handler, instanceInterceptor.Handler,
assetsCache.Handler, assetsCache.Handler,
@ -454,7 +463,7 @@ func startAPIs(
apis.HandleFunc(login.EndpointDeviceAuth, login.RedirectDeviceAuthToPrefix) apis.HandleFunc(login.EndpointDeviceAuth, login.RedirectDeviceAuthToPrefix)
// After OIDC provider so that the callback endpoint can be used // After OIDC provider so that the callback endpoint can be used
if err := apis.RegisterService(ctx, oidc_v2.CreateServer(commands, queries, oidcProvider, config.ExternalSecure)); err != nil { if err := apis.RegisterService(ctx, oidc_v2.CreateServer(commands, queries, oidcServer, config.ExternalSecure)); err != nil {
return err return err
} }
// handle grpc at last to be able to handle the root, because grpc and gateway require a lot of different prefixes // handle grpc at last to be able to handle the root, because grpc and gateway require a lot of different prefixes

View File

@ -30,6 +30,7 @@
"includePaths": ["node_modules"] "includePaths": ["node_modules"]
}, },
"allowedCommonJsDependencies": [ "allowedCommonJsDependencies": [
"opentype.js",
"fast-sha256", "fast-sha256",
"buffer", "buffer",
"moment", "moment",

View File

@ -12,18 +12,18 @@
}, },
"private": true, "private": true,
"dependencies": { "dependencies": {
"@angular/animations": "^16.2.0", "@angular/animations": "^16.2.5",
"@angular/cdk": "^16.2.0", "@angular/cdk": "^16.2.4",
"@angular/common": "^16.2.0", "@angular/common": "^16.2.5",
"@angular/compiler": "^16.2.0", "@angular/compiler": "^16.2.5",
"@angular/core": "^16.2.0", "@angular/core": "^16.2.5",
"@angular/forms": "^16.2.0", "@angular/forms": "^16.2.5",
"@angular/material": "^16.2.0", "@angular/material": "^16.2.4",
"@angular/material-moment-adapter": "^16.2.0", "@angular/material-moment-adapter": "^16.2.4",
"@angular/platform-browser": "^16.2.0", "@angular/platform-browser": "^16.2.5",
"@angular/platform-browser-dynamic": "^16.2.0", "@angular/platform-browser-dynamic": "^16.2.5",
"@angular/router": "^16.2.0", "@angular/router": "^16.2.5",
"@angular/service-worker": "^16.2.0", "@angular/service-worker": "^16.2.5",
"@ctrl/ngx-codemirror": "^6.1.0", "@ctrl/ngx-codemirror": "^6.1.0",
"@grpc/grpc-js": "^1.9.3", "@grpc/grpc-js": "^1.9.3",
"@ngx-translate/core": "^14.0.0", "@ngx-translate/core": "^14.0.0",
@ -50,15 +50,15 @@
"zone.js": "~0.13.1" "zone.js": "~0.13.1"
}, },
"devDependencies": { "devDependencies": {
"@angular-devkit/build-angular": "^16.2.0", "@angular-devkit/build-angular": "^16.2.2",
"@angular-eslint/builder": "16.1.0", "@angular-eslint/builder": "16.2.0",
"@angular-eslint/eslint-plugin": "16.1.0", "@angular-eslint/eslint-plugin": "16.2.0",
"@angular-eslint/eslint-plugin-template": "16.1.0", "@angular-eslint/eslint-plugin-template": "16.2.0",
"@angular-eslint/schematics": "16.1.0", "@angular-eslint/schematics": "16.2.0",
"@angular-eslint/template-parser": "16.1.0", "@angular-eslint/template-parser": "16.2.0",
"@angular/cli": "^16.2.0", "@angular/cli": "^16.2.2",
"@angular/compiler-cli": "^16.2.0", "@angular/compiler-cli": "^16.2.5",
"@angular/language-service": "^16.2.0", "@angular/language-service": "^16.2.5",
"@bufbuild/buf": "^1.23.1", "@bufbuild/buf": "^1.23.1",
"@types/file-saver": "^2.0.2", "@types/file-saver": "^2.0.2",
"@types/google-protobuf": "^3.15.3", "@types/google-protobuf": "^3.15.3",

View File

@ -1,15 +1,13 @@
@use '@angular/material' as mat;
@mixin main-theme($theme) { @mixin main-theme($theme) {
$primary: map-get($theme, primary); $primary: map-get($theme, primary);
$warn: map-get($theme, warn); $warn: map-get($theme, warn);
$background: map-get($theme, background); $background: map-get($theme, background);
$foreground: map-get($theme, foreground); $foreground: map-get($theme, foreground);
$accent: map-get($theme, accent); $accent: map-get($theme, accent);
$primary-color: mat.get-color-from-palette($primary, 500); $primary-color: map-get($primary, 500);
$warn-color: mat.get-color-from-palette($warn, 500); $warn-color: map-get($warn, 500);
$accent-color: mat.get-color-from-palette($accent, 500); $accent-color: map-get($accent, 500);
$is-dark-theme: map-get($theme, is-dark); $is-dark-theme: map-get($theme, is-dark);
.main-container { .main-container {

View File

@ -218,7 +218,6 @@ export class AppComponent implements OnDestroy {
}) })
.catch((error) => { .catch((error) => {
console.error(error); console.error(error);
this.themeService.setDefaultColors();
this.router.navigate(['/users/me']); this.router.navigate(['/users/me']);
}); });
} }

View File

@ -13,11 +13,11 @@ import localePt from '@angular/common/locales/pt';
import localeZh from '@angular/common/locales/zh'; import localeZh from '@angular/common/locales/zh';
import { APP_INITIALIZER, NgModule } from '@angular/core'; import { APP_INITIALIZER, NgModule } from '@angular/core';
import { MatNativeDateModule } from '@angular/material/core'; import { MatNativeDateModule } from '@angular/material/core';
import { MatDialogModule } from '@angular/material/dialog';
import { MatIconModule } from '@angular/material/icon'; import { MatIconModule } from '@angular/material/icon';
import { MatLegacyDialogModule as MatDialogModule } from '@angular/material/legacy-dialog'; import { MatSelectModule } from '@angular/material/select';
import { MatLegacySelectModule as MatSelectModule } from '@angular/material/legacy-select'; import { MatSnackBarModule } from '@angular/material/snack-bar';
import { MatLegacySnackBarModule as MatSnackBarModule } from '@angular/material/legacy-snack-bar'; import { MatTooltipModule } from '@angular/material/tooltip';
import { MatLegacyTooltipModule as MatTooltipModule } from '@angular/material/legacy-tooltip';
import { BrowserModule } from '@angular/platform-browser'; import { BrowserModule } from '@angular/platform-browser';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { ServiceWorkerModule } from '@angular/service-worker'; import { ServiceWorkerModule } from '@angular/service-worker';

View File

@ -3,11 +3,11 @@
$warn: map-get($theme, warn); $warn: map-get($theme, warn);
$background: map-get($theme, background); $background: map-get($theme, background);
$accent: map-get($theme, accent); $accent: map-get($theme, accent);
$primary-color: mat.get-color-from-palette($primary, 500); $primary-color: map-get($primary, 500);
$card-background-color: mat.get-color-from-palette($background, cards); $card-background-color: map-get($background, cards);
$warn-color: mat.get-color-from-palette($warn, 500); $warn-color: map-get($warn, 500);
$accent-color: mat.get-color-from-palette($accent, 500); $accent-color: map-get($accent, 500);
$foreground: map-get($theme, foreground); $foreground: map-get($theme, foreground);
$is-dark-theme: map-get($theme, is-dark); $is-dark-theme: map-get($theme, is-dark);
$back: map-get($background, background); $back: map-get($background, background);
@ -54,10 +54,6 @@
button { button {
border-radius: 50vh; border-radius: 50vh;
margin: 0.5rem; margin: 0.5rem;
.mat-button-wrapper {
font-size: 0.8rem;
}
} }
.l-accounts { .l-accounts {

View File

@ -1,8 +1,8 @@
import { CommonModule } from '@angular/common'; import { CommonModule } from '@angular/common';
import { NgModule } from '@angular/core'; import { NgModule } from '@angular/core';
import { MatButtonModule } from '@angular/material/button';
import { MatIconModule } from '@angular/material/icon'; import { MatIconModule } from '@angular/material/icon';
import { MatLegacyButtonModule as MatButtonModule } from '@angular/material/legacy-button'; import { MatProgressBarModule } from '@angular/material/progress-bar';
import { MatLegacyProgressBarModule as MatProgressBarModule } from '@angular/material/legacy-progress-bar';
import { RouterModule } from '@angular/router'; import { RouterModule } from '@angular/router';
import { TranslateModule } from '@ngx-translate/core'; import { TranslateModule } from '@ngx-translate/core';

View File

@ -1,12 +1,10 @@
@use '@angular/material' as mat;
@mixin action-keys-theme($theme) { @mixin action-keys-theme($theme) {
$primary: map-get($theme, primary); $primary: map-get($theme, primary);
$background: map-get($theme, background); $background: map-get($theme, background);
$foreground: map-get($theme, foreground); $foreground: map-get($theme, foreground);
$accent: map-get($theme, accent); $accent: map-get($theme, accent);
$is-dark-theme: map-get($theme, is-dark); $is-dark-theme: map-get($theme, is-dark);
$accent-color: mat.get-color-from-palette($primary, 500); $accent-color: map-get($primary, 500);
$back: map-get($background, background); $back: map-get($background, background);
.action-keys-wrapper { .action-keys-wrapper {
@ -45,7 +43,7 @@
right: 0; right: 0;
bottom: 0; bottom: 0;
left: 0; left: 0;
background: mat.get-color-from-palette($primary, default-contrast); background: map-get($primary, default-contrast);
opacity: 0.2; opacity: 0.2;
border-radius: 4px; border-radius: 4px;
} }

View File

@ -1,9 +1,6 @@
import { Component, Inject } from '@angular/core'; import { Component, Inject } from '@angular/core';
import { UntypedFormControl } from '@angular/forms'; import { UntypedFormControl } from '@angular/forms';
import { import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';
MatLegacyDialogRef as MatDialogRef,
MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA,
} from '@angular/material/legacy-dialog';
import { KeyType } from 'src/app/proto/generated/zitadel/auth_n_key_pb'; import { KeyType } from 'src/app/proto/generated/zitadel/auth_n_key_pb';
export enum AddKeyDialogType { export enum AddKeyDialogType {

View File

@ -2,14 +2,15 @@ import { CommonModule } from '@angular/common';
import { NgModule } from '@angular/core'; import { NgModule } from '@angular/core';
import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { FormsModule, ReactiveFormsModule } from '@angular/forms';
import { MatMomentDateModule } from '@angular/material-moment-adapter'; import { MatMomentDateModule } from '@angular/material-moment-adapter';
import { MatButtonModule } from '@angular/material/button';
import { MatDatepickerModule } from '@angular/material/datepicker'; import { MatDatepickerModule } from '@angular/material/datepicker';
import { MatIconModule } from '@angular/material/icon'; import { MatIconModule } from '@angular/material/icon';
import { MatLegacyButtonModule as MatButtonModule } from '@angular/material/legacy-button'; import { MatSelectModule } from '@angular/material/select';
import { MatLegacySelectModule as MatSelectModule } from '@angular/material/legacy-select';
import { TranslateModule } from '@ngx-translate/core'; import { TranslateModule } from '@ngx-translate/core';
import { InputModule } from 'src/app/modules/input/input.module'; import { InputModule } from 'src/app/modules/input/input.module';
import { LocalizedDatePipeModule } from 'src/app/pipes/localized-date-pipe/localized-date-pipe.module'; import { LocalizedDatePipeModule } from 'src/app/pipes/localized-date-pipe/localized-date-pipe.module';
import { MatDialogModule } from '@angular/material/dialog';
import { AddKeyDialogComponent } from './add-key-dialog.component'; import { AddKeyDialogComponent } from './add-key-dialog.component';
@NgModule({ @NgModule({
@ -22,6 +23,7 @@ import { AddKeyDialogComponent } from './add-key-dialog.component';
MatSelectModule, MatSelectModule,
MatIconModule, MatIconModule,
FormsModule, FormsModule,
MatDialogModule,
MatDatepickerModule, MatDatepickerModule,
MatMomentDateModule, MatMomentDateModule,
ReactiveFormsModule, ReactiveFormsModule,

View File

@ -1,9 +1,10 @@
<h1 mat-dialog-title> <h1 mat-dialog-title>
<span class="title">{{ 'MEMBER.ADD' | translate }}</span> <span class="title">{{ 'MEMBER.ADD' | translate }}</span>
</h1> </h1>
<p class="desc cnsl-secondary-text">{{ 'ORG_DETAIL.MEMBER.ADDDESCRIPTION' | translate }}</p>
<div mat-dialog-content> <div mat-dialog-content>
<p class="desc cnsl-secondary-text">{{ 'ORG_DETAIL.MEMBER.ADDDESCRIPTION' | translate }}</p>
<ng-container *ngIf="showCreationTypeSelector"> <ng-container *ngIf="showCreationTypeSelector">
<cnsl-form-field class="full-width"> <cnsl-form-field class="full-width">
<cnsl-label>{{ 'MEMBER.CREATIONTYPE' | translate }}</cnsl-label> <cnsl-label>{{ 'MEMBER.CREATIONTYPE' | translate }}</cnsl-label>

View File

@ -14,7 +14,6 @@
box-sizing: border-box; box-sizing: border-box;
.role-cb { .role-cb {
padding: 0.25rem 0;
box-sizing: border-box; box-sizing: border-box;
.role-cb-content { .role-cb-content {

View File

@ -1,8 +1,5 @@
import { Component, Inject } from '@angular/core'; import { Component, Inject } from '@angular/core';
import { import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';
MatLegacyDialogRef as MatDialogRef,
MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA,
} from '@angular/material/legacy-dialog';
import { Observable } from 'rxjs'; import { Observable } from 'rxjs';
import { GrantedProject, Project } from 'src/app/proto/generated/zitadel/project_pb'; import { GrantedProject, Project } from 'src/app/proto/generated/zitadel/project_pb';
import { User } from 'src/app/proto/generated/zitadel/user_pb'; import { User } from 'src/app/proto/generated/zitadel/user_pb';

View File

@ -1,12 +1,12 @@
import { CommonModule } from '@angular/common'; import { CommonModule } from '@angular/common';
import { NgModule } from '@angular/core'; import { NgModule } from '@angular/core';
import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { FormsModule, ReactiveFormsModule } from '@angular/forms';
import { MatLegacyButtonModule as MatButtonModule } from '@angular/material/legacy-button'; import { MatButtonModule } from '@angular/material/button';
import { MatLegacyCheckboxModule as MatCheckboxModule } from '@angular/material/legacy-checkbox'; import { MatCheckboxModule } from '@angular/material/checkbox';
import { MatLegacyChipsModule as MatChipsModule } from '@angular/material/legacy-chips'; import { MatChipsModule } from '@angular/material/chips';
import { MatLegacyDialogModule as MatDialogModule } from '@angular/material/legacy-dialog'; import { MatDialogModule } from '@angular/material/dialog';
import { MatLegacySelectModule as MatSelectModule } from '@angular/material/legacy-select'; import { MatSelectModule } from '@angular/material/select';
import { MatLegacyTooltipModule as MatTooltipModule } from '@angular/material/legacy-tooltip'; import { MatTooltipModule } from '@angular/material/tooltip';
import { TranslateModule } from '@ngx-translate/core'; import { TranslateModule } from '@ngx-translate/core';
import { InputModule } from 'src/app/modules/input/input.module'; import { InputModule } from 'src/app/modules/input/input.module';
import { SearchUserAutocompleteModule } from 'src/app/modules/search-user-autocomplete/search-user-autocomplete.module'; import { SearchUserAutocompleteModule } from 'src/app/modules/search-user-autocomplete/search-user-autocomplete.module';

View File

@ -12,8 +12,6 @@
flex-direction: column; flex-direction: column;
.role-cb { .role-cb {
padding: 0.25rem 0;
.role-cb-content { .role-cb-content {
padding-left: 0.5rem; padding-left: 0.5rem;
display: flex; display: flex;
@ -30,5 +28,9 @@
.action { .action {
display: flex; display: flex;
justify-content: space-between; justify-content: flex-end;
.ok-button {
margin-left: 1rem;
}
} }

View File

@ -1,8 +1,5 @@
import { Component, Inject } from '@angular/core'; import { Component, Inject } from '@angular/core';
import { import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';
MatLegacyDialogRef as MatDialogRef,
MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA,
} from '@angular/material/legacy-dialog';
import { getMembershipColor } from 'src/app/utils/color'; import { getMembershipColor } from 'src/app/utils/color';
@Component({ @Component({

View File

@ -1,13 +1,14 @@
import { CommonModule } from '@angular/common'; import { CommonModule } from '@angular/common';
import { NgModule } from '@angular/core'; import { NgModule } from '@angular/core';
import { MatLegacyButtonModule as MatButtonModule } from '@angular/material/legacy-button'; import { MatButtonModule } from '@angular/material/button';
import { MatLegacyCheckboxModule as MatCheckboxModule } from '@angular/material/legacy-checkbox'; import { MatCheckboxModule } from '@angular/material/checkbox';
import { MatLegacyTooltipModule as MatTooltipModule } from '@angular/material/legacy-tooltip'; import { MatTooltipModule } from '@angular/material/tooltip';
import { TranslateModule } from '@ngx-translate/core'; import { TranslateModule } from '@ngx-translate/core';
import { LocalizedDatePipeModule } from 'src/app/pipes/localized-date-pipe/localized-date-pipe.module'; import { LocalizedDatePipeModule } from 'src/app/pipes/localized-date-pipe/localized-date-pipe.module';
import { RoleTransformPipeModule } from 'src/app/pipes/role-transform/role-transform.module'; import { RoleTransformPipeModule } from 'src/app/pipes/role-transform/role-transform.module';
import { TimestampToDatePipeModule } from 'src/app/pipes/timestamp-to-date-pipe/timestamp-to-date-pipe.module'; import { TimestampToDatePipeModule } from 'src/app/pipes/timestamp-to-date-pipe/timestamp-to-date-pipe.module';
import { MatDialogModule } from '@angular/material/dialog';
import { AddMemberRolesDialogComponent } from './add-member-roles-dialog.component'; import { AddMemberRolesDialogComponent } from './add-member-roles-dialog.component';
@NgModule({ @NgModule({
@ -17,6 +18,7 @@ import { AddMemberRolesDialogComponent } from './add-member-roles-dialog.compone
TranslateModule, TranslateModule,
MatCheckboxModule, MatCheckboxModule,
MatButtonModule, MatButtonModule,
MatDialogModule,
LocalizedDatePipeModule, LocalizedDatePipeModule,
MatTooltipModule, MatTooltipModule,
RoleTransformPipeModule, RoleTransformPipeModule,

View File

@ -1,9 +1,6 @@
import { Component, Inject } from '@angular/core'; import { Component, Inject } from '@angular/core';
import { UntypedFormControl } from '@angular/forms'; import { UntypedFormControl } from '@angular/forms';
import { import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';
MatLegacyDialogRef as MatDialogRef,
MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA,
} from '@angular/material/legacy-dialog';
@Component({ @Component({
selector: 'cnsl-add-token-dialog', selector: 'cnsl-add-token-dialog',

View File

@ -2,14 +2,15 @@ import { CommonModule } from '@angular/common';
import { NgModule } from '@angular/core'; import { NgModule } from '@angular/core';
import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { FormsModule, ReactiveFormsModule } from '@angular/forms';
import { MatMomentDateModule } from '@angular/material-moment-adapter'; import { MatMomentDateModule } from '@angular/material-moment-adapter';
import { MatButtonModule } from '@angular/material/button';
import { MatDatepickerModule } from '@angular/material/datepicker'; import { MatDatepickerModule } from '@angular/material/datepicker';
import { MatIconModule } from '@angular/material/icon'; import { MatIconModule } from '@angular/material/icon';
import { MatLegacyButtonModule as MatButtonModule } from '@angular/material/legacy-button'; import { MatSelectModule } from '@angular/material/select';
import { MatLegacySelectModule as MatSelectModule } from '@angular/material/legacy-select';
import { TranslateModule } from '@ngx-translate/core'; import { TranslateModule } from '@ngx-translate/core';
import { InputModule } from 'src/app/modules/input/input.module'; import { InputModule } from 'src/app/modules/input/input.module';
import { LocalizedDatePipeModule } from 'src/app/pipes/localized-date-pipe/localized-date-pipe.module'; import { LocalizedDatePipeModule } from 'src/app/pipes/localized-date-pipe/localized-date-pipe.module';
import { MatDialogModule } from '@angular/material/dialog';
import { InfoSectionModule } from '../info-section/info-section.module'; import { InfoSectionModule } from '../info-section/info-section.module';
import { AddTokenDialogComponent } from './add-token-dialog.component'; import { AddTokenDialogComponent } from './add-token-dialog.component';
@ -22,6 +23,7 @@ import { AddTokenDialogComponent } from './add-token-dialog.component';
InfoSectionModule, InfoSectionModule,
InputModule, InputModule,
MatSelectModule, MatSelectModule,
MatDialogModule,
MatIconModule, MatIconModule,
FormsModule, FormsModule,
MatDatepickerModule, MatDatepickerModule,

View File

@ -1,12 +1,10 @@
@use '@angular/material' as mat;
@mixin app-card-theme($theme) { @mixin app-card-theme($theme) {
$primary: map-get($theme, primary); $primary: map-get($theme, primary);
$background: map-get($theme, background); $background: map-get($theme, background);
$foreground: map-get($theme, foreground); $foreground: map-get($theme, foreground);
$accent: map-get($theme, accent); $accent: map-get($theme, accent);
$is-dark-theme: map-get($theme, is-dark); $is-dark-theme: map-get($theme, is-dark);
$accent-color: mat.get-color-from-palette($primary, 500); $accent-color: map-get($primary, 500);
$back: map-get($background, background); $back: map-get($background, background);
.cnsl-app-card { .cnsl-app-card {
@ -26,7 +24,7 @@
font-weight: 600; font-weight: 600;
background-color: $back; background-color: $back;
transition: background-color box-shadow 0.3s ease-in; transition: background-color box-shadow 0.3s ease-in;
color: mat.get-color-from-palette($primary, default-contrast); color: map-get($primary, default-contrast);
&.add { &.add {
background-color: map-get($primary, 500); background-color: map-get($primary, 500);

View File

@ -1,5 +1,3 @@
@use '@angular/material' as mat;
.auth-method-radio-button-wrapper { .auth-method-radio-button-wrapper {
display: flex; display: flex;
flex-direction: row; flex-direction: row;
@ -20,7 +18,7 @@
@mixin app-auth-method-radio-theme($theme) { @mixin app-auth-method-radio-theme($theme) {
$primary: map-get($theme, primary); $primary: map-get($theme, primary);
$primary-color: mat.get-color-from-palette($primary, 500); $primary-color: map-get($primary, 500);
$is-dark-theme: map-get($theme, is-dark); $is-dark-theme: map-get($theme, is-dark);
$background: map-get($theme, background); $background: map-get($theme, background);
$border-color: if($is-dark-theme, rgba(#8795a1, 0.2), rgba(#8795a1, 0.2)); $border-color: if($is-dark-theme, rgba(#8795a1, 0.2), rgba(#8795a1, 0.2));

View File

@ -1,5 +1,3 @@
@use '@angular/material' as mat;
.app-type-radio-button-wrapper { .app-type-radio-button-wrapper {
display: flex; display: flex;
flex-direction: row; flex-direction: row;
@ -10,7 +8,7 @@
@mixin app-type-radio-theme($theme) { @mixin app-type-radio-theme($theme) {
$primary: map-get($theme, primary); $primary: map-get($theme, primary);
$primary-color: mat.get-color-from-palette($primary, 500); $primary-color: map-get($primary, 500);
$is-dark-theme: map-get($theme, is-dark); $is-dark-theme: map-get($theme, is-dark);
$background: map-get($theme, background); $background: map-get($theme, background);
$border-color: if($is-dark-theme, rgba(#8795a1, 0.2), rgba(#8795a1, 0.2)); $border-color: if($is-dark-theme, rgba(#8795a1, 0.2), rgba(#8795a1, 0.2));

View File

@ -1,8 +1,6 @@
@use '@angular/material' as mat;
@mixin avatar-theme($theme) { @mixin avatar-theme($theme) {
$primary: map-get($theme, primary); $primary: map-get($theme, primary);
$primary-color: mat.get-color-from-palette($primary, 500); $primary-color: map-get($primary, 500);
.avatar-circle { .avatar-circle {
border-radius: 50%; border-radius: 50%;

View File

@ -1,8 +1,8 @@
import { CommonModule } from '@angular/common'; import { CommonModule } from '@angular/common';
import { NgModule } from '@angular/core'; import { NgModule } from '@angular/core';
import { MatButtonModule } from '@angular/material/button';
import { MatIconModule } from '@angular/material/icon'; import { MatIconModule } from '@angular/material/icon';
import { MatLegacyButtonModule as MatButtonModule } from '@angular/material/legacy-button'; import { MatTooltipModule } from '@angular/material/tooltip';
import { MatLegacyTooltipModule as MatTooltipModule } from '@angular/material/legacy-tooltip';
import { CardComponent } from './card.component'; import { CardComponent } from './card.component';

View File

@ -1,10 +1,8 @@
@use '@angular/material' as mat;
@mixin card-theme($theme) { @mixin card-theme($theme) {
$primary: map-get($theme, primary); $primary: map-get($theme, primary);
$primary-color: mat.get-color-from-palette($primary, 500); $primary-color: map-get($primary, 500);
$background: map-get($theme, background); $background: map-get($theme, background);
$card-background-color: mat.get-color-from-palette($background, cards); $card-background-color: map-get($background, cards);
$is-dark-theme: map-get($theme, is-dark); $is-dark-theme: map-get($theme, is-dark);
$border-color: if($is-dark-theme, rgba(#8795a1, 0.2), rgba(#8795a1, 0.2)); $border-color: if($is-dark-theme, rgba(#8795a1, 0.2), rgba(#8795a1, 0.2));
$border-selected-color: if($is-dark-theme, #fff, #000); $border-selected-color: if($is-dark-theme, #fff, #000);
@ -59,6 +57,13 @@
.cnsl-chip { .cnsl-chip {
height: auto; height: auto;
border: 1px solid $border-color; border: 1px solid $border-color;
background: if($is-dark-theme, map-get($background, state), #e4e7e4) !important;
.cnsl-chip-content {
display: flex;
align-items: center;
font-size: 14px !important;
}
} }
.cnsl-chip-list { .cnsl-chip-list {

View File

@ -1,5 +1,3 @@
@use '@angular/material' as mat;
.change-header { .change-header {
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;

View File

@ -1,10 +1,10 @@
import { ScrollingModule } from '@angular/cdk/scrolling'; import { ScrollingModule } from '@angular/cdk/scrolling';
import { CommonModule } from '@angular/common'; import { CommonModule } from '@angular/common';
import { NgModule } from '@angular/core'; import { NgModule } from '@angular/core';
import { MatButtonModule } from '@angular/material/button';
import { MatIconModule } from '@angular/material/icon'; import { MatIconModule } from '@angular/material/icon';
import { MatLegacyButtonModule as MatButtonModule } from '@angular/material/legacy-button'; import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
import { MatLegacyProgressSpinnerModule as MatProgressSpinnerModule } from '@angular/material/legacy-progress-spinner'; import { MatTooltipModule } from '@angular/material/tooltip';
import { MatLegacyTooltipModule as MatTooltipModule } from '@angular/material/legacy-tooltip';
import { TranslateModule } from '@ngx-translate/core'; import { TranslateModule } from '@ngx-translate/core';
import { ScrollableModule } from 'src/app/directives/scrollable/scrollable.module'; import { ScrollableModule } from 'src/app/directives/scrollable/scrollable.module';
import { HasRolePipeModule } from 'src/app/pipes/has-role-pipe/has-role-pipe.module'; import { HasRolePipeModule } from 'src/app/pipes/has-role-pipe/has-role-pipe.module';

View File

@ -12,7 +12,9 @@
mat-raised-button mat-raised-button
(click)="openAddKey()" (click)="openAddKey()"
> >
<mat-icon class="icon">add</mat-icon>{{ 'ACTIONS.NEW' | translate }} <div class="cnsl-action-button">
<mat-icon class="icon">add</mat-icon><span>{{ 'ACTIONS.NEW' | translate }}</span>
</div>
</a> </a>
</div> </div>

View File

@ -1,7 +1,7 @@
import { SelectionModel } from '@angular/cdk/collections'; import { SelectionModel } from '@angular/cdk/collections';
import { Component, EventEmitter, Input, OnInit, Output, ViewChild } from '@angular/core'; import { Component, EventEmitter, Input, OnInit, Output, ViewChild } from '@angular/core';
import { MatLegacyDialog as MatDialog } from '@angular/material/legacy-dialog'; import { MatDialog } from '@angular/material/dialog';
import { MatLegacyTableDataSource as MatTableDataSource } from '@angular/material/legacy-table'; import { MatTableDataSource } from '@angular/material/table';
import { TranslateService } from '@ngx-translate/core'; import { TranslateService } from '@ngx-translate/core';
import { Timestamp } from 'google-protobuf/google/protobuf/timestamp_pb'; import { Timestamp } from 'google-protobuf/google/protobuf/timestamp_pb';
import { Moment } from 'moment'; import { Moment } from 'moment';

View File

@ -1,13 +1,13 @@
import { CommonModule } from '@angular/common'; import { CommonModule } from '@angular/common';
import { NgModule } from '@angular/core'; import { NgModule } from '@angular/core';
import { FormsModule } from '@angular/forms'; import { FormsModule } from '@angular/forms';
import { MatButtonModule } from '@angular/material/button';
import { MatCheckboxModule } from '@angular/material/checkbox';
import { MatDialogModule } from '@angular/material/dialog';
import { MatIconModule } from '@angular/material/icon'; import { MatIconModule } from '@angular/material/icon';
import { MatLegacyButtonModule as MatButtonModule } from '@angular/material/legacy-button'; import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
import { MatLegacyCheckboxModule as MatCheckboxModule } from '@angular/material/legacy-checkbox'; import { MatTableModule } from '@angular/material/table';
import { MatLegacyDialogModule as MatDialogModule } from '@angular/material/legacy-dialog'; import { MatTooltipModule } from '@angular/material/tooltip';
import { MatLegacyProgressSpinnerModule as MatProgressSpinnerModule } from '@angular/material/legacy-progress-spinner';
import { MatLegacyTableModule as MatTableModule } from '@angular/material/legacy-table';
import { MatLegacyTooltipModule as MatTooltipModule } from '@angular/material/legacy-tooltip';
import { RouterModule } from '@angular/router'; import { RouterModule } from '@angular/router';
import { TranslateModule } from '@ngx-translate/core'; import { TranslateModule } from '@ngx-translate/core';
import { HasRoleModule } from 'src/app/directives/has-role/has-role.module'; import { HasRoleModule } from 'src/app/directives/has-role/has-role.module';

View File

@ -1,5 +1,3 @@
@use '@angular/material' as mat;
@mixin contributors-theme($theme) { @mixin contributors-theme($theme) {
$foreground: map-get($theme, foreground); $foreground: map-get($theme, foreground);
$background: map-get($theme, background); $background: map-get($theme, background);

View File

@ -1,9 +1,9 @@
import { CommonModule } from '@angular/common'; import { CommonModule } from '@angular/common';
import { NgModule } from '@angular/core'; import { NgModule } from '@angular/core';
import { MatButtonModule } from '@angular/material/button';
import { MatIconModule } from '@angular/material/icon'; import { MatIconModule } from '@angular/material/icon';
import { MatLegacyButtonModule as MatButtonModule } from '@angular/material/legacy-button'; import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
import { MatLegacyProgressSpinnerModule as MatProgressSpinnerModule } from '@angular/material/legacy-progress-spinner'; import { MatTooltipModule } from '@angular/material/tooltip';
import { MatLegacyTooltipModule as MatTooltipModule } from '@angular/material/legacy-tooltip';
import { TranslateModule } from '@ngx-translate/core'; import { TranslateModule } from '@ngx-translate/core';
import { RoleTransformPipeModule } from 'src/app/pipes/role-transform/role-transform.module'; import { RoleTransformPipeModule } from 'src/app/pipes/role-transform/role-transform.module';

View File

@ -1,8 +1,6 @@
@use '@angular/material' as mat;
@mixin app-create-theme($theme) { @mixin app-create-theme($theme) {
$primary: map-get($theme, primary); $primary: map-get($theme, primary);
$primary-color: mat.get-color-from-palette($primary, 500); $primary-color: map-get($primary, 500);
// Number of steps creating app // Number of steps creating app
$steps: 3; $steps: 3;
@ -35,7 +33,11 @@
.abort { .abort {
font-size: 1.2rem; font-size: 1.2rem;
margin-left: 2rem; margin-left: 1.5rem;
text-transform: uppercase;
font-size: 14px;
opacity: 0.8;
letter-spacing: 0.05em;
} }
.abort-2 { .abort-2 {

View File

@ -1,8 +1,8 @@
import { CommonModule } from '@angular/common'; import { CommonModule } from '@angular/common';
import { NgModule } from '@angular/core'; import { NgModule } from '@angular/core';
import { MatButtonModule } from '@angular/material/button';
import { MatIconModule } from '@angular/material/icon'; import { MatIconModule } from '@angular/material/icon';
import { MatLegacyButtonModule as MatButtonModule } from '@angular/material/legacy-button'; import { MatTooltipModule } from '@angular/material/tooltip';
import { MatLegacyTooltipModule as MatTooltipModule } from '@angular/material/legacy-tooltip';
import { TranslateModule } from '@ngx-translate/core'; import { TranslateModule } from '@ngx-translate/core';
import { CreateLayoutComponent } from './create-layout.component'; import { CreateLayoutComponent } from './create-layout.component';

View File

@ -1,10 +1,8 @@
@use '@angular/material' as mat;
@mixin detail-layout-theme($theme) { @mixin detail-layout-theme($theme) {
$primary: map-get($theme, primary); $primary: map-get($theme, primary);
$primary-color: mat.get-color-from-palette($primary, 500); $primary-color: map-get($primary, 500);
$is-dark-theme: map-get($theme, is-dark); $is-dark-theme: map-get($theme, is-dark);
$lighter-color: rgba(mat.get-color-from-palette($primary, 300), 0.5); $lighter-color: rgba(map-get($primary, 300), 0.5);
.detail-layout-head { .detail-layout-head {
margin-bottom: 2rem; margin-bottom: 2rem;

View File

@ -1,7 +1,7 @@
import { CommonModule } from '@angular/common'; import { CommonModule } from '@angular/common';
import { NgModule } from '@angular/core'; import { NgModule } from '@angular/core';
import { MatButtonModule } from '@angular/material/button';
import { MatIconModule } from '@angular/material/icon'; import { MatIconModule } from '@angular/material/icon';
import { MatLegacyButtonModule as MatButtonModule } from '@angular/material/legacy-button';
import { RouterModule } from '@angular/router'; import { RouterModule } from '@angular/router';
import { BackModule } from 'src/app/directives/back/back.module'; import { BackModule } from 'src/app/directives/back/back.module';

View File

@ -1,8 +1,5 @@
import { Component, Inject } from '@angular/core'; import { Component, Inject } from '@angular/core';
import { import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';
MatLegacyDialogRef as MatDialogRef,
MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA,
} from '@angular/material/legacy-dialog';
import { mapTo } from 'rxjs'; import { mapTo } from 'rxjs';
import { Event } from 'src/app/proto/generated/zitadel/event_pb'; import { Event } from 'src/app/proto/generated/zitadel/event_pb';

View File

@ -1,11 +1,12 @@
import { CommonModule } from '@angular/common'; import { CommonModule } from '@angular/common';
import { NgModule } from '@angular/core'; import { NgModule } from '@angular/core';
import { MatButtonModule } from '@angular/material/button';
import { MatIconModule } from '@angular/material/icon'; import { MatIconModule } from '@angular/material/icon';
import { MatLegacyButtonModule as MatButtonModule } from '@angular/material/legacy-button';
import { TranslateModule } from '@ngx-translate/core'; import { TranslateModule } from '@ngx-translate/core';
import { LocalizedDatePipeModule } from 'src/app/pipes/localized-date-pipe/localized-date-pipe.module'; import { LocalizedDatePipeModule } from 'src/app/pipes/localized-date-pipe/localized-date-pipe.module';
import { FormsModule } from '@angular/forms'; import { FormsModule } from '@angular/forms';
import { MatDialogModule } from '@angular/material/dialog';
import { CodemirrorModule } from '@ctrl/ngx-codemirror'; import { CodemirrorModule } from '@ctrl/ngx-codemirror';
import { TimestampToDatePipeModule } from 'src/app/pipes/timestamp-to-date-pipe/timestamp-to-date-pipe.module'; import { TimestampToDatePipeModule } from 'src/app/pipes/timestamp-to-date-pipe/timestamp-to-date-pipe.module';
import { ToObjectPipeModule } from 'src/app/pipes/to-object/to-object.module'; import { ToObjectPipeModule } from 'src/app/pipes/to-object/to-object.module';
@ -19,6 +20,7 @@ import { DisplayJsonDialogComponent } from './display-json-dialog.component';
FormsModule, FormsModule,
TranslateModule, TranslateModule,
MatButtonModule, MatButtonModule,
MatDialogModule,
MatIconModule, MatIconModule,
CodemirrorModule, CodemirrorModule,
TimestampToDatePipeModule, TimestampToDatePipeModule,

View File

@ -1,4 +1,4 @@
<span class="title" mat-dialog-title>{{ 'ORG.DOMAINS.ADD.TITLE' | translate }}</span> <h1 class="title" mat-dialog-title>{{ 'ORG.DOMAINS.ADD.TITLE' | translate }}</h1>
<div mat-dialog-content> <div mat-dialog-content>
<p class="desc cnsl-secondary-text">{{ 'ORG.DOMAINS.ADD.DESCRIPTION' | translate }}</p> <p class="desc cnsl-secondary-text">{{ 'ORG.DOMAINS.ADD.DESCRIPTION' | translate }}</p>

View File

@ -7,10 +7,6 @@
font-size: 0.9rem; font-size: 0.9rem;
} }
.form-field {
width: 100%;
}
.action { .action {
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;

View File

@ -1,8 +1,5 @@
import { Component, Inject } from '@angular/core'; import { Component, Inject } from '@angular/core';
import { import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';
MatLegacyDialogRef as MatDialogRef,
MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA,
} from '@angular/material/legacy-dialog';
@Component({ @Component({
selector: 'cnsl-add-domain-dialog', selector: 'cnsl-add-domain-dialog',

View File

@ -1,14 +1,15 @@
import { CommonModule } from '@angular/common'; import { CommonModule } from '@angular/common';
import { NgModule } from '@angular/core'; import { NgModule } from '@angular/core';
import { FormsModule } from '@angular/forms'; import { FormsModule } from '@angular/forms';
import { MatLegacyButtonModule as MatButtonModule } from '@angular/material/legacy-button'; import { MatButtonModule } from '@angular/material/button';
import { TranslateModule } from '@ngx-translate/core'; import { TranslateModule } from '@ngx-translate/core';
import { InputModule } from 'src/app/modules/input/input.module'; import { InputModule } from 'src/app/modules/input/input.module';
import { MatDialogModule } from '@angular/material/dialog';
import { AddDomainDialogComponent } from './add-domain-dialog.component'; import { AddDomainDialogComponent } from './add-domain-dialog.component';
@NgModule({ @NgModule({
declarations: [AddDomainDialogComponent], declarations: [AddDomainDialogComponent],
imports: [CommonModule, TranslateModule, MatButtonModule, InputModule, FormsModule], imports: [CommonModule, TranslateModule, MatButtonModule, InputModule, MatDialogModule, FormsModule],
}) })
export class AddDomainDialogModule {} export class AddDomainDialogModule {}

View File

@ -1,8 +1,5 @@
import { Component, Inject } from '@angular/core'; import { Component, Inject } from '@angular/core';
import { import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';
MatLegacyDialogRef as MatDialogRef,
MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA,
} from '@angular/material/legacy-dialog';
import { saveAs } from 'file-saver'; import { saveAs } from 'file-saver';
import { InfoSectionType } from 'src/app/modules/info-section/info-section.component'; import { InfoSectionType } from 'src/app/modules/info-section/info-section.component';
import { GenerateOrgDomainValidationResponse } from 'src/app/proto/generated/zitadel/management_pb'; import { GenerateOrgDomainValidationResponse } from 'src/app/proto/generated/zitadel/management_pb';

View File

@ -9,7 +9,7 @@
rel="noreferrer" rel="noreferrer"
target="_blank" target="_blank"
> >
<i class="las la-info-circle"></i> <mat-icon class="icon">info_outline</mat-icon>
</a> </a>
</div> </div>
<p class="desc cnsl-secondary-text">{{ 'ORG.DOMAINS.DESCRIPTION' | translate }}</p> <p class="desc cnsl-secondary-text">{{ 'ORG.DOMAINS.DESCRIPTION' | translate }}</p>
@ -24,9 +24,11 @@
class="cnsl-action-button" class="cnsl-action-button"
(click)="addNewDomain()" (click)="addNewDomain()"
> >
<mat-icon>add</mat-icon> <div class="cnsl-action-button">
<span>{{ 'ACTIONS.NEW' | translate }}</span> <mat-icon>add</mat-icon>
<cnsl-action-keys (actionTriggered)="addNewDomain()"> </cnsl-action-keys> <span>{{ 'ACTIONS.NEW' | translate }}</span>
<cnsl-action-keys (actionTriggered)="addNewDomain()"> </cnsl-action-keys>
</div>
</button> </button>
</div> </div>

View File

@ -10,7 +10,7 @@
margin: 0; margin: 0;
} }
a i { a .icon {
font-size: 1.2rem; font-size: 1.2rem;
height: 1.2rem; height: 1.2rem;
line-height: 1.2rem; line-height: 1.2rem;

View File

@ -1,5 +1,5 @@
import { Component, OnInit } from '@angular/core'; import { Component, OnInit } from '@angular/core';
import { MatLegacyDialog as MatDialog } from '@angular/material/legacy-dialog'; import { MatDialog } from '@angular/material/dialog';
import { InfoSectionType } from 'src/app/modules/info-section/info-section.component'; import { InfoSectionType } from 'src/app/modules/info-section/info-section.component';
import { WarnDialogComponent } from 'src/app/modules/warn-dialog/warn-dialog.component'; import { WarnDialogComponent } from 'src/app/modules/warn-dialog/warn-dialog.component';
import { Domain, DomainValidationType } from 'src/app/proto/generated/zitadel/org_pb'; import { Domain, DomainValidationType } from 'src/app/proto/generated/zitadel/org_pb';
@ -63,7 +63,6 @@ export class DomainsComponent implements OnInit {
public addNewDomain(): void { public addNewDomain(): void {
const dialogRef = this.dialog.open(AddDomainDialogComponent, { const dialogRef = this.dialog.open(AddDomainDialogComponent, {
data: {},
width: '400px', width: '400px',
}); });

View File

@ -1,9 +1,9 @@
import { CommonModule } from '@angular/common'; import { CommonModule } from '@angular/common';
import { NgModule } from '@angular/core'; import { NgModule } from '@angular/core';
import { MatButtonModule } from '@angular/material/button';
import { MatIconModule } from '@angular/material/icon'; import { MatIconModule } from '@angular/material/icon';
import { MatLegacyButtonModule as MatButtonModule } from '@angular/material/legacy-button'; import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
import { MatLegacyProgressSpinnerModule as MatProgressSpinnerModule } from '@angular/material/legacy-progress-spinner'; import { MatTooltipModule } from '@angular/material/tooltip';
import { MatLegacyTooltipModule as MatTooltipModule } from '@angular/material/legacy-tooltip';
import { TranslateModule } from '@ngx-translate/core'; import { TranslateModule } from '@ngx-translate/core';
import { CopyToClipboardModule } from 'src/app/directives/copy-to-clipboard/copy-to-clipboard.module'; import { CopyToClipboardModule } from 'src/app/directives/copy-to-clipboard/copy-to-clipboard.module';
import { ActionKeysModule } from 'src/app/modules/action-keys/action-keys.module'; import { ActionKeysModule } from 'src/app/modules/action-keys/action-keys.module';
@ -15,6 +15,7 @@ import { HasRolePipeModule } from 'src/app/pipes/has-role-pipe/has-role-pipe.mod
import { AddDomainDialogModule } from './add-domain-dialog/add-domain-dialog.module'; import { AddDomainDialogModule } from './add-domain-dialog/add-domain-dialog.module';
import { DomainVerificationComponent } from './domain-verification/domain-verification.component'; import { DomainVerificationComponent } from './domain-verification/domain-verification.component';
import { DomainsComponent } from './domains.component'; import { DomainsComponent } from './domains.component';
import { MatDialogModule } from '@angular/material/dialog';
@NgModule({ @NgModule({
declarations: [DomainsComponent, DomainVerificationComponent], declarations: [DomainsComponent, DomainVerificationComponent],
@ -30,6 +31,7 @@ import { DomainsComponent } from './domains.component';
MatTooltipModule, MatTooltipModule,
CopyToClipboardModule, CopyToClipboardModule,
InputModule, InputModule,
MatDialogModule,
TranslateModule, TranslateModule,
InfoSectionModule, InfoSectionModule,
MatProgressSpinnerModule, MatProgressSpinnerModule,

View File

@ -3,10 +3,10 @@
$warn: map-get($theme, warn); $warn: map-get($theme, warn);
$background: map-get($theme, background); $background: map-get($theme, background);
$accent: map-get($theme, accent); $accent: map-get($theme, accent);
$primary-color: mat.get-color-from-palette($primary, 500); $primary-color: map-get($primary, 500);
$warn-color: mat.get-color-from-palette($warn, 500); $warn-color: map-get($warn, 500);
$accent-color: mat.get-color-from-palette($accent, 500); $accent-color: map-get($accent, 500);
$foreground: map-get($theme, foreground); $foreground: map-get($theme, foreground);
$is-dark-theme: map-get($theme, is-dark); $is-dark-theme: map-get($theme, is-dark);
$back: map-get($background, background); $back: map-get($background, background);
@ -22,6 +22,10 @@
.edit-text-area { .edit-text-area {
min-height: 80px; min-height: 80px;
&.defaulttext {
color: if($is-dark-theme, #ffffff50, #00000050);
}
} }
&.hovering { &.hovering {
@ -41,7 +45,7 @@
padding: 4px 0.5rem; padding: 4px 0.5rem;
font-size: 12px; font-size: 12px;
background: $primary-color; background: $primary-color;
color: mat.get-color-from-palette($primary, default-contrast); color: map-get($primary, default-contrast);
margin: 0.25rem; margin: 0.25rem;
display: flex; display: flex;
align-items: center; align-items: center;
@ -98,7 +102,7 @@
display: flex; display: flex;
flex-direction: column; flex-direction: column;
align-self: flex-start; align-self: flex-start;
margin-top: 30px; margin-top: 20px;
} }
} }
} }

View File

@ -2,9 +2,9 @@ import { TextFieldModule } from '@angular/cdk/text-field';
import { CommonModule } from '@angular/common'; import { CommonModule } from '@angular/common';
import { NgModule } from '@angular/core'; import { NgModule } from '@angular/core';
import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { FormsModule, ReactiveFormsModule } from '@angular/forms';
import { MatButtonModule } from '@angular/material/button';
import { MatIconModule } from '@angular/material/icon'; import { MatIconModule } from '@angular/material/icon';
import { MatLegacyButtonModule as MatButtonModule } from '@angular/material/legacy-button'; import { MatTooltipModule } from '@angular/material/tooltip';
import { MatLegacyTooltipModule as MatTooltipModule } from '@angular/material/legacy-tooltip';
import { TranslateModule } from '@ngx-translate/core'; import { TranslateModule } from '@ngx-translate/core';
import { CopyToClipboardModule } from 'src/app/directives/copy-to-clipboard/copy-to-clipboard.module'; import { CopyToClipboardModule } from 'src/app/directives/copy-to-clipboard/copy-to-clipboard.module';
import { InputModule } from 'src/app/modules/input/input.module'; import { InputModule } from 'src/app/modules/input/input.module';

View File

@ -3,15 +3,20 @@
mat-stroked-button mat-stroked-button
cdkOverlayOrigin cdkOverlayOrigin
(click)="showFilter = !showFilter" (click)="showFilter = !showFilter"
class="cnsl-action-button"
#triggereventfilter="cdkOverlayOrigin" #triggereventfilter="cdkOverlayOrigin"
data-e2e="open-filter-button" data-e2e="open-filter-button"
> >
<i class="las la-filter no-margin"></i> <div class="cnsl-action-button">
<span>{{ 'ACTIONS.FILTER' | translate }}</span> <i class="las la-filter no-margin"></i>
<span *ngIf="queryCount" class="filter-count">{{ queryCount }}</span> <span>{{ 'ACTIONS.FILTER' | translate }}</span>
<cnsl-action-keys [doNotUseContrast]="true" [type]="ActionKeysType.FILTER" (actionTriggered)="showFilter = !showFilter"> <span *ngIf="queryCount" class="filter-count">{{ queryCount }}</span>
</cnsl-action-keys> <cnsl-action-keys
[doNotUseContrast]="true"
[type]="ActionKeysType.FILTER"
(actionTriggered)="showFilter = !showFilter"
>
</cnsl-action-keys>
</div>
</button> </button>
<ng-template <ng-template
cdkConnectedOverlay cdkConnectedOverlay

View File

@ -1,17 +1,15 @@
@use '@angular/material' as mat;
@mixin filter-events-theme($theme) { @mixin filter-events-theme($theme) {
$primary: map-get($theme, primary); $primary: map-get($theme, primary);
$primary-color: mat.get-color-from-palette($primary, 500); $primary-color: map-get($primary, 500);
$lighter-primary-color: mat.get-color-from-palette($primary, 300); $lighter-primary-color: map-get($primary, 300);
$darker-primary-color: mat.get-color-from-palette($primary, 700); $darker-primary-color: map-get($primary, 700);
$background: map-get($theme, background); $background: map-get($theme, background);
$foreground: map-get($theme, foreground); $foreground: map-get($theme, foreground);
$secondary-text: map-get($foreground, secondary-text); $secondary-text: map-get($foreground, secondary-text);
$is-dark-theme: map-get($theme, is-dark); $is-dark-theme: map-get($theme, is-dark);
$link-hover-color: if($is-dark-theme, mat.get-color-from-palette($primary, 200), $primary-color); $link-hover-color: if($is-dark-theme, map-get($primary, 200), $primary-color);
$link-color: if($is-dark-theme, $lighter-primary-color, $primary-color); $link-color: if($is-dark-theme, $lighter-primary-color, $primary-color);
.filter-events-wrapper { .filter-events-wrapper {
@ -66,7 +64,7 @@
background-color: if($is-dark-theme, #00000020, #00000008); background-color: if($is-dark-theme, #00000020, #00000008);
margin: 0 -0.5rem; margin: 0 -0.5rem;
.aggregate-type-select .mat-select { .aggregate-type-select .mat-mdc-select {
height: 36px; height: 36px;
padding: 7px 10px; padding: 7px 10px;
} }

View File

@ -1,14 +1,14 @@
import { CommonModule } from '@angular/common'; import { CommonModule } from '@angular/common';
import { NgModule } from '@angular/core'; import { NgModule } from '@angular/core';
import { MatLegacyButtonModule as MatButtonModule } from '@angular/material/legacy-button'; import { MatButtonModule } from '@angular/material/button';
import { MatLegacySelectModule as MatSelectModule } from '@angular/material/legacy-select'; import { MatSelectModule } from '@angular/material/select';
import { TranslateModule } from '@ngx-translate/core'; import { TranslateModule } from '@ngx-translate/core';
import { OverlayModule } from '@angular/cdk/overlay'; import { OverlayModule } from '@angular/cdk/overlay';
import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { FormsModule, ReactiveFormsModule } from '@angular/forms';
import { MatCheckboxModule } from '@angular/material/checkbox';
import { MatDatepickerModule } from '@angular/material/datepicker'; import { MatDatepickerModule } from '@angular/material/datepicker';
import { MatLegacyCheckboxModule } from '@angular/material/legacy-checkbox'; import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
import { MatLegacyProgressSpinnerModule } from '@angular/material/legacy-progress-spinner';
import { ActionKeysModule } from '../action-keys/action-keys.module'; import { ActionKeysModule } from '../action-keys/action-keys.module';
import { InputModule } from '../input/input.module'; import { InputModule } from '../input/input.module';
import { FilterEventsComponent } from './filter-events.component'; import { FilterEventsComponent } from './filter-events.component';
@ -23,9 +23,9 @@ import { FilterEventsComponent } from './filter-events.component';
ReactiveFormsModule, ReactiveFormsModule,
OverlayModule, OverlayModule,
MatDatepickerModule, MatDatepickerModule,
MatLegacyProgressSpinnerModule, MatProgressSpinnerModule,
TranslateModule, TranslateModule,
MatLegacyCheckboxModule, MatCheckboxModule,
MatSelectModule, MatSelectModule,
ActionKeysModule, ActionKeysModule,
], ],

View File

@ -1,5 +1,5 @@
import { Component, OnInit } from '@angular/core'; import { Component, OnInit } from '@angular/core';
import { MatLegacyCheckboxChange as MatCheckboxChange } from '@angular/material/legacy-checkbox'; import { MatCheckboxChange } from '@angular/material/checkbox';
import { ActivatedRoute, Router } from '@angular/router'; import { ActivatedRoute, Router } from '@angular/router';
import { take } from 'rxjs'; import { take } from 'rxjs';
import { TextQueryMethod } from 'src/app/proto/generated/zitadel/object_pb'; import { TextQueryMethod } from 'src/app/proto/generated/zitadel/object_pb';

View File

@ -1,9 +1,9 @@
import { CommonModule } from '@angular/common'; import { CommonModule } from '@angular/common';
import { NgModule } from '@angular/core'; import { NgModule } from '@angular/core';
import { MatButtonModule } from '@angular/material/button';
import { MatCheckboxModule } from '@angular/material/checkbox';
import { MatIconModule } from '@angular/material/icon'; import { MatIconModule } from '@angular/material/icon';
import { MatLegacyButtonModule as MatButtonModule } from '@angular/material/legacy-button'; import { MatSelectModule } from '@angular/material/select';
import { MatLegacyCheckboxModule as MatCheckboxModule } from '@angular/material/legacy-checkbox';
import { MatLegacySelectModule as MatSelectModule } from '@angular/material/legacy-select';
import { RouterModule } from '@angular/router'; import { RouterModule } from '@angular/router';
import { TranslateModule } from '@ngx-translate/core'; import { TranslateModule } from '@ngx-translate/core';

View File

@ -1,5 +1,5 @@
import { Component, OnInit } from '@angular/core'; import { Component, OnInit } from '@angular/core';
import { MatLegacyCheckboxChange as MatCheckboxChange } from '@angular/material/legacy-checkbox'; import { MatCheckboxChange } from '@angular/material/checkbox';
import { ActivatedRoute, Router } from '@angular/router'; import { ActivatedRoute, Router } from '@angular/router';
import { take } from 'rxjs'; import { take } from 'rxjs';
import { TextQueryMethod } from 'src/app/proto/generated/zitadel/object_pb'; import { TextQueryMethod } from 'src/app/proto/generated/zitadel/object_pb';

View File

@ -1,9 +1,9 @@
import { CommonModule } from '@angular/common'; import { CommonModule } from '@angular/common';
import { NgModule } from '@angular/core'; import { NgModule } from '@angular/core';
import { MatButtonModule } from '@angular/material/button';
import { MatCheckboxModule } from '@angular/material/checkbox';
import { MatIconModule } from '@angular/material/icon'; import { MatIconModule } from '@angular/material/icon';
import { MatLegacyButtonModule as MatButtonModule } from '@angular/material/legacy-button'; import { MatSelectModule } from '@angular/material/select';
import { MatLegacyCheckboxModule as MatCheckboxModule } from '@angular/material/legacy-checkbox';
import { MatLegacySelectModule as MatSelectModule } from '@angular/material/legacy-select';
import { RouterModule } from '@angular/router'; import { RouterModule } from '@angular/router';
import { TranslateModule } from '@ngx-translate/core'; import { TranslateModule } from '@ngx-translate/core';

View File

@ -1,5 +1,5 @@
import { Component, OnInit } from '@angular/core'; import { Component, OnInit } from '@angular/core';
import { MatLegacyCheckboxChange as MatCheckboxChange } from '@angular/material/legacy-checkbox'; import { MatCheckboxChange } from '@angular/material/checkbox';
import { ActivatedRoute, Router } from '@angular/router'; import { ActivatedRoute, Router } from '@angular/router';
import { take } from 'rxjs'; import { take } from 'rxjs';
import { TextQueryMethod } from 'src/app/proto/generated/zitadel/object_pb'; import { TextQueryMethod } from 'src/app/proto/generated/zitadel/object_pb';

View File

@ -1,9 +1,9 @@
import { CommonModule } from '@angular/common'; import { CommonModule } from '@angular/common';
import { NgModule } from '@angular/core'; import { NgModule } from '@angular/core';
import { MatButtonModule } from '@angular/material/button';
import { MatCheckboxModule } from '@angular/material/checkbox';
import { MatIconModule } from '@angular/material/icon'; import { MatIconModule } from '@angular/material/icon';
import { MatLegacyButtonModule as MatButtonModule } from '@angular/material/legacy-button'; import { MatSelectModule } from '@angular/material/select';
import { MatLegacyCheckboxModule as MatCheckboxModule } from '@angular/material/legacy-checkbox';
import { MatLegacySelectModule as MatSelectModule } from '@angular/material/legacy-select';
import { RouterModule } from '@angular/router'; import { RouterModule } from '@angular/router';
import { TranslateModule } from '@ngx-translate/core'; import { TranslateModule } from '@ngx-translate/core';

View File

@ -1,5 +1,5 @@
import { Component, OnInit } from '@angular/core'; import { Component, OnInit } from '@angular/core';
import { MatLegacyCheckboxChange as MatCheckboxChange } from '@angular/material/legacy-checkbox'; import { MatCheckboxChange } from '@angular/material/checkbox';
import { ActivatedRoute, Router } from '@angular/router'; import { ActivatedRoute, Router } from '@angular/router';
import { take } from 'rxjs'; import { take } from 'rxjs';
import { TextQueryMethod } from 'src/app/proto/generated/zitadel/object_pb'; import { TextQueryMethod } from 'src/app/proto/generated/zitadel/object_pb';

View File

@ -1,9 +1,9 @@
import { CommonModule } from '@angular/common'; import { CommonModule } from '@angular/common';
import { NgModule } from '@angular/core'; import { NgModule } from '@angular/core';
import { MatButtonModule } from '@angular/material/button';
import { MatCheckboxModule } from '@angular/material/checkbox';
import { MatIconModule } from '@angular/material/icon'; import { MatIconModule } from '@angular/material/icon';
import { MatLegacyButtonModule as MatButtonModule } from '@angular/material/legacy-button'; import { MatSelectModule } from '@angular/material/select';
import { MatLegacyCheckboxModule as MatCheckboxModule } from '@angular/material/legacy-checkbox';
import { MatLegacySelectModule as MatSelectModule } from '@angular/material/legacy-select';
import { RouterModule } from '@angular/router'; import { RouterModule } from '@angular/router';
import { TranslateModule } from '@ngx-translate/core'; import { TranslateModule } from '@ngx-translate/core';

View File

@ -1,16 +1,12 @@
<div class="cnsl-filter-button-wrapper"> <div class="cnsl-filter-button-wrapper">
<button <button mat-stroked-button class="filter-toggle" (click)="toggleFilter()" cdkOverlayOrigin #trigger="cdkOverlayOrigin">
mat-stroked-button <div class="cnsl-action-button">
class="filter-toggle cnsl-action-button" <i class="las la-filter no-margin"></i>
(click)="toggleFilter()" <span>{{ 'ACTIONS.FILTER' | translate }}</span>
cdkOverlayOrigin <span *ngIf="queryCount" class="filter-count">{{ queryCount }}</span>
#trigger="cdkOverlayOrigin" <cnsl-action-keys [doNotUseContrast]="true" [type]="ActionKeysType.FILTER" (actionTriggered)="toggleFilter()">
> </cnsl-action-keys>
<i class="las la-filter no-margin"></i> </div>
<span>{{ 'ACTIONS.FILTER' | translate }}</span>
<span *ngIf="queryCount" class="filter-count">{{ queryCount }}</span>
<cnsl-action-keys [doNotUseContrast]="true" [type]="ActionKeysType.FILTER" (actionTriggered)="toggleFilter()">
</cnsl-action-keys>
</button> </button>
<ng-template <ng-template
cdkConnectedOverlay cdkConnectedOverlay

View File

@ -3,11 +3,11 @@
$warn: map-get($theme, warn); $warn: map-get($theme, warn);
$background: map-get($theme, background); $background: map-get($theme, background);
$accent: map-get($theme, accent); $accent: map-get($theme, accent);
$primary-color: mat.get-color-from-palette($primary, 500); $primary-color: map-get($primary, 500);
$card-background-color: mat.get-color-from-palette($background, cards); $card-background-color: map-get($background, cards);
$warn-color: mat.get-color-from-palette($warn, 500); $warn-color: map-get($warn, 500);
$accent-color: mat.get-color-from-palette($accent, 500); $accent-color: map-get($accent, 500);
$foreground: map-get($theme, foreground); $foreground: map-get($theme, foreground);
$is-dark-theme: map-get($theme, is-dark); $is-dark-theme: map-get($theme, is-dark);
$back: map-get($background, background); $back: map-get($background, background);
@ -56,14 +56,14 @@
} }
.filter-row { .filter-row {
padding: 0.5rem 0; padding: 0.5rem 0 0 0;
.cb { .cb {
padding: 0.5rem 0; padding: 0;
font-size: 15px; font-size: 15px;
} }
.filter-select-method .mat-select { .filter-select-method .mat-mdc-select {
height: 36px; height: 36px;
padding: 7px 10px; padding: 7px 10px;
} }

View File

@ -2,10 +2,10 @@ import { A11yModule } from '@angular/cdk/a11y';
import { OverlayModule } from '@angular/cdk/overlay'; import { OverlayModule } from '@angular/cdk/overlay';
import { CommonModule } from '@angular/common'; import { CommonModule } from '@angular/common';
import { NgModule } from '@angular/core'; import { NgModule } from '@angular/core';
import { MatButtonModule } from '@angular/material/button';
import { MatCheckboxModule } from '@angular/material/checkbox';
import { MatIconModule } from '@angular/material/icon'; import { MatIconModule } from '@angular/material/icon';
import { MatLegacyButtonModule as MatButtonModule } from '@angular/material/legacy-button'; import { MatSelectModule } from '@angular/material/select';
import { MatLegacyCheckboxModule as MatCheckboxModule } from '@angular/material/legacy-checkbox';
import { MatLegacySelectModule as MatSelectModule } from '@angular/material/legacy-select';
import { TranslateModule } from '@ngx-translate/core'; import { TranslateModule } from '@ngx-translate/core';
import { ActionKeysModule } from '../action-keys/action-keys.module'; import { ActionKeysModule } from '../action-keys/action-keys.module';

View File

@ -4,11 +4,11 @@
$background: map-get($theme, background); $background: map-get($theme, background);
$accent: map-get($theme, accent); $accent: map-get($theme, accent);
$lighter-primary-color: mat.get-color-from-palette($primary, 300); $lighter-primary-color: map-get($primary, 300);
$darker-primary-color: mat.get-color-from-palette($primary, 700); $darker-primary-color: map-get($primary, 700);
$warn-color: mat.get-color-from-palette($warn, 500); $warn-color: map-get($warn, 500);
$accent-color: mat.get-color-from-palette($accent, 500); $accent-color: map-get($accent, 500);
$foreground: map-get($theme, foreground); $foreground: map-get($theme, foreground);
$is-dark-theme: map-get($theme, is-dark); $is-dark-theme: map-get($theme, is-dark);
$back: map-get($background, background); $back: map-get($background, background);
@ -60,19 +60,6 @@
justify-content: flex-end; justify-content: flex-end;
flex: 1; flex: 1;
margin: 0.5rem 0; margin: 0.5rem 0;
i {
margin-right: 0.5rem;
}
svg {
opacity: 0.7;
fill: map-get($foreground, text);
height: 1.25rem;
width: 1.25rem;
margin-right: -8px;
margin-left: 0.5rem;
}
} }
.swiss-wrapper { .swiss-wrapper {

View File

@ -1,8 +1,6 @@
@use '@angular/material' as mat;
@mixin cnsl-form-field-theme($theme) { @mixin cnsl-form-field-theme($theme) {
$primary: map-get($theme, primary); $primary: map-get($theme, primary);
$primary-color: mat.get-color-from-palette($primary, 500); $primary-color: map-get($primary, 500);
$is-dark-theme: map-get($theme, is-dark); $is-dark-theme: map-get($theme, is-dark);
$foreground: map-get($theme, foreground); $foreground: map-get($theme, foreground);
@ -16,6 +14,15 @@
.cnsl-form-field-wrapper { .cnsl-form-field-wrapper {
width: 100%; width: 100%;
margin: 10px 0; margin: 10px 0;
.mat-datepicker-toggle button {
padding: 0;
height: 40px;
width: 40px;
display: flex;
justify-content: center;
align-items: center;
}
} }
.cnsl-rel { .cnsl-rel {
@ -35,7 +42,7 @@
} }
input { input {
color: mat.get-color-from-palette($foreground, text); color: map-get($foreground, text);
} }
// Wrapper for the hints and error messages. // Wrapper for the hints and error messages.

View File

@ -17,7 +17,7 @@ import {
ViewEncapsulation, ViewEncapsulation,
} from '@angular/core'; } from '@angular/core';
import { NgControl } from '@angular/forms'; import { NgControl } from '@angular/forms';
import { MatLegacyFormFieldControl as MatFormFieldControl } from '@angular/material/legacy-form-field'; import { MatFormFieldControl } from '@angular/material/form-field';
import { combineLatest, map, Observable, of, startWith, Subject, takeUntil } from 'rxjs'; import { combineLatest, map, Observable, of, startWith, Subject, takeUntil } from 'rxjs';
import { CnslErrorDirective, CNSL_ERROR } from '../error/error.directive'; import { CnslErrorDirective, CNSL_ERROR } from '../error/error.directive';

View File

@ -177,21 +177,25 @@
id="systembutton" id="systembutton"
*ngIf="!isOnInstance && (['iam.read$', 'iam.write$'] | hasRole | async)" *ngIf="!isOnInstance && (['iam.read$', 'iam.write$'] | hasRole | async)"
[routerLink]="['/instance']" [routerLink]="['/instance']"
class="iam-settings cnsl-action-button" class="iam-settings"
mat-stroked-button mat-stroked-button
> >
<span class="iam-label">{{ 'MENU.INSTANCE' | translate }}</span> <div class="cnsl-action-button">
<i class="las la-cog"></i> <span class="iam-label">{{ 'MENU.INSTANCE' | translate }}</span>
<i class="las la-cog"></i>
</div>
</a> </a>
<a <a
id="orgbutton" id="orgbutton"
*ngIf="isOnInstance && (['org.read'] | hasRole | async)" *ngIf="isOnInstance && (['org.read'] | hasRole | async)"
[routerLink]="['/org']" [routerLink]="['/org']"
class="org-settings cnsl-action-button" class="org-settings"
mat-stroked-button mat-stroked-button
> >
<span class="iam-label">{{ 'MENU.ORGANIZATION' | translate }}</span> <div class="cnsl-action-button">
<i class="las la-cog"></i> <span class="iam-label">{{ 'MENU.ORGANIZATION' | translate }}</span>
<i class="las la-cog"></i>
</div>
</a> </a>
</div> </div>

View File

@ -9,17 +9,17 @@
$warn: map-get($theme, warn); $warn: map-get($theme, warn);
$background: map-get($theme, background); $background: map-get($theme, background);
$accent: map-get($theme, accent); $accent: map-get($theme, accent);
$primary-color: mat.get-color-from-palette($primary, 500); $primary-color: map-get($primary, 500);
$warn-color: mat.get-color-from-palette($warn, 500); $warn-color: map-get($warn, 500);
$accent-color: mat.get-color-from-palette($accent, 500); $accent-color: map-get($accent, 500);
$foreground: map-get($theme, foreground); $foreground: map-get($theme, foreground);
$is-dark-theme: map-get($theme, is-dark); $is-dark-theme: map-get($theme, is-dark);
$back: map-get($background, background); $back: map-get($background, background);
.filter-form { .filter-form {
margin: 0 0.5rem; margin: 0 0.5rem;
color: mat.get-color-from-palette($foreground, text) !important; color: map-get($foreground, text) !important;
} }
.header-wrapper { .header-wrapper {

View File

@ -2,10 +2,10 @@ import { OverlayModule } from '@angular/cdk/overlay';
import { CommonModule } from '@angular/common'; import { CommonModule } from '@angular/common';
import { NgModule } from '@angular/core'; import { NgModule } from '@angular/core';
import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { FormsModule, ReactiveFormsModule } from '@angular/forms';
import { MatButtonModule } from '@angular/material/button';
import { MatRippleModule } from '@angular/material/core'; import { MatRippleModule } from '@angular/material/core';
import { MatIconModule } from '@angular/material/icon'; import { MatIconModule } from '@angular/material/icon';
import { MatLegacyButtonModule as MatButtonModule } from '@angular/material/legacy-button'; import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
import { MatLegacyProgressSpinnerModule as MatProgressSpinnerModule } from '@angular/material/legacy-progress-spinner';
import { MatToolbarModule } from '@angular/material/toolbar'; import { MatToolbarModule } from '@angular/material/toolbar';
import { RouterModule } from '@angular/router'; import { RouterModule } from '@angular/router';
import { TranslateModule } from '@ngx-translate/core'; import { TranslateModule } from '@ngx-translate/core';

View File

@ -3,10 +3,10 @@
$warn: map-get($theme, warn); $warn: map-get($theme, warn);
$background: map-get($theme, background); $background: map-get($theme, background);
$accent: map-get($theme, accent); $accent: map-get($theme, accent);
$primary-color: mat.get-color-from-palette($primary, 500); $primary-color: map-get($primary, 500);
$warn-color: mat.get-color-from-palette($warn, 500); $warn-color: map-get($warn, 500);
$accent-color: mat.get-color-from-palette($accent, 500); $accent-color: map-get($accent, 500);
$foreground: map-get($theme, foreground); $foreground: map-get($theme, foreground);
$is-dark-theme: map-get($theme, is-dark); $is-dark-theme: map-get($theme, is-dark);
$back: map-get($background, background); $back: map-get($background, background);

View File

@ -1,7 +1,7 @@
import { SelectionModel } from '@angular/cdk/collections'; import { SelectionModel } from '@angular/cdk/collections';
import { Component, EventEmitter, Input, OnDestroy, OnInit, Output, ViewChild } from '@angular/core'; import { Component, EventEmitter, Input, OnDestroy, OnInit, Output, ViewChild } from '@angular/core';
import { MatLegacyDialog as MatDialog } from '@angular/material/legacy-dialog'; import { MatDialog } from '@angular/material/dialog';
import { MatLegacyTableDataSource as MatTableDataSource } from '@angular/material/legacy-table'; import { MatTableDataSource } from '@angular/material/table';
import { Router, RouterLink } from '@angular/router'; import { Router, RouterLink } from '@angular/router';
import { TranslateService } from '@ngx-translate/core'; import { TranslateService } from '@ngx-translate/core';
import { Duration } from 'google-protobuf/google/protobuf/duration_pb'; import { Duration } from 'google-protobuf/google/protobuf/duration_pb';

View File

@ -1,11 +1,11 @@
import { CommonModule } from '@angular/common'; import { CommonModule } from '@angular/common';
import { NgModule } from '@angular/core'; import { NgModule } from '@angular/core';
import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { FormsModule, ReactiveFormsModule } from '@angular/forms';
import { MatButtonModule } from '@angular/material/button';
import { MatCheckboxModule } from '@angular/material/checkbox';
import { MatIconModule } from '@angular/material/icon'; import { MatIconModule } from '@angular/material/icon';
import { MatLegacyButtonModule as MatButtonModule } from '@angular/material/legacy-button'; import { MatTableModule } from '@angular/material/table';
import { MatLegacyCheckboxModule as MatCheckboxModule } from '@angular/material/legacy-checkbox'; import { MatTooltipModule } from '@angular/material/tooltip';
import { MatLegacyTableModule as MatTableModule } from '@angular/material/legacy-table';
import { MatLegacyTooltipModule as MatTooltipModule } from '@angular/material/legacy-tooltip';
import { RouterModule } from '@angular/router'; import { RouterModule } from '@angular/router';
import { TranslateModule } from '@ngx-translate/core'; import { TranslateModule } from '@ngx-translate/core';
import { HasRoleModule } from 'src/app/directives/has-role/has-role.module'; import { HasRoleModule } from 'src/app/directives/has-role/has-role.module';

View File

@ -1,8 +1,5 @@
import { Component, Inject } from '@angular/core'; import { Component, Inject } from '@angular/core';
import { import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';
MatLegacyDialogRef as MatDialogRef,
MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA,
} from '@angular/material/legacy-dialog';
import { InfoSectionType } from '../info-section/info-section.component'; import { InfoSectionType } from '../info-section/info-section.component';

View File

@ -1,15 +1,16 @@
import { CommonModule } from '@angular/common'; import { CommonModule } from '@angular/common';
import { NgModule } from '@angular/core'; import { NgModule } from '@angular/core';
import { FormsModule } from '@angular/forms'; import { FormsModule } from '@angular/forms';
import { MatLegacyButtonModule as MatButtonModule } from '@angular/material/legacy-button'; import { MatButtonModule } from '@angular/material/button';
import { TranslateModule } from '@ngx-translate/core'; import { TranslateModule } from '@ngx-translate/core';
import { MatDialogModule } from '@angular/material/dialog';
import { InfoSectionModule } from '../info-section/info-section.module'; import { InfoSectionModule } from '../info-section/info-section.module';
import { InputModule } from '../input/input.module'; import { InputModule } from '../input/input.module';
import { InfoDialogComponent } from './info-dialog.component'; import { InfoDialogComponent } from './info-dialog.component';
@NgModule({ @NgModule({
declarations: [InfoDialogComponent], declarations: [InfoDialogComponent],
imports: [CommonModule, FormsModule, TranslateModule, InfoSectionModule, MatButtonModule, InputModule], imports: [CommonModule, FormsModule, MatDialogModule, TranslateModule, InfoSectionModule, MatButtonModule, InputModule],
}) })
export class InfoDialogModule {} export class InfoDialogModule {}

View File

@ -3,10 +3,10 @@
$warn: map-get($theme, warn); $warn: map-get($theme, warn);
$background: map-get($theme, background); $background: map-get($theme, background);
$accent: map-get($theme, accent); $accent: map-get($theme, accent);
$primary-color: mat.get-color-from-palette($primary, 500); $primary-color: map-get($primary, 500);
$warn-color: mat.get-color-from-palette($warn, 500); $warn-color: map-get($warn, 500);
$accent-color: mat.get-color-from-palette($accent, 500); $accent-color: map-get($accent, 500);
$foreground: map-get($theme, foreground); $foreground: map-get($theme, foreground);
$is-dark-theme: map-get($theme, is-dark); $is-dark-theme: map-get($theme, is-dark);
$back: map-get($background, background); $back: map-get($background, background);

View File

@ -1,7 +1,7 @@
import { CommonModule } from '@angular/common'; import { CommonModule } from '@angular/common';
import { NgModule } from '@angular/core'; import { NgModule } from '@angular/core';
import { MatButtonModule } from '@angular/material/button';
import { MatIconModule } from '@angular/material/icon'; import { MatIconModule } from '@angular/material/icon';
import { MatLegacyButtonModule as MatButtonModule } from '@angular/material/legacy-button';
import { TranslateModule } from '@ngx-translate/core'; import { TranslateModule } from '@ngx-translate/core';
import { InfoOverlayComponent } from './info-overlay.component'; import { InfoOverlayComponent } from './info-overlay.component';

View File

@ -1,5 +1,3 @@
@use '@angular/material' as mat;
@mixin info-row-theme($theme) { @mixin info-row-theme($theme) {
$foreground: map-get($theme, foreground); $foreground: map-get($theme, foreground);
$button-text-color: map-get($foreground, text); $button-text-color: map-get($foreground, text);

View File

@ -1,8 +1,8 @@
import { CommonModule } from '@angular/common'; import { CommonModule } from '@angular/common';
import { NgModule } from '@angular/core'; import { NgModule } from '@angular/core';
import { FormsModule } from '@angular/forms'; import { FormsModule } from '@angular/forms';
import { MatLegacyButtonModule as MatButtonModule } from '@angular/material/legacy-button'; import { MatButtonModule } from '@angular/material/button';
import { MatLegacyTooltipModule as MatTooltipModule } from '@angular/material/legacy-tooltip'; import { MatTooltipModule } from '@angular/material/tooltip';
import { TranslateModule } from '@ngx-translate/core'; import { TranslateModule } from '@ngx-translate/core';
import { CopyToClipboardModule } from 'src/app/directives/copy-to-clipboard/copy-to-clipboard.module'; import { CopyToClipboardModule } from 'src/app/directives/copy-to-clipboard/copy-to-clipboard.module';
import { LocalizedDatePipeModule } from 'src/app/pipes/localized-date-pipe/localized-date-pipe.module'; import { LocalizedDatePipeModule } from 'src/app/pipes/localized-date-pipe/localized-date-pipe.module';

View File

@ -1,10 +1,8 @@
@use '@angular/material' as mat;
@mixin info-section-theme($theme) { @mixin info-section-theme($theme) {
$primary: map-get($theme, primary); $primary: map-get($theme, primary);
$background: map-get($theme, background); $background: map-get($theme, background);
$foreground: map-get($theme, foreground); $foreground: map-get($theme, foreground);
$primary-color: mat.get-color-from-palette($primary, 500); $primary-color: map-get($primary, 500);
$is-dark-theme: map-get($theme, is-dark); $is-dark-theme: map-get($theme, is-dark);
.info-section-row { .info-section-row {

View File

@ -17,15 +17,8 @@ import {
} from '@angular/core'; } from '@angular/core';
import { FormGroupDirective, NgControl, NgForm } from '@angular/forms'; import { FormGroupDirective, NgControl, NgForm } from '@angular/forms';
import { CanUpdateErrorState, ErrorStateMatcher, mixinErrorState } from '@angular/material/core'; import { CanUpdateErrorState, ErrorStateMatcher, mixinErrorState } from '@angular/material/core';
import { import { MatFormField, MatFormFieldControl, MAT_FORM_FIELD } from '@angular/material/form-field';
MatLegacyFormField as MatFormField, import { getMatInputUnsupportedTypeError, MAT_INPUT_VALUE_ACCESSOR } from '@angular/material/input';
MatLegacyFormFieldControl as MatFormFieldControl,
MAT_LEGACY_FORM_FIELD as MAT_FORM_FIELD,
} from '@angular/material/legacy-form-field';
import {
getMatLegacyInputUnsupportedTypeError as getMatInputUnsupportedTypeError,
MAT_LEGACY_INPUT_VALUE_ACCESSOR as MAT_INPUT_VALUE_ACCESSOR,
} from '@angular/material/legacy-input';
import { Subject } from 'rxjs'; import { Subject } from 'rxjs';
// Invalid input type. Using one of these will throw an MatInputUnsupportedTypeError. // Invalid input type. Using one of these will throw an MatInputUnsupportedTypeError.
@ -370,7 +363,7 @@ export class InputDirective
private _dirtyCheckPlaceholder(): void { private _dirtyCheckPlaceholder(): void {
// If we're hiding the native placeholder, it should also be cleared from the DOM, otherwise // If we're hiding the native placeholder, it should also be cleared from the DOM, otherwise
// screen readers will read it out twice: once from the label and once from the attribute. // screen readers will read it out twice: once from the label and once from the attribute.
const placeholder = this._formField?._hideControlPlaceholder?.() ? null : this.placeholder; const placeholder = null;
if (placeholder !== this._previousPlaceholder) { if (placeholder !== this._previousPlaceholder) {
const element = this._elementRef.nativeElement; const element = this._elementRef.nativeElement;
this._previousPlaceholder = placeholder; this._previousPlaceholder = placeholder;

View File

@ -34,7 +34,7 @@
</div> </div>
</div> </div>
<div mat-dialog-actions class="action"> <div mat-dialog-actions class="action">
<button mat-stroked-button (click)="closeDialog()"> <button cdkFocusInitial mat-stroked-button (click)="closeDialog()">
{{ 'ACTIONS.CLOSE' | translate }} {{ 'ACTIONS.CLOSE' | translate }}
</button> </button>
<span class="fill-space"></span> <span class="fill-space"></span>

View File

@ -1,5 +1,3 @@
@use '@angular/material' as mat;
@mixin keyboard-shortcuts-theme($theme) { @mixin keyboard-shortcuts-theme($theme) {
$primary: map-get($theme, primary); $primary: map-get($theme, primary);
$background: map-get($theme, background); $background: map-get($theme, background);
@ -7,9 +5,9 @@
$text-color: map-get($foreground, text); $text-color: map-get($foreground, text);
$accent: map-get($theme, accent); $accent: map-get($theme, accent);
$is-dark-theme: map-get($theme, is-dark); $is-dark-theme: map-get($theme, is-dark);
$accent-color: mat.get-color-from-palette($primary, 500); $accent-color: map-get($primary, 500);
$back: map-get($background, background); $back: map-get($background, background);
$card-background-color: mat.get-color-from-palette($background, cards); $card-background-color: map-get($background, cards);
.keyboard-shortcuts-group { .keyboard-shortcuts-group {
$border-color: if($is-dark-theme, rgba(#8795a1, 0.2), rgba(#8795a1, 0.2)); $border-color: if($is-dark-theme, rgba(#8795a1, 0.2), rgba(#8795a1, 0.2));

View File

@ -1,8 +1,5 @@
import { Component, Inject } from '@angular/core'; import { Component, Inject } from '@angular/core';
import { import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';
MatLegacyDialogRef as MatDialogRef,
MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA,
} from '@angular/material/legacy-dialog';
import { Router } from '@angular/router'; import { Router } from '@angular/router';
import { KeyboardShortcut, ORGSHORTCUTS, SIDEWIDESHORTCUTS } from 'src/app/services/keyboard-shortcuts/keyboard-shortcuts'; import { KeyboardShortcut, ORGSHORTCUTS, SIDEWIDESHORTCUTS } from 'src/app/services/keyboard-shortcuts/keyboard-shortcuts';

View File

@ -1,8 +1,8 @@
import { CommonModule } from '@angular/common'; import { CommonModule } from '@angular/common';
import { NgModule } from '@angular/core'; import { NgModule } from '@angular/core';
import { FormsModule } from '@angular/forms'; import { FormsModule } from '@angular/forms';
import { MatButtonModule } from '@angular/material/button';
import { MatIconModule } from '@angular/material/icon'; import { MatIconModule } from '@angular/material/icon';
import { MatLegacyButtonModule as MatButtonModule } from '@angular/material/legacy-button';
import { TranslateModule } from '@ngx-translate/core'; import { TranslateModule } from '@ngx-translate/core';
import { HasRoleModule } from 'src/app/directives/has-role/has-role.module'; import { HasRoleModule } from 'src/app/directives/has-role/has-role.module';

View File

@ -1,11 +1,9 @@
@use '@angular/material' as mat;
@mixin cnsl-label-theme($theme) { @mixin cnsl-label-theme($theme) {
$primary: map-get($theme, primary); $primary: map-get($theme, primary);
$primary-color: mat.get-color-from-palette($primary, 500); $primary-color: map-get($primary, 500);
$is-dark-theme: map-get($theme, is-dark); $is-dark-theme: map-get($theme, is-dark);
$warn: map-get($theme, warn); $warn: map-get($theme, warn);
$warn-color: mat.get-color-from-palette($warn, 500); $warn-color: map-get($warn, 500);
$foreground: map-get($theme, foreground); $foreground: map-get($theme, foreground);
$secondary-text: map-get($foreground, secondary-text); $secondary-text: map-get($foreground, secondary-text);

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