From 4eb9f78fd7285e94b1b213b3e20c6c324568098e Mon Sep 17 00:00:00 2001 From: Salman Murad Date: Mon, 28 Jul 2025 18:50:47 +0100 Subject: [PATCH] pkp/pkp-lib#11686 Add email all authors feature to publication contributors --- .../contributors/ContributorsEmailModal.vue | 27 ++++++++++ .../contributors/ContributorsListPanel.vue | 50 +++++++++++++++++++ .../contributorManagerStore.js | 5 ++ 3 files changed, 82 insertions(+) create mode 100644 src/components/ListPanel/contributors/ContributorsEmailModal.vue diff --git a/src/components/ListPanel/contributors/ContributorsEmailModal.vue b/src/components/ListPanel/contributors/ContributorsEmailModal.vue new file mode 100644 index 000000000..d7875eb7d --- /dev/null +++ b/src/components/ListPanel/contributors/ContributorsEmailModal.vue @@ -0,0 +1,27 @@ + + + diff --git a/src/components/ListPanel/contributors/ContributorsListPanel.vue b/src/components/ListPanel/contributors/ContributorsListPanel.vue index 75854b96f..b6bc725f0 100644 --- a/src/components/ListPanel/contributors/ContributorsListPanel.vue +++ b/src/components/ListPanel/contributors/ContributorsListPanel.vue @@ -108,6 +108,7 @@ + {{ t('grid.action.emailAllAuthors') }} @@ -120,6 +121,7 @@ import Orderer from '@/components/Orderer/Orderer.vue'; import PkpHeader from '@/components/Header/Header.vue'; import ContributorsPreviewModal from './ContributorsPreviewModal.vue'; import ContributorsEditModal from './ContributorsEditModal.vue'; +import ContributorsEmailModal from './ContributorsEmailModal.vue'; import ajaxError from '@/mixins/ajaxError'; import dialog from '@/mixins/dialog.js'; @@ -145,6 +147,10 @@ export default { type: Object, required: true, }, + emailForm: { + type: Object, + required: true, + }, id: { type: String, required: true, @@ -246,6 +252,18 @@ export default { this.activeFormTitle = ''; }, + /** + * Clear email authors form when the modal is closed + * + * @param {Object} event + */ + closeFormEmailAuthorsModal(event) { + const {closeSideModal} = useModal(); + closeSideModal(ContributorsEmailModal); + this.activeForm = null; + this.activeFormTitle = ''; + }, + /** * The add/edit form has been successfully * submitted. @@ -306,6 +324,38 @@ export default { }); }, + /** + * Open the modal to Email all authors + */ + openEmailAuthorsModal() { + let activeForm = cloneDeep(this.emailForm); + activeForm.action = this.contributorsApiUrl + '/email'; + activeForm.method = 'POST'; + + const emails = this.items + .filter(item => item.email) + .map(item => item.email) + .join(', '); + activeForm.fields = activeForm.fields.map(field => { + if (field.name === 'to') { + field.value = emails; + } + return field; + }); + + this.activeForm = activeForm; + this.activeFormTitle = this.t('grid.action.emailAllAuthors'); + const {openSideModal} = useModal(); + + openSideModal(ContributorsEmailModal, { + title: this.activeFormTitle, + activeForm: this.activeForm, + onFormSuccess: () => { + this.closeFormEmailAuthorsModal() + } + }); + }, + /** * Open delete modal * diff --git a/src/managers/ContributorManager/contributorManagerStore.js b/src/managers/ContributorManager/contributorManagerStore.js index 495e097f0..6e277284d 100644 --- a/src/managers/ContributorManager/contributorManagerStore.js +++ b/src/managers/ContributorManager/contributorManagerStore.js @@ -22,6 +22,10 @@ export const useContributorManagerStore = defineComponentStore( dashboardStore.componentForms.contributorForm, ); + const {form: emailForm, setLocalesForSubmission: setEmailLocalesForSubmission} = useForm( + dashboardStore.componentForms.emailContributorForm, + ); + setLocalesForSubmission(props.submission); const {triggerDataChange} = useDataChanged(); @@ -30,6 +34,7 @@ export const useContributorManagerStore = defineComponentStore( return { canEditPublication: props.canEdit, form: form.value, + emailForm: emailForm.value, id: 'contributors', items: props.publication.authors, title: t('publication.contributors'),