Skip to content

Commit 13d565f

Browse files
I10969 (#542) Adjustment to address various issues after dependency update
* pkp/pkp-lib#10969 Fix reactivity madness * pkp/pkp-lib#10969 Address breaking change in vue3, where inject in pinia stores does not provide current component provides * pkp/pkp-lib#10969 Defeated another infinite loop * pkp/pkp-lib#10969 Back to have toolbar dynamic based on attachers * pkp/pkp-lib#10969 Refined
1 parent 94fc221 commit 13d565f

File tree

8 files changed

+79
-25
lines changed

8 files changed

+79
-25
lines changed

src/components/Composer/Composer.vue

+9-3
Original file line numberDiff line numberDiff line change
@@ -553,10 +553,18 @@ export default {
553553
searchPhrase: '',
554554
searchResults: [],
555555
showSearchResultCount: 10,
556-
toolbar: 'bold italic superscript subscript | link',
557556
};
558557
},
559558
computed: {
559+
toolbar() {
560+
let baseToolbar = 'bold italic superscript subscript | link ';
561+
562+
if (this.attachers?.length) {
563+
baseToolbar += '| pkpAttachFiles';
564+
}
565+
566+
return baseToolbar;
567+
},
560568
/**
561569
* A getter and setter to allow v-model on a prop
562570
*/
@@ -579,8 +587,6 @@ export default {
579587
}
580588
let self = this;
581589
582-
self.toolbar += ' | pkpAttachFiles';
583-
584590
return {
585591
setup: function (editor) {
586592
editor.ui.registry.addButton('pkpAttachFiles', {

src/components/SideNav/SideNav.vue

+14-6
Original file line numberDiff line numberDiff line change
@@ -92,9 +92,9 @@ if (reviewAssignmentMenuItem) {
9292
}
9393
9494
// helper to attach count to the menu item
95-
function enrichMenuItemWithCounts(page, itemsCount) {
95+
function enrichMenuItemWithCounts(menuItems, page, itemsCount) {
9696
if (itemsCount.value) {
97-
const menuItem = menuItems.value.find((item) => item.key === page);
97+
const menuItem = menuItems.find((item) => item.key === page);
9898
if (menuItem) {
9999
const menuItemsEnriched = menuItem.items.map((item) => ({
100100
...item,
@@ -105,14 +105,21 @@ function enrichMenuItemWithCounts(page, itemsCount) {
105105
menuItem.items = menuItemsEnriched;
106106
}
107107
}
108+
return menuItems;
108109
}
109110
110111
const menuItemsEnriched = computed(() => {
111-
enrichMenuItemWithCounts('dashboards', dashboardCount);
112-
enrichMenuItemWithCounts('mySubmissions', mySubmissionsCount);
113-
enrichMenuItemWithCounts('reviewAssignments', reviewAssignmentCount);
112+
const menuItemsCopy = JSON.parse(JSON.stringify(menuItems.value));
114113
115-
return menuItems.value;
114+
enrichMenuItemWithCounts(menuItemsCopy, 'dashboards', dashboardCount);
115+
enrichMenuItemWithCounts(menuItemsCopy, 'mySubmissions', mySubmissionsCount);
116+
enrichMenuItemWithCounts(
117+
menuItemsCopy,
118+
'reviewAssignments',
119+
reviewAssignmentCount,
120+
);
121+
122+
return menuItemsCopy;
116123
});
117124
118125
function convertLinksToArray(links, level = 1, parentKey = '') {
@@ -179,6 +186,7 @@ const {sideMenuProps} = useSideMenu(menuItemsEnriched, {
179186
watch(
180187
() => props.links,
181188
(newLinks) => {
189+
console.log('SideNav watch');
182190
menuItems.value = convertLinksToArray(newLinks);
183191
},
184192
);

src/composables/useDataChanged.js

+10-4
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,23 @@
1-
import {inject, onUnmounted} from 'vue';
1+
import {onUnmounted} from 'vue';
2+
import {injectFromCurrentInstance} from '@/utils/defineComponentStore';
3+
24
export function useDataChanged(callback) {
35
if (callback) {
4-
const registerDataChangeCallback = inject('registerDataChangeCallback');
6+
const registerDataChangeCallback = injectFromCurrentInstance(
7+
'registerDataChangeCallback',
8+
);
59
registerDataChangeCallback(callback);
610

7-
const unRegisterDataChangeCallback = inject('unRegisterDataChangeCallback');
11+
const unRegisterDataChangeCallback = injectFromCurrentInstance(
12+
'unRegisterDataChangeCallback',
13+
);
814

915
onUnmounted(() => {
1016
unRegisterDataChangeCallback(callback);
1117
});
1218
}
1319

14-
const triggerDataChange = inject('triggerDataChange');
20+
const triggerDataChange = injectFromCurrentInstance('triggerDataChange');
1521

1622
return {triggerDataChange};
1723
}

src/composables/useFetch.js

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
import {ref, unref, inject} from 'vue';
1+
import {ref, unref} from 'vue';
22
import {ofetch, createFetch} from 'ofetch';
33
import {useModalStore} from '@/stores/modalStore';
44
import {useProgressStore} from '@/stores/progressStore';
5-
5+
import {injectFromCurrentInstance} from '@/utils/defineComponentStore';
66
import {useDebounceFn} from '@vueuse/core';
77

88
let ofetchInstance = ofetch;
@@ -98,7 +98,7 @@ export function useFetch(url, options = {}) {
9898

9999
let lastRequestController = null;
100100

101-
const modalLevel = inject('modalLevel');
101+
const modalLevel = injectFromCurrentInstance('modalLevel');
102102
const screenName = modalLevel?.value ? `modal_${modalLevel.value}` : 'base';
103103
const progressStore = useProgressStore();
104104

src/managers/ReviewerManager/modals/workflowLogResponseModalStore.js

+5-3
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
1-
import {inject} from 'vue';
2-
import {defineComponentStore} from '@/utils/defineComponentStore';
1+
import {
2+
defineComponentStore,
3+
injectFromCurrentInstance,
4+
} from '@/utils/defineComponentStore';
35
import {useForm} from '@/composables/useForm';
46

57
export const useWorkflowLogResponseModalStore = defineComponentStore(
68
'workflowLogResponseModal',
79
(props) => {
8-
const closeModal = inject('closeModal');
10+
const closeModal = injectFromCurrentInstance('closeModal');
911
const {set: updateForm, form} = useForm(props.logResponseForm);
1012

1113
function formSuccess() {

src/pages/workflow/modals/workflowChangeSubmissionLanguageModalStore.js

+6-3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
1-
import {inject, ref, computed, watch} from 'vue';
2-
import {defineComponentStore} from '@/utils/defineComponentStore';
1+
import {ref, computed, watch} from 'vue';
2+
import {
3+
defineComponentStore,
4+
injectFromCurrentInstance,
5+
} from '@/utils/defineComponentStore';
36
import {useUrl} from '@/composables/useUrl';
47
import {useFetch} from '@/composables/useFetch';
58
import {useForm} from '@/composables/useForm';
@@ -62,7 +65,7 @@ export const useWorkflowChangeSubmissionLanguageModalStore =
6265
// Get publication props
6366
getData();
6467

65-
const closeModal = inject('closeModal');
68+
const closeModal = injectFromCurrentInstance('closeModal');
6669

6770
/**
6871
* Functions

src/pages/workflow/workflowStore.js

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
import {computed, inject} from 'vue';
1+
import {computed} from 'vue';
2+
import {injectFromCurrentInstance} from '@/utils/defineComponentStore';
23

34
import {defineComponentStore} from '@/utils/defineComponentStore';
45
import {
@@ -33,7 +34,7 @@ export const useWorkflowStore = defineComponentStore(
3334
/**
3435
* Action to close the workflow from inside
3536
* */
36-
const closeWorkflowModal = inject('closeModal');
37+
const closeWorkflowModal = injectFromCurrentInstance('closeModal');
3738

3839
/**
3940
* Submission & Publication

src/utils/defineComponentStore.js

+29-1
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,40 @@
11
import {defineStore, getActivePinia} from 'pinia';
2-
import {onMounted, onBeforeUnmount, provide, inject} from 'vue';
2+
import {
3+
onMounted,
4+
onBeforeUnmount,
5+
provide,
6+
inject,
7+
getCurrentInstance,
8+
} from 'vue';
39

410
let storesMap = {};
511

612
export function getComponentStoreByName(storeName) {
713
return storesMap[storeName].useStore();
814
}
915

16+
/**
17+
* This is replacement for `inject` method offered from vue, to be used inside pinia "component stores"
18+
* Component stores follow component life cycle for great convinience, but this is not common
19+
* use case. Pinia stores are mostly used as global stores independent from components.
20+
*
21+
* With recent change in vue (https://github.com/vuejs/core/issues/11488),
22+
* inject used within pinia defaults to injecting from root app component provides, instead
23+
* of current instance. Therefore using custom implementation to get current instance provides.
24+
*
25+
*
26+
*/
27+
export function injectFromCurrentInstance(name) {
28+
const instance = getCurrentInstance();
29+
const provides = instance
30+
? instance.parent == null
31+
? instance.vnode.appContext && instance.vnode.appContext.provides
32+
: instance.parent.provides
33+
: void 0;
34+
35+
return provides?.[name];
36+
}
37+
1038
export function defineComponentStore(
1139
_storeName,
1240
setupFn,

0 commit comments

Comments
 (0)