From 285410a59a2a338d089fc44e9fdb4a39d784cf84 Mon Sep 17 00:00:00 2001 From: Wanjin Noh Date: Fri, 3 Jan 2025 14:14:18 +0900 Subject: [PATCH 01/85] fix: reset and dispose stores on component unmount to prevent memory leaks Signed-off-by: Wanjin Noh --- .../services/ops-flow/stores/admin/package-store.ts | 1 + .../ops-flow/stores/admin/task-category-page-store.ts | 11 ++++++++++- .../stores/admin/task-management-page-store.ts | 11 ++++++++++- .../src/services/ops-flow/stores/board-page-store.ts | 11 ++++++++++- .../ops-flow/stores/task-detail-page-store.ts | 6 ++++++ 5 files changed, 37 insertions(+), 3 deletions(-) diff --git a/apps/web/src/services/ops-flow/stores/admin/package-store.ts b/apps/web/src/services/ops-flow/stores/admin/package-store.ts index b1f51eb37a..2076fda226 100644 --- a/apps/web/src/services/ops-flow/stores/admin/package-store.ts +++ b/apps/web/src/services/ops-flow/stores/admin/package-store.ts @@ -87,6 +87,7 @@ export const usePackageStore = defineStore('package', () => { }; const disposeSelf = () => { const store = usePackageStore(); + store.$reset(); store.$dispose(); }; const appContextStore = useAppContextStore(); diff --git a/apps/web/src/services/ops-flow/stores/admin/task-category-page-store.ts b/apps/web/src/services/ops-flow/stores/admin/task-category-page-store.ts index 68633562cc..cb7d2ca38d 100644 --- a/apps/web/src/services/ops-flow/stores/admin/task-category-page-store.ts +++ b/apps/web/src/services/ops-flow/stores/admin/task-category-page-store.ts @@ -1,7 +1,7 @@ import { asyncComputed } from '@vueuse/core'; import type { DeepReadonly } from 'vue'; import { - reactive, computed, + reactive, computed, onUnmounted, } from 'vue'; import { defineStore } from 'pinia'; @@ -215,6 +215,15 @@ export const useTaskCategoryPageStore = defineStore('task-category-page', () => state.targetTaskTypeId = undefined; }, }; + + const disposeSelf = () => { + const store = useTaskCategoryPageStore(); + store.$reset(); + store.$dispose(); + }; + onUnmounted(() => { + disposeSelf(); + }); return { state, getters, diff --git a/apps/web/src/services/ops-flow/stores/admin/task-management-page-store.ts b/apps/web/src/services/ops-flow/stores/admin/task-management-page-store.ts index e1ee19c57c..16a6dfc4e2 100644 --- a/apps/web/src/services/ops-flow/stores/admin/task-management-page-store.ts +++ b/apps/web/src/services/ops-flow/stores/admin/task-management-page-store.ts @@ -1,5 +1,5 @@ import type { DeepReadonly } from 'vue'; -import { reactive, computed } from 'vue'; +import { reactive, computed, onUnmounted } from 'vue'; import { defineStore } from 'pinia'; @@ -162,6 +162,15 @@ export const useTaskManagementPageStore = defineStore('task-management-page', () state.associatedTasksToCategoryMap = {}; }, }; + + const disposeSelf = () => { + const store = useTaskManagementPageStore(); + store.$reset(); + store.$dispose(); + }; + onUnmounted(() => { + disposeSelf(); + }); return { state, getters, diff --git a/apps/web/src/services/ops-flow/stores/board-page-store.ts b/apps/web/src/services/ops-flow/stores/board-page-store.ts index 1cbedf3b4a..78f7e2b846 100644 --- a/apps/web/src/services/ops-flow/stores/board-page-store.ts +++ b/apps/web/src/services/ops-flow/stores/board-page-store.ts @@ -1,5 +1,5 @@ import type { ComputedRef } from 'vue'; -import { reactive, computed } from 'vue'; +import { reactive, computed, onUnmounted } from 'vue'; import { defineStore } from 'pinia'; @@ -24,6 +24,15 @@ export const useBoardPageStore = defineStore('board-page', () => { state.currentCategoryId = categoryId; }, }; + + const disposeSelf = () => { + const store = useBoardPageStore(); + store.$reset(); + store.$dispose(); + }; + onUnmounted(() => { + disposeSelf(); + }); return { state, getters, diff --git a/apps/web/src/services/ops-flow/stores/task-detail-page-store.ts b/apps/web/src/services/ops-flow/stores/task-detail-page-store.ts index 6248bb50dd..e20fa73d94 100644 --- a/apps/web/src/services/ops-flow/stores/task-detail-page-store.ts +++ b/apps/web/src/services/ops-flow/stores/task-detail-page-store.ts @@ -170,7 +170,13 @@ export const useTaskDetailPageStore = defineStore('task-detail-page', () => { }, }; + const disposeSelf = () => { + const store = useTaskDetailPageStore(); + store.$reset(); + store.$dispose(); + }; onUnmounted(() => { + disposeSelf(); taskContentFormStore.$reset(); taskContentFormStore.$dispose(); }); From c3f6366b17828c8a13500f782a7fdb4de96b7d20 Mon Sep 17 00:00:00 2001 From: Wanjin Noh Date: Fri, 3 Jan 2025 14:22:06 +0900 Subject: [PATCH 02/85] fix: correct task initialization logic in create mode handling Signed-off-by: Wanjin Noh --- .../services/ops-flow/components/TaskContentBaseForm.vue | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/apps/web/src/services/ops-flow/components/TaskContentBaseForm.vue b/apps/web/src/services/ops-flow/components/TaskContentBaseForm.vue index 59c98ad26a..58f3630cb2 100644 --- a/apps/web/src/services/ops-flow/components/TaskContentBaseForm.vue +++ b/apps/web/src/services/ops-flow/components/TaskContentBaseForm.vue @@ -254,13 +254,10 @@ createModeInitWatchStop = watch([() => taskContentFormState.currentCategoryId, ( createModeInitWatchStop = undefined; return; } + if (!isCreateMode.value) return; + if (isMinimalCreateMode.value && !taskType) return; // minimal create is from landing page. task type is already selected and must be initialized. - if (isCreateMode.value) { - await initForCreateMode(categoryId); - } else if (isMinimalCreateMode.value) { // minimal create mode always has task type (from landing page) - if (!taskType) return; - await initForCreateMode(categoryId, taskType); - } + await initForCreateMode(categoryId, taskType); }, { immediate: true }); From c202eb466e4275ea85b61c57232d5584f5d263dd Mon Sep 17 00:00:00 2001 From: Wanjin Noh Date: Fri, 3 Jan 2025 15:28:11 +0900 Subject: [PATCH 03/85] fix: correct default field check logic in TaskFieldGenerator component Signed-off-by: Wanjin Noh --- .../ops-flow/task-fields-configuration/TaskFieldGenerator.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/web/src/services/ops-flow/task-fields-configuration/TaskFieldGenerator.vue b/apps/web/src/services/ops-flow/task-fields-configuration/TaskFieldGenerator.vue index ae5f504490..de7d40b01f 100644 --- a/apps/web/src/services/ops-flow/task-fields-configuration/TaskFieldGenerator.vue +++ b/apps/web/src/services/ops-flow/task-fields-configuration/TaskFieldGenerator.vue @@ -57,7 +57,7 @@ const taskManagementTemplateStore = useTaskManagementTemplateStore(); const fieldMetadata = computed(() => taskFieldMetadataStoreGetters.taskFieldTypeMetadataMap[props.field.field_type]); const optionsComponent = computed|undefined>(() => COMPONENT_MAP[props.field.field_type]); -const isDefaultField = computed(() => !!DEFAULT_FIELD_ID_MAP[props.field.field_id]); +const isDefaultField = computed(() => Object.values(DEFAULT_FIELD_ID_MAP).includes(props.field.field_id)); /* input type */ const inputTypes = computed<{ name: string; label: string; }[]>(() => [ From a96881b4313c6f67297d9f14604d2547f7e7fc9b Mon Sep 17 00:00:00 2001 From: Wanjin Noh Date: Fri, 3 Jan 2025 15:29:17 +0900 Subject: [PATCH 04/85] refactor: streamline category loading and initialization across components Signed-off-by: Wanjin Noh --- .../services/ops-flow/components/BoardLSB.vue | 6 ++ .../ops-flow/components/BoardTaskTable.vue | 30 +++++----- .../ops-flow/components/PackageForm.vue | 7 ++- .../ops-flow/components/TaskCategoryPanel.vue | 6 +- .../components/TaskContentBaseForm.vue | 7 ++- .../composables/use-category-field.ts | 57 ++++++++++--------- .../stores/admin/task-category-page-store.ts | 7 ++- .../admin/task-management-page-store.ts | 9 ++- .../ops-flow/stores/board-page-store.ts | 8 ++- .../ops-flow/stores/task-category-store.ts | 14 +---- .../stores/task-content-form-store.ts | 5 +- 11 files changed, 92 insertions(+), 64 deletions(-) diff --git a/apps/web/src/services/ops-flow/components/BoardLSB.vue b/apps/web/src/services/ops-flow/components/BoardLSB.vue index f3bb709870..b791416d7e 100644 --- a/apps/web/src/services/ops-flow/components/BoardLSB.vue +++ b/apps/web/src/services/ops-flow/components/BoardLSB.vue @@ -1,4 +1,6 @@