mirror of
https://github.com/nextcloud/server.git
synced 2026-04-03 16:16:36 -04:00
let user choose notification email in user settings
Signed-off-by: Arthur Schiwon <blizzz@arthur-schiwon.de>
This commit is contained in:
parent
995aa65183
commit
fe5e672654
5 changed files with 90 additions and 10 deletions
|
|
@ -231,7 +231,7 @@ class PersonalInfo implements ISettings {
|
|||
* @return array
|
||||
*/
|
||||
private function getEmails(IAccount $account): array {
|
||||
$primaryEmail = [
|
||||
$systemEmail = [
|
||||
'value' => $account->getProperty(IAccountManager::PROPERTY_EMAIL)->getValue(),
|
||||
'scope' => $account->getProperty(IAccountManager::PROPERTY_EMAIL)->getScope(),
|
||||
'verified' => $account->getProperty(IAccountManager::PROPERTY_EMAIL)->getVerified(),
|
||||
|
|
@ -249,8 +249,9 @@ class PersonalInfo implements ISettings {
|
|||
);
|
||||
|
||||
$emails = [
|
||||
'primaryEmail' => $primaryEmail,
|
||||
'primaryEmail' => $systemEmail,
|
||||
'additionalEmails' => $additionalEmails,
|
||||
'notificationEmail' => (string)$account->getUser()->getPrimaryEMailAddress(),
|
||||
];
|
||||
|
||||
return $emails;
|
||||
|
|
|
|||
|
|
@ -65,11 +65,19 @@
|
|||
@click.stop.prevent="deleteEmail">
|
||||
{{ deleteEmailLabel }}
|
||||
</ActionButton>
|
||||
<ActionButton
|
||||
:aria-label="setNotificationMailLabel"
|
||||
:close-after-click="true"
|
||||
:disabled="setNotificationDisabled"
|
||||
icon="icon-favorite"
|
||||
@click.stop.prevent="setNotificationMail">
|
||||
{{ setNotificationMailLabel }}
|
||||
</ActionButton>
|
||||
</Actions>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<em v-if="primary">
|
||||
<em v-if="isNotificationEmail">
|
||||
{{ t('settings', 'Primary email for password reset and notifications') }}
|
||||
</em>
|
||||
</div>
|
||||
|
|
@ -78,14 +86,21 @@
|
|||
<script>
|
||||
import Actions from '@nextcloud/vue/dist/Components/Actions'
|
||||
import ActionButton from '@nextcloud/vue/dist/Components/ActionButton'
|
||||
import { showError } from '@nextcloud/dialogs'
|
||||
import {showError} from '@nextcloud/dialogs'
|
||||
import debounce from 'debounce'
|
||||
|
||||
import FederationControl from '../shared/FederationControl'
|
||||
|
||||
import { ACCOUNT_PROPERTY_READABLE_ENUM } from '../../../constants/AccountPropertyConstants'
|
||||
import { savePrimaryEmail, saveAdditionalEmail, saveAdditionalEmailScope, updateAdditionalEmail, removeAdditionalEmail } from '../../../service/PersonalInfo/EmailService'
|
||||
import { validateEmail } from '../../../utils/validate'
|
||||
import {ACCOUNT_PROPERTY_READABLE_ENUM} from '../../../constants/AccountPropertyConstants'
|
||||
import {
|
||||
removeAdditionalEmail,
|
||||
saveAdditionalEmail,
|
||||
saveAdditionalEmailScope,
|
||||
saveNotificationEmail,
|
||||
savePrimaryEmail,
|
||||
updateAdditionalEmail
|
||||
} from '../../../service/PersonalInfo/EmailService'
|
||||
import {validateEmail} from '../../../utils/validate'
|
||||
|
||||
export default {
|
||||
name: 'Email',
|
||||
|
|
@ -113,6 +128,10 @@ export default {
|
|||
type: String,
|
||||
required: true,
|
||||
},
|
||||
activeNotificationEmail: {
|
||||
type: String,
|
||||
default: '',
|
||||
},
|
||||
},
|
||||
|
||||
data() {
|
||||
|
|
@ -123,6 +142,8 @@ export default {
|
|||
saveAdditionalEmailScope,
|
||||
showCheckmarkIcon: false,
|
||||
showErrorIcon: false,
|
||||
isNotificationEmail: (this.email === this.activeNotificationEmail)
|
||||
|| (this.primary && this.activeNotificationEmail === ''),
|
||||
}
|
||||
},
|
||||
|
||||
|
|
@ -145,6 +166,17 @@ export default {
|
|||
return t('settings', 'Delete email')
|
||||
},
|
||||
|
||||
setNotificationDisabled() {
|
||||
return this.isNotificationEmail
|
||||
},
|
||||
|
||||
setNotificationMailLabel() {
|
||||
if (this.isNotificationEmail) {
|
||||
return t('settings', 'Your primary email')
|
||||
}
|
||||
return t('settings', 'Set as primary mail')
|
||||
},
|
||||
|
||||
federationDisabled() {
|
||||
return !this.initialEmail
|
||||
},
|
||||
|
|
@ -239,6 +271,21 @@ export default {
|
|||
}
|
||||
},
|
||||
|
||||
async setNotificationMail() {
|
||||
try {
|
||||
const responseData = await saveNotificationEmail(this.primary ? '' : this.initialEmail)
|
||||
this.handleResponse({
|
||||
notificationEmail: this.primary ? '' : this.initialEmail,
|
||||
status: responseData.ocs?.meta?.status,
|
||||
})
|
||||
} catch (e) {
|
||||
this.handleResponse({
|
||||
errorMessage: 'Unable to choose this email for notifications',
|
||||
error: e,
|
||||
})
|
||||
}
|
||||
},
|
||||
|
||||
async updateAdditionalEmail(email) {
|
||||
try {
|
||||
const responseData = await updateAdditionalEmail(this.initialEmail, email)
|
||||
|
|
@ -276,10 +323,14 @@ export default {
|
|||
}
|
||||
},
|
||||
|
||||
handleResponse({ email, status, errorMessage, error }) {
|
||||
handleResponse({ email, notificationEmail, status, errorMessage, error }) {
|
||||
if (status === 'ok') {
|
||||
// Ensure that local state reflects server state
|
||||
this.initialEmail = email
|
||||
if (email) {
|
||||
this.initialEmail = email
|
||||
} else if (notificationEmail) {
|
||||
this.activeNotificationEmail = notificationEmail
|
||||
}
|
||||
this.showCheckmarkIcon = true
|
||||
setTimeout(() => { this.showCheckmarkIcon = false }, 2000)
|
||||
} else {
|
||||
|
|
|
|||
|
|
@ -36,6 +36,7 @@
|
|||
:primary="true"
|
||||
:scope.sync="primaryEmail.scope"
|
||||
:email.sync="primaryEmail.value"
|
||||
:active-notification-email.sync="notificationEmail"
|
||||
@update:email="onUpdateEmail" />
|
||||
</template>
|
||||
<span v-else>
|
||||
|
|
@ -46,6 +47,7 @@
|
|||
:index="index"
|
||||
:scope.sync="additionalEmail.scope"
|
||||
:email.sync="additionalEmail.value"
|
||||
:active-notification-email.sync="notificationEmail"
|
||||
@update:email="onUpdateEmail"
|
||||
@delete-additional-email="onDeleteAdditionalEmail(index)" />
|
||||
</section>
|
||||
|
|
@ -62,7 +64,7 @@ import { ACCOUNT_PROPERTY_READABLE_ENUM, DEFAULT_ADDITIONAL_EMAIL_SCOPE } from '
|
|||
import { savePrimaryEmail, savePrimaryEmailScope, removeAdditionalEmail } from '../../../service/PersonalInfo/EmailService'
|
||||
import { validateEmail } from '../../../utils/validate'
|
||||
|
||||
const { emails: { additionalEmails, primaryEmail } } = loadState('settings', 'personalInfoParameters', {})
|
||||
const { emails: { additionalEmails, primaryEmail, notificationEmail } } = loadState('settings', 'personalInfoParameters', {})
|
||||
const { displayNameChangeSupported } = loadState('settings', 'accountParameters', {})
|
||||
|
||||
export default {
|
||||
|
|
@ -80,6 +82,7 @@ export default {
|
|||
displayNameChangeSupported,
|
||||
primaryEmail,
|
||||
savePrimaryEmailScope,
|
||||
notificationEmail,
|
||||
}
|
||||
},
|
||||
|
||||
|
|
@ -126,6 +129,10 @@ export default {
|
|||
}
|
||||
},
|
||||
|
||||
async onUpdateNotificationEmail(email) {
|
||||
this.notificationEmail = email
|
||||
},
|
||||
|
||||
async updatePrimaryEmail() {
|
||||
try {
|
||||
const responseData = await savePrimaryEmail(this.primaryEmailValue)
|
||||
|
|
|
|||
|
|
@ -33,6 +33,7 @@ export const ACCOUNT_PROPERTY_ENUM = Object.freeze({
|
|||
DISPLAYNAME: 'displayname',
|
||||
EMAIL: 'email',
|
||||
EMAIL_COLLECTION: 'additional_mail',
|
||||
NOTIFICATION_EMAIL: 'notify_email',
|
||||
PHONE: 'phone',
|
||||
TWITTER: 'twitter',
|
||||
WEBSITE: 'website',
|
||||
|
|
|
|||
|
|
@ -69,6 +69,26 @@ export const saveAdditionalEmail = async(email) => {
|
|||
return res.data
|
||||
}
|
||||
|
||||
/**
|
||||
* Save the notification email of the user
|
||||
*
|
||||
* @param {string} email the notification email
|
||||
* @returns {object}
|
||||
*/
|
||||
export const saveNotificationEmail = async(email) => {
|
||||
const userId = getCurrentUser().uid
|
||||
const url = generateOcsUrl('cloud/users/{userId}', { userId })
|
||||
|
||||
await confirmPassword()
|
||||
|
||||
const res = await axios.put(url, {
|
||||
key: ACCOUNT_PROPERTY_ENUM.NOTIFICATION_EMAIL,
|
||||
value: email,
|
||||
})
|
||||
|
||||
return res.data
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove an additional email of the user
|
||||
*
|
||||
|
|
|
|||
Loading…
Reference in a new issue