fix: download button always visible; KKT test shows DTO setup instructions

- Download button shows even without latest release (grayed out state)
- KKT test error "ДТО не запущен" now shows 3-step setup guide with atol.ru link

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-27 14:39:00 +03:00
parent f882cb2481
commit be311a2b30

View File

@@ -685,18 +685,35 @@ function WorkstationCard({
</button> </button>
</div> </div>
</div> </div>
{testResults[device.id] !== undefined && testResults[device.id] !== null && ( {testResults[device.id] !== undefined && testResults[device.id] !== null && (() => {
const res = testResults[device.id]!
const isDtoError = !res.ok && res.msg.includes('ДТО')
return (
<div className={cn( <div className={cn(
'mt-1 px-3 py-1.5 rounded-lg text-xs font-medium flex items-center gap-1.5', 'mt-1 px-3 py-2 rounded-lg text-xs font-medium flex flex-col gap-1',
testResults[device.id]!.ok res.ok
? 'bg-emerald-50 text-emerald-700 dark:bg-emerald-900/20 dark:text-emerald-400' ? 'bg-emerald-50 text-emerald-700 dark:bg-emerald-900/20 dark:text-emerald-400'
: 'bg-red-50 text-red-700 dark:bg-red-900/20 dark:text-red-400', : 'bg-red-50 text-red-700 dark:bg-red-900/20 dark:text-red-400',
)}> )}>
{testResults[device.id]!.ok ? <Check size={11} /> : <X size={11} />} <span className="flex items-center gap-1.5">
{testResults[device.id]!.msg || (testResults[device.id]!.ok ? 'Успешно' : 'Ошибка')} {res.ok ? <Check size={11} /> : <X size={11} />}
{res.msg || (res.ok ? 'Успешно' : 'Ошибка')}
</span>
{isDtoError && (
<div className="mt-0.5 pl-4 space-y-0.5 font-normal text-red-600 dark:text-red-400">
<p>Для работы кассы нужно установить и запустить <strong>АТОЛ ДТО 10</strong>:</p>
<ol className="list-decimal list-inside space-y-0.5 pl-1">
<li>Скачайте бесплатно с <a href="https://atol.ru" target="_blank" rel="noreferrer" className="underline">atol.ru</a> Поддержка ДТО 10</li>
<li>Установите и запустите службу <strong>ATOL DTO Service</strong></li>
<li>Порт по умолчанию: <strong>16732</strong></li>
</ol>
</div> </div>
)} )}
</div> </div>
)
})()}
)}
</div>
)} )}
</div> </div>
))} ))}
@@ -818,7 +835,7 @@ export function EquipmentPage() {
{updatingAll ? 'Отправка...' : 'Обновить все'} {updatingAll ? 'Отправка...' : 'Обновить все'}
</button> </button>
)} )}
{latestRelease && ( {latestRelease ? (
<a <a
href={latestRelease.downloadUrl} href={latestRelease.downloadUrl}
download download
@@ -828,6 +845,11 @@ export function EquipmentPage() {
<Download size={15} /> <Download size={15} />
Скачать агент v{latestRelease.version} Скачать агент v{latestRelease.version}
</a> </a>
) : (
<span className="inline-flex items-center gap-1.5 px-3 py-2 rounded-xl text-sm font-medium bg-slate-100 text-slate-400 dark:bg-slate-700 dark:text-slate-500 cursor-not-allowed">
<Download size={15} />
Агент недоступен
</span>
)} )}
<button <button
onClick={() => setShowAdd(true)} onClick={() => setShowAdd(true)}