+
-
-
- Создание протокола: {template.name}
-
+
+
+
Создание протокола
+ —
+
+ {template.name}
+
@@ -652,10 +634,6 @@ const ProtocolForm: FC
= ({ template, onSave, onBack }) => {
{showSpreadsheet ? 'Скрыть таблицы' : 'Показать таблицы'}
-
@@ -745,7 +724,7 @@ export const ProtocolCreation: FC = () => {
const [selectedTemplate, setSelectedTemplate] = useState
(
null
)
-
+ const toast = useToast()
// Автоматически выбираем шаблон если передан ID в URL
useEffect(() => {
if (templateId && templates.length > 0) {
@@ -757,10 +736,7 @@ export const ProtocolCreation: FC = () => {
}, [templateId, templates])
const handleProtocolSave = (data: Record) => {
- // console.log('Сохранение протокола:', data)
- // Здесь будет логика сохранения протокола
- alert(`Протокол "${data.protocolName}" сохранен!`)
- navigate('/templates')
+ toast.success(`Протокол "${data.protocolName}" сохранен!`)
}
const handleBack = () => {
diff --git a/src/service/fileApiService.ts b/src/service/fileApiService.ts
index 3c329ba..29df205 100644
--- a/src/service/fileApiService.ts
+++ b/src/service/fileApiService.ts
@@ -1,7 +1,10 @@
+import { parseCellRange } from '@/component/DualSpreadsheet/utils'
+import { MergedCell } from '@/type/template'
+
export interface ExcelParseResult {
fileId: string // ID загруженного файла
data: Record
- mergedCells: Array<{ from: string; to: string; value: any }>
+ mergedCells: MergedCell[]
}
export interface ApiUploadResponse {
@@ -67,11 +70,18 @@ export async function parseExcelFile(
// Преобразуем ответ API в формат, ожидаемый приложением
const data = result.cells.cells
- const mergedCells = result.cells.merged.map(merge => ({
- from: merge.from,
- to: merge.to,
- value: data[merge.from] || '',
- }))
+ const mergedCells: MergedCell[] = result.cells.merged.map(merge => {
+ const range = parseCellRange(`${merge.from}:${merge.to}`)
+ return {
+ from: merge.from,
+ to: merge.to,
+ value: data[merge.from] ?? '',
+ startRow: range?.startRow ?? 0,
+ startCol: range?.startCol ?? 0,
+ endRow: range?.endRow ?? 0,
+ endCol: range?.endCol ?? 0,
+ }
+ })
return {
fileId: result.file_id, // Добавляем fileId в возвращаемые данные
@@ -159,11 +169,18 @@ export async function getFileData(fileId: string): Promise {
// Преобразуем данные в формат, ожидаемый приложением
const data = result.file.cells.cells
- const mergedCells = result.file.cells.merged.map(merge => ({
- from: merge.from,
- to: merge.to,
- value: data[merge.from] || '',
- }))
+ const mergedCells: MergedCell[] = result.file.cells.merged.map(merge => {
+ const range = parseCellRange(`${merge.from}:${merge.to}`)
+ return {
+ from: merge.from,
+ to: merge.to,
+ value: data[merge.from] ?? '',
+ startRow: range?.startRow ?? 0,
+ startCol: range?.startCol ?? 0,
+ endRow: range?.endRow ?? 0,
+ endCol: range?.endCol ?? 0,
+ }
+ })
return {
fileId: result.file.id,
diff --git a/src/type/template.ts b/src/type/template.ts
index bada3a1..659e981 100644
--- a/src/type/template.ts
+++ b/src/type/template.ts
@@ -57,6 +57,11 @@ export interface MergedCell {
from: string // начальная ячейка (например, "A1")
to: string // конечная ячейка (например, "C3")
value: any // значение объединенной ячейки
+ // Координаты диапазона (0-based), необходимые для рендера
+ startRow: number
+ startCol: number
+ endRow: number
+ endCol: number
}
// Типы шаблонов
diff --git a/src/widget/template/ui/TemplateCard.tsx b/src/widget/template/ui/TemplateCard.tsx
index e14d443..c6d24b2 100644
--- a/src/widget/template/ui/TemplateCard.tsx
+++ b/src/widget/template/ui/TemplateCard.tsx
@@ -35,8 +35,8 @@ const TemplateCard: React.FC = ({
selectionMode && 'hover:cursor-pointer',
selectionMode &&
isSelected &&
- 'border border-primary ring-2 ring-primary ring-offset-1',
- 'hover:border-primary hover:shadow-lg'
+ 'border-2 border-primary ring-4 ring-primary/30 ring-offset-2',
+ 'hover:border-2 hover:border-primary hover:shadow-lg'
)}
>
{selectionMode && (
@@ -91,20 +91,20 @@ const TemplateCard: React.FC = ({