You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
aConnect-UX/src/app/user-management/setup-user/setup-user.component.html

536 lines
26 KiB
HTML

<div id="layout-wrapper">
<div class="inner-pg-sp">
<div class="container-fluid">
<div class="row">
<div class="col-12">
6 days ago
<div
class="d-sm-flex align-items-center justify-content-between navbar-header p-0"
></div>
</div>
</div>
<div class="container-fluid">
6 days ago
<div class="col-xl-12 mt-4">
<div class="card border">
<div class="card-body">
<div class="table-section">
<div class="row">
<div class="col-lg-12">
<div class="card-body mt-2 p-0">
<div class="card mb-0 mt-2">
<div
class="card-header font-edit-13-child d-flex justify-content-between align-items-center"
>
{{ "setupUser" | translate }}
</div>
<div class="card-body">
6 days ago
<form [formGroup]="userForm">
<div class="row g-3 mb-3">
<!-- User ID -->
<div class="col-md-6">
<div class="d-flex align-items-center gap-2">
<label for="userId" class="text-nowrap">
{{ "userId" | translate
}}<span class="mandatory">*</span>
</label>
<div
class="password-wrapper position-relative w-100"
>
<input
type="text"
id="userId"
class="form-control"
formControlName="userId"
name="userId"
placeholder="{{ 'userID' | translate }}"
appNoWhitespaces
[readonly]="mode === 'edit'"
[class.bg-light]="mode === 'edit'"
/>
<div
class="text-danger"
*ngIf="
userForm.get('userId')?.touched &&
userForm.get('userId')?.invalid
"
>
<div
*ngIf="
userForm.get('userId')?.errors?.[
'required'
]
"
>
{{ "fieldRequired" | translate }}
</div>
<div
*ngIf="
userForm.get('userId')?.errors?.[
'minlength'
]
"
>
{{ "userIdMinLength" | translate }}
</div>
<div
*ngIf="
userForm.get('userId')?.errors?.[
'pattern'
]
"
>
{{
"emptySpaceRestriction" | translate
}}
</div>
</div>
</div>
</div>
</div>
<!-- Full Name -->
<div class="col-md-6">
<div class="d-flex align-items-start gap-2">
<label
for="userFullname"
class="text-nowrap mt-2"
>
{{ "name" | translate
}}<span class="mandatory">*</span>
</label>
<div
class="password-wrapper position-relative w-100"
>
<input
id="userFullname"
class="form-control"
formControlName="userFullname"
name="userFullname"
maxlength="500"
placeholder="{{
'Full Name' | translate
}}"
/>
<div
class="text-danger"
*ngIf="
userForm.get('userFullname')?.touched &&
userForm.get('userFullname')?.invalid
"
>
<div
*ngIf="
userForm.get('userFullname')
?.errors?.['required']
"
>
{{ "fieldRequired" | translate }}
</div>
<div
*ngIf="
userForm.get('userFullname')
?.errors?.['minlength']
"
>
{{ "nameMinLength" | translate }}
</div>
</div>
</div>
</div>
</div>
</div>
6 days ago
<div class="row g-3 mb-3">
<!-- Email -->
<div class="col-md-6">
<div class="d-flex align-items-center gap-2">
<label for="email" class="text-nowrap">
{{ "email" | translate
}}<span class="mandatory">*</span>
</label>
<div
class="password-wrapper position-relative w-100"
>
<input
id="email"
class="form-control"
formControlName="email"
name="email"
placeholder="{{ 'email' | translate }}"
appNoWhitespaces
/>
6 days ago
<div
class="text-danger"
*ngIf="
userForm.get('email')?.touched &&
userForm.get('email')?.invalid
"
>
<div
*ngIf="
userForm.get('email')?.errors?.[
'required'
]
"
>
{{ "fieldRequired" | translate }}
</div>
<div
*ngIf="
userForm.get('email')?.errors?.[
'email'
]
"
>
{{ "invalidEmail" | translate }}
</div>
</div>
</div>
</div>
</div>
<!-- Password -->
<div class="col-md-6">
<div class="d-flex align-items-center gap-2">
<label
for="defaultPassword"
class="text-nowrap"
>
{{ "password" | translate
}}<span class="mandatory" *ngIf="mode === 'create'">*</span>
<span class="text-muted small" *ngIf="mode === 'edit'"></span>
</label>
<div
class="password-wrapper position-relative w-100"
>
<input
id="defaultPassword"
type="password"
class="form-control"
formControlName="defaultPassword"
name="defaultPassword"
placeholder="{{
mode === 'create' ? ('passwordPlaceHolder' | translate) : ('newPasswordOptional' | translate)
}}"
appNoWhitespaces
/>
<div
class="text-danger"
*ngIf="
userForm.get('defaultPassword')
?.touched &&
userForm.get('defaultPassword')?.invalid
"
>
<div
*ngIf="
userForm.get('defaultPassword')
?.errors?.['required'] &&
mode === 'create'
"
>
{{ "fieldRequired" | translate }}
</div>
<div
*ngIf="
!userForm.get('defaultPassword')
?.errors?.['required'] &&
userForm.get('defaultPassword')
?.errors?.['pattern']
"
>
{{ "passwordPattern" | translate }}
</div>
</div>
</div>
</div>
</div>
</div>
6 days ago
<div class="row g-3 mb-3">
<!-- User Role -->
<div class="col-md-6">
<div class="d-flex align-items-center gap-2">
<label for="userRole" class="text-nowrap">
{{ "SelectRole" | translate
}}<span class="mandatory">*</span>
</label>
<div class="position-relative w-100">
<ng-select
id="userRole"
class="form-select form-select-narrow"
formControlName="userRole"
[items]="roleOptions"
bindLabel="label"
bindValue="value"
placeholder="{{
'SelectRole' | translate
}}"
>
</ng-select>
<div
class="text-danger"
*ngIf="
userForm.get('userRole')?.touched &&
userForm.get('userRole')?.invalid
"
>
{{ "fieldRequired" | translate }}
</div>
6 days ago
</div>
</div>
6 days ago
</div>
</div>
<!-- Action Buttons -->
<div class="row g-3 mb-3">
<div class="col-md-6 ms-auto text-end">
<!-- Save button for create mode -->
<button
*ngIf="mode === 'create'"
type="button"
class="btn btn-primary waves-effect waves-light"
(click)="onSubmit()"
[disabled]="userForm.invalid"
>
{{ "save" | translate }}
</button>
<!-- Update button for edit mode -->
<button
*ngIf="mode === 'edit'"
type="button"
class="btn btn-primary waves-effect waves-light me-2"
(click)="onUpdate()"
[disabled]="userForm.invalid || !isFormDirty()"
>
{{ "update" | translate }}
</button>
<!-- Cancel button for edit mode -->
<button
*ngIf="mode === 'edit'"
type="button"
class="btn btn-secondary waves-effect waves-light"
(click)="cancelEdit()"
>
{{ "cancel" | translate }}
</button>
</div>
</div>
6 days ago
</form>
</div>
6 days ago
</div>
</div>
6 days ago
</div>
</div>
6 days ago
</div>
</div>
6 days ago
</div>
</div>
</div>
<div class="container-fluid">
<div class="col-xl-12 mt-4">
<div class="card border">
6 days ago
<div
class="card-body"
*ngIf="
renewalDataExpanded && allItems.length;
else noRecordsFound
"
>
<div class="table-section">
<div class="row">
<div class="col-lg-12">
<div class="card-body mt-2 p-0">
<div class="card mb-0 mt-2">
6 days ago
<div
class="card-header font-edit-13-child d-flex justify-content-between align-items-center"
>
{{ "SetupUserDetails" | translate }}
<div class="d-flex align-items-center gap-2">
<div class="search-box">
6 days ago
<input
type="text"
class="form-control form-control-sm"
[(ngModel)]="searchText"
6 days ago
placeholder="{{ 'search' | translate }}"
/>
<i class="fas fa-search search-icon"></i>
</div>
6 days ago
<i
class="materialdesignicons"
(click)="toggleTableCard()"
>
<ng-container
*ngIf="
userSetupDataExpanded;
else collapsedIcon
"
>
<i class="dripicons-chevron-up float-end"></i>
</ng-container>
<ng-template #collapsedIcon>
<i class="dripicons-chevron-down float-end"></i>
</ng-template>
</i>
</div>
</div>
6 days ago
<div
class="card-body"
*ngIf="
userSetupDataExpanded && allItems.length;
else noRecordsFound
"
>
<div class="table-responsive">
<table class="table mb-0 border">
<thead class="table-light">
<tr>
6 days ago
<th style="width: 25%">
{{ "userID" | translate }}
</th>
<th style="width: 25%">
{{ "Name" | translate }}
</th>
<th style="width: 25%">
{{ "Email" | translate }}
</th>
<th style="width: 15%">
{{ "Role" | translate }}
</th>
<th style="width: 10%">
{{ "action" | translate }}
</th>
</tr>
</thead>
<tbody>
6 days ago
<tr
*ngFor="
let item of (
allItems
| tableFilter
: searchText
: ['userId', 'userFullname', 'email']
).slice(
(currentPage - 1) * itemsPerPage,
currentPage * itemsPerPage
)
"
>
<td>{{ item.userId }}</td>
<td>{{ item.userFullname }}</td>
<td>{{ item.email }}</td>
<td>{{ getRoleLabel(item.role) }}</td>
<td>
<div
class="d-flex justify-content-center gap-2"
>
<button
class="btn btn-info btn-sm"
title="View/Edit"
(click)="onView(item.userId)"
>
<i class="mdi mdi-eye-outline"></i>
</button>
<button
class="btn btn-warning btn-sm"
*ngIf="
buttonPermissions?.resetPasswordButton
"
title="Reset Password"
(click)="
openResetPasswordModal(item.userId)
"
>
<i class="mdi mdi-lock-reset"></i>
</button>
<button
*ngIf="buttonPermissions?.delete"
class="btn btn-danger btn-sm"
title="Delete"
(click)="confirmDelete(item.userId)"
>
<i class="fas fa-trash-alt"></i>
</button>
</div>
</td>
</tr>
</tbody>
</table>
6 days ago
<app-reset-password-modal
[userId]="selectedUserIdForReset ?? ''"
(modalClosed)="closeResetPasswordModal()">
</app-reset-password-modal>
<div
class="d-flex justify-content-between align-items-center mt-3"
>
<div class="form-group mb-0">
<ng-select
class="form-select-sm"
[items]="pageSizeOptions"
bindLabel="label"
bindValue="value"
[(ngModel)]="itemsPerPage"
(change)="itemsPerPageChanged()"
[searchable]="false"
[clearable]="false"
[dropdownPosition]="'top'"
>
</ng-select>
</div>
6 days ago
<div
class="text-muted"
*ngIf="allItems.length > 1"
>
{{ "page" | translate }} {{ currentPage }}
{{ "of" | translate }} {{ totalPages() }} ({{
allItems.length
}}
{{ "totalItems" | translate }})
</div>
6 days ago
<div class="btn-group">
<button
class="btn btn-primary waves-effect waves-light"
(click)="previousPage()"
[disabled]="currentPage === 1"
>
{{ "previous" | translate }}
</button>
<button
class="btn btn-primary waves-effect waves-light"
(click)="nextPage()"
[disabled]="currentPage === totalPages()"
>
{{ "next" | translate }}
</button>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<ng-template #noRecordsFound>
6 days ago
<div
*ngIf="!isLoading && allItems.length === 0"
class="text-center text-muted mt-3"
>
<p>{{ "noUserDetailsFound" | translate }}</p>
</div>
</ng-template>