356 lines
12 KiB
JavaScript
356 lines
12 KiB
JavaScript
import categoryContants from '../consts/category.js';
|
|
import services from '../lib/services.js';
|
|
import logger from '../lib/logger.js';
|
|
|
|
import {
|
|
LOAD_TRANSACTION_CATEGORY_LIST,
|
|
ADD_CATEGORY_TO_TRANSACTION_CATEGORY_LIST,
|
|
SAVE_CATEGORY_IN_TRANSACTION_CATEGORY_LIST,
|
|
CHANGE_CATEGORY_DISPLAY_ORDER_IN_CATEGORY_LIST,
|
|
UPDATE_CATEGORY_VISIBILITY_IN_TRANSACTION_CATEGORY_LIST,
|
|
REMOVE_CATEGORY_FROM_TRANSACTION_CATEGORYLIST,
|
|
UPDATE_TRANSACTION_CATEGORY_LIST_INVALID_STATE,
|
|
} from './mutations.js';
|
|
|
|
export function loadAllCategories(context, { force }) {
|
|
if (!force && !context.state.transactionCategoryListStateInvalid) {
|
|
return new Promise((resolve) => {
|
|
resolve(context.state.allTransactionCategories);
|
|
});
|
|
}
|
|
|
|
return new Promise((resolve, reject) => {
|
|
services.getAllTransactionCategories().then(response => {
|
|
const data = response.data;
|
|
|
|
if (!data || !data.success || !data.result) {
|
|
reject({ message: 'Unable to get category list' });
|
|
return;
|
|
}
|
|
|
|
if (!data.result[categoryContants.allCategoryTypes.Income]) {
|
|
data.result[categoryContants.allCategoryTypes.Income] = [];
|
|
}
|
|
|
|
if (!data.result[categoryContants.allCategoryTypes.Expense]) {
|
|
data.result[categoryContants.allCategoryTypes.Expense] = [];
|
|
}
|
|
|
|
if (!data.result[categoryContants.allCategoryTypes.Transfer]) {
|
|
data.result[categoryContants.allCategoryTypes.Transfer] = [];
|
|
}
|
|
|
|
for (let categoryType in data.result) {
|
|
if (!Object.prototype.hasOwnProperty.call(data.result, categoryType)) {
|
|
continue;
|
|
}
|
|
|
|
const categories = data.result[categoryType];
|
|
|
|
for (let i = 0; i < categories.length; i++) {
|
|
const category = categories[i];
|
|
|
|
if (!category.subCategories) {
|
|
category.subCategories = [];
|
|
}
|
|
}
|
|
}
|
|
|
|
context.commit(LOAD_TRANSACTION_CATEGORY_LIST, data.result);
|
|
|
|
if (context.state.transactionCategoryListStateInvalid) {
|
|
context.commit(UPDATE_TRANSACTION_CATEGORY_LIST_INVALID_STATE, false);
|
|
}
|
|
|
|
resolve(data.result);
|
|
}).catch(error => {
|
|
if (force) {
|
|
logger.error('failed to force load category list', error);
|
|
} else {
|
|
logger.error('failed to load category list', error);
|
|
}
|
|
|
|
if (error.response && error.response.data && error.response.data.errorMessage) {
|
|
reject({ error: error.response.data });
|
|
} else if (!error.processed) {
|
|
reject({ message: 'Unable to get category list' });
|
|
} else {
|
|
reject(error);
|
|
}
|
|
});
|
|
});
|
|
}
|
|
|
|
export function getCategory(context, { categoryId }) {
|
|
return new Promise((resolve, reject) => {
|
|
services.getTransactionCategory({
|
|
id: categoryId
|
|
}).then(response => {
|
|
const data = response.data;
|
|
|
|
if (!data || !data.success || !data.result) {
|
|
reject({ message: 'Unable to get category' });
|
|
return;
|
|
}
|
|
|
|
resolve(data.result);
|
|
}).catch(error => {
|
|
logger.error('failed to load category info', error);
|
|
|
|
if (error.response && error.response.data && error.response.data.errorMessage) {
|
|
reject({ error: error.response.data });
|
|
} else if (!error.processed) {
|
|
reject({ message: 'Unable to get category' });
|
|
} else {
|
|
reject(error);
|
|
}
|
|
});
|
|
});
|
|
}
|
|
|
|
export function saveCategory(context, { category }) {
|
|
return new Promise((resolve, reject) => {
|
|
let promise = null;
|
|
|
|
if (!category.id) {
|
|
promise = services.addTransactionCategory(category);
|
|
} else {
|
|
promise = services.modifyTransactionCategory(category);
|
|
}
|
|
|
|
promise.then(response => {
|
|
const data = response.data;
|
|
|
|
if (!data || !data.success || !data.result) {
|
|
if (!category.id) {
|
|
reject({ message: 'Unable to add category' });
|
|
} else {
|
|
reject({ message: 'Unable to save category' });
|
|
}
|
|
return;
|
|
}
|
|
|
|
if (!data.result.subCategories) {
|
|
data.result.subCategories = [];
|
|
}
|
|
|
|
if (!category.id) {
|
|
context.commit(ADD_CATEGORY_TO_TRANSACTION_CATEGORY_LIST, data.result);
|
|
} else {
|
|
context.commit(SAVE_CATEGORY_IN_TRANSACTION_CATEGORY_LIST, data.result);
|
|
}
|
|
|
|
resolve(data.result);
|
|
}).catch(error => {
|
|
logger.error('failed to save category', error);
|
|
|
|
if (error.response && error.response.data && error.response.data.errorMessage) {
|
|
reject({ error: error.response.data });
|
|
} else if (!error.processed) {
|
|
if (!category.id) {
|
|
reject({ message: 'Unable to add category' });
|
|
} else {
|
|
reject({ message: 'Unable to save category' });
|
|
}
|
|
} else {
|
|
reject(error);
|
|
}
|
|
});
|
|
});
|
|
}
|
|
|
|
export function addCategories(context, { categories }) {
|
|
return new Promise((resolve, reject) => {
|
|
services.addTransactionCategoryBatch({
|
|
categories: categories
|
|
}).then(response => {
|
|
const data = response.data;
|
|
|
|
if (!data || !data.success || !data.result) {
|
|
reject({ message: 'Unable to add preset categories' });
|
|
return;
|
|
}
|
|
|
|
if (!context.state.transactionCategoryListStateInvalid) {
|
|
context.commit(UPDATE_TRANSACTION_CATEGORY_LIST_INVALID_STATE, true);
|
|
}
|
|
|
|
resolve(data.result);
|
|
}).catch(error => {
|
|
logger.error('failed to add preset categories', error);
|
|
|
|
if (error.response && error.response.data && error.response.data.errorMessage) {
|
|
reject({ error: error.response.data });
|
|
} else if (!error.processed) {
|
|
reject({ message: 'Unable to add preset categories' });
|
|
} else {
|
|
reject(error);
|
|
}
|
|
});
|
|
});
|
|
}
|
|
|
|
export function changeCategoryDisplayOrder(context, { categoryId, from, to }) {
|
|
const category = context.state.allTransactionCategoriesMap[categoryId];
|
|
|
|
return new Promise((resolve, reject) => {
|
|
if (!category) {
|
|
reject({ message: 'Unable to move category' });
|
|
return;
|
|
}
|
|
|
|
if (!category.parentId || category.parentId === '0') {
|
|
if (!context.state.allTransactionCategories[category.type] ||
|
|
!context.state.allTransactionCategories[category.type][to]) {
|
|
reject({ message: 'Unable to move category' });
|
|
return;
|
|
}
|
|
} else {
|
|
if (!context.state.allTransactionCategoriesMap[category.parentId].subCategories ||
|
|
!context.state.allTransactionCategoriesMap[category.parentId].subCategories[to]) {
|
|
reject({ message: 'Unable to move category' });
|
|
return;
|
|
}
|
|
}
|
|
|
|
if (!context.state.transactionCategoryListStateInvalid) {
|
|
context.commit(UPDATE_TRANSACTION_CATEGORY_LIST_INVALID_STATE, true);
|
|
}
|
|
|
|
context.commit(CHANGE_CATEGORY_DISPLAY_ORDER_IN_CATEGORY_LIST, {
|
|
category: category,
|
|
from: from,
|
|
to: to
|
|
});
|
|
|
|
resolve();
|
|
});
|
|
}
|
|
|
|
export function updateCategoryDisplayOrders(context, { type, parentId }) {
|
|
const newDisplayOrders = [];
|
|
|
|
let categoryList = null;
|
|
|
|
if (!parentId || parentId === '0') {
|
|
categoryList = context.state.allTransactionCategories[type];
|
|
} else if (context.state.allTransactionCategoriesMap[parentId]) {
|
|
categoryList = context.state.allTransactionCategoriesMap[parentId].subCategories;
|
|
}
|
|
|
|
if (categoryList) {
|
|
for (let i = 0; i < categoryList.length; i++) {
|
|
newDisplayOrders.push({
|
|
id: categoryList[i].id,
|
|
displayOrder: i + 1
|
|
});
|
|
}
|
|
}
|
|
|
|
return new Promise((resolve, reject) => {
|
|
services.moveTransactionCategory({
|
|
newDisplayOrders: newDisplayOrders
|
|
}).then(response => {
|
|
const data = response.data;
|
|
|
|
if (!data || !data.success || !data.result) {
|
|
reject({ message: 'Unable to move category' });
|
|
return;
|
|
}
|
|
|
|
if (context.state.transactionCategoryListStateInvalid) {
|
|
context.commit(UPDATE_TRANSACTION_CATEGORY_LIST_INVALID_STATE, false);
|
|
}
|
|
|
|
resolve(data.result);
|
|
}).catch(error => {
|
|
logger.error('failed to save categories display order', error);
|
|
|
|
if (error.response && error.response.data && error.response.data.errorMessage) {
|
|
reject({ error: error.response.data });
|
|
} else if (!error.processed) {
|
|
reject({ message: 'Unable to move category' });
|
|
} else {
|
|
reject(error);
|
|
}
|
|
});
|
|
});
|
|
}
|
|
|
|
export function hideCategory(context, { category, hidden }) {
|
|
return new Promise((resolve, reject) => {
|
|
services.hideTransactionCategory({
|
|
id: category.id,
|
|
hidden: hidden
|
|
}).then(response => {
|
|
const data = response.data;
|
|
|
|
if (!data || !data.success || !data.result) {
|
|
if (hidden) {
|
|
reject({ message: 'Unable to hide this category' });
|
|
} else {
|
|
reject({ message: 'Unable to unhide this category' });
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
context.commit(UPDATE_CATEGORY_VISIBILITY_IN_TRANSACTION_CATEGORY_LIST, {
|
|
category: category,
|
|
hidden: hidden
|
|
});
|
|
|
|
resolve(data.result);
|
|
}).catch(error => {
|
|
logger.error('failed to change category visibility', error);
|
|
|
|
if (error.response && error.response.data && error.response.data.errorMessage) {
|
|
reject({ error: error.response.data });
|
|
} else if (!error.processed) {
|
|
if (hidden) {
|
|
reject({ message: 'Unable to hide this category' });
|
|
} else {
|
|
reject({ message: 'Unable to unhide this category' });
|
|
}
|
|
} else {
|
|
reject(error);
|
|
}
|
|
});
|
|
});
|
|
}
|
|
|
|
export function deleteCategory(context, { category, beforeResolve }) {
|
|
return new Promise((resolve, reject) => {
|
|
services.deleteTransactionCategory({
|
|
id: category.id
|
|
}).then(response => {
|
|
const data = response.data;
|
|
|
|
if (!data || !data.success || !data.result) {
|
|
reject({ message: 'Unable to delete this category' });
|
|
return;
|
|
}
|
|
|
|
if (beforeResolve) {
|
|
beforeResolve(() => {
|
|
context.commit(REMOVE_CATEGORY_FROM_TRANSACTION_CATEGORYLIST, category);
|
|
});
|
|
} else {
|
|
context.commit(REMOVE_CATEGORY_FROM_TRANSACTION_CATEGORYLIST, category);
|
|
}
|
|
|
|
resolve(data.result);
|
|
}).catch(error => {
|
|
logger.error('failed to delete category', error);
|
|
|
|
if (error.response && error.response.data && error.response.data.errorMessage) {
|
|
reject({ error: error.response.data });
|
|
} else if (!error.processed) {
|
|
reject({ message: 'Unable to delete this category' });
|
|
} else {
|
|
reject(error);
|
|
}
|
|
});
|
|
});
|
|
}
|