mirror of
https://github.com/zitadel/zitadel.git
synced 2025-02-28 23:37:23 +00:00
fix(console, login): console - ensure permission is available, login - i18n fixes, input borders, lgn-touched script to add class on blur (#3760)
* permission restriction, member, login i18n input borders, secondary text * add touched js
This commit is contained in:
parent
c1f59c7950
commit
233d80502d
@ -150,7 +150,8 @@ const routes: Routes = [
|
|||||||
loadChildren: () => import('./pages/instance-settings/instance-settings.module').then((m) => m.InstanceSettingsModule),
|
loadChildren: () => import('./pages/instance-settings/instance-settings.module').then((m) => m.InstanceSettingsModule),
|
||||||
canActivate: [AuthGuard, RoleGuard],
|
canActivate: [AuthGuard, RoleGuard],
|
||||||
data: {
|
data: {
|
||||||
roles: ['iam.read', 'iam.write'],
|
roles: ['iam.read', 'iam.policy.read'],
|
||||||
|
requiresAll: true,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -166,7 +167,7 @@ const routes: Routes = [
|
|||||||
loadChildren: () => import('./pages/org-settings/org-settings.module').then((m) => m.OrgSettingsModule),
|
loadChildren: () => import('./pages/org-settings/org-settings.module').then((m) => m.OrgSettingsModule),
|
||||||
canActivate: [AuthGuard, RoleGuard],
|
canActivate: [AuthGuard, RoleGuard],
|
||||||
data: {
|
data: {
|
||||||
roles: ['org.read', 'org.write'],
|
roles: ['policy.read'],
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -9,17 +9,11 @@ import { GrpcAuthService } from '../services/grpc-auth.service';
|
|||||||
providedIn: 'root',
|
providedIn: 'root',
|
||||||
})
|
})
|
||||||
export class RoleGuard implements CanActivate {
|
export class RoleGuard implements CanActivate {
|
||||||
|
constructor(private authService: GrpcAuthService) {}
|
||||||
|
|
||||||
constructor(private authService: GrpcAuthService) { }
|
public canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> {
|
||||||
|
return this.authService.fetchedZitadelPermissions
|
||||||
public canActivate(
|
.pipe(filter((permissionsFetched) => !!permissionsFetched))
|
||||||
route: ActivatedRouteSnapshot,
|
.pipe(switchMap((_) => this.authService.isAllowed(route.data['roles'], route.data['requiresAll'])));
|
||||||
state: RouterStateSnapshot,
|
|
||||||
): Observable<boolean> {
|
|
||||||
return this.authService.fetchedZitadelPermissions.pipe(
|
|
||||||
filter((permissionsFetched) => !!permissionsFetched),
|
|
||||||
).pipe(
|
|
||||||
switchMap(_ => this.authService.isAllowed(route.data['roles'])),
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -30,6 +30,10 @@
|
|||||||
margin-bottom: 0.5rem;
|
margin-bottom: 0.5rem;
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
|
|
||||||
|
@media only screen and (max-width: 500px) {
|
||||||
|
border-bottom: none;
|
||||||
|
}
|
||||||
|
|
||||||
.date {
|
.date {
|
||||||
font-weight: 500;
|
font-weight: 500;
|
||||||
font-size: 0.8rem;
|
font-size: 0.8rem;
|
||||||
|
@ -216,7 +216,16 @@
|
|||||||
<button
|
<button
|
||||||
actions
|
actions
|
||||||
[disabled]="
|
[disabled]="
|
||||||
serviceType === PolicyComponentServiceType.MGMT && idp?.providerType === IDPOwnerType.IDP_OWNER_TYPE_ORG
|
(serviceType === PolicyComponentServiceType.MGMT && idp?.providerType === IDPOwnerType.IDP_OWNER_TYPE_ORG) ||
|
||||||
|
([
|
||||||
|
serviceType === PolicyComponentServiceType.ADMIN
|
||||||
|
? 'iam.idp.write'
|
||||||
|
: serviceType === PolicyComponentServiceType.MGMT
|
||||||
|
? 'org.idp.write'
|
||||||
|
: ''
|
||||||
|
]
|
||||||
|
| hasRole
|
||||||
|
| async) === false
|
||||||
"
|
"
|
||||||
mat-icon-button
|
mat-icon-button
|
||||||
color="warn"
|
color="warn"
|
||||||
|
@ -92,6 +92,7 @@
|
|||||||
color="warn"
|
color="warn"
|
||||||
(click)="$event.stopPropagation(); triggerDeleteMember(member)"
|
(click)="$event.stopPropagation(); triggerDeleteMember(member)"
|
||||||
mat-icon-button
|
mat-icon-button
|
||||||
|
[disabled]="canDelete === false"
|
||||||
>
|
>
|
||||||
<i class="las la-trash"></i>
|
<i class="las la-trash"></i>
|
||||||
</button>
|
</button>
|
||||||
@ -110,13 +111,13 @@
|
|||||||
<mat-chip
|
<mat-chip
|
||||||
class="cnsl-chip"
|
class="cnsl-chip"
|
||||||
*ngFor="let role of member.rolesList"
|
*ngFor="let role of member.rolesList"
|
||||||
[removable]="true"
|
[removable]="canWrite"
|
||||||
[selectable]="false"
|
[selectable]="false"
|
||||||
(removed)="removeRole(member, role)"
|
(removed)="removeRole(member, role)"
|
||||||
>
|
>
|
||||||
<div class="cnsl-chip-dot" [style.background]="getColor(role)"></div>
|
<div class="cnsl-chip-dot" [style.background]="getColor(role)"></div>
|
||||||
<span>{{ role | roletransform }}</span>
|
<span>{{ role | roletransform }}</span>
|
||||||
<button matChipRemove>
|
<button *ngIf="canWrite" matChipRemove>
|
||||||
<mat-icon>cancel</mat-icon>
|
<mat-icon>cancel</mat-icon>
|
||||||
</button>
|
</button>
|
||||||
</mat-chip>
|
</mat-chip>
|
||||||
@ -126,8 +127,9 @@
|
|||||||
|
|
||||||
<tr mat-header-row *matHeaderRowDef="displayedColumns"></tr>
|
<tr mat-header-row *matHeaderRowDef="displayedColumns"></tr>
|
||||||
<tr
|
<tr
|
||||||
class="highlight pointer"
|
class="highlight"
|
||||||
(click)="addRole(member)"
|
[ngClass]="{ pointer: canWrite }"
|
||||||
|
(click)="canWrite ? addRole(member) : null"
|
||||||
mat-row
|
mat-row
|
||||||
*matRowDef="let member; columns: displayedColumns"
|
*matRowDef="let member; columns: displayedColumns"
|
||||||
></tr>
|
></tr>
|
||||||
|
@ -64,6 +64,7 @@
|
|||||||
[routerLinkActiveOptions]="{ exact: false }"
|
[routerLinkActiveOptions]="{ exact: false }"
|
||||||
[routerLinkActive]="['active']"
|
[routerLinkActive]="['active']"
|
||||||
[routerLink]="['/settings']"
|
[routerLink]="['/settings']"
|
||||||
|
*ngIf="['iam.read', 'iam.policy.read'] | hasRole: true | async"
|
||||||
>
|
>
|
||||||
<div class="c_label">
|
<div class="c_label">
|
||||||
<span> {{ 'MENU.SETTINGS' | translate }} </span>
|
<span> {{ 'MENU.SETTINGS' | translate }} </span>
|
||||||
@ -169,6 +170,7 @@
|
|||||||
[routerLinkActive]="['active']"
|
[routerLinkActive]="['active']"
|
||||||
[routerLinkActiveOptions]="{ exact: false }"
|
[routerLinkActiveOptions]="{ exact: false }"
|
||||||
[routerLink]="['/org-settings']"
|
[routerLink]="['/org-settings']"
|
||||||
|
*ngIf="['policy.read'] | hasRole | async"
|
||||||
>
|
>
|
||||||
<span class="label">{{ 'MENU.SETTINGS' | translate }}</span>
|
<span class="label">{{ 'MENU.SETTINGS' | translate }}</span>
|
||||||
</a>
|
</a>
|
||||||
|
@ -37,12 +37,24 @@
|
|||||||
<input id="smtp-user" cnslInput name="smtp-user" autocomplete="smtp-user" formControlName="user" />
|
<input id="smtp-user" cnslInput name="smtp-user" autocomplete="smtp-user" formControlName="user" />
|
||||||
</cnsl-form-field>
|
</cnsl-form-field>
|
||||||
|
|
||||||
<button class="set-password-btn" (click)="setSMTPPassword()" mat-stroked-button>
|
<button
|
||||||
|
class="set-password-btn"
|
||||||
|
[disabled]="(['iam.write'] | hasRole | async) === false"
|
||||||
|
(click)="setSMTPPassword()"
|
||||||
|
mat-stroked-button
|
||||||
|
>
|
||||||
{{ 'SETTING.SMTP.SETPASSWORD' | translate }}
|
{{ 'SETTING.SMTP.SETPASSWORD' | translate }}
|
||||||
</button>
|
</button>
|
||||||
|
|
||||||
<div class="general-btn-container">
|
<div class="general-btn-container">
|
||||||
<button class="save-button" (click)="savePolicy()" color="primary" type="submit" mat-raised-button>
|
<button
|
||||||
|
class="save-button"
|
||||||
|
[disabled]="form.disabled"
|
||||||
|
(click)="savePolicy()"
|
||||||
|
color="primary"
|
||||||
|
type="submit"
|
||||||
|
mat-raised-button
|
||||||
|
>
|
||||||
{{ 'ACTIONS.SAVE' | translate }}
|
{{ 'ACTIONS.SAVE' | translate }}
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
@ -65,13 +77,9 @@
|
|||||||
></span>
|
></span>
|
||||||
|
|
||||||
<span class="fill-space"></span>
|
<span class="fill-space"></span>
|
||||||
<button mat-icon-button (click)="addSMSProvider()"><i class="las la-pen"></i></button>
|
<button [disabled]="(['iam.write'] | hasRole | async) === false" mat-icon-button (click)="addSMSProvider()">
|
||||||
|
<i class="las la-pen"></i>
|
||||||
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</cnsl-card>
|
</cnsl-card>
|
||||||
<!-- <button mat-stroked-button (click)="addSMSProvider()">
|
|
||||||
<div class="sms-card add">
|
|
||||||
<mat-icon>add</mat-icon>
|
|
||||||
<span>{{ 'ACTIONS.ADD' | translate }}</span>
|
|
||||||
</div>
|
|
||||||
</button> -->
|
|
||||||
</div>
|
</div>
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
import { Component, Input, OnInit } from '@angular/core';
|
import { Component, Input, OnInit } from '@angular/core';
|
||||||
import { AbstractControl, FormBuilder, FormGroup, Validators } from '@angular/forms';
|
import { AbstractControl, FormBuilder, FormGroup, Validators } from '@angular/forms';
|
||||||
import { MatDialog } from '@angular/material/dialog';
|
import { MatDialog } from '@angular/material/dialog';
|
||||||
|
import { take } from 'rxjs';
|
||||||
import {
|
import {
|
||||||
AddSMSProviderTwilioRequest,
|
AddSMSProviderTwilioRequest,
|
||||||
UpdateSMTPConfigPasswordRequest,
|
UpdateSMTPConfigPasswordRequest,
|
||||||
@ -9,6 +10,7 @@ import {
|
|||||||
} from 'src/app/proto/generated/zitadel/admin_pb';
|
} from 'src/app/proto/generated/zitadel/admin_pb';
|
||||||
import { DebugNotificationProvider, SMSProvider, SMSProviderConfigState } from 'src/app/proto/generated/zitadel/settings_pb';
|
import { DebugNotificationProvider, SMSProvider, SMSProviderConfigState } from 'src/app/proto/generated/zitadel/settings_pb';
|
||||||
import { AdminService } from 'src/app/services/admin.service';
|
import { AdminService } from 'src/app/services/admin.service';
|
||||||
|
import { GrpcAuthService } from 'src/app/services/grpc-auth.service';
|
||||||
import { ToastService } from 'src/app/services/toast.service';
|
import { ToastService } from 'src/app/services/toast.service';
|
||||||
|
|
||||||
import { InfoSectionType } from '../../info-section/info-section.component';
|
import { InfoSectionType } from '../../info-section/info-section.component';
|
||||||
@ -44,18 +46,27 @@ export class NotificationSettingsComponent implements OnInit {
|
|||||||
private dialog: MatDialog,
|
private dialog: MatDialog,
|
||||||
private toast: ToastService,
|
private toast: ToastService,
|
||||||
private fb: FormBuilder,
|
private fb: FormBuilder,
|
||||||
|
private authService: GrpcAuthService,
|
||||||
) {
|
) {
|
||||||
this.form = this.fb.group({
|
this.form = this.fb.group({
|
||||||
senderAddress: ['', [Validators.required]],
|
senderAddress: [{ disabled: true, value: '' }, [Validators.required]],
|
||||||
senderName: ['', [Validators.required]],
|
senderName: [{ disabled: true, value: '' }, [Validators.required]],
|
||||||
tls: [true, [Validators.required]],
|
tls: [{ disabled: true, value: true }, [Validators.required]],
|
||||||
host: ['', [Validators.required]],
|
host: [{ disabled: true, value: '' }, [Validators.required]],
|
||||||
user: ['', [Validators.required]],
|
user: [{ disabled: true, value: '' }, [Validators.required]],
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
ngOnInit(): void {
|
ngOnInit(): void {
|
||||||
this.fetchData();
|
this.fetchData();
|
||||||
|
this.authService
|
||||||
|
.isAllowed(['iam.write'])
|
||||||
|
.pipe(take(1))
|
||||||
|
.subscribe((allowed) => {
|
||||||
|
if (allowed) {
|
||||||
|
this.form.enable();
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private fetchData(): void {
|
private fetchData(): void {
|
||||||
|
@ -7,6 +7,7 @@ import { MatIconModule } from '@angular/material/icon';
|
|||||||
import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
|
import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
|
||||||
import { MatSelectModule } from '@angular/material/select';
|
import { MatSelectModule } from '@angular/material/select';
|
||||||
import { TranslateModule } from '@ngx-translate/core';
|
import { TranslateModule } from '@ngx-translate/core';
|
||||||
|
import { HasRolePipeModule } from 'src/app/pipes/has-role-pipe/has-role-pipe.module';
|
||||||
|
|
||||||
import { CardModule } from '../../card/card.module';
|
import { CardModule } from '../../card/card.module';
|
||||||
import { FormFieldModule } from '../../form-field/form-field.module';
|
import { FormFieldModule } from '../../form-field/form-field.module';
|
||||||
@ -24,6 +25,7 @@ import { SMTPPasswordDialogComponent } from './smtp-password-dialog/smtp-passwor
|
|||||||
InfoSectionModule,
|
InfoSectionModule,
|
||||||
FormsModule,
|
FormsModule,
|
||||||
ReactiveFormsModule,
|
ReactiveFormsModule,
|
||||||
|
HasRolePipeModule,
|
||||||
MatButtonModule,
|
MatButtonModule,
|
||||||
MatCheckboxModule,
|
MatCheckboxModule,
|
||||||
InputModule,
|
InputModule,
|
||||||
|
@ -39,7 +39,14 @@
|
|||||||
</cnsl-form-field>
|
</cnsl-form-field>
|
||||||
</form>
|
</form>
|
||||||
<div class="oidc-btn-container">
|
<div class="oidc-btn-container">
|
||||||
<button class="save-button" (click)="savePolicy()" color="primary" type="submit" mat-raised-button>
|
<button
|
||||||
|
[disabled]="form.disabled"
|
||||||
|
class="save-button"
|
||||||
|
(click)="savePolicy()"
|
||||||
|
color="primary"
|
||||||
|
type="submit"
|
||||||
|
mat-raised-button
|
||||||
|
>
|
||||||
{{ 'ACTIONS.SAVE' | translate }}
|
{{ 'ACTIONS.SAVE' | translate }}
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
@ -1,9 +1,11 @@
|
|||||||
import { Component, OnInit } from '@angular/core';
|
import { Component, OnInit } from '@angular/core';
|
||||||
import { AbstractControl, FormBuilder, FormGroup, Validators } from '@angular/forms';
|
import { AbstractControl, FormBuilder, FormGroup, Validators } from '@angular/forms';
|
||||||
import { Duration } from 'google-protobuf/google/protobuf/duration_pb';
|
import { Duration } from 'google-protobuf/google/protobuf/duration_pb';
|
||||||
|
import { take } from 'rxjs';
|
||||||
import { SetDefaultLanguageResponse, UpdateOIDCSettingsRequest } from 'src/app/proto/generated/zitadel/admin_pb';
|
import { SetDefaultLanguageResponse, UpdateOIDCSettingsRequest } from 'src/app/proto/generated/zitadel/admin_pb';
|
||||||
import { OIDCSettings } from 'src/app/proto/generated/zitadel/settings_pb';
|
import { OIDCSettings } from 'src/app/proto/generated/zitadel/settings_pb';
|
||||||
import { AdminService } from 'src/app/services/admin.service';
|
import { AdminService } from 'src/app/services/admin.service';
|
||||||
|
import { GrpcAuthService } from 'src/app/services/grpc-auth.service';
|
||||||
import { ToastService } from 'src/app/services/toast.service';
|
import { ToastService } from 'src/app/services/toast.service';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
@ -16,17 +18,30 @@ export class OIDCConfigurationComponent implements OnInit {
|
|||||||
|
|
||||||
public loading: boolean = false;
|
public loading: boolean = false;
|
||||||
public form!: FormGroup;
|
public form!: FormGroup;
|
||||||
constructor(private service: AdminService, private fb: FormBuilder, private toast: ToastService) {
|
constructor(
|
||||||
|
private service: AdminService,
|
||||||
|
private fb: FormBuilder,
|
||||||
|
private toast: ToastService,
|
||||||
|
private authService: GrpcAuthService,
|
||||||
|
) {
|
||||||
this.form = this.fb.group({
|
this.form = this.fb.group({
|
||||||
accessTokenLifetime: [12, [Validators.required]],
|
accessTokenLifetime: [{ disabled: true, value: 12 }, [Validators.required]],
|
||||||
idTokenLifetime: [12, [Validators.required]],
|
idTokenLifetime: [{ disabled: true, value: 12 }, [Validators.required]],
|
||||||
refreshTokenExpiration: [30, [Validators.required]],
|
refreshTokenExpiration: [{ disabled: true, value: 30 }, [Validators.required]],
|
||||||
refreshTokenIdleExpiration: [90, [Validators.required]],
|
refreshTokenIdleExpiration: [{ disabled: true, value: 90 }, [Validators.required]],
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
ngOnInit(): void {
|
ngOnInit(): void {
|
||||||
this.fetchData();
|
this.fetchData();
|
||||||
|
this.authService
|
||||||
|
.isAllowed(['iam.write'])
|
||||||
|
.pipe(take(1))
|
||||||
|
.subscribe((allowed) => {
|
||||||
|
if (allowed) {
|
||||||
|
this.form.enable();
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private fetchData(): void {
|
private fetchData(): void {
|
||||||
|
@ -57,6 +57,18 @@
|
|||||||
*ngIf="serviceType === PolicyComponentServiceType.MGMT && !isDefault"
|
*ngIf="serviceType === PolicyComponentServiceType.MGMT && !isDefault"
|
||||||
matTooltip="{{ 'POLICY.RESET' | translate }}"
|
matTooltip="{{ 'POLICY.RESET' | translate }}"
|
||||||
color="warn"
|
color="warn"
|
||||||
|
[disabled]="
|
||||||
|
view === View.CURRENT ||
|
||||||
|
([
|
||||||
|
serviceType === PolicyComponentServiceType.ADMIN
|
||||||
|
? 'iam.policy.delete'
|
||||||
|
: serviceType === PolicyComponentServiceType.MGMT
|
||||||
|
? 'policy.delete'
|
||||||
|
: ''
|
||||||
|
]
|
||||||
|
| hasRole
|
||||||
|
| async) === false
|
||||||
|
"
|
||||||
(click)="removePolicy()"
|
(click)="removePolicy()"
|
||||||
mat-stroked-button
|
mat-stroked-button
|
||||||
>
|
>
|
||||||
@ -136,7 +148,18 @@
|
|||||||
mat-icon-button
|
mat-icon-button
|
||||||
color="warn"
|
color="warn"
|
||||||
(click)="deleteAsset(AssetType.LOGO, theme)"
|
(click)="deleteAsset(AssetType.LOGO, theme)"
|
||||||
[disabled]="view === View.CURRENT"
|
[disabled]="
|
||||||
|
view === View.CURRENT ||
|
||||||
|
([
|
||||||
|
serviceType === PolicyComponentServiceType.ADMIN
|
||||||
|
? 'iam.policy.write'
|
||||||
|
: serviceType === PolicyComponentServiceType.MGMT
|
||||||
|
? 'policy.write'
|
||||||
|
: ''
|
||||||
|
]
|
||||||
|
| hasRole
|
||||||
|
| async) === false
|
||||||
|
"
|
||||||
matTooltip="{{ 'ACTIONS.DELETE' | translate }}"
|
matTooltip="{{ 'ACTIONS.DELETE' | translate }}"
|
||||||
>
|
>
|
||||||
<i class="las la-ban"></i>
|
<i class="las la-ban"></i>
|
||||||
@ -151,9 +174,22 @@
|
|||||||
(change)="onDropLogo(theme, $any($event.target).files)"
|
(change)="onDropLogo(theme, $any($event.target).files)"
|
||||||
/>
|
/>
|
||||||
<button
|
<button
|
||||||
|
class="asset-add-btn"
|
||||||
mat-icon-button
|
mat-icon-button
|
||||||
matTooltip="{{ 'POLICY.PRIVATELABELING.BTN' | translate }}"
|
matTooltip="{{ 'POLICY.PRIVATELABELING.BTN' | translate }}"
|
||||||
*ngIf="view !== View.CURRENT"
|
*ngIf="view !== View.CURRENT"
|
||||||
|
[disabled]="
|
||||||
|
view === View.CURRENT ||
|
||||||
|
([
|
||||||
|
serviceType === PolicyComponentServiceType.ADMIN
|
||||||
|
? 'iam.policy.write'
|
||||||
|
: serviceType === PolicyComponentServiceType.MGMT
|
||||||
|
? 'policy.write'
|
||||||
|
: ''
|
||||||
|
]
|
||||||
|
| hasRole
|
||||||
|
| async) === false
|
||||||
|
"
|
||||||
(click)="$event.preventDefault(); selectedFile.click()"
|
(click)="$event.preventDefault(); selectedFile.click()"
|
||||||
>
|
>
|
||||||
<mat-icon>add</mat-icon>
|
<mat-icon>add</mat-icon>
|
||||||
@ -183,7 +219,18 @@
|
|||||||
mat-icon-button
|
mat-icon-button
|
||||||
color="warn"
|
color="warn"
|
||||||
(click)="deleteAsset(AssetType.ICON, theme)"
|
(click)="deleteAsset(AssetType.ICON, theme)"
|
||||||
[disabled]="view === View.CURRENT"
|
[disabled]="
|
||||||
|
view === View.CURRENT ||
|
||||||
|
([
|
||||||
|
serviceType === PolicyComponentServiceType.ADMIN
|
||||||
|
? 'iam.policy.write'
|
||||||
|
: serviceType === PolicyComponentServiceType.MGMT
|
||||||
|
? 'policy.write'
|
||||||
|
: ''
|
||||||
|
]
|
||||||
|
| hasRole
|
||||||
|
| async) === false
|
||||||
|
"
|
||||||
matTooltip="{{ 'ACTIONS.DELETE' | translate }}"
|
matTooltip="{{ 'ACTIONS.DELETE' | translate }}"
|
||||||
>
|
>
|
||||||
<i class="las la-ban"></i>
|
<i class="las la-ban"></i>
|
||||||
@ -199,8 +246,21 @@
|
|||||||
/>
|
/>
|
||||||
<button
|
<button
|
||||||
mat-icon-button
|
mat-icon-button
|
||||||
|
class="asset-add-btn"
|
||||||
matTooltip="{{ 'POLICY.PRIVATELABELING.BTN' | translate }}"
|
matTooltip="{{ 'POLICY.PRIVATELABELING.BTN' | translate }}"
|
||||||
*ngIf="view !== View.CURRENT"
|
*ngIf="view !== View.CURRENT"
|
||||||
|
[disabled]="
|
||||||
|
view === View.CURRENT ||
|
||||||
|
([
|
||||||
|
serviceType === PolicyComponentServiceType.ADMIN
|
||||||
|
? 'iam.policy.write'
|
||||||
|
: serviceType === PolicyComponentServiceType.MGMT
|
||||||
|
? 'policy.write'
|
||||||
|
: ''
|
||||||
|
]
|
||||||
|
| hasRole
|
||||||
|
| async) === false
|
||||||
|
"
|
||||||
(click)="$event.preventDefault(); selectedIconFile.click()"
|
(click)="$event.preventDefault(); selectedIconFile.click()"
|
||||||
>
|
>
|
||||||
<mat-icon>add</mat-icon>
|
<mat-icon>add</mat-icon>
|
||||||
@ -232,7 +292,18 @@
|
|||||||
<div class="colors" *ngIf="data && previewData">
|
<div class="colors" *ngIf="data && previewData">
|
||||||
<div class="color">
|
<div class="color">
|
||||||
<cnsl-color
|
<cnsl-color
|
||||||
[disabled]="view === View.CURRENT"
|
[disabled]="
|
||||||
|
view === View.CURRENT ||
|
||||||
|
([
|
||||||
|
serviceType === PolicyComponentServiceType.ADMIN
|
||||||
|
? 'iam.policy.write'
|
||||||
|
: serviceType === PolicyComponentServiceType.MGMT
|
||||||
|
? 'policy.write'
|
||||||
|
: ''
|
||||||
|
]
|
||||||
|
| hasRole
|
||||||
|
| async) === false
|
||||||
|
"
|
||||||
[colorType]="ColorType.BACKGROUNDDARK"
|
[colorType]="ColorType.BACKGROUNDDARK"
|
||||||
(previewChanged)="previewData.backgroundColorDark !== $event ? setDarkBackgroundColorAndSave($event) : null"
|
(previewChanged)="previewData.backgroundColorDark !== $event ? setDarkBackgroundColorAndSave($event) : null"
|
||||||
name="Background Color"
|
name="Background Color"
|
||||||
@ -243,7 +314,18 @@
|
|||||||
|
|
||||||
<div class="color">
|
<div class="color">
|
||||||
<cnsl-color
|
<cnsl-color
|
||||||
[disabled]="view === View.CURRENT"
|
[disabled]="
|
||||||
|
view === View.CURRENT ||
|
||||||
|
([
|
||||||
|
serviceType === PolicyComponentServiceType.ADMIN
|
||||||
|
? 'iam.policy.write'
|
||||||
|
: serviceType === PolicyComponentServiceType.MGMT
|
||||||
|
? 'policy.write'
|
||||||
|
: ''
|
||||||
|
]
|
||||||
|
| hasRole
|
||||||
|
| async) === false
|
||||||
|
"
|
||||||
[colorType]="ColorType.PRIMARY"
|
[colorType]="ColorType.PRIMARY"
|
||||||
(previewChanged)="previewData.primaryColorDark !== $event ? setDarkPrimaryColorAndSave($event) : null"
|
(previewChanged)="previewData.primaryColorDark !== $event ? setDarkPrimaryColorAndSave($event) : null"
|
||||||
name="Primary Color"
|
name="Primary Color"
|
||||||
@ -255,7 +337,18 @@
|
|||||||
|
|
||||||
<div class="color">
|
<div class="color">
|
||||||
<cnsl-color
|
<cnsl-color
|
||||||
[disabled]="view === View.CURRENT"
|
[disabled]="
|
||||||
|
view === View.CURRENT ||
|
||||||
|
([
|
||||||
|
serviceType === PolicyComponentServiceType.ADMIN
|
||||||
|
? 'iam.policy.write'
|
||||||
|
: serviceType === PolicyComponentServiceType.MGMT
|
||||||
|
? 'policy.write'
|
||||||
|
: ''
|
||||||
|
]
|
||||||
|
| hasRole
|
||||||
|
| async) === false
|
||||||
|
"
|
||||||
[colorType]="ColorType.WARN"
|
[colorType]="ColorType.WARN"
|
||||||
(previewChanged)="previewData.warnColorDark !== $event ? setDarkWarnColorAndSave($event) : null"
|
(previewChanged)="previewData.warnColorDark !== $event ? setDarkWarnColorAndSave($event) : null"
|
||||||
name="Warn Color"
|
name="Warn Color"
|
||||||
@ -267,7 +360,18 @@
|
|||||||
|
|
||||||
<div class="color">
|
<div class="color">
|
||||||
<cnsl-color
|
<cnsl-color
|
||||||
[disabled]="view === View.CURRENT"
|
[disabled]="
|
||||||
|
view === View.CURRENT ||
|
||||||
|
([
|
||||||
|
serviceType === PolicyComponentServiceType.ADMIN
|
||||||
|
? 'iam.policy.write'
|
||||||
|
: serviceType === PolicyComponentServiceType.MGMT
|
||||||
|
? 'policy.write'
|
||||||
|
: ''
|
||||||
|
]
|
||||||
|
| hasRole
|
||||||
|
| async) === false
|
||||||
|
"
|
||||||
[colorType]="ColorType.FONTDARK"
|
[colorType]="ColorType.FONTDARK"
|
||||||
(previewChanged)="previewData.fontColorDark !== $event ? setDarkFontColorAndSave($event) : null"
|
(previewChanged)="previewData.fontColorDark !== $event ? setDarkFontColorAndSave($event) : null"
|
||||||
name="Font Color"
|
name="Font Color"
|
||||||
@ -283,7 +387,18 @@
|
|||||||
<div class="colors" *ngIf="data && previewData">
|
<div class="colors" *ngIf="data && previewData">
|
||||||
<div class="color">
|
<div class="color">
|
||||||
<cnsl-color
|
<cnsl-color
|
||||||
[disabled]="view === View.CURRENT"
|
[disabled]="
|
||||||
|
view === View.CURRENT ||
|
||||||
|
([
|
||||||
|
serviceType === PolicyComponentServiceType.ADMIN
|
||||||
|
? 'iam.policy.write'
|
||||||
|
: serviceType === PolicyComponentServiceType.MGMT
|
||||||
|
? 'policy.write'
|
||||||
|
: ''
|
||||||
|
]
|
||||||
|
| hasRole
|
||||||
|
| async) === false
|
||||||
|
"
|
||||||
[colorType]="ColorType.BACKGROUNDLIGHT"
|
[colorType]="ColorType.BACKGROUNDLIGHT"
|
||||||
(previewChanged)="previewData.backgroundColor !== $event ? setBackgroundColorAndSave($event) : null"
|
(previewChanged)="previewData.backgroundColor !== $event ? setBackgroundColorAndSave($event) : null"
|
||||||
name="Background Color"
|
name="Background Color"
|
||||||
@ -294,7 +409,18 @@
|
|||||||
|
|
||||||
<div class="color">
|
<div class="color">
|
||||||
<cnsl-color
|
<cnsl-color
|
||||||
[disabled]="view === View.CURRENT"
|
[disabled]="
|
||||||
|
view === View.CURRENT ||
|
||||||
|
([
|
||||||
|
serviceType === PolicyComponentServiceType.ADMIN
|
||||||
|
? 'iam.policy.write'
|
||||||
|
: serviceType === PolicyComponentServiceType.MGMT
|
||||||
|
? 'policy.write'
|
||||||
|
: ''
|
||||||
|
]
|
||||||
|
| hasRole
|
||||||
|
| async) === false
|
||||||
|
"
|
||||||
[colorType]="ColorType.PRIMARY"
|
[colorType]="ColorType.PRIMARY"
|
||||||
(previewChanged)="previewData.primaryColor !== $event ? setPrimaryColorAndSave($event) : null"
|
(previewChanged)="previewData.primaryColor !== $event ? setPrimaryColorAndSave($event) : null"
|
||||||
name="Primary Color"
|
name="Primary Color"
|
||||||
@ -306,7 +432,18 @@
|
|||||||
|
|
||||||
<div class="color">
|
<div class="color">
|
||||||
<cnsl-color
|
<cnsl-color
|
||||||
[disabled]="view === View.CURRENT"
|
[disabled]="
|
||||||
|
view === View.CURRENT ||
|
||||||
|
([
|
||||||
|
serviceType === PolicyComponentServiceType.ADMIN
|
||||||
|
? 'iam.policy.write'
|
||||||
|
: serviceType === PolicyComponentServiceType.MGMT
|
||||||
|
? 'policy.write'
|
||||||
|
: ''
|
||||||
|
]
|
||||||
|
| hasRole
|
||||||
|
| async) === false
|
||||||
|
"
|
||||||
[colorType]="ColorType.WARN"
|
[colorType]="ColorType.WARN"
|
||||||
name="Warn Color"
|
name="Warn Color"
|
||||||
(previewChanged)="previewData.warnColor !== $event ? setWarnColorAndSave($event) : null"
|
(previewChanged)="previewData.warnColor !== $event ? setWarnColorAndSave($event) : null"
|
||||||
@ -317,7 +454,18 @@
|
|||||||
|
|
||||||
<div class="color">
|
<div class="color">
|
||||||
<cnsl-color
|
<cnsl-color
|
||||||
[disabled]="view === View.CURRENT"
|
[disabled]="
|
||||||
|
view === View.CURRENT ||
|
||||||
|
([
|
||||||
|
serviceType === PolicyComponentServiceType.ADMIN
|
||||||
|
? 'iam.policy.write'
|
||||||
|
: serviceType === PolicyComponentServiceType.MGMT
|
||||||
|
? 'policy.write'
|
||||||
|
: ''
|
||||||
|
]
|
||||||
|
| hasRole
|
||||||
|
| async) === false
|
||||||
|
"
|
||||||
[colorType]="ColorType.FONTLIGHT"
|
[colorType]="ColorType.FONTLIGHT"
|
||||||
(previewChanged)="previewData.fontColor !== $event ? setFontColorAndSave($event) : null"
|
(previewChanged)="previewData.fontColor !== $event ? setFontColorAndSave($event) : null"
|
||||||
name="Font Color"
|
name="Font Color"
|
||||||
@ -349,7 +497,18 @@
|
|||||||
|
|
||||||
<button
|
<button
|
||||||
class="dl-btn"
|
class="dl-btn"
|
||||||
[disabled]="view === View.CURRENT"
|
[disabled]="
|
||||||
|
view === View.CURRENT ||
|
||||||
|
([
|
||||||
|
serviceType === PolicyComponentServiceType.ADMIN
|
||||||
|
? 'iam.policy.write'
|
||||||
|
: serviceType === PolicyComponentServiceType.MGMT
|
||||||
|
? 'policy.write'
|
||||||
|
: ''
|
||||||
|
]
|
||||||
|
| hasRole
|
||||||
|
| async) === false
|
||||||
|
"
|
||||||
mat-icon-button
|
mat-icon-button
|
||||||
color="warn"
|
color="warn"
|
||||||
(click)="deleteFont()"
|
(click)="deleteFont()"
|
||||||
@ -375,7 +534,19 @@
|
|||||||
(change)="onDropFont($any($event.target).files)"
|
(change)="onDropFont($any($event.target).files)"
|
||||||
/>
|
/>
|
||||||
<a
|
<a
|
||||||
class="btn"
|
class="asset-add-btn"
|
||||||
|
[disabled]="
|
||||||
|
view === View.CURRENT ||
|
||||||
|
([
|
||||||
|
serviceType === PolicyComponentServiceType.ADMIN
|
||||||
|
? 'iam.policy.write'
|
||||||
|
: serviceType === PolicyComponentServiceType.MGMT
|
||||||
|
? 'policy.write'
|
||||||
|
: ''
|
||||||
|
]
|
||||||
|
| hasRole
|
||||||
|
| async) === false
|
||||||
|
"
|
||||||
mat-icon-button
|
mat-icon-button
|
||||||
*ngIf="view !== View.CURRENT"
|
*ngIf="view !== View.CURRENT"
|
||||||
(click)="selectedFontFile.click()"
|
(click)="selectedFontFile.click()"
|
||||||
|
@ -168,6 +168,12 @@
|
|||||||
flex: 1;
|
flex: 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.asset-add-btn {
|
||||||
|
&[disabled] {
|
||||||
|
color: map-get($foreground, disabled-text);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
.img-wrapper {
|
.img-wrapper {
|
||||||
position: relative;
|
position: relative;
|
||||||
height: 70px;
|
height: 70px;
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
<cnsl-card class="generator" [nomargin]="true" *ngFor="let gen of AVAILABLEGENERATORS">
|
<cnsl-card class="generator" [nomargin]="true" *ngFor="let gen of AVAILABLEGENERATORS">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<h3 class="title">{{ 'SETTING.SECRETS.TYPE.' + gen | translate }}</h3>
|
<h3 class="title">{{ 'SETTING.SECRETS.TYPE.' + gen | translate }}</h3>
|
||||||
<button mat-icon-button (click)="openGeneratorDialog(gen)">
|
<button mat-icon-button (click)="openGeneratorDialog(gen)" [disabled]="(['iam.write'] | hasRole | async) === false">
|
||||||
<i class="las la-pen"></i>
|
<i class="las la-pen"></i>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
@ -7,6 +7,7 @@ import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
|
|||||||
import { MatSelectModule } from '@angular/material/select';
|
import { MatSelectModule } from '@angular/material/select';
|
||||||
import { MatSlideToggleModule } from '@angular/material/slide-toggle';
|
import { MatSlideToggleModule } from '@angular/material/slide-toggle';
|
||||||
import { TranslateModule } from '@ngx-translate/core';
|
import { TranslateModule } from '@ngx-translate/core';
|
||||||
|
import { HasRolePipeModule } from 'src/app/pipes/has-role-pipe/has-role-pipe.module';
|
||||||
|
|
||||||
import { CardModule } from '../../card/card.module';
|
import { CardModule } from '../../card/card.module';
|
||||||
import { FormFieldModule } from '../../form-field/form-field.module';
|
import { FormFieldModule } from '../../form-field/form-field.module';
|
||||||
@ -21,6 +22,7 @@ import { SecretGeneratorComponent } from './secret-generator.component';
|
|||||||
MatIconModule,
|
MatIconModule,
|
||||||
CardModule,
|
CardModule,
|
||||||
FormsModule,
|
FormsModule,
|
||||||
|
HasRolePipeModule,
|
||||||
MatButtonModule,
|
MatButtonModule,
|
||||||
FormFieldModule,
|
FormFieldModule,
|
||||||
ReactiveFormsModule,
|
ReactiveFormsModule,
|
||||||
|
@ -39,6 +39,7 @@
|
|||||||
grid-template-columns: 1fr;
|
grid-template-columns: 1fr;
|
||||||
gap: 1rem;
|
gap: 1rem;
|
||||||
justify-content: space-evenly;
|
justify-content: space-evenly;
|
||||||
|
padding-bottom: 1rem;
|
||||||
|
|
||||||
@media only screen and (min-width: 599px) {
|
@media only screen and (min-width: 599px) {
|
||||||
grid-template-columns: 1fr 1fr;
|
grid-template-columns: 1fr 1fr;
|
||||||
|
@ -17,7 +17,7 @@
|
|||||||
(addClicked)="openAddMember()"
|
(addClicked)="openAddMember()"
|
||||||
(showDetailClicked)="showDetail()"
|
(showDetailClicked)="showDetail()"
|
||||||
(refreshClicked)="loadMembers()"
|
(refreshClicked)="loadMembers()"
|
||||||
[disabled]="false"
|
[disabled]="(['iam.member.write'] | hasRole | async) === false"
|
||||||
>
|
>
|
||||||
</cnsl-contributors>
|
</cnsl-contributors>
|
||||||
</div>
|
</div>
|
||||||
|
@ -81,7 +81,7 @@ export class InstanceComponent {
|
|||||||
}),
|
}),
|
||||||
)
|
)
|
||||||
.then(() => {
|
.then(() => {
|
||||||
this.toast.showInfo('IAM.TOAST.MEMBERADDED');
|
this.toast.showInfo('IAM.TOAST.MEMBERADDED', true);
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
this.loadMembers();
|
this.loadMembers();
|
||||||
}, 1000);
|
}, 1000);
|
||||||
|
@ -16,7 +16,7 @@
|
|||||||
(addClicked)="openAddMember()"
|
(addClicked)="openAddMember()"
|
||||||
(showDetailClicked)="showDetail()"
|
(showDetailClicked)="showDetail()"
|
||||||
(refreshClicked)="loadMembers()"
|
(refreshClicked)="loadMembers()"
|
||||||
[disabled]="false"
|
[disabled]="(['org.member.write'] | hasRole | async) === false"
|
||||||
>
|
>
|
||||||
</cnsl-contributors>
|
</cnsl-contributors>
|
||||||
|
|
||||||
|
@ -21,6 +21,10 @@
|
|||||||
border-bottom: 1px solid #ffffff20;
|
border-bottom: 1px solid #ffffff20;
|
||||||
flex-wrap: wrap;
|
flex-wrap: wrap;
|
||||||
|
|
||||||
|
&:last-child {
|
||||||
|
border-bottom: none;
|
||||||
|
}
|
||||||
|
|
||||||
.left {
|
.left {
|
||||||
.label {
|
.label {
|
||||||
font-size: 13px;
|
font-size: 13px;
|
||||||
|
@ -6,7 +6,7 @@ Login:
|
|||||||
LoginNameLabel: Loginname
|
LoginNameLabel: Loginname
|
||||||
UsernamePlaceHolder: username
|
UsernamePlaceHolder: username
|
||||||
LoginnamePlaceHolder: username@domain
|
LoginnamePlaceHolder: username@domain
|
||||||
ExternalUserDescription: Melde dich mit einem externen Benutzer an
|
ExternalUserDescription: oder melde dich mit einem externen Benutzer an
|
||||||
MustBeMemberOfOrg: Der Benutzer muss der Organisation {{.OrgName}} angehören.
|
MustBeMemberOfOrg: Der Benutzer muss der Organisation {{.OrgName}} angehören.
|
||||||
RegisterButtonText: registrieren
|
RegisterButtonText: registrieren
|
||||||
NextButtonText: weiter
|
NextButtonText: weiter
|
||||||
@ -159,7 +159,7 @@ PasswordlessRegistrationDone:
|
|||||||
|
|
||||||
PasswordChange:
|
PasswordChange:
|
||||||
Title: Passwort ändern
|
Title: Passwort ändern
|
||||||
Description: Ändere dein Password in dem du dein altes und dann dein neuen Passwort eingibst.
|
Description: Ändere dein Passwort in dem du dein altes und dann dein neues Passwort eingibst.
|
||||||
OldPasswordLabel: Altes Passwort
|
OldPasswordLabel: Altes Passwort
|
||||||
NewPasswordLabel: Neues Passwort
|
NewPasswordLabel: Neues Passwort
|
||||||
NewPasswordConfirmLabel: Passwort Bestätigung
|
NewPasswordConfirmLabel: Passwort Bestätigung
|
||||||
|
13
internal/api/ui/login/static/resources/scripts/touched.js
Normal file
13
internal/api/ui/login/static/resources/scripts/touched.js
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
let inputs = document.getElementsByTagName("input");
|
||||||
|
|
||||||
|
if (inputs && inputs.length) {
|
||||||
|
for (let input of inputs) {
|
||||||
|
input.addEventListener("focus", () => {
|
||||||
|
input.classList.add("lgn-focused");
|
||||||
|
});
|
||||||
|
input.addEventListener("blur", () => {
|
||||||
|
input.classList.add("lgn-touched");
|
||||||
|
input.classList.remove("lgn-focused");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
@ -1,4 +1,4 @@
|
|||||||
@import 'identity_provider_base';
|
@import "identity_provider_base";
|
||||||
|
|
||||||
.lgn-idp {
|
.lgn-idp {
|
||||||
@include lgn-idp-base;
|
@include lgn-idp-base;
|
||||||
|
@ -1,11 +1,10 @@
|
|||||||
@import 'identity_provider';
|
@import "identity_provider";
|
||||||
|
|
||||||
@mixin lgn-idp-theme() {
|
@mixin lgn-idp-theme() {
|
||||||
@include lgn-idp-color();
|
@include lgn-idp-color();
|
||||||
}
|
}
|
||||||
|
|
||||||
@mixin lgn-idp-color() {
|
@mixin lgn-idp-color() {
|
||||||
|
|
||||||
.lgn-idp {
|
.lgn-idp {
|
||||||
border-color: var(--zitadel-color-divider);
|
border-color: var(--zitadel-color-divider);
|
||||||
|
|
||||||
@ -20,6 +19,12 @@
|
|||||||
background-color: var(--zitadel-color-google-background);
|
background-color: var(--zitadel-color-google-background);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.lgn-idp-providers {
|
||||||
|
.lgn-idp-desc {
|
||||||
|
color: var(--zitadel-color-label);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@mixin lgn-idp-elevation($zValue, $opacity: $lgn-elevation-opacity) {
|
@mixin lgn-idp-elevation($zValue, $opacity: $lgn-elevation-opacity) {
|
||||||
|
@ -31,7 +31,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
// overwrite if state is warn
|
// overwrite if state is warn
|
||||||
&[color="warn"] {
|
&.lgn-touched[color="warn"] {
|
||||||
border-color: var(--zitadel-color-warn);
|
border-color: var(--zitadel-color-warn);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -45,7 +45,7 @@
|
|||||||
--zitadel-color-footer-line: rgba(0, 0, 0, 0.12);
|
--zitadel-color-footer-line: rgba(0, 0, 0, 0.12);
|
||||||
|
|
||||||
--zitadel-color-input-background: #00000003;
|
--zitadel-color-input-background: #00000003;
|
||||||
--zitadel-color-input-border: #00000040;
|
--zitadel-color-input-border: #1a191938;
|
||||||
--zitadel-color-input-border-hover: #1a1b1b;
|
--zitadel-color-input-border-hover: #1a1b1b;
|
||||||
--zitadel-color-input-border-active: var(--zitadel-color-primary-500);
|
--zitadel-color-input-border-active: var(--zitadel-color-primary-500);
|
||||||
--zitadel-color-input-placeholder: var(--zitadel-color-grey-600);
|
--zitadel-color-input-placeholder: var(--zitadel-color-grey-600);
|
||||||
@ -156,7 +156,7 @@
|
|||||||
--zitadel-color-footer-line: rgba(255, 255, 255, 0.12);
|
--zitadel-color-footer-line: rgba(255, 255, 255, 0.12);
|
||||||
|
|
||||||
--zitadel-color-input-background: rgba(0, 0, 0, 0.2);
|
--zitadel-color-input-background: rgba(0, 0, 0, 0.2);
|
||||||
--zitadel-color-input-border: #403e3e;
|
--zitadel-color-input-border: #f9f7f725;
|
||||||
--zitadel-color-input-border-hover: #aeafb1;
|
--zitadel-color-input-border-hover: #aeafb1;
|
||||||
--zitadel-color-input-border-active: var(--zitadel-color-primary-500);
|
--zitadel-color-input-border-active: var(--zitadel-color-primary-500);
|
||||||
--zitadel-color-input-placeholder: var(--zitadel-color-grey-600);
|
--zitadel-color-input-placeholder: var(--zitadel-color-grey-600);
|
||||||
|
@ -40,7 +40,7 @@
|
|||||||
--zitadel-color-background-contrast: rgb(0, 0, 0);
|
--zitadel-color-background-contrast: rgb(0, 0, 0);
|
||||||
--zitadel-color-footer-line: rgba(0, 0, 0, 0.12);
|
--zitadel-color-footer-line: rgba(0, 0, 0, 0.12);
|
||||||
--zitadel-color-input-background: #00000003;
|
--zitadel-color-input-background: #00000003;
|
||||||
--zitadel-color-input-border: #00000040;
|
--zitadel-color-input-border: #1a191938;
|
||||||
--zitadel-color-input-border-hover: #1a1b1b;
|
--zitadel-color-input-border-hover: #1a1b1b;
|
||||||
--zitadel-color-input-border-active: var(--zitadel-color-primary-500);
|
--zitadel-color-input-border-active: var(--zitadel-color-primary-500);
|
||||||
--zitadel-color-input-placeholder: var(--zitadel-color-grey-600);
|
--zitadel-color-input-placeholder: var(--zitadel-color-grey-600);
|
||||||
@ -136,7 +136,7 @@
|
|||||||
--zitadel-color-background-contrast: rgb(255, 255, 255);
|
--zitadel-color-background-contrast: rgb(255, 255, 255);
|
||||||
--zitadel-color-footer-line: rgba(255, 255, 255, 0.12);
|
--zitadel-color-footer-line: rgba(255, 255, 255, 0.12);
|
||||||
--zitadel-color-input-background: rgba(0, 0, 0, 0.2);
|
--zitadel-color-input-background: rgba(0, 0, 0, 0.2);
|
||||||
--zitadel-color-input-border: #403e3e;
|
--zitadel-color-input-border: #f9f7f725;
|
||||||
--zitadel-color-input-border-hover: #aeafb1;
|
--zitadel-color-input-border-hover: #aeafb1;
|
||||||
--zitadel-color-input-border-active: var(--zitadel-color-primary-500);
|
--zitadel-color-input-border-active: var(--zitadel-color-primary-500);
|
||||||
--zitadel-color-input-placeholder: var(--zitadel-color-grey-600);
|
--zitadel-color-input-placeholder: var(--zitadel-color-grey-600);
|
||||||
@ -2721,9 +2721,9 @@ select:focus,
|
|||||||
.lgn-select:focus {
|
.lgn-select:focus {
|
||||||
border-color: var(--zitadel-color-input-border-active);
|
border-color: var(--zitadel-color-input-border-active);
|
||||||
}
|
}
|
||||||
.lgn-input[color=warn],
|
.lgn-input.lgn-touched[color=warn],
|
||||||
select[color=warn],
|
select.lgn-touched[color=warn],
|
||||||
.lgn-select[color=warn] {
|
.lgn-select.lgn-touched[color=warn] {
|
||||||
border-color: var(--zitadel-color-warn);
|
border-color: var(--zitadel-color-warn);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2921,6 +2921,10 @@ ul li i.lgn-valid {
|
|||||||
background-color: var(--zitadel-color-google-background);
|
background-color: var(--zitadel-color-google-background);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.lgn-idp-providers .lgn-idp-desc {
|
||||||
|
color: var(--zitadel-color-label);
|
||||||
|
}
|
||||||
|
|
||||||
.lgn-success-label {
|
.lgn-success-label {
|
||||||
color: var(--zitadel-color-success);
|
color: var(--zitadel-color-success);
|
||||||
background-color: var(--zitadel-color-success-background);
|
background-color: var(--zitadel-color-success-background);
|
||||||
|
File diff suppressed because one or more lines are too long
@ -42,7 +42,7 @@
|
|||||||
|
|
||||||
{{if hasExternalLogin }}
|
{{if hasExternalLogin }}
|
||||||
<div class="lgn-idp-providers">
|
<div class="lgn-idp-providers">
|
||||||
<p>{{t "Login.ExternalUserDescription"}}</p>
|
<p class="lgn-idp-desc">{{t "Login.ExternalUserDescription"}}</p>
|
||||||
|
|
||||||
{{ $reqid := .AuthReqID}}
|
{{ $reqid := .AuthReqID}}
|
||||||
{{range $provider := .IDPProviders}}
|
{{range $provider := .IDPProviders}}
|
||||||
|
@ -33,6 +33,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<script src="{{ resourceUrl "scripts/avatar.js" }}"></script>
|
<script src="{{ resourceUrl "scripts/avatar.js" }}"></script>
|
||||||
|
<script src="{{ resourceUrl "scripts/touched.js" }}"></script>
|
||||||
</body>
|
</body>
|
||||||
<footer>
|
<footer>
|
||||||
{{template "footer" .}}
|
{{template "footer" .}}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user