From 1c91c24dfb193b565461b720ec9b6d1ef7359c7d Mon Sep 17 00:00:00 2001 From: SMOSMOSMOSMOSMO <95004236+SmoSmoSmoSmok@users.noreply.github.com> Date: Sun, 5 Mar 2023 23:15:31 +0200 Subject: [PATCH] ORM ui qol (#73721) ## About The Pull Request seperates everything into tabs and allows u to search. ur credits are displayed on the ui and makes the buttons to print mats similar to fabricators ![image](https://user-images.githubusercontent.com/95004236/222835992-a4ffa622-b718-4f3b-b8c7-9cbc8355c325.png) ## Why It's Good For The Game more fun to use the orm ## Changelog :cl: qol: made ORM easier to use /:cl: --- code/modules/mining/machine_redemption.dm | 59 +++- .../tgui/interfaces/OreRedemptionMachine.js | 285 +++++++++++++----- 2 files changed, 251 insertions(+), 93 deletions(-) diff --git a/code/modules/mining/machine_redemption.dm b/code/modules/mining/machine_redemption.dm index 7be6cd41211..6eb4b28da81 100644 --- a/code/modules/mining/machine_redemption.dm +++ b/code/modules/mining/machine_redemption.dm @@ -213,21 +213,28 @@ /obj/machinery/mineral/ore_redemption/ui_data(mob/user) var/list/data = list() data["unclaimedPoints"] = points - data["materials"] = list() var/datum/component/material_container/mat_container = materials.mat_container if (mat_container) - for(var/mat in mat_container.materials) - var/datum/material/M = mat - var/amount = mat_container.materials[M] + for(var/datum/material/material as anything in mat_container.materials) + var/amount = mat_container.materials[material] var/sheet_amount = amount / MINERAL_MATERIAL_AMOUNT - var/ref = REF(M) - data["materials"] += list(list("name" = M.name, "id" = ref, "amount" = sheet_amount, "value" = ore_values[M.type])) + data["materials"] += list(list( + "name" = material.name, + "id" = REF(material), + "amount" = sheet_amount, + "category" = "material", + "value" = ore_values[material.type], + )) - data["alloys"] = list() - for(var/v in stored_research.researched_designs) - var/datum/design/D = SSresearch.techweb_design_by_id(v) - data["alloys"] += list(list("name" = D.name, "id" = D.id, "amount" = can_smelt_alloy(D))) + for(var/research in stored_research.researched_designs) + var/datum/design/alloy = SSresearch.techweb_design_by_id(research) + data["materials"] += list(list( + "name" = alloy.name, + "id" = alloy.id, + "category" = "alloy", + "amount" = can_smelt_alloy(alloy), + )) if (!mat_container) data["disconnected"] = "local mineral storage is unavailable" @@ -236,8 +243,40 @@ else if (materials.on_hold()) data["disconnected"] = "mineral withdrawal is on hold" + var/obj/item/card/id/card + if(isliving(user)) + var/mob/living/customer = user + card = customer.get_idcard(hand_first = TRUE) + if(card?.registered_account) + data["user"] = list( + "name" = card.registered_account.account_holder, + "cash" = card.registered_account.account_balance, + ) return data +/obj/machinery/mineral/ore_redemption/ui_static_data(mob/user) + var/list/data = list() + + var/datum/component/material_container/mat_container = materials.mat_container + if (mat_container) + for(var/datum/material/material as anything in mat_container.materials) + var/obj/material_display = initial(material.sheet_type) + data["material_icons"] += list(list( + "id" = REF(material), + "product_icon" = icon2base64(getFlatIcon(image(icon = initial(material_display.icon), icon_state = initial(material_display.icon_state)), no_anim=TRUE)), + )) + + for(var/research in stored_research.researched_designs) + var/datum/design/alloy = SSresearch.techweb_design_by_id(research) + var/obj/alloy_display = initial(alloy.build_path) + data["material_icons"] += list(list( + "id" = alloy.id, + "product_icon" = icon2base64(getFlatIcon(image(icon = initial(alloy_display.icon), icon_state = initial(alloy_display.icon_state)), no_anim=TRUE)), + )) + + return data + + /obj/machinery/mineral/ore_redemption/ui_act(action, params) . = ..() if(.) diff --git a/tgui/packages/tgui/interfaces/OreRedemptionMachine.js b/tgui/packages/tgui/interfaces/OreRedemptionMachine.js index 5a387ecb993..89b3f63fd54 100644 --- a/tgui/packages/tgui/interfaces/OreRedemptionMachine.js +++ b/tgui/packages/tgui/interfaces/OreRedemptionMachine.js @@ -1,107 +1,226 @@ -import { toTitleCase } from 'common/string'; -import { useBackend, useLocalState } from '../backend'; -import { BlockQuote, Box, Button, NumberInput, Section, Table } from '../components'; +import { createSearch, toTitleCase } from 'common/string'; +import { useBackend, useLocalState, useSharedState } from '../backend'; +import { BlockQuote, Box, Button, Table, Tabs, Input, Stack, Icon, Section, LabeledList } from '../components'; import { Window } from '../layouts'; +import { formatSiUnit } from '../format'; export const OreRedemptionMachine = (props, context) => { const { act, data } = useBackend(context); - const { unclaimedPoints, materials, alloys } = data; + const { unclaimedPoints, materials, user } = data; + const [tab, setTab] = useSharedState(context, 'tab', 1); + const [searchItem, setSearchItem] = useLocalState(context, 'searchItem', ''); + const [compact, setCompact] = useSharedState(context, 'compact', false); + const search = createSearch(searchItem, (materials) => materials.name); + const material_filtered = + searchItem.length > 0 + ? data.materials.filter(search) + : materials.filter((material) => material && material.category === tab); return ( - - -
-
- This machine only accepts ore. -
- Gibtonite and Slag are not accepted. -
- - - Unclaimed points: - - {unclaimedPoints} -
+ + +
+ + + + + Unclaimed points: + + {unclaimedPoints} +
+
+ +
+ This machine only accepts ore. Gibtonite and Slag are not + accepted. +
+
+
+ + { + setTab('material'); + + if (searchItem.length > 0) { + setSearchItem(''); + } + }}> + Materials + + { + setTab('alloy'); + + if (searchItem.length > 0) { + setSearchItem(''); + } + }}> + Alloys + + { + setSearchItem(value); + + if (value.length > 0) { + setTab(1); + } + }} + fluid /> - - -
- - {materials.map((material) => ( - - act('Release', { - id: material.id, - sheets: amount, - }) - } - /> - ))} -
-
-
- - {alloys.map((material) => ( - - act('Smelt', { - id: material.id, - sheets: amount, - }) - } - /> - ))} -
-
+
+ +
+ + {material_filtered.map((material) => ( + { + if (material.category === 'material') { + act('Release', { + id: material.id, + sheets: amount, + }); + } else { + act('Smelt', { + id: material.id, + sheets: amount, + }); + } + }} + /> + ))} +
+
+
+
); }; const MaterialRow = (props, context) => { + const { data } = useBackend(context); + const { material_icons } = data; const { material, onRelease } = props; + const [compact, setCompact] = useLocalState(context, 'compact', false); - const [amount, setAmount] = useLocalState( - context, - 'amount' + material.name, - 1 + const display = material_icons.find( + (mat_icon) => mat_icon.id === material.id ); - const amountAvailable = Math.floor(material.amount); + const print_amount = 5; + const max_sheets = 50; + return ( - - {toTitleCase(material.name).replace('Alloy', '')} - - - {material.value && material.value + ' cr'} + + {!compact && ( + + + + )} + {toTitleCase(material.name)} + + + {formatSiUnit(material.amount, 0)}{' '} + {material.amount === 1 ? 'sheet' : 'sheets'} - - - {amountAvailable} sheets - - - - setAmount(value)} + +