diff --git a/code/datums/components/material/remote_materials.dm b/code/datums/components/material/remote_materials.dm
index 33d85a5376f..41fa6599224 100644
--- a/code/datums/components/material/remote_materials.dm
+++ b/code/datums/components/material/remote_materials.dm
@@ -74,7 +74,6 @@ handles linking back and forth.
if (silo)
silo.ore_connected_machines -= src
silo.holds -= src
- silo.updateUsrDialog()
silo = null
mat_container = null
return ..()
@@ -170,7 +169,6 @@ handles linking back and forth.
if (silo)
silo.ore_connected_machines -= src
silo.holds -= src
- silo.updateUsrDialog()
else if (mat_container)
//transfer all mats to silo. whatever cannot be transfered is dumped out as sheets
if(mat_container.total_amount())
@@ -183,7 +181,6 @@ handles linking back and forth.
qdel(mat_container)
silo = new_silo
silo.ore_connected_machines += src
- silo.updateUsrDialog()
mat_container = new_container
if(!(mat_container_flags & MATCONTAINER_NO_INSERT))
RegisterSignal(parent, COMSIG_ATOM_ATTACKBY, TYPE_PROC_REF(/datum/component/remote_materials, SiloAttackBy))
diff --git a/code/modules/mining/machine_silo.dm b/code/modules/mining/machine_silo.dm
index dcc85dc1c1c..66c9a370e77 100644
--- a/code/modules/mining/machine_silo.dm
+++ b/code/modules/mining/machine_silo.dm
@@ -8,7 +8,7 @@ GLOBAL_LIST_EMPTY(silo_access_logs)
icon_state = "silo"
density = TRUE
circuit = /obj/item/circuitboard/machine/ore_silo
- interaction_flags_machine = INTERACT_MACHINE_WIRES_IF_OPEN|INTERACT_MACHINE_ALLOW_SILICON|INTERACT_MACHINE_OPEN_SILICON|INTERACT_MACHINE_SET_MACHINE
+ interaction_flags_machine = INTERACT_MACHINE_WIRES_IF_OPEN|INTERACT_MACHINE_ALLOW_SILICON|INTERACT_MACHINE_OPEN_SILICON
/// The machine UI's page of logs showing ore history.
var/log_page = 1
@@ -77,93 +77,79 @@ GLOBAL_LIST_EMPTY(silo_access_logs)
/obj/machinery/ore_silo/crowbar_act(mob/living/user, obj/item/tool)
return default_deconstruction_crowbar(tool)
-/obj/machinery/ore_silo/ui_interact(mob/user)
- user.set_machine(src)
- var/datum/browser/popup = new(user, "ore_silo", null, 600, 550)
- popup.set_content(generate_ui())
- popup.open()
+/obj/machinery/ore_silo/ui_assets(mob/user)
+ return list(
+ get_asset_datum(/datum/asset/spritesheet/sheetmaterials)
+ )
-/obj/machinery/ore_silo/proc/generate_ui()
- var/list/ui = list("
Ore SiloStored Material:
")
- var/any = FALSE
- for(var/M in materials.materials)
- var/datum/material/mat = M
- var/amount = materials.materials[M]
- var/sheets = round(amount) / SHEET_MATERIAL_AMOUNT
- var/ref = REF(M)
- if (sheets)
- if (sheets >= 1)
- ui += "
Eject"
- else
- ui += "
Eject"
- if (sheets >= 20)
- ui += "
20x"
- else
- ui += "
20x"
- ui += "
[mat.name]: [sheets] sheets
"
- any = TRUE
- if(!any)
- ui += "Nothing!"
+/obj/machinery/ore_silo/ui_interact(mob/user, datum/tgui/ui)
+ ui = SStgui.try_update_ui(user, src, ui)
+ if(!ui)
+ ui = new(user, src, "OreSilo")
+ ui.open()
- ui += "
Connected Machines:
"
- for(var/datum/component/remote_materials/mats as anything in ore_connected_machines)
- var/atom/parent = mats.parent
- ui += "
Remove"
- ui += "
[holds[mats] ? "Allow" : "Hold"]"
- ui += "
[parent.name] in [get_area_name(parent, TRUE)]
"
- if(!ore_connected_machines.len)
- ui += "Nothing!"
+/obj/machinery/ore_silo/ui_static_data(mob/user)
+ return materials.ui_static_data()
- ui += "
Access Logs:
"
- var/list/logs = GLOB.silo_access_logs[REF(src)]
- var/len = LAZYLEN(logs)
- var/num_pages = 1 + round((len - 1) / 30)
- var/page = clamp(log_page, 1, num_pages)
- if(num_pages > 1)
- for(var/i in 1 to num_pages)
- if(i == page)
- ui += "
[i]"
- else
- ui += "
[i]"
+/obj/machinery/ore_silo/ui_data(mob/user)
+ var/list/data = list(
+ "materials" = materials.ui_data()
+ )
- ui += "
"
- any = FALSE
- for(var/i in (page - 1) * 30 + 1 to min(page * 30, len))
- var/datum/ore_silo_log/entry = logs[i]
- ui += "- [entry.formatted]
"
- any = TRUE
- if (!any)
- ui += "- Nothing!
"
+ var/list/connected_data
+ for(var/datum/component/remote_materials/remote as anything in ore_connected_machines)
+ var/atom/parent = remote.parent
+ var/icon/parent_icon = icon(initial(parent.icon), initial(parent.icon_state), frame = 1)
+ var/list/remote_data = list(
+ "ref" = REF(remote),
+ "icon" = icon2base64(parent_icon),
+ "name" = parent.name,
+ "onHold" = holds[remote] ? TRUE : FALSE,
+ "location" = get_area_name(parent, TRUE)
+ )
+ LAZYADD(connected_data, list(remote_data))
+ LAZYSET(data, "machines", connected_data)
- ui += "
"
- return ui.Join()
+ var/list/logs_data
+ for(var/datum/ore_silo_log/entry as anything in GLOB.silo_access_logs[REF(src)])
+ var/list/log_data = list(
+ "rawMaterials" = entry.get_raw_materials(""),
+ "machineName" = entry.machine_name,
+ "areaName" = entry.area_name,
+ "action" = entry.action,
+ "amount" = entry.amount,
+ "time" = entry.timestamp,
+ "noun" = entry.noun
+ )
+ LAZYADD(logs_data, list(log_data))
+ LAZYSET(data, "logs", logs_data)
-/obj/machinery/ore_silo/Topic(href, href_list)
- if(..())
+ return data
+
+/obj/machinery/ore_silo/ui_act(action, list/params)
+ . = ..()
+ if(.)
return
- add_fingerprint(usr)
- usr.set_machine(src)
- if(href_list["remove"])
- var/datum/component/remote_materials/mats = locate(href_list["remove"]) in ore_connected_machines
- if (mats)
- mats.disconnect_from(src)
- updateUsrDialog()
+ switch(action)
+ if("remove")
+ var/datum/component/remote_materials/remote = locate(params["ref"]) in ore_connected_machines
+ remote?.disconnect_from(src)
+ return TRUE
+
+ if("hold")
+ var/datum/component/remote_materials/remote = locate(params["ref"]) in ore_connected_machines
+ remote?.toggle_holding()
+ return TRUE
+
+ if("eject")
+ var/datum/material/ejecting = locate(params["ref"])
+ var/amount = text2num(params["amount"])
+ if(!isnum(amount) || !istype(ejecting))
+ return TRUE
+
+ materials.retrieve_sheets(amount, ejecting, drop_location())
return TRUE
- else if(href_list["hold"])
- var/datum/component/remote_materials/mats = locate(href_list["hold"]) in ore_connected_machines
- mats.toggle_holding()
- updateUsrDialog()
- return TRUE
- else if(href_list["ejectsheet"])
- var/datum/material/eject_sheet = locate(href_list["ejectsheet"])
- var/amount = text2num(href_list["eject_amt"])
- materials.retrieve_sheets(amount, eject_sheet, drop_location())
- return TRUE
- else if(href_list["page"])
- log_page = text2num(href_list["page"]) || 1
- updateUsrDialog()
- return TRUE
/obj/machinery/ore_silo/multitool_act(mob/living/user, obj/item/multitool/I)
. = ..()
@@ -192,7 +178,6 @@ GLOBAL_LIST_EMPTY(silo_access_logs)
else if(!logs[1].merge(entry))
logs.Insert(1, entry)
- updateUsrDialog()
flick("silo_active", src)
/obj/machinery/ore_silo/examine(mob/user)
@@ -219,7 +204,6 @@ GLOBAL_LIST_EMPTY(silo_access_logs)
amount = _amount
noun = _noun
materials = mats.Copy()
- format()
var/list/data = list(
"machine_name" = machine_name,
"area_name" = AREACOORD(M),
@@ -245,13 +229,8 @@ GLOBAL_LIST_EMPTY(silo_access_logs)
amount += other.amount
for(var/each in other.materials)
materials[each] += other.materials[each]
- format()
return TRUE
-/datum/ore_silo_log/proc/format()
- name = "[machine_name]: [action] [amount]x [noun]"
- formatted = "([timestamp]) [machine_name] in [area_name]
[action] [abs(amount)]x [noun]
[get_raw_materials("")]"
-
/datum/ore_silo_log/proc/get_raw_materials(separator)
var/list/msg = list()
for(var/key in materials)
diff --git a/tgui/packages/tgui/interfaces/Fabrication/MaterialAccessBar.tsx b/tgui/packages/tgui/interfaces/Fabrication/MaterialAccessBar.tsx
index 0a099a51165..2936d93df3f 100644
--- a/tgui/packages/tgui/interfaces/Fabrication/MaterialAccessBar.tsx
+++ b/tgui/packages/tgui/interfaces/Fabrication/MaterialAccessBar.tsx
@@ -2,7 +2,7 @@ import { sortBy } from 'common/collections';
import { classes } from 'common/react';
import { useState } from 'react';
-import { AnimatedNumber, Button, Flex, Stack } from '../../components';
+import { AnimatedNumber, Button, Flex } from '../../components';
import { formatSiUnit } from '../../format';
import { MaterialIcon } from './MaterialIcon';
import { Material } from './Types';
@@ -57,7 +57,7 @@ export const MaterialAccessBar = (props: MaterialAccessBarProps) => {
{sortBy((m: Material) => MATERIAL_RARITY[m.name])(availableMaterials).map(
(material) => (
-
+
{
sheets < 1 && 'MaterialDock--disabled',
])}
>
-
+
{
)}
-
+
);
};
diff --git a/tgui/packages/tgui/interfaces/OreSilo.tsx b/tgui/packages/tgui/interfaces/OreSilo.tsx
new file mode 100644
index 00000000000..844453400b6
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/OreSilo.tsx
@@ -0,0 +1,205 @@
+import { classes } from 'common/react';
+import { capitalize } from 'common/string';
+import { useState } from 'react';
+
+import { useBackend } from '../backend';
+import {
+ Box,
+ Icon,
+ Image,
+ LabeledList,
+ NoticeBox,
+ Section,
+ Stack,
+ Tabs,
+ Tooltip,
+} from '../components';
+import { Window } from '../layouts';
+import { MaterialAccessBar } from './Fabrication/MaterialAccessBar';
+import { Material } from './Fabrication/Types';
+
+type Machine = {
+ ref: string;
+ name: string;
+ icon: string;
+ onHold: boolean;
+ location: string;
+};
+
+type Log = {
+ rawMaterials: string;
+ machineName: string;
+ areaName: string;
+ action: string;
+ amount: number;
+ time: string;
+ noun: string;
+};
+
+type OreSiloData = {
+ SHEET_MATERIAL_AMOUNT: number;
+ materials: Material[];
+ machines: Machine[];
+ logs: Log[];
+};
+
+export const OreSilo = (props: any, context: any) => {
+ const { act, data } = useBackend();
+ const { SHEET_MATERIAL_AMOUNT, machines, logs } = data;
+
+ const [currentTab, setCurrentTab] = useState(0);
+
+ return (
+
+
+
+
+
+ setCurrentTab(0)}
+ >
+ Connections
+
+ setCurrentTab(1)}
+ >
+ Logs
+
+
+
+
+ {currentTab === 0 ? (
+ !!machines && machines.length > 0 ? (
+
+ {machines.map((machine, index) => (
+ act('hold', { ref: machine.ref })}
+ onRemove={(machine) =>
+ act('remove', { ref: machine.ref })
+ }
+ />
+ ))}
+
+ ) : (
+ No machines connected!
+ )
+ ) : null}
+ {currentTab === 1 ? (
+ !!logs && logs.length > 0 ? (
+
+ {logs.map((log, index) => (
+
+ ))}
+
+ ) : (
+ No log entries currently present!
+ )
+ ) : null}
+
+
+
+
+ act('eject', { ref: material.ref, amount })
+ }
+ />
+
+
+
+
+
+ );
+};
+
+type MachineProps = {
+ machine: Machine;
+ onPause: (machine: Machine) => void;
+ onRemove: (machine: Machine) => void;
+};
+
+const MachineDisplay = (props: MachineProps) => {
+ const { machine, onPause, onRemove } = props;
+
+ return (
+
+
+
+
+
+ {machine.name}
+
+
+
+ {
+ onPause(machine);
+ }}
+ >
+
+
+
+
+ {
+ onRemove(machine);
+ }}
+ >
+
+
+
+
+ );
+};
+
+type LogProps = {
+ log: Log;
+};
+
+const LogEntry = (props: LogProps) => {
+ const { log } = props;
+ return (
+
+
+ {log.time}
+
+ {capitalize(log.machineName)}
+
+ {log.areaName}
+ 0 ? 'good' : 'bad'}
+ >
+ {log.rawMaterials}
+
+
+
+ );
+};