{{ t('deviceList') }} ({{total}})
| SN | BCU | PCS | {{ t('ioServer') }} | {{ t('serialServer') }} | {{ t('stationCode') }} | {{ t('port') }} | {{ t('actions') }} |
|---|---|---|---|---|---|---|---|
| {{d.sn}} | {{d.bcu_ip}} | {{d.pcs_ip}} | {{d.io_server_ip}} | {{d.serial_server_ip}} | {{d.station_code}} | {{d.port}} |
{{ t('totalPages', {n: totalPages}) }}
{{ t('snQueryTitle') }}
{{snQueryError}}
| SN | Station Code | BCU IP | PCS IP | {{ t('ioServerIP') }} | {{ t('serialServerIP') }} | {{ t('status') }} |
|---|---|---|---|---|---|---|
| {{r.sn}} | {{r.station_code || '—'}} | {{r.bcu_ip || '—'}} | {{r.pcs_ip || '—'}} | {{r.io_server_ip || '—'}} | {{r.serial_server_ip || '—'}} | — {{ t('probing') }} 🟢 {{ t('online') }} 🔴 {{ t('offline') }} |
{{ t('noMatchDevice') }}
📁 {{ t('subLocalTemplates') }}
🔌 {{ t('subIOConfigs') }}
🏢 {{ t('subProductModels') }}
🗂 {{ t('subManagedDirs') }}
{{ t('managedDirMgmt') }}
{{dirLog}}
| {{ t('dirPath') }} | {{ t('fileCount') }} | {{ t('fileSize') }} | {{ t('dirFiles') }} | {{ t('actions') }} |
|---|---|---|---|---|
| {{d.rel}} | {{d.file_count}} | {{ (d.total_size/1024).toFixed(1) }} KB | {{ (d.files||[]).join(', ') || '—' }} | |
| {{ t('noManagedDirs') }} | ||||
{{ t('productModelMgmt') }}
| {{ t('modelName') }} | {{ t('defaultProtocolMap') }} | {{ t('actions') }} |
|---|---|---|
| {{m.model_name}} | {{JSON.stringify(m.default_protocols, null, 2)}} | |
| {{ t('noProductModels') }} | ||
{{ t('localTplList') }} ({{localTemplates.length}})
| {{ t('folderName') }} | {{ t('templateName') }} | {{ t('category') }} | {{ t('deviceType') }} | {{ t('protocol') }} | {{ t('csvFiles') }} | {{ t('syncStatus') }} | {{ t('actions') }} |
|---|---|---|---|---|---|---|---|
| {{lt.folder_name}} | {{lt.template_name}} | {{ t('builtin') }} {{ t('custom') }} | {{lt.device_type}} | {{lt.protocol}} | {{csv}}.csv {{ t('calcPoints') }} | {{ t('synced') }} {{ t('modified') }} {{ t('notSynced') }} {{ t('unknown') }} | |
| {{ t('noLocalTpls') }} | |||||||
{{ t('ioConfigList') }} ({{ioConfigs.length}})
| {{ t('folder') }} | {{ t('templateName') }} | {{ t('description') }} | {{ t('protocol') }} | {{ t('moduleCount') }} | {{ t('wiringDiagram') }} | {{ t('syncStatus') }} | {{ t('actions') }} |
|---|---|---|---|---|---|---|---|
| {{cfg.folder_name}} | {{cfg.template_name}} | {{cfg.description || '—'}} | {{cfg.protocol}} | {{cfg.module_count}} | {{ t('primaryDiagram') }} {{ t('secondaryDiagram') }} — | {{ t('synced') }} {{ t('modified') }} {{ t('notSynced') }} {{ t('unknown') }} | |
| {{ t('noIOConfigs') }} | |||||||
{{ t('firmwareMgmt') }}
{{firmwareLog}}
| {{ t('status') }} | {{ t('versionLabel') }} | {{ t('buildDate') }} | {{ t('physicalFilename') }} | {{ t('packageSize') }} | {{ t('changelogLabel') }} | {{ t('uploadTime') }} | {{ t('actions') }} |
|---|---|---|---|---|---|---|---|
| {{ t('activeNow') }} {{ t('historyVersion') }} |
{{fw.version}}
FE: {{fw.frontend_version || '—'}}
BE: {{fw.backend_version || '—'}}
|
{{fw.build_date || '—'}} | {{fw.filename}} | {{fw.size_mb}} MB | {{new Date(fw.uploaded_at).toLocaleString()}} | ||
| {{ t('noFirmware') }} | |||||||
{{ t('toolMgmt') }}
{{toolUpgradeLog}}
| {{ t('status') }} | {{ t('version') }} | {{ t('filename') }} | {{ t('fileSize') }} | {{ t('releaseDate') }} | {{ t('changelog') }} | {{ t('actions') }} |
|---|---|---|---|---|---|---|
| {{ t('activeNow') }} {{ t('historyVersion') }} | {{tv.version}} | {{tv.filename}} | {{tv.size_mb}} MB | {{tv.release_date || '—'}} | ||
| {{ t('noToolVersions') }} | ||||||
{{ t('installerMgmt') }}
{{installerLog}}
| {{ t('version') }} | {{ t('filename') }} | {{ t('fileSize') }} | {{ t('releaseDate') }} | {{ t('actions') }} |
|---|---|---|---|---|
| {{it.version}} {{ t('latestBadge') }} | {{it.filename}} | {{it.size_mb}} MB | {{it.release_date || '—'}} | ⬇️ {{ t('downloadBtn') }} |
| {{ t('noInstallers') }} | ||||
{{ t('importTitle') }}
💡 {{ t('importGuide') }}
- {{ t('importGuide1') }}
- {{ t('requiredCol') }}{{ t('importGuide2') }}
- {{ t('otherCol') }}{{ t('importGuide3') }}
- {{ t('importGuide4') }}
{{ t('uploadZoneText') }}
{{log}}
{{ t('configMgmt') }}
| SN | {{ t('stationName') }} | {{ t('productModel') }} | {{ t('filename') }} | {{ t('fileSize') }} | {{ t('uploadTime') }} | {{ t('actions') }} |
|---|---|---|---|---|---|---|
| {{c.sn}} | {{c.station_name || '—'}} | {{c.product_model || '—'}} | {{c.filename}} | {{formatFileSize(c.file_size)}} | {{c.uploaded_at}} | |
| {{ t('noConfigs') }} | ||||||
{{ t('userMgmt') }} ({{users.length}})
| ID | {{ t('username') }} | {{ t('role') }} | {{ t('actions') }} |
|---|---|---|---|
| {{u.id}} | {{u.username}} | {{u.role}} |
{{ t('changePwdTitle') }}
{{ t('securityMgmt') }}
{{ t('newTokenHint') }}
{{newlyGeneratedToken}}
| {{ t('token') }} | {{ t('type') }} | {{ t('status') }} | {{ t('usedByDevice') }} | {{ t('applicant') }} | {{ t('createdAt') }} | {{ t('expiresAt') }} | {{ t('note') }} | {{ t('actions') }} |
|---|---|---|---|---|---|---|---|---|
| {{tok.token}} | {{tok.token_type === 'onetime' ? t('onetime') : t('timed')}} | {{tok.status === 'active' ? t('statusActive') : tok.status === 'used' ? t('statusUsed') : t('statusExpired')}} | {{tok.used_by_sn || '—'}} | {{tok.created_by || '—'}} | {{formatTime(tok.created_at)}} | {{tok.expires_at ? formatTime(tok.expires_at) : '—'}} | {{tok.note || '—'}} | |
| {{ t('noTokens') }} | ||||||||