0.10.2-6 Layout
This commit is contained in:
4
backend/package-lock.json
generated
4
backend/package-lock.json
generated
@@ -1,12 +1,12 @@
|
|||||||
{
|
{
|
||||||
"name": "ripster-backend",
|
"name": "ripster-backend",
|
||||||
"version": "0.10.2-5",
|
"version": "0.10.2-6",
|
||||||
"lockfileVersion": 3,
|
"lockfileVersion": 3,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "ripster-backend",
|
"name": "ripster-backend",
|
||||||
"version": "0.10.2-5",
|
"version": "0.10.2-6",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"archiver": "^7.0.1",
|
"archiver": "^7.0.1",
|
||||||
"cors": "^2.8.5",
|
"cors": "^2.8.5",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "ripster-backend",
|
"name": "ripster-backend",
|
||||||
"version": "0.10.2-5",
|
"version": "0.10.2-6",
|
||||||
"private": true,
|
"private": true,
|
||||||
"type": "commonjs",
|
"type": "commonjs",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
|
|||||||
4
frontend/package-lock.json
generated
4
frontend/package-lock.json
generated
@@ -1,12 +1,12 @@
|
|||||||
{
|
{
|
||||||
"name": "ripster-frontend",
|
"name": "ripster-frontend",
|
||||||
"version": "0.10.2-5",
|
"version": "0.10.2-6",
|
||||||
"lockfileVersion": 3,
|
"lockfileVersion": 3,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "ripster-frontend",
|
"name": "ripster-frontend",
|
||||||
"version": "0.10.2-5",
|
"version": "0.10.2-6",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"primeicons": "^7.0.0",
|
"primeicons": "^7.0.0",
|
||||||
"primereact": "^10.9.2",
|
"primereact": "^10.9.2",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "ripster-frontend",
|
"name": "ripster-frontend",
|
||||||
"version": "0.10.2-5",
|
"version": "0.10.2-6",
|
||||||
"private": true,
|
"private": true,
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
|
|||||||
@@ -880,18 +880,38 @@ export default function DashboardPage({
|
|||||||
const gpuMetrics = monitoringSample?.gpu || null;
|
const gpuMetrics = monitoringSample?.gpu || null;
|
||||||
const storageMetrics = Array.isArray(monitoringSample?.storage) ? monitoringSample.storage : [];
|
const storageMetrics = Array.isArray(monitoringSample?.storage) ? monitoringSample.storage : [];
|
||||||
const storageGroups = useMemo(() => {
|
const storageGroups = useMemo(() => {
|
||||||
const groups = [];
|
// Phase 1: group by mountPoint
|
||||||
|
const phase1 = [];
|
||||||
const mountMap = new Map();
|
const mountMap = new Map();
|
||||||
for (const entry of storageMetrics) {
|
for (const entry of storageMetrics) {
|
||||||
const groupKey = entry?.mountPoint || `__no_mount_${entry?.key}`;
|
const groupKey = entry?.mountPoint || `__no_mount_${entry?.key}`;
|
||||||
if (!mountMap.has(groupKey)) {
|
if (!mountMap.has(groupKey)) {
|
||||||
const group = { mountPoint: entry?.mountPoint || null, entries: [], representative: entry };
|
const group = { mountPoint: entry?.mountPoint || null, entries: [], representative: entry };
|
||||||
mountMap.set(groupKey, group);
|
mountMap.set(groupKey, group);
|
||||||
groups.push(group);
|
phase1.push(group);
|
||||||
}
|
}
|
||||||
mountMap.get(groupKey).entries.push(entry);
|
mountMap.get(groupKey).entries.push(entry);
|
||||||
}
|
}
|
||||||
return groups;
|
|
||||||
|
// Phase 2: merge groups with identical disk signature (same physical disk)
|
||||||
|
const merged = [];
|
||||||
|
const diskSigMap = new Map();
|
||||||
|
for (const group of phase1) {
|
||||||
|
const totalBytes = Number(group.representative?.totalBytes);
|
||||||
|
const freeBytes = Number(group.representative?.freeBytes);
|
||||||
|
if (Number.isFinite(totalBytes) && totalBytes > 0 && Number.isFinite(freeBytes)) {
|
||||||
|
const sig = `${totalBytes}:${freeBytes}`;
|
||||||
|
if (diskSigMap.has(sig)) {
|
||||||
|
diskSigMap.get(sig).entries.push(...group.entries);
|
||||||
|
} else {
|
||||||
|
diskSigMap.set(sig, group);
|
||||||
|
merged.push(group);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
merged.push(group);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return merged;
|
||||||
}, [storageMetrics]);
|
}, [storageMetrics]);
|
||||||
const cpuPerCoreMetrics = Array.isArray(cpuMetrics?.perCore) ? cpuMetrics.perCore : [];
|
const cpuPerCoreMetrics = Array.isArray(cpuMetrics?.perCore) ? cpuMetrics.perCore : [];
|
||||||
const gpuDevices = Array.isArray(gpuMetrics?.devices) ? gpuMetrics.devices : [];
|
const gpuDevices = Array.isArray(gpuMetrics?.devices) ? gpuMetrics.devices : [];
|
||||||
@@ -2495,19 +2515,15 @@ export default function DashboardPage({
|
|||||||
ref={audiobookFileUploadRef}
|
ref={audiobookFileUploadRef}
|
||||||
accept=".aax"
|
accept=".aax"
|
||||||
maxFileSize={10737418240}
|
maxFileSize={10737418240}
|
||||||
|
customUpload
|
||||||
|
uploadHandler={() => void handleAudiobookUpload()}
|
||||||
disabled={audiobookUploadBusy}
|
disabled={audiobookUploadBusy}
|
||||||
onSelect={(e) => setAudiobookUploadFile(e.files[0] || null)}
|
onSelect={(e) => setAudiobookUploadFile(e.files[0] || null)}
|
||||||
onClear={() => setAudiobookUploadFile(null)}
|
onClear={() => setAudiobookUploadFile(null)}
|
||||||
onRemove={() => setAudiobookUploadFile(null)}
|
onRemove={() => setAudiobookUploadFile(null)}
|
||||||
chooseLabel="Auswählen"
|
chooseOptions={{ icon: 'pi pi-images', iconOnly: true, className: 'p-button-rounded p-button-outlined' }}
|
||||||
chooseOptions={{ icon: 'pi pi-folder-open' }}
|
uploadOptions={{ icon: 'pi pi-cloud-upload', iconOnly: true, className: 'p-button-rounded p-button-outlined p-button-success' }}
|
||||||
cancelOptions={{ icon: 'pi pi-times', className: 'p-button-outlined p-button-secondary' }}
|
cancelOptions={{ icon: 'pi pi-times', iconOnly: true, className: 'p-button-rounded p-button-outlined p-button-danger' }}
|
||||||
headerTemplate={(options) => (
|
|
||||||
<div className="aax-upload-header">
|
|
||||||
{options.chooseButton}
|
|
||||||
{options.cancelButton}
|
|
||||||
</div>
|
|
||||||
)}
|
|
||||||
itemTemplate={(file, options) => (
|
itemTemplate={(file, options) => (
|
||||||
<div className="aax-file-item">
|
<div className="aax-file-item">
|
||||||
<i className="pi pi-headphones aax-file-icon" />
|
<i className="pi pi-headphones aax-file-icon" />
|
||||||
|
|||||||
@@ -1112,15 +1112,6 @@ body {
|
|||||||
white-space: normal;
|
white-space: normal;
|
||||||
}
|
}
|
||||||
|
|
||||||
.aax-upload-header {
|
|
||||||
display: flex;
|
|
||||||
gap: 0.5rem;
|
|
||||||
padding: 0.5rem 0.75rem;
|
|
||||||
border-bottom: 1px solid var(--rip-border);
|
|
||||||
background: var(--rip-panel-soft);
|
|
||||||
border-radius: 0.5rem 0.5rem 0 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.aax-drop-zone {
|
.aax-drop-zone {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
@@ -3659,7 +3650,7 @@ body {
|
|||||||
|
|
||||||
.runtime-activity-grid {
|
.runtime-activity-grid {
|
||||||
display: grid;
|
display: grid;
|
||||||
grid-template-columns: repeat(2, minmax(0, 1fr));
|
grid-template-columns: minmax(0, 1fr);
|
||||||
gap: 0.75rem;
|
gap: 0.75rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
4
package-lock.json
generated
4
package-lock.json
generated
@@ -1,12 +1,12 @@
|
|||||||
{
|
{
|
||||||
"name": "ripster",
|
"name": "ripster",
|
||||||
"version": "0.10.2-5",
|
"version": "0.10.2-6",
|
||||||
"lockfileVersion": 3,
|
"lockfileVersion": 3,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "ripster",
|
"name": "ripster",
|
||||||
"version": "0.10.2-5",
|
"version": "0.10.2-6",
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"concurrently": "^9.1.2"
|
"concurrently": "^9.1.2"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "ripster",
|
"name": "ripster",
|
||||||
"private": true,
|
"private": true,
|
||||||
"version": "0.10.2-5",
|
"version": "0.10.2-6",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "concurrently \"npm run dev --prefix backend\" \"npm run dev --prefix frontend\"",
|
"dev": "concurrently \"npm run dev --prefix backend\" \"npm run dev --prefix frontend\"",
|
||||||
"dev:backend": "npm run dev --prefix backend",
|
"dev:backend": "npm run dev --prefix backend",
|
||||||
|
|||||||
Reference in New Issue
Block a user