2023-09-14 14:03:28 -07:00
< pngx-page-header [ ( title ) ] = " title " >
2023-12-04 17:17:40 -08:00
< ng-container * ngIf = "getContentType() === 'application/pdf' && !useNativePdfViewer" >
< div class = "input-group input-group-sm me-2 d-none d-md-flex" >
< div class = "input-group-text" i18n > Page< / div >
< input class = "form-control flex-grow-0 w-auto" type = "number" min = "1" [ max ] = " previewNumPages " [ ( ngModel ) ] = " previewCurrentPage " / >
< div class = "input-group-text" i18n > of {{previewNumPages}}< / div >
< / div >
< div class = "input-group input-group-sm me-5 d-none d-md-flex" >
< button class = "btn btn-outline-secondary" ( click ) = " decreaseZoom ( ) " i18n > -< / button >
< select class = "form-select" ( change ) = " onZoomSelect ( $ event ) " >
< option * ngFor = "let setting of zoomSettings" [ value ] = " setting " [ selected ] = " previewZoomSetting = == setting " >
{{ getZoomSettingTitle(setting) }}
< / option >
< / select >
< button class = "btn btn-outline-secondary" ( click ) = " increaseZoom ( ) " i18n > +< / button >
< / div >
< / ng-container >
2020-12-18 14:31:09 -08:00
2023-09-14 14:03:28 -07:00
< button type = "button" class = "btn btn-sm btn-outline-danger me-4" ( click ) = " delete ( ) " [ disabled ] = " ! userIsOwner " * pngxIfPermissions = "{ action: PermissionAction.Delete, type: PermissionType.Document }" >
2020-10-27 01:10:18 +01:00
< svg class = "buttonicon" fill = "currentColor" >
< use xlink:href = "assets/bootstrap-icons.svg#trash" / >
2022-07-28 15:36:24 -07:00
< / svg > < span class = "d-none d-lg-inline ps-1" i18n > Delete< / span >
2020-10-27 01:10:18 +01:00
< / button >
2020-11-25 18:01:43 +01:00
2022-02-20 01:21:30 +01:00
< div class = "btn-group me-2" >
2020-11-25 18:01:43 +01:00
< a [ href ] = " downloadUrl " class = "btn btn-sm btn-outline-primary" >
2023-09-14 13:32:43 -07:00
< svg class = "buttonicon me-md-1" fill = "currentColor" >
2020-11-25 18:01:43 +01:00
< use xlink:href = "assets/bootstrap-icons.svg#download" / >
2022-07-28 15:36:24 -07:00
< / svg > < span class = "d-none d-lg-inline ps-1" i18n > Download< / span >
2020-11-25 18:01:43 +01:00
< / a >
2020-12-11 14:22:02 -08:00
2020-12-08 15:28:09 +01:00
< div class = "btn-group" ngbDropdown role = "group" * ngIf = "metadata?.has_archive_version" >
2022-12-08 11:19:52 -08:00
< button class = "btn btn-sm btn-outline-primary dropdown-toggle" ngbDropdownToggle > < / button >
2020-12-09 13:44:37 +01:00
< div class = "dropdown-menu shadow" ngbDropdownMenu >
2020-12-23 15:09:39 +01:00
< a ngbDropdownItem [ href ] = " downloadOriginalUrl " i18n > Download original< / a >
2020-12-07 23:42:18 +01:00
< / div >
2020-11-25 18:01:43 +01:00
< / div >
2020-12-07 23:42:18 +01:00
< / div >
2020-11-25 18:01:43 +01:00
2023-11-05 17:26:51 -08:00
< div class = "ms-auto" ngbDropdown >
2023-09-14 13:32:43 -07:00
< button class = "btn btn-sm btn-outline-primary me-2" id = "actionsDropdown" ngbDropdownToggle >
< svg class = "toolbaricon" fill = "currentColor" >
< use xlink:href = "assets/bootstrap-icons.svg#three-dots" / >
< / svg >
< div class = "d-none d-sm-inline" > < ng-container i18n > Actions< / ng-container > < / div >
< / button >
< div ngbDropdownMenu aria-labelledby = "actionsDropdown" class = "shadow" >
< button ngbDropdownItem ( click ) = " redoOcr ( ) " [ disabled ] = " ! userCanEdit " >
< svg class = "buttonicon-sm" fill = "currentColor" >
< use xlink:href = "assets/bootstrap-icons.svg#arrow-counterclockwise" / >
< / svg > < span class = "ps-1" i18n > Redo OCR< / span >
< / button >
2022-07-28 15:36:24 -07:00
2023-09-14 13:32:43 -07:00
< button ngbDropdownItem ( click ) = " moreLike ( ) " >
< svg class = "buttonicon-sm" fill = "currentColor" >
< use xlink:href = "assets/bootstrap-icons.svg#diagram-3" / >
< / svg > < span class = "ps-1" i18n > More like this< / span >
< / button >
< / div >
< / div >
2023-11-05 17:26:51 -08:00
< pngx-custom-fields-dropdown
*pngxIfPermissions="{ action: PermissionAction.View, type: PermissionType.CustomField }"
class="me-2"
[documentId]="documentId"
[disabled]="!userIsOwner"
[existingFields]="document?.custom_fields"
(created)="refreshCustomFields()"
(added)="addField($event)">
< / pngx-custom-fields-dropdown >
2022-03-11 17:35:38 +01:00
2023-12-07 13:48:33 -08:00
< pngx-share-links-dropdown [ documentId ] = " documentId " [ hasArchiveVersion ] = " ! ! document ? . archived_file_name " [ disabled ] = " ! userIsOwner " * pngxIfPermissions = "{ action: PermissionAction.Add, type: PermissionType.ShareLink }" > < / pngx-share-links-dropdown >
2023-09-14 14:03:28 -07:00
< / pngx-page-header >
2020-10-27 01:10:18 +01:00
< div class = "row" >
2023-02-09 20:16:45 -08:00
< div class = "col-md-6 col-xl-4 mb-4" >
2020-10-28 20:21:00 +01:00
2020-12-07 23:42:18 +01:00
< form [ formGroup ] = ' documentForm ' ( ngSubmit ) = " save ( ) " >
2020-10-28 20:21:00 +01:00
2023-11-05 17:26:51 -08:00
< div class = "btn-toolbar mb-1 pb-3 border-bottom" >
< div class = "btn-group" >
< button type = "button" class = "btn btn-sm btn-outline-secondary" i18n-title title = "Close" ( click ) = " close ( ) " >
< svg class = "buttonicon" fill = "currentColor" >
< use xlink:href = "assets/bootstrap-icons.svg#x" / >
< / svg >
< / button >
< button type = "button" class = "btn btn-sm btn-outline-secondary" i18n-title title = "Previous" ( click ) = " previousDoc ( ) " [ disabled ] = " ! hasPrevious ( ) " >
< svg class = "buttonicon" fill = "currentColor" >
< use xlink:href = "assets/bootstrap-icons.svg#arrow-left" / >
< / svg >
< / button >
< button type = "button" class = "btn btn-sm btn-outline-secondary" i18n-title title = "Next" ( click ) = " nextDoc ( ) " [ disabled ] = " ! hasNext ( ) " >
< svg class = "buttonicon" fill = "currentColor" >
< use xlink:href = "assets/bootstrap-icons.svg#arrow-right" / >
< / svg >
< / button >
< / div >
2023-12-17 16:11:12 -08:00
< ng-container * ngTemplateOutlet = "saveButtons" > < / ng-container >
2023-11-05 17:26:51 -08:00
< / div >
< ul ngbNav # nav = "ngbNav" class = "nav-underline flex-nowrap flex-md-wrap overflow-auto" ( navChange ) = " onNavChange ( $ event ) " [ ( activeId ) ] = " activeNavID " >
2023-03-16 23:18:16 -07:00
< li [ ngbNavItem ] = " DocumentDetailNavIDs . Details " >
2020-12-23 15:09:39 +01:00
< a ngbNavLink i18n > Details< / a >
2020-12-07 23:42:18 +01:00
< ng-template ngbNavContent >
2023-11-05 17:26:51 -08:00
< div >
< pngx-input-text # inputTitle i18n-title title = "Title" formControlName = "title" [ horizontal ] = " true " ( keyup ) = " titleKeyUp ( $ event ) " [ error ] = " error ? . title " > < / pngx-input-text >
< pngx-input-number i18n-title title = "Archive serial number" [ error ] = " error ? . archive_serial_number " [ horizontal ] = " true " formControlName = 'archive_serial_number' > < / pngx-input-number >
< pngx-input-date i18n-title title = "Date created" formControlName = "created_date" [ suggestions ] = " suggestions ? . dates " [ showFilter ] = " true " [ horizontal ] = " true " ( filterDocuments ) = " filterDocuments ( $ event ) "
[error]="error?.created_date">< / pngx-input-date >
< pngx-input-select [ items ] = " correspondents " i18n-title title = "Correspondent" formControlName = "correspondent" [ allowNull ] = " true " [ showFilter ] = " true " [ horizontal ] = " true " ( filterDocuments ) = " filterDocuments ( $ event ) "
(createNew)="createCorrespondent($event)" [suggestions]="suggestions?.correspondents" *pngxIfPermissions="{ action: PermissionAction.View, type: PermissionType.Correspondent }">< / pngx-input-select >
< pngx-input-select [ items ] = " documentTypes " i18n-title title = "Document type" formControlName = "document_type" [ allowNull ] = " true " [ showFilter ] = " true " [ horizontal ] = " true " ( filterDocuments ) = " filterDocuments ( $ event ) "
(createNew)="createDocumentType($event)" [suggestions]="suggestions?.document_types" *pngxIfPermissions="{ action: PermissionAction.View, type: PermissionType.DocumentType }">< / pngx-input-select >
< pngx-input-select [ items ] = " storagePaths " i18n-title title = "Storage path" formControlName = "storage_path" [ allowNull ] = " true " [ showFilter ] = " true " [ horizontal ] = " true " ( filterDocuments ) = " filterDocuments ( $ event ) "
(createNew)="createStoragePath($event)" [suggestions]="suggestions?.storage_paths" i18n-placeholder placeholder="Default" *pngxIfPermissions="{ action: PermissionAction.View, type: PermissionType.StoragePath }">< / pngx-input-select >
< pngx-input-tags formControlName = "tags" [ suggestions ] = " suggestions ? . tags " [ showFilter ] = " true " [ horizontal ] = " true " ( filterDocuments ) = " filterDocuments ( $ event ) " * pngxIfPermissions = "{ action: PermissionAction.View, type: PermissionType.Tag }" > < / pngx-input-tags >
< ng-container * ngFor = "let fieldInstance of document?.custom_fields; let i = index" >
2023-11-09 15:07:49 -08:00
< div [ formGroup ] = " customFieldFormFields . controls [ i ] " [ ngSwitch ] = " getCustomFieldFromInstance ( fieldInstance ) ? . data_type " >
< pngx-input-text * ngSwitchCase = "PaperlessCustomFieldDataType.String" formControlName = "value" [ title ] = " getCustomFieldFromInstance ( fieldInstance ) ? . name " [ removable ] = " true " ( removed ) = " removeField ( fieldInstance ) " [ horizontal ] = " true " [ error ] = " getCustomFieldError ( i ) " > < / pngx-input-text >
< pngx-input-date * ngSwitchCase = "PaperlessCustomFieldDataType.Date" formControlName = "value" [ title ] = " getCustomFieldFromInstance ( fieldInstance ) ? . name " [ removable ] = " true " ( removed ) = " removeField ( fieldInstance ) " [ horizontal ] = " true " [ error ] = " getCustomFieldError ( i ) " > < / pngx-input-date >
< pngx-input-number * ngSwitchCase = "PaperlessCustomFieldDataType.Integer" formControlName = "value" [ title ] = " getCustomFieldFromInstance ( fieldInstance ) ? . name " [ removable ] = " true " ( removed ) = " removeField ( fieldInstance ) " [ horizontal ] = " true " [ showAdd ] = " false " [ error ] = " getCustomFieldError ( i ) " > < / pngx-input-number >
< pngx-input-number * ngSwitchCase = "PaperlessCustomFieldDataType.Float" formControlName = "value" [ title ] = " getCustomFieldFromInstance ( fieldInstance ) ? . name " [ removable ] = " true " ( removed ) = " removeField ( fieldInstance ) " [ horizontal ] = " true " [ showAdd ] = " false " [ step ] = " . 1 " [ error ] = " getCustomFieldError ( i ) " > < / pngx-input-number >
< pngx-input-number * ngSwitchCase = "PaperlessCustomFieldDataType.Monetary" formControlName = "value" [ title ] = " getCustomFieldFromInstance ( fieldInstance ) ? . name " [ removable ] = " true " ( removed ) = " removeField ( fieldInstance ) " [ horizontal ] = " true " [ showAdd ] = " false " [ step ] = " . 01 " [ error ] = " getCustomFieldError ( i ) " > < / pngx-input-number >
< pngx-input-check * ngSwitchCase = "PaperlessCustomFieldDataType.Boolean" formControlName = "value" [ title ] = " getCustomFieldFromInstance ( fieldInstance ) ? . name " [ removable ] = " true " ( removed ) = " removeField ( fieldInstance ) " [ horizontal ] = " true " > < / pngx-input-check >
< pngx-input-url * ngSwitchCase = "PaperlessCustomFieldDataType.Url" formControlName = "value" [ title ] = " getCustomFieldFromInstance ( fieldInstance ) ? . name " [ removable ] = " true " ( removed ) = " removeField ( fieldInstance ) " [ horizontal ] = " true " [ error ] = " getCustomFieldError ( i ) " > < / pngx-input-url >
2023-12-17 16:39:45 -08:00
< pngx-input-document-link * ngSwitchCase = "PaperlessCustomFieldDataType.DocumentLink" formControlName = "value" [ title ] = " getCustomFieldFromInstance ( fieldInstance ) ? . name " [ parentDocumentID ] = " documentId " [ removable ] = " true " ( removed ) = " removeField ( fieldInstance ) " [ horizontal ] = " true " [ error ] = " getCustomFieldError ( i ) " > < / pngx-input-document-link >
2023-11-05 17:26:51 -08:00
< / div >
< / ng-container >
< / div >
2023-12-17 16:11:12 -08:00
< div class = "d-flex border-top pt-3" >
< ng-container * ngTemplateOutlet = "saveButtons" > < / ng-container >
< / div >
2020-12-07 23:42:18 +01:00
< / ng-template >
< / li >
2023-03-16 23:18:16 -07:00
< li [ ngbNavItem ] = " DocumentDetailNavIDs . Content " >
2020-12-23 15:09:39 +01:00
< a ngbNavLink i18n > Content< / a >
2020-12-07 23:42:18 +01:00
< ng-template ngbNavContent >
2023-11-05 17:26:51 -08:00
< div >
2023-01-01 08:59:43 -08:00
< textarea class = "form-control" id = "content" rows = "20" formControlName = 'content' [ class . rtl ] = " isRTL " > < / textarea >
2020-12-07 23:42:18 +01:00
< / div >
< / ng-template >
< / li >
2023-03-16 23:18:16 -07:00
< li [ ngbNavItem ] = " DocumentDetailNavIDs . Metadata " >
2020-12-23 15:09:39 +01:00
< a ngbNavLink i18n > Metadata< / a >
2020-12-07 23:42:18 +01:00
< ng-template ngbNavContent >
2020-12-08 15:28:09 +01:00
2023-04-28 08:14:24 -07:00
< table class = "table table-borderless" * ngIf = "document" >
2020-12-07 23:42:18 +01:00
< tbody >
< tr >
2020-12-23 15:09:39 +01:00
< td i18n > Date modified< / td >
2021-01-17 00:15:45 +01:00
< td > {{document.modified | customDate}}< / td >
2020-12-07 23:42:18 +01:00
< / tr >
< tr >
2020-12-23 15:09:39 +01:00
< td i18n > Date added< / td >
2021-01-17 00:15:45 +01:00
< td > {{document.added | customDate}}< / td >
2020-12-07 23:42:18 +01:00
< / tr >
2020-12-08 16:09:47 +01:00
< tr >
2020-12-23 15:09:39 +01:00
< td i18n > Media filename< / td >
2020-12-08 16:09:47 +01:00
< td > {{metadata?.media_filename}}< / td >
< / tr >
2022-08-21 08:06:56 -07:00
< tr >
< td i18n > Original filename< / td >
< td > {{metadata?.original_filename}}< / td >
< / tr >
2020-12-07 23:42:18 +01:00
< tr >
2020-12-23 15:09:39 +01:00
< td i18n > Original MD5 checksum< / td >
2020-12-08 15:28:09 +01:00
< td > {{metadata?.original_checksum}}< / td >
< / tr >
< tr >
2020-12-23 15:09:39 +01:00
< td i18n > Original file size< / td >
2020-12-08 16:09:47 +01:00
< td > {{metadata?.original_size | fileSize}}< / td >
2020-12-07 23:42:18 +01:00
< / tr >
< tr >
2020-12-23 15:09:39 +01:00
< td i18n > Original mime type< / td >
2020-12-08 15:28:09 +01:00
< td > {{metadata?.original_mime_type}}< / td >
2020-12-07 23:42:18 +01:00
< / tr >
2020-12-08 16:09:47 +01:00
< tr * ngIf = "metadata?.has_archive_version" >
2020-12-23 15:09:39 +01:00
< td i18n > Archive MD5 checksum< / td >
2020-12-08 16:09:47 +01:00
< td > {{metadata?.archive_checksum}}< / td >
2020-12-07 23:42:18 +01:00
< / tr >
2020-12-08 16:09:47 +01:00
< tr * ngIf = "metadata?.has_archive_version" >
2020-12-23 15:09:39 +01:00
< td i18n > Archive file size< / td >
2020-12-08 16:09:47 +01:00
< td > {{metadata?.archive_size | fileSize}}< / td >
2020-12-07 23:42:18 +01:00
< / tr >
< / tbody >
< / table >
2020-12-08 15:28:09 +01:00
2023-09-14 14:03:28 -07:00
< pngx-metadata-collapse i18n-title title = "Original document metadata" [ metadata ] = " metadata . original_metadata " * ngIf = "metadata?.original_metadata?.length > 0" > < / pngx-metadata-collapse >
< pngx-metadata-collapse i18n-title title = "Archived document metadata" [ metadata ] = " metadata . archive_metadata " * ngIf = "metadata?.archive_metadata?.length > 0" > < / pngx-metadata-collapse >
2020-12-08 15:28:09 +01:00
2020-12-07 23:42:18 +01:00
< / ng-template >
< / li >
2020-12-13 02:28:02 -08:00
2023-03-16 23:18:16 -07:00
< li [ ngbNavItem ] = " DocumentDetailNavIDs . Preview " class = "d-md-none" >
2023-02-17 14:08:05 +01:00
< a ngbNavLink i18n > Preview< / a >
2023-01-04 06:58:42 -08:00
< ng-template ngbNavContent * ngIf = "!pdfPreview.offsetParent" >
2023-12-04 17:17:40 -08:00
< ng-container * ngTemplateOutlet = "previewContent" > < / ng-container >
2022-03-29 10:35:42 -07:00
< / ng-template >
2020-12-13 02:28:02 -08:00
< / li >
2022-12-07 00:36:31 -08:00
2023-03-17 16:36:08 -07:00
< li [ ngbNavItem ] = " DocumentDetailNavIDs . Notes " * ngIf = "notesEnabled" >
2023-11-13 19:54:01 -08:00
< a class = "text-nowrap" ngbNavLink i18n > Notes < span * ngIf = "document?.notes.length" class = "badge text-bg-secondary ms-1" > {{document.notes.length}}< / span > < / a >
2022-08-07 12:41:30 -07:00
< ng-template ngbNavContent >
2023-09-14 14:03:28 -07:00
< pngx-document-notes [ documentId ] = " documentId " [ notes ] = " document ? . notes " [ addDisabled ] = " ! userCanEdit " ( updated ) = " notesUpdated ( $ event ) " > < / pngx-document-notes >
2022-08-07 12:41:30 -07:00
< / ng-template >
< / li >
2022-12-07 00:36:31 -08:00
2023-04-09 16:17:48 -07:00
< li [ ngbNavItem ] = " DocumentDetailNavIDs . Permissions " * ngIf = "showPermissions" >
2022-12-07 00:36:31 -08:00
< a ngbNavLink i18n > Permissions< / a >
< ng-template ngbNavContent >
2022-12-09 17:51:01 -08:00
< div class = "mb-3" >
2023-09-14 14:03:28 -07:00
< pngx-permissions-form [ users ] = " users " formControlName = "permissions_form" > < / pngx-permissions-form >
2022-12-09 17:51:01 -08:00
< / div >
2022-12-07 00:36:31 -08:00
< / ng-template >
< / li >
2020-12-07 23:42:18 +01:00
< / ul >
2023-11-05 17:26:51 -08:00
< div [ ngbNavOutlet ] = " nav " class = "mt-3" > < / div >
2020-10-27 01:10:18 +01:00
< / form >
< / div >
2022-03-29 10:35:42 -07:00
< div class = "col-md-6 col-xl-8 mb-3 d-none d-md-block position-relative" # pdfPreview >
2023-12-04 17:17:40 -08:00
< ng-container * ngTemplateOutlet = "previewContent" > < / ng-container >
2023-05-09 21:51:31 -07:00
< ng-container * ngIf = "renderAsPlainText" >
2023-11-13 06:44:07 -08:00
< div [ innerText ] = " previewText " class = "preview-sticky bg-light p-3 overflow-auto" width = "100%" > < / div >
2021-01-19 16:23:49 +01:00
< / ng-container >
2022-03-29 10:35:42 -07:00
< div * ngIf = "requiresPassword" class = "password-prompt" >
< form >
< input autocomplete = "" class = "form-control" i18n-placeholder placeholder = "Enter Password" type = "password" ( keyup ) = " onPasswordKeyUp ( $ event ) " / >
< / form >
< / div >
2020-10-27 01:10:18 +01:00
< / div >
2022-03-29 10:35:42 -07:00
2020-12-12 08:43:03 -08:00
< / div >
2023-12-04 17:17:40 -08:00
2023-12-17 16:11:12 -08:00
< ng-template # saveButtons >
< div class = "btn-group ms-auto" >
< ng-container * pngxIfPermissions = "{ action: PermissionAction.Change, type: PermissionType.Document }" >
< button type = "submit" class = "order-3 btn btn-sm btn-primary" i18n [ disabled ] = " ! userCanEdit | | networkActive | | ( isDirty $ | async ) ! = = true " > Save< / button >
< button * ngIf = "hasNext()" type = "button" class = "order-1 btn btn-sm btn-outline-primary" ( click ) = " saveEditNext ( ) " i18n [ disabled ] = " ! userCanEdit | | networkActive | | ( isDirty $ | async ) ! = = true " > Save & next< / button >
< button * ngIf = "!hasNext()" type = "button" class = "order-2 btn btn-sm btn-outline-primary" ( click ) = " save ( true ) " i18n [ disabled ] = " ! userCanEdit | | networkActive | | ( isDirty $ | async ) ! = = true " > Save & close< / button >
< / ng-container >
< button type = "button" class = "order-0 btn btn-sm btn-outline-secondary" ( click ) = " discard ( ) " i18n [ disabled ] = " ! userCanEdit | | networkActive | | ( isDirty $ | async ) ! = = true " > Discard< / button >
< / div >
< / ng-template >
2023-12-04 17:17:40 -08:00
< ng-template # previewContent >
< div * ngIf = "!metadata" class = "w-100 h-100 d-flex align-items-center justify-content-center" >
< div >
< div class = "spinner-border spinner-border-sm me-2" role = "status" > < / div >
< ng-container i18n > Loading...< / ng-container >
< / div >
< / div >
< ng-container * ngIf = "getContentType() === 'application/pdf'" >
< div class = "preview-sticky pdf-viewer-container" * ngIf = "!useNativePdfViewer ; else nativePdfViewer" >
< pngx-pdf-viewer
[src]="{ url: previewUrl, password: password }"
[original-size]="false"
[show-borders]="true"
[show-all]="true"
[(page)]="previewCurrentPage"
[zoom-scale]="previewZoomScale"
[zoom]="previewZoomSetting"
(error)="onError($event)"
(after-load-complete)="pdfPreviewLoaded($event)">
< / pngx-pdf-viewer >
< / div >
< ng-template # nativePdfViewer >
< object [ data ] = " previewUrl | safeUrl " class = "preview-sticky" width = "100%" > < / object >
< / ng-template >
< / ng-container >
< ng-container * ngIf = "renderAsPlainText" >
< div [ innerText ] = " previewText " class = "preview-sticky bg-light p-3 overflow-auto" width = "100%" > < / div >
< / ng-container >
< div * ngIf = "showPasswordField" class = "password-prompt" >
< form >
< input autocomplete = "" autofocus = "true" class = "form-control" i18n-placeholder placeholder = "Enter Password" type = "password" ( keyup ) = " onPasswordKeyUp ( $ event ) " / >
< / form >
< / div >
< / ng-template >