Skip to content
28 changes: 28 additions & 0 deletions static/scripts/localizable.js
Original file line number Diff line number Diff line change
Expand Up @@ -195,6 +195,34 @@ let _localizable = {
"cs": "Tag",
"it": "Etichetta"
},
"status": {
"ru": "Бтатус",
"en": "Status",
"de": "Status",
"cs": "Stav",
"it": "Stato"
},
"status_static": {
"ru": "Π‘Ρ‚Π°Ρ‚ΠΈΡ‡Π½Ρ‹ΠΉ",
"en": "Static",
"de": "Statisch",
"cs": "StatickΓ½",
"it": "Statico"
},
"status_converting": {
"ru": "ΠšΠΎΠ½Π²Π΅Ρ€Ρ‚Π°Ρ†ΠΈΡ",
"en": "Converting",
"de": "Konvertierung",
"cs": "Konverze",
"it": "Conversione"
},
"status_streaming": {
"ru": "ΠŸΠΎΡ‚ΠΎΠΊΠΎΠ²Ρ‹ΠΉ",
"en": "Streaming",
"de": "Streaming",
"cs": "StreamovΓ‘nΓ­",
"it": "Streaming"
},
"list_compilation": {
"ru": "БоставлСния списка...",
"en": "List compilation...",
Expand Down
48 changes: 46 additions & 2 deletions static/scripts/ocap.ui.js
Original file line number Diff line number Diff line change
Expand Up @@ -513,6 +513,44 @@ class UI {
this.modalFilter.style.display = "inherit";
};

/**
* Returns status display info for an operation based on its storage format and conversion status.
* @param {Object} op - Operation object with storageFormat and conversionStatus fields
* @returns {{icon: string, textKey: string, tooltip: string}}
*/
getOperationStatusInfo (op) {
const format = op.storageFormat || 'json';
const conversionStatus = op.conversionStatus || 'completed';
const targetFormat = format === 'flatbuffers' ? 'FlatBuffers' : 'Protobuf';

if (conversionStatus === 'pending') {
// Queued for conversion
return {
icon: '⏳',
tooltip: 'Converting (JSON β†’ ' + targetFormat + ')'
};
} else if (conversionStatus === 'converting') {
// Actively converting
return {
icon: 'βš™οΈ',
tooltip: 'Converting (JSON β†’ ' + targetFormat + ')'
};
} else if (format === 'protobuf' || format === 'flatbuffers') {
// Binary format = streaming
const formatName = format === 'protobuf' ? 'Protobuf' : 'FlatBuffers';
return {
icon: 'πŸ“‘',
tooltip: 'Streaming (' + formatName + ')'
};
} else {
// JSON, completed (no conversion or conversion not enabled)
return {
icon: 'πŸ“„',
tooltip: 'Static (JSON)'
};
}
}

setModalOpList () {
var OpList;
var n = filterTagGameInput.options.selectedIndex;
Expand Down Expand Up @@ -552,7 +590,7 @@ class UI {
var table = document.createElement("table");
var headerRow = document.createElement("tr");

var columnNames = ["mission", "map", "data", "durability", "tag"];
var columnNames = ["mission", "map", "data", "durability", "tag", "status"];
columnNames.forEach(function (name) {
var th = document.createElement("th");
localizable(th, name);
Expand All @@ -563,7 +601,6 @@ class UI {

OpList.forEach((op) => {
var row = document.createElement("tr");
var cell = document.createElement("td");

var vals = [
op.mission_name,
Expand All @@ -578,6 +615,13 @@ class UI {
row.appendChild(cell);
});

// Add status cell with icon and tooltip
var statusCell = document.createElement("td");
var statusInfo = this.getOperationStatusInfo(op);
statusCell.textContent = statusInfo.icon;
statusCell.title = statusInfo.tooltip;
row.appendChild(statusCell);

row.addEventListener("click", () => {
localizable(this.modalBody, "loading");
loadOperation(op);
Expand Down
Loading