From 707dd6ac42147c0609993a1efc0ccce59052dfe9 Mon Sep 17 00:00:00 2001 From: ipula Date: Tue, 4 Mar 2025 15:38:49 +0100 Subject: [PATCH 01/14] disable selected role --- src/pages/userInvitation/UserInvitationUserGroupsTable.vue | 1 + 1 file changed, 1 insertion(+) diff --git a/src/pages/userInvitation/UserInvitationUserGroupsTable.vue b/src/pages/userInvitation/UserInvitationUserGroupsTable.vue index 56b0a902c..9b5598d75 100644 --- a/src/pages/userInvitation/UserInvitationUserGroupsTable.vue +++ b/src/pages/userInvitation/UserInvitationUserGroupsTable.vue @@ -180,6 +180,7 @@ function updateUserGroup(index, fieldName, newValue) { const userGroupsUpdate = [...store.invitationPayload.userGroupsToAdd]; userGroupsUpdate[index][fieldName] = newValue; store.updatePayload('userGroupsToAdd', userGroupsUpdate, false); + updateWithSelectedUserGroups(props.userGroups); } const availableUserGroups = computed(() => { From 1c3ec12ee8106e00bb8ed5bc5282cf4cc53cdfc5 Mon Sep 17 00:00:00 2001 From: ipula Date: Tue, 4 Mar 2025 15:46:15 +0100 Subject: [PATCH 02/14] allow users to invite removed roles again --- src/pages/userInvitation/UserInvitationUserGroupsTable.vue | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/pages/userInvitation/UserInvitationUserGroupsTable.vue b/src/pages/userInvitation/UserInvitationUserGroupsTable.vue index 9b5598d75..ad24cc4f2 100644 --- a/src/pages/userInvitation/UserInvitationUserGroupsTable.vue +++ b/src/pages/userInvitation/UserInvitationUserGroupsTable.vue @@ -184,11 +184,7 @@ function updateUserGroup(index, fieldName, newValue) { } const availableUserGroups = computed(() => { - return props.userGroups.filter((element) => { - return !store.invitationPayload.currentUserGroups.find( - (data) => data.id === element.value, - ); - }); + return props.userGroups; }); /** From f1ebcf4594d411176490065651be74c206573e73 Mon Sep 17 00:00:00 2001 From: ipula Date: Tue, 4 Mar 2025 15:50:16 +0100 Subject: [PATCH 03/14] allow users to invite romved role again --- src/pages/userInvitation/UserInvitationUserGroupsTable.vue | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/pages/userInvitation/UserInvitationUserGroupsTable.vue b/src/pages/userInvitation/UserInvitationUserGroupsTable.vue index ad24cc4f2..68f2710cd 100644 --- a/src/pages/userInvitation/UserInvitationUserGroupsTable.vue +++ b/src/pages/userInvitation/UserInvitationUserGroupsTable.vue @@ -66,7 +66,7 @@ :label="t('invitation.role.selectRole')" :is-required="true" :value="userGroupToAdd.userGroupId" - :options="availableUserGroups" + :options="userGroups" :all-errors="{ userGroupId: userGroupErrors['userGroupsToAdd.' + index + '.userGroupId'], @@ -183,10 +183,6 @@ function updateUserGroup(index, fieldName, newValue) { updateWithSelectedUserGroups(props.userGroups); } -const availableUserGroups = computed(() => { - return props.userGroups; -}); - /** * add user groups to the invitation payload */ From 261320419a96e2fafecb3b6936f041a367be91d7 Mon Sep 17 00:00:00 2001 From: ipula Date: Tue, 4 Mar 2025 15:54:36 +0100 Subject: [PATCH 04/14] fix cancel invitation modal roles localized role name --- .../UserInvitationManager/UserInvitationManagerStore.js | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/managers/UserInvitationManager/UserInvitationManagerStore.js b/src/managers/UserInvitationManager/UserInvitationManagerStore.js index f07042672..138d8b8d2 100755 --- a/src/managers/UserInvitationManager/UserInvitationManagerStore.js +++ b/src/managers/UserInvitationManager/UserInvitationManagerStore.js @@ -67,10 +67,7 @@ export const useUserInvitationManagerStore = defineComponentStore( function getAllInvitedRoles(userGroups) { let roles = ''; userGroups.forEach((element) => { - roles = - roles + - localize(element.userGroupName) + - t('common.commaListSeparator'); + roles = roles + element.userGroupName + t('common.commaListSeparator'); }); return roles.substring(0, roles.length - 1); From 1e3fcc585591d622dce3f78873181d5351ecee7f Mon Sep 17 00:00:00 2001 From: ipula Date: Tue, 4 Mar 2025 16:35:03 +0100 Subject: [PATCH 05/14] fix ui issues in cancel invitation popup modal --- ...ationManagerCancelInvitationDialogBody.vue | 26 ++++++++++++++----- .../UserInvitationManagerStore.js | 3 ++- 2 files changed, 22 insertions(+), 7 deletions(-) diff --git a/src/managers/UserInvitationManager/UserInvitationManagerCancelInvitationDialogBody.vue b/src/managers/UserInvitationManager/UserInvitationManagerCancelInvitationDialogBody.vue index 8c82861e5..8f516fe95 100644 --- a/src/managers/UserInvitationManager/UserInvitationManagerCancelInvitationDialogBody.vue +++ b/src/managers/UserInvitationManager/UserInvitationManagerCancelInvitationDialogBody.vue @@ -1,11 +1,25 @@ diff --git a/src/managers/UserInvitationManager/UserInvitationManagerStore.js b/src/managers/UserInvitationManager/UserInvitationManagerStore.js index 138d8b8d2..dee140ff5 100755 --- a/src/managers/UserInvitationManager/UserInvitationManagerStore.js +++ b/src/managers/UserInvitationManager/UserInvitationManagerStore.js @@ -133,7 +133,7 @@ export const useUserInvitationManagerStore = defineComponentStore( actions: [ { label: t('invitation.cancelInvite.title'), - isWarnable: true, + isPrimary: true, callback: async (close) => { const {apiUrl: cancelApiUrl} = useUrl( `invitations/${invitationObj.id}/cancel`, @@ -152,6 +152,7 @@ export const useUserInvitationManagerStore = defineComponentStore( }, { label: t('common.cancel'), + isWarnable: true, callback: (close) => { close(); }, From e15dd1d2075775b8c15408fd7cd7350cc512d1ec Mon Sep 17 00:00:00 2001 From: ipula Date: Tue, 4 Mar 2025 17:02:41 +0100 Subject: [PATCH 06/14] remove error message after text field filled --- src/pages/userInvitation/UserInvitationUserGroupsTable.vue | 1 + 1 file changed, 1 insertion(+) diff --git a/src/pages/userInvitation/UserInvitationUserGroupsTable.vue b/src/pages/userInvitation/UserInvitationUserGroupsTable.vue index 68f2710cd..e42dc6085 100644 --- a/src/pages/userInvitation/UserInvitationUserGroupsTable.vue +++ b/src/pages/userInvitation/UserInvitationUserGroupsTable.vue @@ -177,6 +177,7 @@ updateWithSelectedUserGroups(props.userGroups); * @param newValue String */ function updateUserGroup(index, fieldName, newValue) { + delete store.errors['userGroupsToAdd.' + index + `.${fieldName}`]; const userGroupsUpdate = [...store.invitationPayload.userGroupsToAdd]; userGroupsUpdate[index][fieldName] = newValue; store.updatePayload('userGroupsToAdd', userGroupsUpdate, false); From b433bb3514e4d3954c0e471901770539325c75a9 Mon Sep 17 00:00:00 2001 From: ipula Date: Tue, 4 Mar 2025 17:27:15 +0100 Subject: [PATCH 07/14] fix issue user can not remove added first role in send invitation --- src/pages/userInvitation/UserInvitationUserGroupsTable.vue | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/pages/userInvitation/UserInvitationUserGroupsTable.vue b/src/pages/userInvitation/UserInvitationUserGroupsTable.vue index e42dc6085..c20d456e5 100644 --- a/src/pages/userInvitation/UserInvitationUserGroupsTable.vue +++ b/src/pages/userInvitation/UserInvitationUserGroupsTable.vue @@ -118,7 +118,7 @@ @@ -239,6 +239,7 @@ function removeInvitedUserGroup(index) { const userGroupsUpdate = [...store.invitationPayload.userGroupsToAdd]; userGroupsUpdate.splice(index, 1); store.updatePayload('userGroupsToAdd', userGroupsUpdate, false); + updateWithSelectedUserGroups(props.userGroups); } const userGroupErrors = computed(() => { From 354705814fb128df4533472e420145cfe5232d5b Mon Sep 17 00:00:00 2001 From: ipula Date: Tue, 4 Mar 2025 19:21:52 +0100 Subject: [PATCH 08/14] locale and modal style changes --- public/globals.js | 12 ++++++++++-- src/pages/userInvitation/UserInvitationPageStore.js | 2 +- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/public/globals.js b/public/globals.js index eeddc1a02..58851b81e 100644 --- a/public/globals.js +++ b/public/globals.js @@ -869,7 +869,7 @@ window.pkp = { 'user.password': 'Password', 'user.phone': 'Phone', 'user.removeRole.message': - 'Are you sure want remove this role permanently?', + "Are you sure you want to permanently remove this role? This action will revoke the user's access to all information and permissions associated with this role", 'user.role.reviewer': 'Reviewer', 'user.role.reviewers': 'Reviewers', 'user.roles': 'Roles', @@ -889,7 +889,7 @@ window.pkp = { 'userInvitation.edit.title': 'Edit Invitation', 'userInvitation.modal.button': 'View All Users', 'userInvitation.modal.message': - "{$email} has been invited to new role in OJS. You can be updated about the user's decision on the User and Role page, your OJS notification and/or your email", + "{$email} has been invited to new role in OJS. You can be updated about the user's decision on the User & Role page, your OJS notification and/or your email", 'userInvitation.modal.title': 'Invitation Sent', 'userInvitation.roleTable.endDate': 'End Date', 'userInvitation.roleTable.journalMasthead': 'Journal Masthead', @@ -920,6 +920,14 @@ window.pkp = { 'workflow.submissionNextReviewRoundInFutureStage': 'The submission advanced to the next review round, was accepted, and is currently in the {$stage} stage.', 'workflow.uploadRevisions': 'Upload revisions', + 'grid.user.grid.user.enableReasonDescription': + "Once the user is enabled, they will regain access to OJS, and you'll be able to invite them to roles as needed.", + 'grid.user.grid.user.disableReasonDescription': + "Please note that once a user is disabled, you won't be able to add them to any roles until they are enabled again.", + 'user.url': 'Homepage URL', + 'user.workingLanguages': 'Working Languages', + 'user.bioStatement': 'Bio Statement', + 'common.viewMoreDetails': 'View more details', }, tinyMCE: { skinUrl: '/styles/tinymce', diff --git a/src/pages/userInvitation/UserInvitationPageStore.js b/src/pages/userInvitation/UserInvitationPageStore.js index 16ac45a09..38338a4f4 100644 --- a/src/pages/userInvitation/UserInvitationPageStore.js +++ b/src/pages/userInvitation/UserInvitationPageStore.js @@ -349,7 +349,7 @@ export const useUserInvitationPageStore = defineComponentStore( }, }, ], - modalStyle: 'primary', + modalStyle: 'success', }); } else { isSubmitting.value = false; From 704daf40d860cefd3a1dba35e08960f28e3ab398 Mon Sep 17 00:00:00 2001 From: ipula Date: Wed, 5 Mar 2025 11:27:18 +0100 Subject: [PATCH 09/14] add current remove role in select a new role lits --- .../userInvitation/UserInvitationUserGroupsTable.vue | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/pages/userInvitation/UserInvitationUserGroupsTable.vue b/src/pages/userInvitation/UserInvitationUserGroupsTable.vue index c20d456e5..38f516b0b 100644 --- a/src/pages/userInvitation/UserInvitationUserGroupsTable.vue +++ b/src/pages/userInvitation/UserInvitationUserGroupsTable.vue @@ -66,7 +66,7 @@ :label="t('invitation.role.selectRole')" :is-required="true" :value="userGroupToAdd.userGroupId" - :options="userGroups" + :options="availableUserGroups" :all-errors="{ userGroupId: userGroupErrors['userGroupsToAdd.' + index + '.userGroupId'], @@ -184,6 +184,14 @@ function updateUserGroup(index, fieldName, newValue) { updateWithSelectedUserGroups(props.userGroups); } +const availableUserGroups = computed(() => { + return props.userGroups.filter((element) => { + return !store.invitationPayload.currentUserGroups.find( + (data) => data.id === element.value && !data.dateEnd, + ); + }); +}); + /** * add user groups to the invitation payload */ From 8f1cfa3695fb9b1070d11d43303901f8ed9385a5 Mon Sep 17 00:00:00 2001 From: ipula Date: Thu, 6 Mar 2025 18:48:34 +0100 Subject: [PATCH 10/14] enable remove role button only for clear the fields --- .../UserInvitationUserGroupsTable.vue | 27 ++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/src/pages/userInvitation/UserInvitationUserGroupsTable.vue b/src/pages/userInvitation/UserInvitationUserGroupsTable.vue index 38f516b0b..e17382652 100644 --- a/src/pages/userInvitation/UserInvitationUserGroupsTable.vue +++ b/src/pages/userInvitation/UserInvitationUserGroupsTable.vue @@ -118,7 +118,10 @@ @@ -169,6 +172,7 @@ const allUserGroupsToAdd = computed( () => store.invitationPayload.userGroupsToAdd, ); updateWithSelectedUserGroups(props.userGroups); +hasUserGroupsValue(); /** * update selected user group @@ -182,6 +186,7 @@ function updateUserGroup(index, fieldName, newValue) { userGroupsUpdate[index][fieldName] = newValue; store.updatePayload('userGroupsToAdd', userGroupsUpdate, false); updateWithSelectedUserGroups(props.userGroups); + hasUserGroupsValue(); } const availableUserGroups = computed(() => { @@ -192,6 +197,19 @@ const availableUserGroups = computed(() => { }); }); +/** + * check user groups array and show + * remove role button only for clear the fields + */ +function hasUserGroupsValue() { + if (store.invitationPayload.userGroupsToAdd[0]) { + Object.values(store.invitationPayload.userGroupsToAdd[0]).some( + (value) => value !== null, + ); + } + return false; +} + /** * add user groups to the invitation payload */ @@ -245,6 +263,13 @@ function removeUserGroup(userGroup, index) { */ function removeInvitedUserGroup(index) { const userGroupsUpdate = [...store.invitationPayload.userGroupsToAdd]; + if (hasUserGroupsValue && userGroupsUpdate.length === 1) { + userGroupsUpdate.push({ + userGroupId: null, + dateStart: null, + masthead: null, + }); + } userGroupsUpdate.splice(index, 1); store.updatePayload('userGroupsToAdd', userGroupsUpdate, false); updateWithSelectedUserGroups(props.userGroups); From 2e0a6fc20612dc5faf14e238a9b7978bf5614669 Mon Sep 17 00:00:00 2001 From: ipula Date: Thu, 6 Mar 2025 18:52:03 +0100 Subject: [PATCH 11/14] enable remove role button only for clear the fields --- src/pages/userInvitation/UserInvitationUserGroupsTable.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/userInvitation/UserInvitationUserGroupsTable.vue b/src/pages/userInvitation/UserInvitationUserGroupsTable.vue index e17382652..b340c78e9 100644 --- a/src/pages/userInvitation/UserInvitationUserGroupsTable.vue +++ b/src/pages/userInvitation/UserInvitationUserGroupsTable.vue @@ -203,7 +203,7 @@ const availableUserGroups = computed(() => { */ function hasUserGroupsValue() { if (store.invitationPayload.userGroupsToAdd[0]) { - Object.values(store.invitationPayload.userGroupsToAdd[0]).some( + return Object.values(store.invitationPayload.userGroupsToAdd[0]).some( (value) => value !== null, ); } From b6ab3e3b640574100549eb1dd024edb03f499a66 Mon Sep 17 00:00:00 2001 From: ipula Date: Tue, 11 Mar 2025 19:33:07 +0100 Subject: [PATCH 12/14] add spacing in user count and invitation count --- src/managers/UserAccessManager/UserAccessManager.vue | 2 +- src/managers/UserInvitationManager/UserInvitationManager.vue | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/managers/UserAccessManager/UserAccessManager.vue b/src/managers/UserAccessManager/UserAccessManager.vue index 74495efb1..687c826cb 100755 --- a/src/managers/UserAccessManager/UserAccessManager.vue +++ b/src/managers/UserAccessManager/UserAccessManager.vue @@ -2,7 +2,7 @@