- Unify API: lib/api.ts uses /api/v1, inbox uses /api/inbox (rewrites) - Remove localhost refs: openapi, inbox page - Add rewrites: /api/inbox|tmc -> inbox-server, /api/v1 -> FastAPI - Add stub routes: knowledge/insights, recommendations, search, log-error - Transfer from PAPA: prompts (inspection, tmc), scripts, supabase, data/tmc-requests - Fix inbox-server: ORDER BY created_at, package.json - Remove redundant app/api/inbox/files route (rewrites handle it) - knowledge/ in gitignore (large PDFs) Co-authored-by: Cursor <cursoragent@cursor.com>
5.8 KiB
5.8 KiB
Документация по экспорту данных и клавиатурным сокращениям
Экспорт данных
Поддерживаемые форматы
- Excel (.xlsx) - через библиотеку
xlsx - CSV - текстовый формат с разделителями
- PDF - для отчетов через
jspdfиjspdf-autotable - JSON - для разработчиков
Использование
Экспорт в Excel
import { exportToExcel } from '@/lib/export';
exportToExcel(data, {
filename: 'aircraft-export',
sheetName: 'Воздушные суда',
headers: ['Регистрационный номер', 'Тип ВС', 'Оператор'],
columns: ['registrationNumber', 'aircraftType', 'operator'],
});
Экспорт в CSV
import { exportToCSV } from '@/lib/export';
exportToCSV(data, {
filename: 'aircraft-export',
headers: ['Регистрационный номер', 'Тип ВС'],
columns: ['registrationNumber', 'aircraftType'],
delimiter: ',',
});
Экспорт в PDF
import { exportToPDF } from '@/lib/export';
exportToPDF(data, {
filename: 'aircraft-report',
title: 'Отчет по воздушным судам',
headers: ['Регистрационный номер', 'Тип ВС'],
columns: ['registrationNumber', 'aircraftType'],
orientation: 'portrait',
});
Экспорт в JSON
import { exportToJSON } from '@/lib/export';
exportToJSON(data, {
filename: 'aircraft-data',
pretty: true,
});
Компонент ExportModal
Модальное окно для экспорта с выбором формата и колонок:
<ExportModal
isOpen={isExportModalOpen}
onClose={() => setIsExportModalOpen(false)}
data={aircraft}
filename="aircraft-export"
title="Экспорт воздушных судов"
availableColumns={Object.keys(aircraft[0])}
columnLabels={{
registrationNumber: 'Регистрационный номер',
aircraftType: 'Тип ВС',
}}
/>
Сохранение состояния
useLocalStorage
Базовый хук для работы с localStorage:
import { useLocalStorage } from '@/hooks/useLocalStorage';
const [value, setValue] = useLocalStorage('key', initialValue);
useFilters
Хук для сохранения фильтров:
import { useFilters } from '@/hooks/useLocalStorage';
const [filters, setFilters, resetFilters] = useFilters('dashboardFilters', {
search: '',
status: 'all',
});
useUserSettings
Хук для настроек пользователя:
import { useUserSettings } from '@/hooks/useLocalStorage';
const { theme, setTheme, language, setLanguage } = useUserSettings();
useFavorites
Хук для избранного:
import { useFavorites } from '@/hooks/useLocalStorage';
const { favorites, addFavorite, removeFavorite, isFavorite, toggleFavorite } = useFavorites();
useLastVisited
Хук для последних посещенных страниц:
import { useLastVisited } from '@/hooks/useLocalStorage';
const { lastVisited, addVisited } = useLastVisited();
Клавиатурные сокращения
Глобальные горячие клавиши
- Ctrl+K (или Cmd+K на Mac) - Глобальный поиск
- Ctrl+N (или Cmd+N на Mac) - Создать новую запись
- Ctrl+S (или Cmd+S на Mac) - Сохранить форму
- Esc - Закрыть модальное окно
Использование
useGlobalShortcuts
import { useGlobalShortcuts } from '@/hooks/useKeyboardShortcuts';
useGlobalShortcuts({
onSearch: () => setIsSearchModalOpen(true),
onCreateNew: () => router.push('/aircraft'),
onSave: () => handleSave(),
onClose: () => setIsModalOpen(false),
});
useKeyboardShortcuts
Для кастомных горячих клавиш:
import { useKeyboardShortcuts } from '@/hooks/useKeyboardShortcuts';
useKeyboardShortcuts([
{
key: 'k',
ctrl: true,
handler: () => console.log('Ctrl+K pressed'),
description: 'Глобальный поиск',
},
]);
Показ подсказок
Компонент для отображения подсказок по горячим клавишам:
import { KeyboardShortcutsHelp, useShortcutsHelp } from '@/hooks/useKeyboardShortcuts';
function MyComponent() {
const { showHelp, setShowHelp } = useShortcutsHelp();
return (
<>
{showHelp && <KeyboardShortcutsHelp />}
<button onClick={() => setShowHelp(true)}>Показать горячие клавиши</button>
</>
);
}
Нажмите Ctrl+? (или Cmd+? на Mac) для показа/скрытия подсказок.
Примеры использования
Экспорт с фильтрами
const [filters] = useFilters('aircraftFilters', { status: 'all' });
const filteredData = aircraft.filter(a => {
if (filters.status !== 'all') {
return a.status === filters.status;
}
return true;
});
exportToExcel(filteredData, { filename: 'filtered-aircraft' });
Сохранение состояния формы
const [formData, setFormData] = useLocalStorage('aircraftForm', {
registrationNumber: '',
aircraftType: '',
});
Избранное
const { isFavorite, toggleFavorite } = useFavorites<Aircraft>();
<button onClick={() => toggleFavorite(aircraft)}>
{isFavorite(aircraft.id) ? '★' : '☆'}
</button>
Дата создания: 2025-01-22
Версия: 1.0