feat: Обновить компонент HistoryModal, добавив иконку информации и улучшив отображение времени изменения версий с использованием относительного формата. Изменить текст кнопки отката и модального окна подтверждения для более ясного взаимодействия с пользователем.
Publish Fast Tabler Docker image / build-and-push-fast (push) Successful in 1m45s

This commit is contained in:
2025-08-27 21:45:34 +07:00
parent 730017405c
commit c06945eefc
+14 -8
View File
@@ -3,7 +3,8 @@ import api from '../lib/api.js';
import { useQuery } from '@tanstack/react-query';
import ConfirmDialog from './ConfirmDialog.jsx';
import { useNotify } from './NotifyProvider.jsx';
import { IconHistory, IconRefresh, IconDeviceFloppy } from '@tabler/icons-react';
import { IconHistory, IconRefresh, IconDeviceFloppy, IconInfoCircle, IconRotate2 } from '@tabler/icons-react';
import { formatDateTimeWithRelative } from '../lib/datetime.js';
export default function HistoryModal({ resource, show, onClose, onRolledBack }) {
const [loading, setLoading] = useState(false);
@@ -72,7 +73,10 @@ export default function HistoryModal({ resource, show, onClose, onRolledBack })
</div>
<div className="modal-body">
<div className="d-flex justify-content-between align-items-center mb-2">
<div className="text-muted small">Ресурс: <code>{resource}</code></div>
<div className="text-muted small d-flex align-items-center">
<IconInfoCircle size={16} className="me-1" />
Ресурс: <code className="ms-1">{resource}</code>
</div>
<button className="btn btn-outline-secondary btn-sm" onClick={() => refetch()} disabled={loading}>
<IconRefresh className={loading ? 'spin' : ''} />
<span className="ms-1">Обновить</span>
@@ -95,13 +99,13 @@ export default function HistoryModal({ resource, show, onClose, onRolledBack })
) : items.map((v) => (
<tr key={v.versionId} className={v.isLatest ? 'table-info' : ''}>
<td><code>{v.versionId}</code></td>
<td>{v.lastModified ? new Date(v.lastModified).toLocaleString() : '—'}</td>
<td>{v.lastModified ? formatDateTimeWithRelative(v.lastModified) : '—'}</td>
<td>{typeof v.size === 'number' ? `${v.size} байт` : '—'}</td>
<td><code>{v.etag || '—'}</code></td>
<td className="text-end">
{!v.isLatest && (
<button className="btn btn-outline-primary btn-sm" onClick={() => rollback(v.versionId)} disabled={loading}>
<IconDeviceFloppy className="me-1" /> Откатить к этой версии
<button className="btn btn-outline-primary btn-sm" onClick={() => rollback(v.versionId)} disabled={loading} title="Восстановить содержимое файла до этой версии">
<IconRotate2 className="me-1" /> Восстановить
</button>
)}
</td>
@@ -118,9 +122,11 @@ export default function HistoryModal({ resource, show, onClose, onRolledBack })
</div>
<ConfirmDialog
open={confirmState.open}
title="Подтверждение"
message="Откатить к выбранной версии? Текущее содержимое будет перезаписано."
confirmText="Откатить"
title="Восстановить версию файла?"
message="Текущее содержимое будет заменено выбранной версией. Действие можно отменить, выбрав предыдущую версию."
confirmText="Восстановить"
destructive
size={'sm'}
onCancel={() => setConfirmState({ open: false, onConfirm: null })}
onConfirm={confirmState.onConfirm}
/>