- number-поля теперь рендерятся как text + inputMode=numeric, чтобы браузер не округлял значения через input type=number - пробелы при вставке в number-поля удаляются - бэкенд нормализует значения number-полей в строку перед сохранением - добавлен хелпер normalizeFieldValueForStorage Closes: искажение расчётного счёта и других длинных числовых полей
103 lines
4.1 KiB
TypeScript
103 lines
4.1 KiB
TypeScript
import { Router } from "express";
|
|
import { type AuthenticatedRequest } from "../middleware/auth.middleware";
|
|
import {
|
|
getDirectoryFolders,
|
|
createDirectoryFolder,
|
|
updateDirectoryFolder,
|
|
deleteDirectoryFolder,
|
|
moveDirectoryToFolder,
|
|
reorderDirectoryFolders,
|
|
moveDirectoryFolder,
|
|
} from "../storage/folder.storage";
|
|
|
|
export function registerDirectoryFolderRoutes(router: ReturnType<typeof Router>): void {
|
|
router.get('/api/directories/folders', async (req: AuthenticatedRequest, res) => {
|
|
try {
|
|
const folders = await getDirectoryFolders(req.organizationId!);
|
|
res.json({ success: true, folders });
|
|
} catch (error) {
|
|
console.error('Get directory folders error:', error);
|
|
res.status(500).json({ success: false, error: 'Ошибка при получении папок' });
|
|
}
|
|
});
|
|
|
|
router.post('/api/directories/folders', async (req: AuthenticatedRequest, res) => {
|
|
try {
|
|
const { name, parentId, position } = req.body;
|
|
if (!name || typeof name !== 'string') {
|
|
return res.status(400).json({ success: false, error: 'Название папки обязательно' });
|
|
}
|
|
const folder = await createDirectoryFolder({
|
|
organizationId: req.organizationId!,
|
|
name,
|
|
parentId: parentId ?? null,
|
|
position: position ?? 0,
|
|
});
|
|
res.status(201).json({ success: true, folder });
|
|
} catch (error) {
|
|
console.error('Create directory folder error:', error);
|
|
res.status(500).json({ success: false, error: 'Ошибка при создании папки' });
|
|
}
|
|
});
|
|
|
|
router.put('/api/directories/folders/:id', async (req: AuthenticatedRequest, res) => {
|
|
try {
|
|
const id = parseInt(req.params.id);
|
|
const { name, parentId, position } = req.body;
|
|
let folder;
|
|
if (parentId !== undefined || position !== undefined) {
|
|
folder = await moveDirectoryFolder(id, req.organizationId!, parentId ?? null, position ?? 0);
|
|
} else {
|
|
folder = await updateDirectoryFolder(id, req.organizationId!, { name });
|
|
}
|
|
if (!folder) {
|
|
return res.status(404).json({ success: false, error: 'Папка не найдена' });
|
|
}
|
|
res.json({ success: true, folder });
|
|
} catch (error) {
|
|
console.error('Update directory folder error:', error);
|
|
res.status(500).json({ success: false, error: 'Ошибка при обновлении папки' });
|
|
}
|
|
});
|
|
|
|
router.delete('/api/directories/folders/:id', async (req: AuthenticatedRequest, res) => {
|
|
try {
|
|
const id = parseInt(req.params.id);
|
|
await deleteDirectoryFolder(id, req.organizationId!);
|
|
res.json({ success: true });
|
|
} catch (error) {
|
|
console.error('Delete directory folder error:', error);
|
|
res.status(500).json({ success: false, error: 'Ошибка при удалении папки' });
|
|
}
|
|
});
|
|
|
|
router.patch('/api/directories/folders/reorder', async (req: AuthenticatedRequest, res) => {
|
|
try {
|
|
const { updates } = req.body;
|
|
if (!Array.isArray(updates)) {
|
|
return res.status(400).json({ success: false, error: 'Некорректные данные' });
|
|
}
|
|
await reorderDirectoryFolders(req.organizationId!, updates);
|
|
res.json({ success: true });
|
|
} catch (error) {
|
|
console.error('Reorder directory folders error:', error);
|
|
res.status(500).json({ success: false, error: 'Ошибка при изменении порядка' });
|
|
}
|
|
});
|
|
|
|
router.patch('/api/directories/:id/folder', async (req: AuthenticatedRequest, res) => {
|
|
try {
|
|
const id = parseInt(req.params.id);
|
|
const { folderId } = req.body;
|
|
const table = await moveDirectoryToFolder(id, req.organizationId!, folderId ?? null);
|
|
if (!table) {
|
|
return res.status(404).json({ success: false, error: 'Справочник не найден' });
|
|
}
|
|
res.json({ success: true, table });
|
|
} catch (error) {
|
|
console.error('Move directory to folder error:', error);
|
|
res.status(500).json({ success: false, error: 'Ошибка при перемещении справочника' });
|
|
}
|
|
});
|
|
}
|