Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
<div class="app-modal-body">
@switch (entityType) {
@case (EntityTypes.User) {
<app-user-properties class="block h-full" [accessor]="accessor"></app-user-properties>
<app-user-properties class="block h-full" #userProps [accessor]="accessor"></app-user-properties>
}
@case (EntityTypes.Group) {
<app-group-properties class="block h-full" [accessor]="accessor" />
Expand All @@ -22,11 +22,11 @@
</div>

<div class="app-modal-footer flex justify-end">
<md-button (click)="save(true)" class="pr-8">{{
<md-button (click)="save(userProps?.generalPropertiesValid)" class="pr-8">{{
'properties-modal.close' | transloco
}}</md-button>
<md-button (click)="save(false)" [primary]="true"
>{{ 'properties-modal.approve' | transloco }}
<md-button (click)="save(false)" [disabled]="userProps && !userProps.generalPropertiesValid" [primary]="true"
>{{ 'properties-modal.approve' | transloco }}
</md-button>
</div>
</app-dialog>
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ import { LdapEntryType } from '@models/core/ldap/ldap-entry-type';
export class EntityPropertiesDialogComponent implements OnInit {
dialogData: EntityPropertiesDialogData = inject(DIALOG_DATA);

@ViewChild('userProps') userProps!: UserPropertiesComponent;
@ViewChild(DialogComponent, { static: true }) dialogComponent!: DialogComponent;

EntityTypes = LdapEntryType;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,9 @@ export class DomainFormatValidatorDirective implements Validator {
patternValidator = new PatternValidator();

validate(control: AbstractControl): ValidationErrors | null {
if (!control.value) {
return null;
}
const result = new RegExp(this.domainPattern()).test(control.value);
return result ? null : { DomainFormat: this.domainErrorMessage() };
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,10 @@ export class MaxLengthValidatorDirective implements Validator {
return null;
}

const exceededMaxLength = this.maxLength ? value.length > this.maxLength : false;
// todo: убрать в рамках рефакторинга форм
const normalizedValue = value instanceof Array ? value[0] : value;

const exceededMaxLength = this.maxLength ? normalizedValue.length > this.maxLength : false;

return exceededMaxLength ? { MaxLengthExceeded: this.maxLengthErrorMessage } : null;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,12 +23,13 @@ export class RequiredWithMessageDirective extends RequiredValidator {

override validate(control: AbstractControl): ValidationErrors | null {
const appRequiredErrorLabel = this.appRequiredErrorLabel();
return control.value !== null && control.value !== undefined && control.value !== ''
const normalizedValue = control.value instanceof Array ? control.value[0] : control.value;
return normalizedValue !== null && normalizedValue !== undefined && normalizedValue !== ''
? null
: {
required: appRequiredErrorLabel
? appRequiredErrorLabel
: translate('error-message.required'),
};
required: appRequiredErrorLabel
? appRequiredErrorLabel
: translate('error-message.required'),
};
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
appRequired
class="col-span-1 w-full"
name="first-name"
[maxLength]="256"
(change)="onNameChange()"
[(ngModel)]="setupRequest.firstName"
></md-textbox>
Expand All @@ -19,6 +20,7 @@
<md-textbox
class="col-span-1 w-full"
name="initials"
[maxLength]="6"
(change)="onNameChange()"
[(ngModel)]="setupRequest.initials"
></md-textbox>
Expand All @@ -32,6 +34,7 @@
<md-textbox
class="col-span-3 w-full"
name="last-name"
[maxLength]="64"
(change)="onNameChange()"
[(ngModel)]="setupRequest.lastName"
></md-textbox>
Expand All @@ -45,6 +48,7 @@
<md-textbox
class="col-span-3 w-full"
name="full-name"
[maxLength]="64"
[(ngModel)]="setupRequest.fullName"
></md-textbox>
</div>
Expand All @@ -57,6 +61,7 @@
<md-textarea
class="col-span-3 w-full"
name="description"
[maxLength]="1024"
[(ngModel)]="setupRequest.description"
[expandWidth]="true"
></md-textarea>
Expand All @@ -70,6 +75,7 @@
<md-textbox
class="col-span-3 w-full"
name="email"
[maxLength]="254"
[(ngModel)]="setupRequest.email"
></md-textbox>
</div>
Expand All @@ -83,6 +89,7 @@
<md-textbox
appRequired
[(ngModel)]="setupRequest.upnLogin"
[maxLength]="64"
name="login"
class="w-full"
></md-textbox>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ import {
TextboxComponent,
} from 'multidirectory-ui-kit';
import { from, Subject, take, takeUntil } from 'rxjs';
import { MaxLengthValidatorDirective } from '@core/validators/max-length.directive';

@Component({
selector: 'app-user-create-general-info',
Expand All @@ -39,6 +40,7 @@ import { from, Subject, take, takeUntil } from 'rxjs';
DropdownComponent,
MdFormComponent,
CommonModule,
MaxLengthValidatorDirective
],
})
export class UserCreateGeneralInfoComponent implements OnInit, AfterViewInit, OnDestroy {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,102 +9,108 @@

<hr class="my-2" />

<!-- Имя + Инициалы -->
<div class="grid grid-cols-6 gap-4 items-start py-2">
<label for="givenName" class="col-span-1">
{{ 'user-properties-generals.name' | transloco }}
</label>
<md-textbox
id="givenName"
name="givenName"
appRequired
class="col-span-2"
[(ngModel)]="accessor.givenName"
></md-textbox>
<md-form #form>
<!-- Имя + Инициалы -->
<div class="grid grid-cols-6 gap-4 items-start py-2">
<label for="givenName" class="col-span-1">
{{ 'user-properties-generals.name' | transloco }}
</label>
<md-textbox
id="givenName"
name="givenName"
appRequired
[maxLength]="256"
class="col-span-2"
[(ngModel)]="accessor.givenName"
></md-textbox>

<label for="initials" class="col-span-1">
{{ 'user-properties-generals.initials' | transloco }}
</label>
<md-textbox name="initials" class="col-span-2" [(ngModel)]="accessor.initials"></md-textbox>
</div>
<label for="initials" class="col-span-1">
{{ 'user-properties-generals.initials' | transloco }}
</label>
<md-textbox name="initials" class="col-span-2" [maxLength]="6" [(ngModel)]="accessor.initials"></md-textbox>
</div>

<!-- Фамилия -->
<div class="grid grid-cols-6 gap-4 items-start py-2">
<label for="surname" class="col-span-1">
{{ 'user-properties-generals.last-name' | transloco }}
</label>
<md-textbox name="surname" class="col-span-5" [(ngModel)]="accessor.surname"></md-textbox>
</div>
<!-- Фамилия -->
<div class="grid grid-cols-6 gap-4 items-start py-2">
<label for="surname" class="col-span-1">
{{ 'user-properties-generals.last-name' | transloco }}
</label>
<md-textbox name="surname" [maxLength]="64" class="col-span-5" [(ngModel)]="accessor.surname"></md-textbox>
</div>

<!-- Полное имя -->
<div class="grid grid-cols-6 gap-4 items-start py-2">
<label for="display-name" class="col-span-1">
{{ 'user-properties-generals.full-name' | transloco }}
</label>
<md-textbox
name="display-name"
class="col-span-5"
[(ngModel)]="accessor.displayName"
></md-textbox>
</div>
<!-- Полное имя -->
<div class="grid grid-cols-6 gap-4 items-start py-2">
<label for="display-name" class="col-span-1">
{{ 'user-properties-generals.full-name' | transloco }}
</label>
<md-textbox
name="display-name"
[maxLength]="64"
class="col-span-5"
[(ngModel)]="accessor.displayName"
></md-textbox>
</div>

<!-- Описание -->
<div class="grid grid-cols-6 gap-4 items-start py-2">
<label for="description" class="col-span-1">
{{ 'user-properties-generals.description' | transloco }}
</label>
<md-textbox
name="description"
class="col-span-5"
[(ngModel)]="accessor.description"
></md-textbox>
</div>
<!-- Описание -->
<div class="grid grid-cols-6 gap-4 items-start py-2">
<label for="description" class="col-span-1">
{{ 'user-properties-generals.description' | transloco }}
</label>
<md-textbox
name="description"
[maxLength]="1024"
class="col-span-5"
[(ngModel)]="accessor.description"
></md-textbox>
</div>

<!-- Офис -->
<div class="grid grid-cols-6 gap-4 items-start py-2">
<label for="office" class="col-span-1">
{{ 'user-properties-generals.office' | transloco }}
</label>
<md-textbox name="office" class="col-span-5" [(ngModel)]="accessor.office"></md-textbox>
</div>
<!-- Офис -->
<div class="grid grid-cols-6 gap-4 items-start py-2">
<label for="office" class="col-span-1">
{{ 'user-properties-generals.office' | transloco }}
</label>
<md-textbox name="office" [maxLength]="64" class="col-span-5" [(ngModel)]="accessor.office"></md-textbox>
</div>

<hr class="my-2" />
<hr class="my-2" />

<!-- Телефон -->
<div class="grid grid-cols-6 gap-4 items-start py-2">
<label for="phone" class="col-span-1">
{{ 'user-properties-generals.phone' | transloco }}
</label>
<md-textbox name="phone" class="col-span-4" [(ngModel)]="accessor.telephoneNumber"></md-textbox>
<md-button
(click)="changeOtherAttributeList('user-properties-generals.phones', 'otherTelephone')"
>
{{ 'user-properties-generals.other' | transloco }}
</md-button>
</div>
<!-- Телефон -->
<div class="grid grid-cols-6 gap-4 items-start py-2">
<label for="phone" class="col-span-1">
{{ 'user-properties-generals.phone' | transloco }}
</label>
<md-textbox name="phone" [maxLength]="64" class="col-span-4" [maxlength]="64" [(ngModel)]="accessor.telephoneNumber"></md-textbox>
<md-button
(click)="changeOtherAttributeList('user-properties-generals.phones', 'otherTelephone')"
>
{{ 'user-properties-generals.other' | transloco }}
</md-button>
</div>

<!-- Email -->
<div class="grid grid-cols-6 gap-4 items-start py-2">
<label for="email" class="col-span-1">Email</label>
<md-textbox name="email" class="col-span-5" [(ngModel)]="accessor.mail"></md-textbox>
</div>
<!-- Email -->
<div class="grid grid-cols-6 gap-4 items-start py-2">
<label for="email" class="col-span-1">Email</label>
<md-textbox name="email" class="col-span-5" [maxLength]="254" [(ngModel)]="accessor.mail"></md-textbox>
</div>

<!-- Веб-страница -->
<div class="grid grid-cols-6 gap-4 items-start py-2">
<label for="homepage" class="col-span-1">
{{ 'user-properties-generals.webpage' | transloco }}
</label>
<md-textbox
appDomainFormat="^(?:[a-z0-9][a-z0-9-]{0,61}[a-z0-9]\.)+[a-z0-9][a-z0-9-]{0,61}[a-z0-9]$"
domainErrorMessage="{{ 'setup.domain-settings.domain-format-error' | transloco }}"
class="col-span-4"
name="homepage"
[(ngModel)]="accessor.webpage"
></md-textbox>
<md-button
(click)="changeOtherAttributeList('user-properties-generals.webpages', 'otherWebpage')"
>
{{ 'user-properties-generals.other' | transloco }}
</md-button>
</div>
<!-- Веб-страница -->
<div class="grid grid-cols-6 gap-4 items-start py-2">
<label for="homepage" class="col-span-1">
{{ 'user-properties-generals.webpage' | transloco }}
</label>
<md-textbox
[maxLength]="64"
appDomainFormat="^(?:[a-z0-9][a-z0-9-]{0,61}[a-z0-9]\.)+[a-z0-9][a-z0-9-]{0,61}[a-z0-9]$"
domainErrorMessage="{{ 'setup.domain-settings.domain-format-error' | transloco }}"
class="col-span-4"
name="homepage"
[(ngModel)]="accessor.webpage"
></md-textbox>
<md-button
(click)="changeOtherAttributeList('user-properties-generals.webpages', 'otherWebpage')"
>
{{ 'user-properties-generals.other' | transloco }}
</md-button>
</div>
</md-form>
}
Loading
Loading