2019-11-25 16:12:43 +01:00
<!-- Modal change avatar -->
< div class = "modal fade" id = "avatarChangeModal" tabindex = "-1" role = "dialog" >
< div class = "modal-dialog" >
< div class = "modal-content" >
< div class = "modal-header" >
2020-10-28 18:21:56 +01:00
< h4 class = "modal-title" > {{ 'profile.changeAvatar.title' | tr }}< / h4 >
2019-11-25 16:12:43 +01:00
< / div >
< div class = "modal-body settings-avatar-selector" >
2021-07-07 14:39:17 +02:00
< div style = "margin: auto; text-align: left" >
< div class = "radio" >
< label >
< input type = "radio" name = "avatarType" ng-model = "avatarChange.type" value = "" >
{{ 'profile.changeAvatar.noAvatar' | tr }}
< / label >
< / div >
< div class = "radio" >
< label >
< input type = "radio" name = "avatarType" ng-model = "avatarChange.type" value = "gravatar" >
< span ng-bind-html = "'profile.changeAvatar.useGravatar' | tr:{ gravatarLink: 'https://gravatar.com/' }" > < / span >
< / label >
< / div >
< div class = "radio" >
< label >
< input type = "radio" name = "avatarType" ng-model = "avatarChange.type" value = "custom" >
{{ 'profile.changeAvatar.useCustomPicture' | tr }}
< / label >
< / div >
2019-12-12 15:34:26 +01:00
< / div >
2021-07-07 14:39:17 +02:00
< div ng-show = "avatarChange.type === 'custom'" class = "preview-avatar" >
2020-01-20 19:01:41 +01:00
< img id = "previewAvatar" width = "128" height = "128" class = "copy" ng-click = "avatarChange.showCustomAvatarSelector()" / >
2020-06-02 15:25:27 +02:00
< input type = "file" id = "avatarFileInput" style = "display: none" accept = "image/*" / >
2019-12-12 15:34:26 +01:00
< / div >
2019-11-25 16:12:43 +01:00
< / div >
< div class = "modal-footer" >
2020-10-28 18:21:56 +01:00
< button type = "button" class = "btn btn-default" data-dismiss = "modal" > {{ 'main.dialog.cancel' | tr }}< / button >
2021-07-07 14:39:17 +02:00
< button type = "button" class = "btn btn-success" ng-click = "avatarChange.doChangeAvatar()" ng-disabled = "avatarChange.busy || (avatarChange.typeOrig === avatarChange.type && !avatarChange.pictureChanged) || (avatarChange.type === 'custom' && !avatarChange.pictureChanged)" > < i class = "fa fa-circle-notch fa-spin" ng-show = "avatarChange.busy" > < / i > {{ 'main.dialog.save' | tr }}< / button >
2019-11-25 16:12:43 +01:00
< / div >
< / div >
< / div >
< / div >
2022-05-14 19:41:47 +02:00
<!-- Modal change backgroundImage -->
< div class = "modal fade" id = "backgroundImageChangeModal" tabindex = "-1" role = "dialog" >
< div class = "modal-dialog" >
< div class = "modal-content" >
< div class = "modal-header" >
< h4 class = "modal-title" > {{ 'profile.changeBackgroundImage.title' | tr }}< / h4 >
< / div >
< div class = "modal-body settings-avatar-selector" >
< div class = "preview-avatar" >
< img id = "previewBackgroundImage" width = "100%" height = "400px" class = "copy" style = "object-fit: cover;" ng-click = "backgroundImageChange.showCustomBackgroundImageSelector()" / >
2022-06-06 17:40:51 +02:00
< input type = "file" id = "backgroundImageFileInput" style = "display: none" accept = "image/png, image/jpeg" / >
2022-05-14 19:41:47 +02:00
< / div >
< / div >
< div class = "modal-footer" >
2022-05-25 19:04:13 -07:00
< button type = "button" class = "btn btn-danger pull-left" ng-click = "backgroundImageChange.unset()" ng-disabled = "backgroundImageChange.busy" > Remove Background Image< / button >
2022-05-14 19:41:47 +02:00
< button type = "button" class = "btn btn-default" data-dismiss = "modal" > {{ 'main.dialog.cancel' | tr }}< / button >
< button type = "button" class = "btn btn-success" ng-click = "backgroundImageChange.submit()" ng-disabled = "backgroundImageChange.busy || !backgroundImageChange.pictureChanged" > < i class = "fa fa-circle-notch fa-spin" ng-show = "backgroundImageChange.busy" > < / i > {{ 'main.dialog.save' | tr }}< / button >
< / div >
< / div >
< / div >
< / div >
2018-01-22 13:01:38 -08:00
<!-- Modal change password -->
< div class = "modal fade" id = "passwordChangeModal" tabindex = "-1" role = "dialog" >
2020-10-28 18:21:56 +01:00
< div class = "modal-dialog" >
< div class = "modal-content" >
< div class = "modal-header" >
2020-11-02 14:59:39 +01:00
< h4 class = "modal-title" > {{ 'profile.changePassword.title' | tr }}< / h4 >
2020-10-28 18:21:56 +01:00
< / div >
< div class = "modal-body" >
< form name = "passwordChangeForm" role = "form" novalidate ng-submit = "passwordchange.submit()" autocomplete = "off" >
< input type = "password" style = "display: none;" >
< div class = "form-group" ng-class = "{ 'has-error': (!passwordChangeForm.password.$dirty && passwordchange.error.password) || (passwordChangeForm.password.$dirty && passwordChangeForm.password.$invalid) }" >
2020-11-02 14:59:39 +01:00
< label class = "control-label" for = "inputPasswordChangePassword" > {{ 'profile.changePassword.currentPassword' | tr }}< / label >
2020-10-28 18:21:56 +01:00
< div class = "control-label" ng-show = "(!passwordChangeForm.password.$dirty && passwordchange.error.password) || (passwordChangeForm.password.$dirty && passwordChangeForm.password.$invalid)" >
< small ng-show = "!passwordChangeForm.password.$dirty && passwordchange.error.password" > Wrong password< / small >
< small ng-show = "passwordChangeForm.password.$dirty && passwordChangeForm.password.$error.required" > A password is required< / small >
2018-01-22 13:01:38 -08:00
< / div >
2021-11-03 21:57:44 +01:00
< input type = "password" class = "form-control" ng-model = "passwordchange.password" id = "inputPasswordChangePassword" name = "password" required autofocus password-reveal >
2020-10-28 18:21:56 +01:00
< / div >
< div class = "form-group" ng-class = "{ 'has-error': (!passwordChangeForm.newPassword.$dirty && passwordchange.error.newPassword) || (passwordChangeForm.newPassword.$dirty && passwordChangeForm.newPassword.$invalid) }" >
2020-11-02 14:59:39 +01:00
< label class = "control-label" for = "inputPasswordChangeNewPassword" > {{ 'profile.changePassword.newPassword' | tr }}< / label >
2020-10-28 18:21:56 +01:00
< div class = "control-label" ng-show = "(!passwordChangeForm.newPassword.$dirty && passwordchange.error.newPassword) || (passwordChangeForm.newPassword.$dirty && passwordChangeForm.newPassword.$invalid)" >
< small ng-show = "!passwordChangeForm.newPassword.$dirty && passwordchange.error.newPassword" > {{ passwordchange.error.newPassword }}< br / > < br / > < / small >
2020-11-02 14:59:39 +01:00
< small ng-show = " passwordChangeForm.newPassword.$dirty && passwordChangeForm.newPassword.$invalid" > {{ 'profile.changePassword.errorPasswordInvalid' | tr }}< / small >
2018-01-22 13:01:38 -08:00
< / div >
2021-11-03 21:57:44 +01:00
< input type = "password" class = "form-control" ng-model = "passwordchange.newPassword" id = "inputPasswordChangeNewPassword" name = "newPassword" ng-minlength = "8" ng-maxlength = "256" required autofocus password-reveal >
2020-10-28 18:21:56 +01:00
< / div >
< div class = "form-group" ng-class = "{ 'has-error': (!passwordChangeForm.newPassword.$dirty && passwordchange.error.newPassword) || (passwordChangeForm.newPasswordRepeat.$dirty && passwordChangeForm.newPasswordRepeat.$error.required) || (passwordChangeForm.newPasswordRepeat.$dirty && passwordchange.newPassword !== passwordchange.newPasswordRepeat) }" >
2020-11-02 14:59:39 +01:00
< label class = "control-label" for = "inputPasswordChangeNewPasswordRepeat" > {{ 'profile.changePassword.newPasswordRepeat' | tr }}< / label >
2020-10-28 18:21:56 +01:00
< div class = "control-label" ng-show = "(!passwordChangeForm.newPassword.$dirty && passwordchange.error.newPassword) || (passwordChangeForm.newPasswordRepeat.$dirty && passwordChangeForm.newPasswordRepeat.$error.required) || (passwordChangeForm.newPasswordRepeat.$dirty && passwordchange.newPassword !== passwordchange.newPasswordRepeat)" >
2020-11-02 14:59:39 +01:00
< small ng-show = "passwordChangeForm.newPasswordRepeat.$dirty && passwordChangeForm.newPasswordRepeat.$error.required" > {{ 'profile.changePassword.errorPasswordRequired' | tr }}< / small >
< small ng-show = "passwordChangeForm.newPasswordRepeat.$dirty && passwordchange.newPassword !== passwordchange.newPasswordRepeat && passwordchange.newPasswordRepeat" > {{ 'profile.changePassword.errorPasswordsDontMatch' | tr }}< / small >
2018-01-22 13:01:38 -08:00
< / div >
2021-11-03 21:57:44 +01:00
< input type = "password" class = "form-control" ng-model = "passwordchange.newPasswordRepeat" id = "inputPasswordChangeNewPasswordRepeat" name = "newPasswordRepeat" required autofocus password-reveal >
2020-10-28 18:21:56 +01:00
< / div >
< input class = "ng-hide" type = "submit" ng-disabled = "passwordChangeForm.$invalid" / >
< / form >
< / div >
< div class = "modal-footer" >
< button type = "button" class = "btn btn-default" data-dismiss = "modal" > {{ 'main.dialog.cancel' | tr }}< / button >
2020-11-02 14:59:39 +01:00
< button type = "button" class = "btn btn-success" ng-click = "passwordchange.submit()" ng-disabled = "passwordChangeForm.$invalid || passwordchange.busy" > < i class = "fa fa-circle-notch fa-spin" ng-show = "passwordchange.busy" > < / i > {{ 'main.dialog.save' | tr }}< / button >
2020-10-28 18:21:56 +01:00
< / div >
2018-01-22 13:01:38 -08:00
< / div >
2020-10-28 18:21:56 +01:00
< / div >
2018-01-22 13:01:38 -08:00
< / div >
<!-- Modal change email -->
< div class = "modal fade" id = "emailChangeModal" tabindex = "-1" role = "dialog" >
2020-10-28 18:21:56 +01:00
< div class = "modal-dialog" >
< div class = "modal-content" >
< div class = "modal-header" >
2020-11-02 14:59:39 +01:00
< h4 class = "modal-title" > {{ 'profile.changeEmail.title' | tr }}< / h4 >
2020-10-28 18:21:56 +01:00
< / div >
< div class = "modal-body" >
2024-01-18 17:34:45 +01:00
< form name = "emailChangeForm" role = "form" novalidate ng-submit = "emailChange.submit()" autocomplete = "off" >
< div class = "form-group" ng-class = "{ 'has-error': (emailChangeForm.email.$dirty && emailChangeForm.email.$invalid) || (!emailChangeForm.email.$dirty && emailChange.error.email)}" >
< label class = "control-label" for = "inputEmailChangeEmail" > {{ 'profile.changeEmail.email' | tr }}< / label >
< input type = "email" class = "form-control" ng-model = "emailChange.email" id = "inputEmailChangeEmail" name = "email" required autofocus >
< div class = "control-label" ng-show = "(!emailChangeForm.email.$dirty && emailChange.error.email) || (emailChangeForm.email.$dirty && emailChangeForm.email.$invalid)" >
2020-11-02 14:59:39 +01:00
< small ng-show = "emailChangeForm.email.$error.required" > {{ 'profile.changeEmail.errorEmailRequired' | tr }}< / small >
< small ng-show = "(emailChangeForm.email.$dirty && emailChangeForm.email.$invalid) && !emailChangeForm.email.$error.required" > {{ 'profile.changeEmail.errorEmailInvalid' | tr }}< / small >
2024-01-18 17:34:45 +01:00
< small ng-show = "!emailChangeForm.email.$dirty && emailChange.error.email" > {{ emailChange.error.email }}< / small >
< / div >
< / div >
< div class = "form-group" ng-class = "{ 'has-error': (emailChange.error.password && !emailChangeForm.password.$dirty) }" >
< label class = "control-label" for = "inputEmailChangePassword" > {{ 'profile.changeEmail.password' | tr }}< / label >
< input type = "password" class = "form-control" ng-model = "emailChange.password" id = "inputEmailChangePassword" name = "password" required autofocus password-reveal >
< div class = "control-label" ng-show = "emailChange.error.password && !emailChangeForm.password.$dirty" >
< small ng-show = "emailChange.error.password" > {{ 'profile.changeEmail.errorWrongPassword' | tr }}< / small >
2018-01-22 13:01:38 -08:00
< / div >
2020-10-28 18:21:56 +01:00
< / div >
< input class = "ng-hide" type = "submit" ng-disabled = "emailChangeForm.$invalid" / >
< / form >
< / div >
< div class = "modal-footer" >
< button type = "button" class = "btn btn-default" data-dismiss = "modal" > {{ 'main.dialog.cancel' | tr }}< / button >
2024-01-18 17:34:45 +01:00
< button type = "button" class = "btn btn-success" ng-click = "emailChange.submit()" ng-disabled = "emailChangeForm.$invalid || emailChange.busy" > < i class = "fa fa-circle-notch fa-spin" ng-show = "emailChange.busy" > < / i > {{ 'main.dialog.save' | tr }}< / button >
2020-10-28 18:21:56 +01:00
< / div >
2018-01-22 13:01:38 -08:00
< / div >
2020-10-28 18:21:56 +01:00
< / div >
2018-01-22 13:01:38 -08:00
< / div >
<!-- Modal change fallback email -->
< div class = "modal fade" id = "fallbackEmailChangeModal" tabindex = "-1" role = "dialog" >
2020-10-28 18:21:56 +01:00
< div class = "modal-dialog" >
< div class = "modal-content" >
< div class = "modal-header" >
2020-11-02 14:59:39 +01:00
< h4 class = "modal-title" > {{ 'profile.changeFallbackEmail.title' | tr }}< / h4 >
2020-10-28 18:21:56 +01:00
< / div >
< div class = "modal-body" >
< form name = "fallbackEmailChangeForm" role = "form" novalidate ng-submit = "fallbackEmailChange.submit()" autocomplete = "off" >
2021-09-09 23:01:18 +02:00
< input type = "password" style = "display: none;" >
2022-04-27 14:30:54 +02:00
< div class = "form-group" ng-class = "{ 'has-error': fallbackEmailChange.error.generic || (fallbackEmailChangeForm.email.$dirty && fallbackEmailChangeForm.email.$invalid) || (!fallbackEmailChangeForm.email.$dirty && fallbackEmailChange.error.email)}" >
2021-09-09 23:01:18 +02:00
< label class = "control-label" for = "inputFallbackEmailChangeEmail" > {{ 'profile.changeFallbackEmail.email' | tr }}< / label >
< input type = "email" class = "form-control" ng-model = "fallbackEmailChange.email" id = "inputFallbackEmailChangeEmail" name = "email" required autofocus >
2022-04-27 14:30:54 +02:00
< div class = "control-label" ng-show = "fallbackEmailChange.error.generic || (!fallbackEmailChangeForm.email.$dirty && fallbackEmailChange.error.email) || (fallbackEmailChangeForm.email.$dirty && fallbackEmailChangeForm.email.$invalid)" >
2020-11-02 14:59:39 +01:00
< small ng-show = "fallbackEmailChangeForm.email.$error.required" > {{ 'profile.changeFallbackEmail.errorEmailRequired' | tr }}< / small >
< small ng-show = "(fallbackEmailChangeForm.email.$dirty && fallbackEmailChangeForm.email.$invalid) && !fallbackEmailChangeForm.email.$error.required" > {{ 'profile.changeFallbackEmail.errorEmailInvalid' | tr }}< / small >
2020-10-28 18:21:56 +01:00
< small ng-show = "!fallbackEmailChangeForm.email.$dirty && fallbackEmailChange.error.email" > {{ fallbackEmailChange.error.email }}< / small >
2022-04-27 14:30:54 +02:00
< small ng-show = "fallbackEmailChange.error.generic" > {{ fallbackEmailChange.error.generic }}< / small >
2018-01-22 13:01:38 -08:00
< / div >
2020-10-28 18:21:56 +01:00
< / div >
2021-09-09 23:01:18 +02:00
< div class = "form-group" ng-class = "{ 'has-error': (!fallbackEmailChangeForm.password.$dirty && fallbackEmailChange.error.password) || (fallbackEmailChangeForm.password.$dirty && fallbackEmailChangeForm.password.$invalid) }" >
< label class = "control-label" for = "inputFallbackEmailChangePassword" > {{ 'profile.changeFallbackEmail.password' | tr }}< / label >
2021-11-03 21:57:44 +01:00
< input type = "password" class = "form-control" ng-model = "fallbackEmailChange.password" id = "inputFallbackEmailChangePassword" name = "password" required autofocus password-reveal >
2021-09-09 23:01:18 +02:00
< div class = "control-label" ng-show = "(!fallbackEmailChangeForm.password.$dirty && fallbackEmailChange.error.password) || (fallbackEmailChangeForm.password.$dirty && fallbackEmailChangeForm.password.$invalid)" >
< small ng-show = "!fallbackEmailChangeForm.password.$dirty && fallbackEmailChange.error.password" > {{ 'profile.changeFallbackEmail.errorWrongPassword' | tr }}< / small >
< small ng-show = "fallbackEmailChangeForm.password.$dirty && fallbackEmailChangeForm.password.$error.required" > {{ 'profile.changeFallbackEmail.errorPasswordRequired' | tr }}< / small >
< / div >
< / div >
2020-10-28 18:21:56 +01:00
< input class = "ng-hide" type = "submit" ng-disabled = "fallbackEmailChangeForm.$invalid" / >
< / form >
< / div >
< div class = "modal-footer" >
< button type = "button" class = "btn btn-default" data-dismiss = "modal" > {{ 'main.dialog.cancel' | tr }}< / button >
2020-11-02 14:59:39 +01:00
< button type = "button" class = "btn btn-success" ng-click = "fallbackEmailChange.submit()" ng-disabled = "fallbackEmailChangeForm.$invalid || fallbackEmailChange.busy" > < i class = "fa fa-circle-notch fa-spin" ng-show = "fallbackEmailChange.busy" > < / i > {{ 'main.dialog.save' | tr }}< / button >
2020-10-28 18:21:56 +01:00
< / div >
2018-01-22 13:01:38 -08:00
< / div >
2020-10-28 18:21:56 +01:00
< / div >
2018-01-22 13:01:38 -08:00
< / div >
<!-- Modal change displayName -->
< div class = "modal fade" id = "displayNameChangeModal" tabindex = "-1" role = "dialog" >
2020-10-28 18:21:56 +01:00
< div class = "modal-dialog" >
< div class = "modal-content" >
< div class = "modal-header" >
2020-11-02 14:59:39 +01:00
< h4 class = "modal-title" > {{ 'profile.changeDisplayName.title' | tr }}< / h4 >
2020-10-28 18:21:56 +01:00
< / div >
< div class = "modal-body" >
< form name = "displayNameChangeForm" role = "form" novalidate ng-submit = "displayNameChange.submit()" autocomplete = "off" >
< div class = "form-group" ng-class = "{ 'has-error': (displayNameChangeForm.displayName.$dirty && displayNameChangeForm.displayName.$invalid) || (!displayNameChangeForm.displayName.$dirty && displayNameChange.error.displayName)}" >
2020-11-23 12:54:34 +01:00
< input type = "text" class = "form-control" ng-model = "displayNameChange.displayName" id = "inputDisplayNameChangeDisplayName" name = "displayName" required autofocus >
2020-10-28 18:21:56 +01:00
< div class = "control-label" ng-show = "(!displayNameChangeForm.displayName.$dirty && displayNameChange.error.displayName) || (displayNameChangeForm.displayName.$dirty && displayNameChangeForm.displayName.$invalid)" >
2020-11-02 14:59:39 +01:00
< small ng-show = "displayNameChangeForm.displayName.$error.required" > {{ 'profile.changeDisplayName.errorDisplayNameRequired' | tr }}< / small >
< small ng-show = "(displayNameChangeForm.displayName.$dirty && displayNameChangeForm.displayName.$invalid) && !displayNameChangeForm.displayName.$error.required" > {{ 'profile.changeDisplayName.errorNameInvalid' | tr }}< / small >
2020-10-28 18:21:56 +01:00
< small ng-show = "!displayNameChangeForm.email.$dirty && displayNameChange.error.displayName" > {{ displayNameChange.error.displayName }}< / small >
2018-01-22 13:01:38 -08:00
< / div >
2020-10-28 18:21:56 +01:00
< / div >
< input class = "ng-hide" type = "submit" ng-disabled = "displayNameChangeForm.$invalid" / >
< / form >
< / div >
< div class = "modal-footer" >
< button type = "button" class = "btn btn-default" data-dismiss = "modal" > {{ 'main.dialog.cancel' | tr }}< / button >
2020-11-02 14:59:39 +01:00
< button type = "button" class = "btn btn-success" ng-click = "displayNameChange.submit()" ng-disabled = "displayNameChangeForm.$invalid || displayNameChange.busy" > < i class = "fa fa-circle-notch fa-spin" ng-show = "displayNameChange.busy" > < / i > {{ 'main.dialog.save' | tr }}< / button >
2020-10-28 18:21:56 +01:00
< / div >
2018-01-22 13:01:38 -08:00
< / div >
2020-10-28 18:21:56 +01:00
< / div >
2018-01-22 13:01:38 -08:00
< / div >
2018-04-26 15:12:29 +02:00
<!-- Modal enable twofactor authentication -->
< div class = "modal fade" id = "twoFactorAuthenticationEnableModal" tabindex = "-1" role = "dialog" >
< div class = "modal-dialog" >
< div class = "modal-content" >
< div class = "modal-header" >
2020-11-02 14:59:39 +01:00
< h4 class = "modal-title" > {{ 'profile.enable2FA.title' | tr }}< / h4 >
2018-04-26 15:12:29 +02:00
< / div >
2020-11-02 14:59:39 +01:00
< p class = "modal-body" ng-show = "twoFactorAuthentication.mandatory2FAHelp && !twoFactorAuthentication.secret" > {{ 'profile.enable2FA.description' | tr }}< / p >
2022-04-27 14:09:07 +02:00
< div class = "modal-body text-center" ng-show = "!twoFactorAuthentication.mandatory2FAHelp && !twoFactorAuthentication.secret && !twoFactorAuthentication.notSupportedError" >
2018-11-16 17:03:21 +01:00
< h2 > < i class = "fa fa-circle-notch fa-spin" > < / i > < / h2 >
2018-04-26 15:12:29 +02:00
< / div >
2022-04-27 14:09:07 +02:00
< div class = "modal-body" ng-show = "twoFactorAuthentication.notSupportedError" >
< p class = "text-danger" > {{ twoFactorAuthentication.notSupportedError }}< / p >
< / div >
2018-04-26 15:12:29 +02:00
< div class = "modal-body" ng-show = "twoFactorAuthentication.secret" >
2020-11-12 23:13:52 +01:00
< p ng-bind-html = "'profile.enable2FA.authenticatorAppDescription' | tr:{ googleAuthenticatorPlayStoreLink: 'https://play.google.com/store/apps/details?id=com.google.android.apps.authenticator2', googleAuthenticatorITunesLink: 'https://itunes.apple.com/us/app/google-authenticator/id388497605', freeOTPPlayStoreLink: 'https://play.google.com/store/apps/details?id=org.fedorahosted.freeotp', freeOTPITunesLink: 'https://itunes.apple.com/us/app/freeotp-authenticator/id872559395' }" > < / p >
2018-04-26 15:12:29 +02:00
< center >
< img ng-src = "{{ twoFactorAuthentication.qrcode }}" / >
< p > {{ twoFactorAuthentication.secret }}< / p >
< / center >
< br / >
< form name = "twoFactorAuthenticationEnableForm" role = "form" novalidate ng-submit = "twoFactorAuthentication.enable()" autocomplete = "off" >
< div class = "form-group" ng-class = "{ 'has-error': (!twoFactorAuthenticationEnableForm.totpToken.$dirty && twoFactorAuthentication.error) || (twoFactorAuthenticationEnableForm.totpToken.$dirty && twoFactorAuthenticationEnableForm.totpToken.$invalid) }" >
2020-11-02 14:59:39 +01:00
< label class = "control-label" > {{ 'profile.enable2FA.token' | tr }}< / label >
2018-04-26 15:12:29 +02:00
< div class = "control-label" ng-show = "(!twoFactorAuthenticationEnableForm.totpToken.$dirty && twoFactorAuthentication.error) || (twoFactorAuthenticationEnableForm.totpToken.$dirty && twoFactorAuthenticationEnableForm.totpToken.$invalid)" >
< small > {{ twoFactorAuthentication.error }}< / small >
< / div >
< input type = "text" class = "form-control" ng-model = "twoFactorAuthentication.totpToken" id = "twoFactorAuthenticationTotpTokenInput" name = "totpToken" required autofocus >
< / div >
< input class = "ng-hide" type = "submit" ng-disabled = "twoFactorAuthenticationEnableForm.$invalid" / >
< / form >
< / div >
< div class = "modal-footer" >
2020-10-28 18:21:56 +01:00
< button type = "button" class = "btn btn-default" data-dismiss = "modal" ng-if = "!twoFactorAuthentication.mandatory2FA" > {{ 'main.dialog.cancel' | tr }}< / button >
2020-11-02 14:59:39 +01:00
< button type = "button" class = "btn btn-success" ng-click = "twoFactorAuthentication.enable()" ng-show = "twoFactorAuthentication.secret" ng-disabled = "twoFactorAuthenticationEnableForm.$invalid || twoFactorAuthentication.busy" > < i class = "fa fa-circle-notch fa-spin" ng-show = "twoFactorAuthentication.busy" > < / i > {{ 'profile.enable2FA.enable' | tr }}< / button >
< button type = "button" class = "btn btn-success" ng-click = "twoFactorAuthentication.getSecret()" ng-show = "twoFactorAuthentication.mandatory2FAHelp" > {{ 'profile.enable2FA.setup2FA' | tr }}< / button >
2018-04-26 15:12:29 +02:00
< / div >
< / div >
< / div >
< / div >
2018-04-26 16:38:26 +02:00
<!-- Modal disable twofactor authentication -->
< div class = "modal fade" id = "twoFactorAuthenticationDisableModal" tabindex = "-1" role = "dialog" >
< div class = "modal-dialog" >
< div class = "modal-content" >
< div class = "modal-header" >
2020-11-02 14:59:39 +01:00
< h4 class = "modal-title" > {{ 'profile.disable2FA.title' | tr }}< / h4 >
2018-04-26 16:38:26 +02:00
< / div >
< div class = "modal-body" >
< form name = "twoFactorAuthenticationDisableForm" role = "form" novalidate ng-submit = "twoFactorAuthentication.disable()" autocomplete = "off" >
< div class = "form-group" ng-class = "{ 'has-error': (!twoFactorAuthenticationDisableForm.password.$dirty && twoFactorAuthentication.error) || (twoFactorAuthenticationDisableForm.password.$dirty && twoFactorAuthenticationDisableForm.password.$invalid) }" >
2020-11-02 14:59:39 +01:00
< label class = "control-label" > {{ 'profile.disable2FA.password' | tr }}< / label >
2018-04-26 16:38:26 +02:00
< div class = "control-label" ng-show = "(!twoFactorAuthenticationDisableForm.password.$dirty && twoFactorAuthentication.error) || (twoFactorAuthenticationDisableForm.password.$dirty && twoFactorAuthenticationDisableForm.password.$invalid)" >
< small > {{ twoFactorAuthentication.error }}< / small >
< / div >
2021-11-03 21:57:44 +01:00
< input type = "password" class = "form-control" ng-model = "twoFactorAuthentication.password" id = "twoFactorAuthenticationPasswordInput" name = "password" required autofocus password-reveal >
2018-04-26 16:38:26 +02:00
< / div >
< input class = "ng-hide" type = "submit" ng-disabled = "twoFactorAuthenticationDisableForm.$invalid" / >
< / form >
< / div >
< div class = "modal-footer" >
2020-10-28 18:21:56 +01:00
< button type = "button" class = "btn btn-default" data-dismiss = "modal" > {{ 'main.dialog.cancel' | tr }}< / button >
2020-11-02 14:59:39 +01:00
< button type = "button" class = "btn btn-success" ng-click = "twoFactorAuthentication.disable()" ng-disabled = "twoFactorAuthenticationDisableForm.$invalid || twoFactorAuthentication.busy" > < i class = "fa fa-circle-notch fa-spin" ng-show = "twoFactorAuthentication.busy" > < / i > {{ 'profile.disable2FA.disable' | tr }}< / button >
2018-04-26 16:38:26 +02:00
< / div >
< / div >
< / div >
2018-08-27 15:26:52 -07:00
< / div >
2020-02-01 10:04:09 -08:00
<!-- Modal add app password -->
< div class = "modal fade" id = "appPasswordAddModal" tabindex = "-1" role = "dialog" >
< div class = "modal-dialog" >
2020-02-24 13:23:47 +01:00
< div class = "modal-content" >
< div class = "modal-header" >
2020-11-02 14:59:39 +01:00
< h4 class = "modal-title" > {{ 'profile.createAppPassword.title' | tr }}< / h4 >
2020-02-24 13:23:47 +01:00
< / div >
< div class = "modal-body" >
< div ng-hide = "appPasswordAdd.password" >
< form name = "appPasswordAddForm" role = "form" novalidate ng-submit = "appPasswordAdd.submit()" autocomplete = "off" >
< div class = "form-group" ng-class = "{ 'has-error': (appPasswordAddForm.name.$dirty && appPasswordAddForm.name.$invalid) || (!appPasswordAddForm.name.$dirty && appPasswordAdd.error.name)}" >
2020-11-02 14:59:39 +01:00
< label class = "control-label" > {{ 'profile.createAppPassword.name' | tr }}< / label >
2020-02-24 13:23:47 +01:00
< div class = "control-label" ng-show = "(!appPasswordAddForm.name.$dirty && appPasswordAdd.error.name) || (appPasswordAddForm.name.$dirty && appPasswordAddForm.name.$invalid)" >
2020-11-02 14:59:39 +01:00
< small ng-show = "appPasswordAddForm.name.$error.required" > {{ 'profile.createAppPassword.errorNameRequired' | tr }}< / small >
2020-02-24 13:23:47 +01:00
< small ng-show = "appPasswordAdd.error.name" > {{ appPasswordAdd.error.name }}< / small >
2020-02-01 10:04:09 -08:00
< / div >
2020-02-24 13:23:47 +01:00
< input type = "text" class = "form-control" ng-model = "appPasswordAdd.name" id = "inputAppPasswordAddName" name = "name" required autofocus >
< / div >
< div class = "form-group" ng-class = "{ 'has-error': (appPasswordAddForm.identifier.$dirty && appPasswordAddForm.identifier.$invalid) || (!appPasswordAddForm.identifier.$dirty && appPasswordAdd.error.identifier)}" >
2020-11-02 14:59:39 +01:00
< label class = "control-label" > {{ 'profile.createAppPassword.app' | tr }}< / label >
2020-02-24 13:23:47 +01:00
< select class = "form-control" ng-model = "appPasswordAdd.identifier" ng-options = "a.id as a.label for a in appPassword.identifiers" required > < / select >
< / div >
< input class = "ng-hide" type = "submit" ng-disabled = "appPasswordAddForm.$invalid" / >
< / form >
< / div >
2020-02-01 10:04:09 -08:00
2020-02-24 13:23:47 +01:00
< div ng-show = "appPasswordAdd.password" >
2020-11-02 14:59:39 +01:00
{{ 'profile.createAppPassword.description' | tr }}
2020-02-24 13:23:47 +01:00
< br / >
< br / >
2022-09-28 15:38:42 +02:00
< div class = "input-group" >
< input type = "text" id = "newAppPassword" class = "form-control" name = "appPassword" ng-model = "appPasswordAdd.password.password" required readonly / >
< span class = "input-group-btn" >
< button class = "btn btn-default" type = "button" id = "newAppPasswordClipboardButton" data-clipboard-target = "#newAppPassword" > < i class = "fa fa-clipboard" > < / i > < / button >
< / span >
< / div >
2020-02-24 13:23:47 +01:00
< br / >
2020-11-02 14:59:39 +01:00
< p > {{ 'profile.createAppPassword.copyNow' | tr }}< / p >
2020-02-24 13:23:47 +01:00
< / div >
< / div >
< div class = "modal-footer" >
2020-10-28 18:21:56 +01:00
< button type = "button" class = "btn btn-default" data-dismiss = "modal" > {{ 'main.dialog.close' | tr }}< / button >
2020-02-24 13:23:47 +01:00
< button type = "button" class = "btn btn-success" ng-click = "appPasswordAdd.submit()" ng-hide = "appPasswordAdd.password" ng-disabled = "appPasswordAddForm.$invalid || appPasswordAdd.busy" >
2020-11-02 14:59:39 +01:00
< i class = "fa fa-circle-notch fa-spin" ng-show = "appPasswordAdd.busy" > < / i > {{ 'profile.createAppPassword.generatePassword' | tr }}
2020-02-24 13:23:47 +01:00
< / button >
2020-02-01 10:04:09 -08:00
< / div >
2020-02-24 13:23:47 +01:00
< / div >
2020-02-01 10:04:09 -08:00
< / div >
< / div >
2020-02-07 21:40:43 +01:00
<!-- Modal add api token -->
< div class = "modal fade" id = "apiTokenAddModal" tabindex = "-1" role = "dialog" >
< div class = "modal-dialog" >
< div class = "modal-content" >
< div class = "modal-header" >
2020-11-02 14:59:39 +01:00
< h4 class = "modal-title" > {{ 'profile.createApiToken.title' | tr }}< / h4 >
2020-02-07 21:40:43 +01:00
< / div >
< div class = "modal-body" >
< div ng-hide = "tokens.add.accessToken" >
< form name = "apiTokenAddForm" role = "form" novalidate ng-submit = "tokens.add.submit()" autocomplete = "off" >
< div class = "form-group" ng-class = "{ 'has-error': (apiTokenAddForm.name.$dirty && apiTokenAddForm.name.$invalid) || (!apiTokenAddForm.name.$dirty && tokens.add.error)}" >
2020-11-02 14:59:39 +01:00
< label class = "control-label" > {{ 'profile.createApiToken.name' | tr }}< / label >
2020-02-07 21:40:43 +01:00
< div class = "control-label" ng-show = "(!apiTokenAddForm.name.$dirty && tokens.add.error) || (apiTokenAddForm.name.$dirty && apiTokenAddForm.name.$invalid)" >
2020-11-02 14:59:39 +01:00
< small ng-show = "apiTokenAddForm.name.$error.required" > {{ 'profile.createApiToken.errorNameRequired' | tr }}< / small >
2020-02-07 21:40:43 +01:00
< small ng-show = "tokens.add.error.name" > {{ tokens.add.error }}< / small >
< / div >
< input type = "text" class = "form-control" id = "inputApiTokenName" ng-model = "tokens.add.name" name = "name" required autofocus >
< / div >
2022-09-26 12:44:44 +02:00
< div class = "form-group" >
< label class = "control-label" > {{ 'profile.createApiToken.access' | tr }}< / label >
< div class = "radio" >
< label > < input type = "radio" ng-model = "tokens.add.scope" value = "r" > {{ 'profile.apiTokens.readonly' | tr }}< / label >
< / div >
< div class = "radio" >
< label > < input type = "radio" ng-model = "tokens.add.scope" value = "rw" > {{ 'profile.apiTokens.readwrite' | tr }}< / label >
< / div >
2022-09-22 21:59:10 +02:00
< / div >
2020-02-07 21:40:43 +01:00
< input class = "ng-hide" type = "submit" ng-disabled = "apiTokenAddForm.$invalid" / >
< / form >
< / div >
< div ng-show = "tokens.add.accessToken" >
2020-11-02 14:59:39 +01:00
{{ 'profile.createApiToken.description' | tr }}
2020-02-07 21:40:43 +01:00
< br / >
< br / >
2022-09-28 15:38:42 +02:00
< div class = "input-group" >
< input type = "text" id = "accessTokenToken" class = "form-control" name = "accessToken" ng-model = "tokens.add.accessToken" required readonly / >
< span class = "input-group-btn" >
< button class = "btn btn-default" type = "button" id = "newAccessTokenClipboardButton" data-clipboard-target = "#accessTokenToken" > < i class = "fa fa-clipboard" > < / i > < / button >
< / span >
< / div >
2020-02-07 21:40:43 +01:00
< br / >
2020-11-02 14:59:39 +01:00
< p > {{ 'profile.createApiToken.copyNow' | tr }}< / p >
2020-02-07 21:40:43 +01:00
< / div >
< / div >
< div class = "modal-footer" >
2020-10-28 18:21:56 +01:00
< button type = "button" class = "btn btn-default" data-dismiss = "modal" > {{ 'main.dialog.close' | tr }}< / button >
2020-02-07 21:40:43 +01:00
< button type = "button" class = "btn btn-success" ng-click = "tokens.add.submit()" ng-hide = "tokens.add.accessToken" ng-disabled = "apiTokenAddForm.$invalid || tokens.add.busy" >
2020-11-02 14:59:39 +01:00
< i class = "fa fa-circle-notch fa-spin" ng-show = "tokens.add.busy" > < / i > {{ 'profile.createApiToken.generateToken' | tr }}
2020-02-07 21:40:43 +01:00
< / button >
< / div >
< / div >
< / div >
< / div >
2018-01-22 13:01:38 -08:00
< div class = "content" >
2024-10-15 18:46:51 +02:00
< h1 class = "section-header" > {{ 'profile.title' | tr }}< / h1 >
2018-01-22 13:01:38 -08:00
< div class = "card" >
2024-10-15 17:27:58 +02:00
< div style = "display: flex; flex-wrap: wrap;" >
< div style = "width: 150px;" >
< div class = "settings-avatar" style = "background-image: url('{{ user.avatarUrl }}');" ng-click = "avatarChange.showChangeAvatar()" >
< i class = "picture-edit-indicator fa fa-pencil-alt" > < / i >
2020-11-11 22:00:00 +01:00
< / div >
2018-01-22 13:01:38 -08:00
< / div >
2024-10-15 17:27:58 +02:00
< div style = "flex-grow: 1;" >
< table style = "width: 100%;" >
< tr >
< td class = "text-muted" style = "vertical-align: top;" > {{ 'main.username' | tr }}< / td >
< td class = "text-right" style = "vertical-align: top;" >
{{ user.username }}
< / td >
< / tr >
< tr >
< td class = "text-muted" style = "vertical-align: top;" > {{ 'main.displayName' | tr }}< / td >
< td class = "text-right" style = "vertical-align: top; white-space: nowrap;" >
{{ user.displayName }} < a href = "" ng-click = "displayNameChange.show()" ng-hide = "user.source || config.profileLocked" > < i class = "fa fa-edit text-small" > < / i > < / a >
< / td >
< / tr >
< tr >
< td class = "text-muted" style = "vertical-align: top;" > {{ 'profile.primaryEmail' | tr }}< / td >
< td class = "text-right" style = "vertical-align: top; white-space: nowrap;" >
{{ user.email }} < a href = "" ng-click = "emailChange.show()" ng-hide = "user.source || config.profileLocked" > < i class = "fa fa-edit text-small" > < / i > < / a >
< / td >
< / tr >
< tr >
< td class = "text-muted" style = "vertical-align: top;" > {{ 'profile.passwordRecoveryEmail' | tr }}< / td >
< td class = "text-right" style = "vertical-align: top; white-space: nowrap;" >
{{ user.fallbackEmail }} < a href = "" ng-click = "fallbackEmailChange.show()" ng-hide = "user.source || config.profileLocked" > < i class = "fa fa-edit text-small" > < / i > < / a >
< / td >
< / tr >
< tr ng-hide = "user.source" >
< td colspan = "2" class = "text-right" >
< a href = "" ng-click = "sendPasswordReset()" > {{ 'profile.passwordResetAction' | tr }}< / a >
< / td >
< / tr >
< tr > < td colspan = "2" > < / td > < / tr >
< tr >
< td class = "text-muted" style = "vertical-align: middle;" > {{ 'profile.language' | tr }}< / td >
< td class = "text-right" style = "vertical-align: middle;" >
< multiselect ng-model = "language" options = "lang.display for lang in languages" data-multiple = "false" filter-after-rows = "5" scroll-after-rows = "10" > < / multiselect >
< / td >
< / tr >
< / table >
2022-05-15 12:14:32 +02:00
< / div >
2020-11-11 22:00:00 +01:00
< / div >
2024-10-15 17:27:58 +02:00
< br / >
< div style = "display: flex; flex-wrap: wrap; gap: 5px;" >
< button class = "btn btn-default" ng-click = "backgroundImageChange.show()" > Set Background Image< / button >
< div style = "flex-grow: 1;" > < / div >
< button class = "btn btn-primary" ng-click = "passwordchange.show()" ng-hide = "user.source" > {{ 'profile.changePasswordAction' | tr }}< / button >
< button class = "btn" uib-tooltip = "{{ (user.source && config.external2FA) ? ('profile.enable2FANotAvailable' | tr) : '' }}" ng-disabled = "user.source && config.external2FA" ng-class = "user.twoFactorAuthenticationEnabled ? 'btn-danger' : 'btn-success'" ng-click = "twoFactorAuthentication.show()" > {{ user.twoFactorAuthenticationEnabled ? 'profile.disable2FAAction' : 'profile.enable2FAAction' | tr }}< / button >
< / div >
2018-01-22 13:01:38 -08:00
< / div >
2024-10-15 18:46:51 +02:00
< h3 class = "section-header" > {{ 'profile.appPasswords.title' | tr }}< button class = "btn btn-primary btn-sm pull-right" ng-click = "appPasswordAdd.show()" > < i class = "fa fa-plus" > < / i > {{ 'profile.appPasswords.newPassword' | tr }}< / button > < / h3 >
2020-02-01 10:04:09 -08:00
< div class = "card" >
< div class = "grid-item-top" >
2020-02-24 13:29:47 +01:00
< div class = "row" >
2020-02-01 10:04:09 -08:00
< div class = "col-xs-12" >
2020-10-31 12:24:35 +01:00
< p > {{ 'profile.appPasswords.description' | tr }}< / p >
2020-02-24 13:29:47 +01:00
< table class = "table table-hover" >
2020-02-01 10:04:09 -08:00
< thead >
2020-02-24 13:29:47 +01:00
< tr >
2020-10-31 12:24:35 +01:00
< th style = "width: 45%" > {{ 'profile.appPasswords.name' | tr }}< / th >
< th style = "width: 45%" > {{ 'profile.appPasswords.app' | tr }}< / th >
< th style = "width: 10%" class = "text-right" > {{ 'main.actions' | tr }}< / th >
2020-02-24 13:29:47 +01:00
< / tr >
2020-02-01 10:04:09 -08:00
< / thead >
< tbody >
2020-06-12 15:46:34 +02:00
< tr ng-show = "appPassword.passwords.length === 0" >
2020-10-31 12:24:35 +01:00
< td colspan = "3" class = "text-center" > {{ 'profile.appPasswords.noPasswordsPlaceholder' | tr }}< / td >
2020-06-12 15:46:34 +02:00
< / tr >
2020-02-24 13:29:47 +01:00
< tr ng-repeat = "password in appPassword.passwords" >
< td class = "text-left elide-table-cell" >
< span uib-tooltip = "{{ password.creationTime | prettyLongDate }}" class = "arrow" > {{ password.name }}< / span >
< / td >
< td class = "text-left elide-table-cell" >
2020-03-05 20:02:27 -08:00
< span class = "arrow" > {{ password.label }}< / span >
2020-02-24 13:29:47 +01:00
< / td >
< td class = "text-right no-wrap" style = "vertical-align: bottom" >
2020-10-31 12:24:35 +01:00
< button class = "btn btn-xs btn-danger pull-right" ng-click = "appPassword.del(password.id)" uib-tooltip = "{{ 'profile.appPasswords.deletePasswordTooltip' | tr }}" > < i class = "far fa-trash-alt" > < / i > < / button >
2020-02-24 13:29:47 +01:00
< / td >
< / tr >
2020-02-01 10:04:09 -08:00
< / tbody >
2020-02-24 13:29:47 +01:00
< / table >
2020-02-01 10:04:09 -08:00
< / div >
2020-02-24 13:29:47 +01:00
< / div >
2020-02-01 10:04:09 -08:00
< / div >
< / div >
2024-10-15 18:46:51 +02:00
< h3 class = "section-header" ng-show = "user.isAtLeastAdmin" > {{ 'profile.apiTokens.title' | tr }} < button class = "btn btn-primary btn-sm pull-right" ng-click = "tokens.add.show()" > < i class = "fa fa-plus" > < / i > {{ 'profile.apiTokens.newApiToken' | tr }}< / button > < / h3 >
2018-08-27 15:26:52 -07:00
2020-02-24 17:29:20 +01:00
< div class = "card" ng-show = "user.isAtLeastAdmin" >
2019-11-07 12:08:51 +01:00
< div class = "grid-item-top" >
< div class = "row" >
< div class = "col-xs-12" >
2020-11-12 23:13:52 +01:00
< p ng-bind-html = "'profile.apiTokens.description' | tr:{ apiDocsLink: 'https://docs.cloudron.io/api.html' }" > < / p >
2020-02-07 17:03:14 +01:00
< table class = "table table-hover" style = "margin: 0;" >
< thead >
< tr >
2024-10-15 15:31:45 +02:00
< th > {{ 'profile.apiTokens.name' | tr }}< / th >
< th class = "hide-mobile" > {{ 'profile.apiTokens.lastUsed' | tr }}< / th >
< th > {{ 'profile.apiTokens.scope' | tr }}< / th >
< th class = "text-right" > {{ 'main.actions' | tr }}< / th >
2020-02-07 17:03:14 +01:00
< / tr >
< / thead >
< tbody >
2020-02-07 21:40:43 +01:00
< tr ng-show = "tokens.apiTokens.length === 0" >
2020-10-31 12:24:35 +01:00
< td colspan = "3" class = "text-center" > {{ 'profile.apiTokens.noTokensPlaceholder' | tr }}< / td >
2020-02-07 21:40:43 +01:00
< / tr >
< tr ng-repeat = "token in tokens.apiTokens" >
2024-10-15 15:31:45 +02:00
< td >
2020-02-07 17:03:14 +01:00
{{ token.name || 'unnamed' }}
< / td >
2024-10-15 15:31:45 +02:00
< td class = "hide-mobile" >
2021-03-15 12:44:24 -07:00
< span ng-show = "token.lastUsedTime" > {{ token.lastUsedTime | prettyLongDate }}< / span >
< span ng-show = "!token.lastUsedTime" > {{ 'profile.apiTokens.neverUsed' | tr }}< / span >
2020-02-07 17:03:14 +01:00
< / td >
2022-09-24 21:27:12 +02:00
< td >
2022-09-26 12:44:44 +02:00
< span ng-show = "token.scope['*'] === 'rw'" > {{ 'profile.apiTokens.readwrite' | tr }}< / span >
< span ng-hide = "token.scope['*'] === 'rw'" > {{ 'profile.apiTokens.readonly' | tr }}< / span >
2022-09-24 21:27:12 +02:00
< / td >
2024-10-15 15:31:45 +02:00
< td class = "text-right" >
2020-10-31 12:24:35 +01:00
< button class = "btn btn-xs btn-danger" ng-click = "tokens.revokeToken(token)" uib-tooltip = "{{ 'profile.apiTokens.revokeTokenTooltip' | tr }}" > < i class = "far fa-trash-alt" > < / i > < / button >
2020-02-07 17:03:14 +01:00
< / td >
< / tr >
< / tbody >
< / table >
2020-02-07 21:40:43 +01:00
< / div >
< / div >
< / div >
< / div >
2024-10-15 18:46:51 +02:00
< h3 class = "section-header" > {{ 'profile.loginTokens.title' | tr }}< / h3 >
2020-02-07 21:40:43 +01:00
< div class = "card" >
< div class = "grid-item-top" >
< div class = "row" >
< div class = "col-xs-12" >
2023-08-07 16:53:00 +02:00
< p > {{ 'profile.loginTokens.description' | tr:{ webadminTokenCount: tokens.webadminTokens.length, cliTokenCount: tokens.cliTokens.length } }}< / p >
< button class = "btn btn-outline btn-danger pull-right" ng-click = "tokens.revokeAllWebAndCliTokens()" ng-disabled = "tokens.busy" > < i class = "fa fa-circle-notch fa-spin" ng-show = "tokens.busy" > < / i > {{ 'profile.loginTokens.logoutAll' | tr }}< / button >
2019-11-07 12:08:51 +01:00
< / div >
2018-08-27 15:26:52 -07:00
< / div >
2019-11-07 12:08:51 +01:00
< / div >
2018-08-27 15:26:52 -07:00
< / div >
2023-03-24 20:08:17 +01:00
< / div >