Added changes for Sharelatex/Overleaf 5.0.6; Added Track Changes.
This commit is contained in:
@@ -1,6 +1,4 @@
|
||||
268a268,364
|
||||
>
|
||||
> // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
|
||||
300a301,394
|
||||
> oauth2Redirect(req, res, next) {
|
||||
> // random state
|
||||
> const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'
|
||||
@@ -95,4 +93,3 @@
|
||||
> console.error("Fails to access by OAuth2: " + String(e))
|
||||
> }
|
||||
> },
|
||||
> // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
|
||||
|
||||
@@ -1,12 +1,9 @@
|
||||
19a20,25
|
||||
> // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
|
||||
19a20,22
|
||||
> const fs = require("fs")
|
||||
> const { Client } = require("ldapts")
|
||||
> const ldapEscape = require("ldap-escape")
|
||||
> // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
|
||||
120a124,132
|
||||
>
|
||||
120a127,136
|
||||
> // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
|
||||
> _checkUserPassword2(query, password, callback) {
|
||||
> // leave original _checkUserPassword untouched, because it will be called by
|
||||
> // setUserPasswordInV2 (e.g. UserRegistrationHandler.js )
|
||||
@@ -14,17 +11,16 @@
|
||||
> AuthenticationManager.authUserObj(error, user, query, password, callback)
|
||||
> })
|
||||
> },
|
||||
> // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
|
||||
>
|
||||
126c142,144
|
||||
122c134,138
|
||||
< AuthenticationManager._checkUserPassword(
|
||||
---
|
||||
> // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
|
||||
> if (typeof callback === 'undefined') {
|
||||
> callback = auditLog
|
||||
> auditLog = null
|
||||
> }
|
||||
> AuthenticationManager._checkUserPassword2(
|
||||
> // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
|
||||
190a209,488
|
||||
>
|
||||
> // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
|
||||
201a218,467
|
||||
> /**
|
||||
> * login with any password
|
||||
> */
|
||||
@@ -32,33 +28,6 @@
|
||||
> callback(null, user, true)
|
||||
> },
|
||||
>
|
||||
> createIfNotFoundAndLogin(
|
||||
> query,
|
||||
> callback,
|
||||
> uid,
|
||||
> firstname,
|
||||
> lastname,
|
||||
> mail,
|
||||
> isAdmin
|
||||
> ) {
|
||||
> User.findOne(query, (error, user) => {
|
||||
> if (error) {
|
||||
> console.log(error)
|
||||
> }
|
||||
>
|
||||
> AuthenticationManager.createIfNotExistAndLogin(
|
||||
> query,
|
||||
> user,
|
||||
> callback,
|
||||
> uid,
|
||||
> firstname,
|
||||
> lastname,
|
||||
> mail,
|
||||
> isAdmin
|
||||
> )
|
||||
> })
|
||||
> },
|
||||
>
|
||||
> createIfNotExistAndLogin(
|
||||
> query,
|
||||
> user,
|
||||
@@ -70,9 +39,10 @@
|
||||
> isAdmin
|
||||
> ) {
|
||||
> if (!user) {
|
||||
> //console.log('Creating User:' + JSON.stringify(query))
|
||||
> //create random pass for local userdb, does not get checked for ldap users during login
|
||||
> const pass = require("crypto").randomBytes(32).toString("hex")
|
||||
> console.log('Creating User', { mail, uid, firstname, lastname, isAdmin, pass })
|
||||
> let pass = require("crypto").randomBytes(32).toString("hex")
|
||||
> //console.log('Creating User:' + JSON.stringify(query) + 'Random Pass' + pass)
|
||||
>
|
||||
> const userRegHand = require("../User/UserRegistrationHandler.js")
|
||||
> userRegHand.registerNewUser(
|
||||
@@ -102,7 +72,6 @@
|
||||
> }
|
||||
> ) // end register user
|
||||
> } else {
|
||||
> console.log('User exists', { mail })
|
||||
> AuthenticationManager.login(user, "randomPass", callback)
|
||||
> }
|
||||
> },
|
||||
@@ -302,4 +271,3 @@
|
||||
> }
|
||||
> })
|
||||
> },
|
||||
> // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
|
||||
|
||||
@@ -1,217 +0,0 @@
|
||||
4,6c4,5
|
||||
< if (typeof(suppressNavbarRight) == "undefined")
|
||||
< button.navbar-toggle(ng-init="navCollapsed = true", ng-click="navCollapsed = !navCollapsed", ng-class="{active: !navCollapsed}", aria-label="Toggle " + translate('navigation'))
|
||||
< i.fa.fa-bars(aria-hidden="true")
|
||||
---
|
||||
> button.navbar-toggle(ng-init="navCollapsed = true", ng-click="navCollapsed = !navCollapsed", ng-class="{active: !navCollapsed}", aria-label="Toggle " + translate('navigation'))
|
||||
> i.fa.fa-bars(aria-hidden="true")
|
||||
14,106c13,74
|
||||
< - var canDisplayAdminMenu = hasAdminAccess()
|
||||
< - var canDisplayAdminRedirect = canRedirectToAdminDomain()
|
||||
< - var canDisplaySplitTestMenu = hasFeature('saas') && (canDisplayAdminMenu || (getSessionUser() && getSessionUser().staffAccess && (getSessionUser().staffAccess.splitTestMetrics || getSessionUser().staffAccess.splitTestManagement)))
|
||||
< - var canDisplaySurveyMenu = hasFeature('saas') && canDisplayAdminMenu
|
||||
< - var featuresPageVariant = splitTestVariants && splitTestVariants['features-page']
|
||||
<
|
||||
< if (typeof(suppressNavbarRight) == "undefined")
|
||||
< .navbar-collapse.collapse(collapse="navCollapsed")
|
||||
< ul.nav.navbar-nav.navbar-right
|
||||
< if (canDisplayAdminMenu || canDisplayAdminRedirect || canDisplaySplitTestMenu)
|
||||
< li.dropdown(class="subdued", dropdown)
|
||||
< a.dropdown-toggle(href, dropdown-toggle)
|
||||
< | Admin
|
||||
< b.caret
|
||||
< ul.dropdown-menu
|
||||
< if canDisplayAdminMenu
|
||||
< li
|
||||
< a(href="/admin") Manage Site
|
||||
< li
|
||||
< a(href="/admin/user") Manage Users
|
||||
< li
|
||||
< a(href="/admin/project") Project URL Lookup
|
||||
< li
|
||||
< a(href="/admin/saml/logs") SAML logs
|
||||
< if canDisplayAdminRedirect
|
||||
< li
|
||||
< a(href=settings.adminUrl) Switch to Admin
|
||||
< if canDisplaySplitTestMenu
|
||||
< li
|
||||
< a(href="/admin/split-test") Manage Feature Flags
|
||||
< if canDisplaySurveyMenu
|
||||
< li
|
||||
< a(href="/admin/survey") Manage Surveys
|
||||
<
|
||||
< // loop over header_extras
|
||||
< each item in nav.header_extras
|
||||
< -
|
||||
< if ((item.only_when_logged_in && getSessionUser())
|
||||
< || (item.only_when_logged_out && (!getSessionUser()))
|
||||
< || (!item.only_when_logged_out && !item.only_when_logged_in && !item.only_content_pages)
|
||||
< || (item.only_content_pages && (typeof(suppressNavContentLinks) == "undefined" || !suppressNavContentLinks))
|
||||
< ){
|
||||
< var showNavItem = true
|
||||
< } else {
|
||||
< var showNavItem = false
|
||||
< }
|
||||
<
|
||||
< if showNavItem
|
||||
< if item.dropdown
|
||||
< li.dropdown(class=item.class, dropdown)
|
||||
< a.dropdown-toggle(href, dropdown-toggle)
|
||||
< | !{translate(item.text)}
|
||||
< b.caret
|
||||
< ul.dropdown-menu
|
||||
< each child in item.dropdown
|
||||
< if child.divider
|
||||
< li.divider
|
||||
< else if child.isContactUs
|
||||
< li
|
||||
< a(ng-controller="ContactModal" ng-click="contactUsModal()" href)
|
||||
< span(event-tracking="menu-clicked-contact" event-tracking-mb="true" event-tracking-trigger="click")
|
||||
< | #{translate("contact_us")}
|
||||
< else
|
||||
< li
|
||||
< if child.url
|
||||
< if !child.splitTest || child.splitTest && child.splitTest === 'features-page' && child.splitTestVariant === featuresPageVariant
|
||||
< a(
|
||||
< href=child.url,
|
||||
< class=child.class,
|
||||
< event-tracking=child.event
|
||||
< event-tracking-mb="true"
|
||||
< event-tracking-trigger="click"
|
||||
< event-segmentation=child.eventSegmentation
|
||||
< ) !{translate(child.text)}
|
||||
< else
|
||||
< | !{translate(child.text)}
|
||||
< else
|
||||
< li(class=item.class)
|
||||
< if item.url
|
||||
< a(
|
||||
< href=item.url,
|
||||
< class=item.class,
|
||||
< event-tracking=item.event
|
||||
< event-tracking-mb="true"
|
||||
< event-tracking-trigger="click"
|
||||
< ) !{translate(item.text)}
|
||||
< else
|
||||
< | !{translate(item.text)}
|
||||
<
|
||||
< // logged out
|
||||
< if !getSessionUser()
|
||||
< // register link
|
||||
< if hasFeature('registration-page')
|
||||
---
|
||||
> .navbar-collapse.collapse(collapse="navCollapsed")
|
||||
>
|
||||
> ul.nav.navbar-nav.navbar-right
|
||||
> if (getSessionUser() && getSessionUser().isAdmin)
|
||||
> li
|
||||
> a(href="/admin") Admin
|
||||
>
|
||||
>
|
||||
> // loop over header_extras
|
||||
> each item in nav.header_extras
|
||||
> -
|
||||
> if ((item.only_when_logged_in && getSessionUser())
|
||||
> || (item.only_when_logged_out && (!getSessionUser()))
|
||||
> || (!item.only_when_logged_out && !item.only_when_logged_in && !item.only_content_pages)
|
||||
> || (item.only_content_pages && (typeof(suppressNavContentLinks) == "undefined" || !suppressNavContentLinks))
|
||||
> ){
|
||||
> var showNavItem = true
|
||||
> } else {
|
||||
> var showNavItem = false
|
||||
> }
|
||||
>
|
||||
> if showNavItem
|
||||
> if item.dropdown
|
||||
> li.dropdown(class=item.class, dropdown)
|
||||
> a.dropdown-toggle(href, dropdown-toggle)
|
||||
> | !{translate(item.text)}
|
||||
> b.caret
|
||||
> ul.dropdown-menu
|
||||
> each child in item.dropdown
|
||||
> if child.divider
|
||||
> li.divider
|
||||
> else
|
||||
> li
|
||||
> if child.url
|
||||
> a(href=child.url, class=child.class) !{translate(child.text)}
|
||||
> else
|
||||
> | !{translate(child.text)}
|
||||
> else
|
||||
> li(class=item.class)
|
||||
> if item.url
|
||||
> a(href=item.url, class=item.class) !{translate(item.text)}
|
||||
> else
|
||||
> | !{translate(item.text)}
|
||||
>
|
||||
> // logged out
|
||||
> if !getSessionUser()
|
||||
> // login link
|
||||
> li
|
||||
> a(href="/login") #{translate('log_in')}
|
||||
>
|
||||
> // projects link and account menu
|
||||
> if getSessionUser()
|
||||
> li
|
||||
> a(href="/project") #{translate('Projects')}
|
||||
> li.dropdown(dropdown)
|
||||
> a.dropdown-toggle(href, dropdown-toggle)
|
||||
> | #{translate('Account')}
|
||||
> b.caret
|
||||
> ul.dropdown-menu
|
||||
> //li
|
||||
> // div.subdued(ng-non-bindable) #{getUserEmail()}
|
||||
> //li.divider.hidden-xs.hidden-sm
|
||||
108,139c76,77
|
||||
< a(
|
||||
< href="/register"
|
||||
< event-tracking="menu-clicked-register"
|
||||
< event-tracking-action="clicked"
|
||||
< event-tracking-trigger="click"
|
||||
< event-tracking-mb="true"
|
||||
< event-segmentation={ page: currentUrl }
|
||||
< ) #{translate('register')}
|
||||
<
|
||||
< // login link
|
||||
< li
|
||||
< a(
|
||||
< href="/login"
|
||||
< event-tracking="menu-clicked-login"
|
||||
< event-tracking-action="clicked"
|
||||
< event-tracking-trigger="click"
|
||||
< event-tracking-mb="true"
|
||||
< event-segmentation={ page: currentUrl }
|
||||
< ) #{translate('log_in')}
|
||||
<
|
||||
< // projects link and account menu
|
||||
< if getSessionUser()
|
||||
< li
|
||||
< a(href="/project") #{translate('Projects')}
|
||||
< li.dropdown(dropdown)
|
||||
< a.dropdown-toggle(href, dropdown-toggle)
|
||||
< | #{translate('Account')}
|
||||
< b.caret
|
||||
< ul.dropdown-menu
|
||||
< li
|
||||
< div.subdued {{ usersEmail }}
|
||||
< li.divider.hidden-xs.hidden-sm
|
||||
---
|
||||
> a(href="/user/settings") #{translate('Account Settings')}
|
||||
> if nav.showSubscriptionLink
|
||||
141,149c79,84
|
||||
< a(href="/user/settings") #{translate('Account Settings')}
|
||||
< if nav.showSubscriptionLink
|
||||
< li
|
||||
< a(href="/user/subscription") #{translate('subscription')}
|
||||
< li.divider.hidden-xs.hidden-sm
|
||||
< li
|
||||
< form(method="POST" action="/logout")
|
||||
< input(name='_csrf', type='hidden', value=csrfToken)
|
||||
< button.btn-link.text-left.dropdown-menu-button #{translate('log_out')}
|
||||
---
|
||||
> a(href="/user/subscription") #{translate('subscription')}
|
||||
> li.divider.hidden-xs.hidden-sm
|
||||
> li
|
||||
> form(method="POST" action="/logout")
|
||||
> input(name='_csrf', type='hidden', value=csrfToken)
|
||||
> button.btn-link.text-left.dropdown-menu-button #{translate('log_out')}
|
||||
@@ -1,212 +0,0 @@
|
||||
1c1
|
||||
< extends ../layout-marketing
|
||||
---
|
||||
> extends ../layout
|
||||
3,4c3,14
|
||||
< block entrypointVar
|
||||
< - entrypoint = 'pages/user/settings'
|
||||
---
|
||||
> block content
|
||||
> .content.content-alt
|
||||
> .container
|
||||
> .row
|
||||
> .col-md-12.col-lg-10.col-lg-offset-1
|
||||
> if ssoError
|
||||
> .alert.alert-danger
|
||||
> | #{translate('sso_link_error')}: #{translate(ssoError)}
|
||||
> .card
|
||||
> .page-header
|
||||
> h1 #{translate("account_settings")}
|
||||
> .account-settings(ng-controller="AccountSettingsController", ng-cloak)
|
||||
6,29c16,17
|
||||
< block append meta
|
||||
< meta(name="ol-hasPassword" data-type="boolean" content=hasPassword)
|
||||
< meta(name="ol-shouldAllowEditingDetails" data-type="boolean" content=shouldAllowEditingDetails)
|
||||
< meta(name="ol-oauthProviders", data-type="json", content=oauthProviders)
|
||||
< meta(name="ol-institutionLinked", data-type="json", content=institutionLinked)
|
||||
< meta(name="ol-samlError", data-type="json", content=samlError)
|
||||
< meta(name="ol-institutionEmailNonCanonical", content=institutionEmailNonCanonical)
|
||||
<
|
||||
< meta(name="ol-reconfirmedViaSAML", content=reconfirmedViaSAML)
|
||||
< meta(name="ol-reconfirmationRemoveEmail", content=reconfirmationRemoveEmail)
|
||||
< meta(name="ol-samlBeta", content=samlBeta)
|
||||
< meta(name="ol-ssoErrorMessage", content=ssoErrorMessage)
|
||||
< meta(name="ol-thirdPartyIds", data-type="json", content=thirdPartyIds || {})
|
||||
< meta(name="ol-passwordStrengthOptions", data-type="json", content=settings.passwordStrengthOptions || {})
|
||||
< meta(name="ol-isExternalAuthenticationSystemUsed" data-type="boolean" content=externalAuthenticationSystemUsed())
|
||||
< meta(name="ol-user" data-type="json" content=user)
|
||||
< meta(name="ol-dropbox" data-type="json" content=dropbox)
|
||||
< meta(name="ol-github" data-type="json" content=github)
|
||||
< meta(name="ol-projectSyncSuccessMessage", content=projectSyncSuccessMessage)
|
||||
< meta(name="ol-showPersonalAccessToken", data-type="boolean" content=showPersonalAccessToken)
|
||||
< meta(name="ol-optionalPersonalAccessToken", data-type="boolean" content=optionalPersonalAccessToken)
|
||||
< meta(name="ol-personalAccessTokens", data-type="json" content=personalAccessTokens)
|
||||
< meta(name="ol-emailAddressLimit", data-type="json", content=emailAddressLimit)
|
||||
< meta(name="ol-currentManagedUserAdminEmail" data-type="string" content=currentManagedUserAdminEmail)
|
||||
---
|
||||
>
|
||||
>
|
||||
31,32c19,178
|
||||
< block content
|
||||
< main.content.content-alt#settings-page-root
|
||||
---
|
||||
> .row
|
||||
> .col-md-5
|
||||
> h3 #{translate("update_account_info")}
|
||||
> form(async-form="settings", name="settingsForm", method="POST", action="/user/settings", novalidate)
|
||||
> input(type="hidden", name="_csrf", value=csrfToken)
|
||||
> if !hasFeature('affiliations')
|
||||
> // show the email, non-editable
|
||||
> .form-group
|
||||
> label.control-label #{translate("email")}
|
||||
> div.form-control(
|
||||
> readonly="true",
|
||||
> ng-non-bindable
|
||||
> ) #{user.email}
|
||||
>
|
||||
> if shouldAllowEditingDetails
|
||||
> .form-group
|
||||
> label(for='firstName').control-label #{translate("first_name")}
|
||||
> input.form-control(
|
||||
> id="firstName"
|
||||
> type='text',
|
||||
> name='first_name',
|
||||
> value=user.first_name
|
||||
> ng-non-bindable
|
||||
> )
|
||||
> .form-group
|
||||
> label(for='lastName').control-label #{translate("last_name")}
|
||||
> input.form-control(
|
||||
> id="lastName"
|
||||
> type='text',
|
||||
> name='last_name',
|
||||
> value=user.last_name
|
||||
> ng-non-bindable
|
||||
> )
|
||||
> .form-group
|
||||
> form-messages(aria-live="polite" for="settingsForm")
|
||||
> .alert.alert-success(ng-show="settingsForm.response.success")
|
||||
> | #{translate("thanks_settings_updated")}
|
||||
> .actions
|
||||
> button.btn.btn-primary(
|
||||
> type='submit',
|
||||
> ng-disabled="settingsForm.$invalid"
|
||||
> ) #{translate("update")}
|
||||
> else
|
||||
> .form-group
|
||||
> label.control-label #{translate("first_name")}
|
||||
> div.form-control(
|
||||
> readonly="true",
|
||||
> ng-non-bindable
|
||||
> ) #{user.first_name}
|
||||
> .form-group
|
||||
> label.control-label #{translate("last_name")}
|
||||
> div.form-control(
|
||||
> readonly="true",
|
||||
> ng-non-bindable
|
||||
> ) #{user.last_name}
|
||||
>
|
||||
> .col-md-5.col-md-offset-1
|
||||
> h3
|
||||
> | Set Password for Email login
|
||||
> p
|
||||
> | Note: you can not change the LDAP password from here. You can set/reset a password for
|
||||
> | your email login:
|
||||
> | #[a(href="/user/password/reset", target='_blank') Reset.]
|
||||
>
|
||||
> | !{moduleIncludes("userSettings", locals)}
|
||||
> hr
|
||||
>
|
||||
> h3
|
||||
> | Contact
|
||||
> div
|
||||
> | If you need any help, please contact your sysadmins.
|
||||
>
|
||||
> p #{translate("need_to_leave")}
|
||||
> a(href, ng-click="deleteAccount()") #{translate("delete_your_account")}
|
||||
>
|
||||
>
|
||||
>
|
||||
> script(type='text/ng-template', id='deleteAccountModalTemplate')
|
||||
> .modal-header
|
||||
> h3 #{translate("delete_account")}
|
||||
> div.modal-body#delete-account-modal
|
||||
> p !{translate("delete_account_warning_message_3")}
|
||||
> if settings.createV1AccountOnLogin && settings.overleaf
|
||||
> p
|
||||
> strong
|
||||
> | Your Overleaf v2 projects will be deleted if you delete your account.
|
||||
> | If you want to remove any remaining Overleaf v1 projects in your account,
|
||||
> | please first make sure they are imported to Overleaf v2.
|
||||
>
|
||||
> if settings.overleaf && !hasPassword
|
||||
> p
|
||||
> b
|
||||
> | #[a(href="/user/password/reset", target='_blank') #{translate("delete_acct_no_existing_pw")}].
|
||||
> else
|
||||
> form(novalidate, name="deleteAccountForm")
|
||||
> label #{translate('email')}
|
||||
> input.form-control(
|
||||
> type="text",
|
||||
> autocomplete="off",
|
||||
> placeholder="",
|
||||
> ng-model="state.deleteText",
|
||||
> focus-on="open",
|
||||
> ng-keyup="checkValidation()"
|
||||
> )
|
||||
>
|
||||
> label #{translate('password')}
|
||||
> input.form-control(
|
||||
> type="password",
|
||||
> autocomplete="off",
|
||||
> placeholder="",
|
||||
> ng-model="state.password",
|
||||
> ng-keyup="checkValidation()"
|
||||
> )
|
||||
>
|
||||
> div.confirmation-checkbox-wrapper
|
||||
> input(
|
||||
> type="checkbox"
|
||||
> ng-model="state.confirmV1Purge"
|
||||
> ng-change="checkValidation()"
|
||||
> ).pull-left
|
||||
> label(style="display: inline") I have left, purged or imported my projects on Overleaf v1 (if any)
|
||||
>
|
||||
> div.confirmation-checkbox-wrapper
|
||||
> input(
|
||||
> type="checkbox"
|
||||
> ng-model="state.confirmSharelatexDelete"
|
||||
> ng-change="checkValidation()"
|
||||
> ).pull-left
|
||||
> label(style="display: inline") I understand this will delete all projects in my Overleaf v2 account (and ShareLaTeX account, if any) with email address #[em {{ userDefaultEmail }}]
|
||||
>
|
||||
> div(ng-if="state.error")
|
||||
> div.alert.alert-danger(ng-switch="state.error.code")
|
||||
> span(ng-switch-when="InvalidCredentialsError")
|
||||
> | #{translate('email_or_password_wrong_try_again')}
|
||||
> span(ng-switch-when="SubscriptionAdminDeletionError")
|
||||
> | #{translate('subscription_admins_cannot_be_deleted')}
|
||||
> span(ng-switch-when="UserDeletionError")
|
||||
> | #{translate('user_deletion_error')}
|
||||
> span(ng-switch-default)
|
||||
> | #{translate('generic_something_went_wrong')}
|
||||
> if settings.createV1AccountOnLogin && settings.overleaf
|
||||
> div(ng-if="state.error && state.error.code == 'InvalidCredentialsError'")
|
||||
> div.alert.alert-info
|
||||
> | If you can't remember your password, or if you are using Single-Sign-On with another provider
|
||||
> | to sign in (such as Twitter or Google), please
|
||||
> | #[a(href="/user/password/reset", target='_blank') reset your password],
|
||||
> | and try again.
|
||||
> .modal-footer
|
||||
> button.btn.btn-default(
|
||||
> ng-click="cancel()"
|
||||
> ) #{translate("cancel")}
|
||||
> button.btn.btn-danger(
|
||||
> ng-disabled="!state.isValid || state.inflight"
|
||||
> ng-click="delete()"
|
||||
> )
|
||||
> span(ng-hide="state.inflight") #{translate("delete")}
|
||||
> span(ng-show="state.inflight") #{translate("deleting")}...
|
||||
>
|
||||
> script(type='text/javascript').
|
||||
> window.passwordStrengthOptions = !{StringHelper.stringifyJsonForScript(settings.passwordStrengthOptions || {})}
|
||||
Reference in New Issue
Block a user