diff --git a/src/lib/category.ts b/src/lib/category.ts index 65aab7ab..4941dc1f 100644 --- a/src/lib/category.ts +++ b/src/lib/category.ts @@ -1,6 +1,11 @@ -import { CategoryType } from '@/core/category.ts'; +import { type LocalizedPresetCategory, CategoryType } from '@/core/category.ts'; import { TransactionType } from '@/core/transaction.ts'; -import { type TransactionCategoriesWithVisibleCount, TransactionCategory } from '@/models/transaction_category.ts'; +import { + type TransactionCategoriesWithVisibleCount, + type TransactionCategoryCreateRequest, + type TransactionCategoryCreateWithSubCategories, + TransactionCategory +} from '@/models/transaction_category.ts'; export function transactionTypeToCategoryType(transactionType: TransactionType): CategoryType | null { if (transactionType === TransactionType.Income) { @@ -26,6 +31,47 @@ export function categoryTypeToTransactionType(categoryType: CategoryType): Trans } } +export function localizedPresetCategoryToTransactionCategoryCreateWithSubCategorys(presetCategory: LocalizedPresetCategory): TransactionCategoryCreateWithSubCategories { + const subCategories: TransactionCategoryCreateRequest[] = []; + + for (let i = 0; i < presetCategory.subCategories.length; i++) { + const subPresetCategory = presetCategory.subCategories[i]; + const subCategory: TransactionCategoryCreateRequest = { + name: subPresetCategory.name, + type: subPresetCategory.type, + parentId: '', + icon: subPresetCategory.icon, + color: subPresetCategory.color, + comment: '', + clientSessionId: '' + }; + + subCategories.push(subCategory); + } + + const categoryWithSubCategories: TransactionCategoryCreateWithSubCategories = { + name: presetCategory.name, + type: presetCategory.type, + icon: presetCategory.icon, + color: presetCategory.color, + subCategories: subCategories + }; + + return categoryWithSubCategories; +} + +export function localizedPresetCategoriesToTransactionCategoryCreateWithSubCategories(presetCategories: LocalizedPresetCategory[]): TransactionCategoryCreateWithSubCategories[] { + const categories: TransactionCategoryCreateWithSubCategories[] = []; + + for (let i = 0; i < presetCategories.length; i++) { + const presetCategory = presetCategories[i]; + const categoryWithSubCategories = localizedPresetCategoryToTransactionCategoryCreateWithSubCategorys(presetCategory); + categories.push(categoryWithSubCategories); + } + + return categories; +} + export function getSecondaryTransactionMapByName(allCategories: TransactionCategory[]): Record { const ret: Record = {}; diff --git a/src/models/transaction_category.ts b/src/models/transaction_category.ts index 8539885c..4df40135 100644 --- a/src/models/transaction_category.ts +++ b/src/models/transaction_category.ts @@ -1,5 +1,5 @@ import type { ColorValue } from '@/core/color.ts'; -import { type LocalizedPresetCategory, CategoryType } from '@/core/category.ts'; +import { CategoryType } from '@/core/category.ts'; import { DEFAULT_CATEGORY_ICON_ID } from '@/consts/icon.ts'; import { DEFAULT_CATEGORY_COLOR } from '@/consts/color.ts'; @@ -137,7 +137,15 @@ export interface TransactionCategoryCreateRequest { } export interface TransactionCategoryCreateBatchRequest { - readonly categories: LocalizedPresetCategory[]; + readonly categories: TransactionCategoryCreateWithSubCategories[]; +} + +export interface TransactionCategoryCreateWithSubCategories { + readonly name: string; + readonly type: CategoryType; + readonly icon: string; + readonly color: ColorValue; + readonly subCategories: TransactionCategoryCreateRequest[]; } export interface TransactionCategoryModifyRequest { diff --git a/src/views/desktop/categories/list/dialogs/PresetDialog.vue b/src/views/desktop/categories/list/dialogs/PresetDialog.vue index ab25d069..2b1267f5 100644 --- a/src/views/desktop/categories/list/dialogs/PresetDialog.vue +++ b/src/views/desktop/categories/list/dialogs/PresetDialog.vue @@ -67,6 +67,7 @@ import { useTransactionCategoriesStore } from '@/stores/transactionCategory.ts'; import type { PartialRecord } from '@/core/base.ts'; import { type LocalizedPresetCategory, CategoryType } from '@/core/category.ts'; import { categorizedArrayToPlainArray } from '@/lib/common.ts'; +import { localizedPresetCategoriesToTransactionCategoryCreateWithSubCategories } from '@/lib/category.ts'; type SnackBarType = InstanceType; @@ -113,7 +114,8 @@ function getCategoryTypeName(categoryType: CategoryType): string { function save(): void { submitting.value = true; - const submitCategories = categorizedArrayToPlainArray(allPresetCategories.value); + const presetCategoriesArray = categorizedArrayToPlainArray(allPresetCategories.value); + const submitCategories = localizedPresetCategoriesToTransactionCategoryCreateWithSubCategories(presetCategoriesArray); transactionCategoriesStore.addCategories({ categories: submitCategories diff --git a/src/views/mobile/categories/PresetPage.vue b/src/views/mobile/categories/PresetPage.vue index cdcd8991..e8807052 100644 --- a/src/views/mobile/categories/PresetPage.vue +++ b/src/views/mobile/categories/PresetPage.vue @@ -68,6 +68,7 @@ import type { PartialRecord } from '@/core/base.ts'; import type { LanguageOption } from '@/locales/index.ts'; import { type LocalizedPresetCategory, CategoryType } from '@/core/category.ts'; import { getObjectOwnFieldCount, categorizedArrayToPlainArray } from '@/lib/common.ts'; +import { localizedPresetCategoriesToTransactionCategoryCreateWithSubCategories } from '@/lib/category.ts'; const props = defineProps<{ f7route: Router.Route; @@ -109,7 +110,8 @@ function save(): void { submitting.value = true; showLoading(() => submitting.value); - const submitCategories = categorizedArrayToPlainArray(allPresetCategories.value); + const presetCategoriesArray = categorizedArrayToPlainArray(allPresetCategories.value); + const submitCategories = localizedPresetCategoriesToTransactionCategoryCreateWithSubCategories(presetCategoriesArray); transactionCategoriesStore.addCategories({ categories: submitCategories