mirror of
https://github.com/andwati/zitadel.git
synced 2026-10-18 05:52:51 +00:00
* feat: return 404 or 409 if org reg disallowed * fix: system limit permissions * feat: add iam limits api * feat: disallow public org registrations on default instance * add integration test * test: integration * fix test * docs: describe public org registrations * avoid updating docs deps * fix system limits integration test * silence integration tests * fix linting * ignore strange linter complaints * review * improve reset properties naming * redefine the api * use restrictions aggregate * test query * simplify and test projection * test commands * fix unit tests * move integration test * support restrictions on default instance * also test GetRestrictions * self review * lint * abstract away resource owner * fix tests * configure supported languages * fix allowed languages * fix tests * default lang must not be restricted * preferred language must be allowed * change preferred languages * check languages everywhere * lint * test command side * lint * add integration test * add integration test * restrict supported ui locales * lint * lint * cleanup * lint * allow undefined preferred language * fix integration tests * update main * fix env var * ignore linter * ignore linter * improve integration test config * reduce cognitive complexity * compile * fix(console): switch back to saved language * feat(API): get allowed languages * fix(console): only make allowed languages selectable * warn when editing not allowed languages * check for duplicates * remove useless restriction checks * review * revert restriction renaming * fix language restrictions * lint * generate * allow custom texts for supported langs for now * fix tests * cleanup * cleanup * cleanup * lint * unsupported preferred lang is allowed * fix integration test * allow unsupported preferred languages * lint * load languages for tests * cleanup * lint * cleanup * get allowed only on admin * cleanup * reduce flakiness on very limited postgres * simplify langSvc * refactor according to suggestions in pr * lint * set first allowed language as default * selectionchange for language in msg texts * initialize login texts * init message texts * lint --------- Co-authored-by: peintnermax <[email protected]>
147 lines
6.2 KiB
HTML
147 lines
6.2 KiB
HTML
<cnsl-create-layout
|
|
title="{{ 'USER.CREATE.TITLE' | translate }}"
|
|
[createSteps]="1"
|
|
[currentCreateStep]="1"
|
|
(closed)="close()"
|
|
>
|
|
<div class="user-create-main-content">
|
|
<mat-progress-bar *ngIf="loading" color="primary" mode="indeterminate"></mat-progress-bar>
|
|
|
|
<form *ngIf="userForm" [formGroup]="userForm" (ngSubmit)="createUser()" class="user-create-form">
|
|
<div class="user-create-content">
|
|
<p class="user-create-section">{{ 'USER.CREATE.NAMEANDEMAILSECTION' | translate }}</p>
|
|
|
|
<div class="user-create-grid">
|
|
<cnsl-form-field>
|
|
<cnsl-label>{{ 'USER.PROFILE.EMAIL' | translate }}</cnsl-label>
|
|
<input cnslInput matRipple formControlName="email" required />
|
|
</cnsl-form-field>
|
|
<cnsl-form-field>
|
|
<cnsl-label>{{ 'USER.PROFILE.USERNAME' | translate }}</cnsl-label>
|
|
<input
|
|
cnslInput
|
|
formControlName="userName"
|
|
required
|
|
[ngStyle]="{ 'padding-right': suffixPadding ? suffixPadding : '10px' }"
|
|
/>
|
|
<span #suffix *ngIf="envSuffix" cnslSuffix>{{ envSuffix }}</span>
|
|
</cnsl-form-field>
|
|
|
|
<cnsl-form-field>
|
|
<cnsl-label>{{ 'USER.PROFILE.FIRSTNAME' | translate }}</cnsl-label>
|
|
<input cnslInput formControlName="firstName" required />
|
|
</cnsl-form-field>
|
|
<cnsl-form-field>
|
|
<cnsl-label>{{ 'USER.PROFILE.LASTNAME' | translate }}</cnsl-label>
|
|
<input cnslInput formControlName="lastName" required />
|
|
</cnsl-form-field>
|
|
<cnsl-form-field>
|
|
<cnsl-label>{{ 'USER.PROFILE.NICKNAME' | translate }}</cnsl-label>
|
|
<input cnslInput formControlName="nickName" />
|
|
</cnsl-form-field>
|
|
</div>
|
|
|
|
<div class="email-is-verified">
|
|
<mat-checkbox class="block-checkbox" formControlName="isVerified">
|
|
{{ 'USER.LOGINMETHODS.EMAIL.ISVERIFIED' | translate }}
|
|
</mat-checkbox>
|
|
<mat-checkbox class="block-checkbox" [(ngModel)]="usePassword" [ngModelOptions]="{ standalone: true }">
|
|
{{ 'ORG.PAGES.USEPASSWORD' | translate }}
|
|
</mat-checkbox>
|
|
<cnsl-info-section class="full-width desc">
|
|
<span>{{ 'USER.CREATE.INITMAILDESCRIPTION' | translate }}</span>
|
|
</cnsl-info-section>
|
|
</div>
|
|
|
|
<div class="pwd-section" *ngIf="usePassword && pwdForm">
|
|
<cnsl-password-complexity-view class="complexity-view" [policy]="this.policy" [password]="password">
|
|
</cnsl-password-complexity-view>
|
|
|
|
<form [formGroup]="pwdForm">
|
|
<div class="user-create-grid">
|
|
<cnsl-form-field *ngIf="password">
|
|
<cnsl-label>{{ 'USER.PASSWORD.NEWINITIAL' | translate }}</cnsl-label>
|
|
<input cnslInput autocomplete="off" name="firstpassword" formControlName="password" type="password" />
|
|
</cnsl-form-field>
|
|
<cnsl-form-field *ngIf="confirmPassword">
|
|
<cnsl-label>{{ 'USER.PASSWORD.CONFIRMINITIAL' | translate }}</cnsl-label>
|
|
<input
|
|
cnslInput
|
|
autocomplete="off"
|
|
name="confirmPassword"
|
|
formControlName="confirmPassword"
|
|
type="password"
|
|
/>
|
|
</cnsl-form-field>
|
|
</div>
|
|
</form>
|
|
</div>
|
|
|
|
<p class="user-create-section">{{ 'USER.CREATE.GENDERLANGSECTION' | translate }}</p>
|
|
|
|
<div class="user-create-grid">
|
|
<cnsl-form-field>
|
|
<cnsl-label>{{ 'USER.PROFILE.GENDER' | translate }}</cnsl-label>
|
|
<mat-select formControlName="gender">
|
|
<mat-option *ngFor="let gender of genders" [value]="gender">
|
|
{{ 'GENDERS.' + gender | translate }}
|
|
</mat-option>
|
|
</mat-select>
|
|
</cnsl-form-field>
|
|
<cnsl-form-field>
|
|
<cnsl-label>{{ 'USER.PROFILE.PREFERRED_LANGUAGE' | translate }}</cnsl-label>
|
|
<mat-select formControlName="preferredLanguage">
|
|
<mat-option *ngFor="let language of langSvc.supported$ | async" [value]="language">
|
|
{{ 'LANGUAGES.' + language | translate }}
|
|
</mat-option>
|
|
</mat-select>
|
|
</cnsl-form-field>
|
|
</div>
|
|
|
|
<p class="user-create-section">{{ 'USER.CREATE.ADDRESSANDPHONESECTION' | translate }}</p>
|
|
|
|
<div class="phone-grid">
|
|
<cnsl-form-field class="phone-country">
|
|
<cnsl-label>{{ 'USER.PROFILE.COUNTRY' | translate }}</cnsl-label>
|
|
<mat-select
|
|
[(value)]="selected"
|
|
[compareWith]="compareCountries"
|
|
(selectionChange)="setCountryCallingCode()"
|
|
data-cy="country-calling-code"
|
|
>
|
|
<mat-select-trigger>
|
|
<span class="fi fi-{{ selected?.countryCode | lowercase }}"></span>
|
|
<span class="trigger-name">{{ selected?.countryName }}</span>
|
|
</mat-select-trigger>
|
|
<mat-option class="phone-country-option" *ngFor="let country of countryPhoneCodes" [value]="country">
|
|
<span class="phone-country-row">
|
|
<span class="phone-country-flag fi fi-{{ country.countryCode | lowercase }}"></span>
|
|
<span class="phone-country-name">{{ country.countryName }}</span>
|
|
<span class="fill-space"></span>
|
|
<small class="phone-country-code">+{{ country.countryCallingCode }}</small>
|
|
</span>
|
|
</mat-option>
|
|
</mat-select>
|
|
</cnsl-form-field>
|
|
<cnsl-form-field>
|
|
<cnsl-label>{{ 'USER.PROFILE.PHONE' | translate }}</cnsl-label>
|
|
<input cnslInput formControlName="phone" matTooltip="{{ 'USER.PROFILE.PHONE_HINT' | translate }}" />
|
|
</cnsl-form-field>
|
|
</div>
|
|
</div>
|
|
<div class="user-create-btn-container">
|
|
<button
|
|
data-e2e="create-button"
|
|
color="primary"
|
|
[disabled]="userForm.invalid || (this.usePassword && this.pwdForm.invalid)"
|
|
type="submit"
|
|
class="create-button"
|
|
mat-raised-button
|
|
>
|
|
{{ 'ACTIONS.CREATE' | translate }}
|
|
</button>
|
|
</div>
|
|
</form>
|
|
</div>
|
|
</cnsl-create-layout>
|