From 1dfd637c80db396ee35fe459370be93b61c2d313 Mon Sep 17 00:00:00 2001 From: AffectedArc07 <25063394+AffectedArc07@users.noreply.github.com> Date: Thu, 22 Oct 2020 22:16:11 +0100 Subject: [PATCH] [TGUI] Accounts Uplink Terminal (#14697) * TGUI Accounts Uplink Terminal * Mochi tweaks --- code/modules/economy/Accounts.dm | 5 +- code/modules/economy/Accounts_DB.dm | 365 +++++++++--------- nano/templates/accounts_terminal.tmpl | 146 ------- .../tgui/interfaces/AccountsUplinkTerminal.js | 288 ++++++++++++++ tgui/packages/tgui/public/tgui.bundle.css | 2 +- tgui/packages/tgui/public/tgui.bundle.js | 6 +- .../interfaces/AccountsUplinkTerminal.scss | 20 + tgui/packages/tgui/styles/main.scss | 1 + 8 files changed, 491 insertions(+), 342 deletions(-) delete mode 100644 nano/templates/accounts_terminal.tmpl create mode 100644 tgui/packages/tgui/interfaces/AccountsUplinkTerminal.js create mode 100644 tgui/packages/tgui/styles/interfaces/AccountsUplinkTerminal.scss diff --git a/code/modules/economy/Accounts.dm b/code/modules/economy/Accounts.dm index 0a2b500a0d3..19e2bcafe0b 100644 --- a/code/modules/economy/Accounts.dm +++ b/code/modules/economy/Accounts.dm @@ -87,8 +87,9 @@ GLOBAL_LIST_EMPTY(all_money_accounts) R.name = "Account information: [M.owner_name]" var/overseer = "Unknown" - if(source_db.held_card) - overseer = source_db.held_card.registered_name + var/datum/tgui_login/L = source_db.tgui_login_get() + if(L.id) + overseer = L.id.registered_name R.info = {"Account details (confidential)


Account holder: [M.owner_name]
Account number: [M.account_number]
diff --git a/code/modules/economy/Accounts_DB.dm b/code/modules/economy/Accounts_DB.dm index aafc91cb849..dccab690af3 100644 --- a/code/modules/economy/Accounts_DB.dm +++ b/code/modules/economy/Accounts_DB.dm @@ -1,22 +1,30 @@ GLOBAL_VAR(current_date_string) +#define AUT_ACCLST 1 +#define AUT_ACCINF 2 +#define AUT_ACCNEW 3 + /obj/machinery/computer/account_database name = "Accounts Uplink Terminal" desc = "Access transaction logs, account data and all kinds of other financial records." icon_screen = "accounts" - density = 1 req_one_access = list(ACCESS_HOP, ACCESS_CAPTAIN, ACCESS_CENT_COMMANDER) + light_color = LIGHT_COLOR_GREEN var/receipt_num var/machine_id = "" - var/obj/item/card/id/held_card var/datum/money_account/detailed_account_view - var/creating_new_account = 0 - var/activated = 1 + var/activated = TRUE var/const/fund_cap = 1000000 - - light_color = LIGHT_COLOR_GREEN + /// Current UI page + var/current_page = AUT_ACCLST + /// Next time a print can be made + var/next_print = 0 /obj/machinery/computer/account_database/New() + // Why the fuck are these not in a subsystem? They are global variables for fucks sake + // If someone ever makes a map without one of these consoles, the entire eco AND date system breaks + // This upsets me a lot + // AA Todo: SSeconomy if(!GLOB.station_account) create_station_account() @@ -33,230 +41,207 @@ GLOBAL_VAR(current_date_string) machine_id = "[station_name()] Acc. DB #[GLOB.num_financial_terminals++]" ..() -/obj/machinery/computer/account_database/proc/get_access_level(var/mob/user) - if(user.can_admin_interact()) - return 2 - if(!held_card) - return 0 - if(ACCESS_CENT_COMMANDER in held_card.access) - return 2 - else if((ACCESS_HOP in held_card.access) || (ACCESS_CAPTAIN in held_card.access)) - return 1 - /obj/machinery/computer/account_database/proc/accounting_letterhead(report_name) + var/datum/tgui_login/L = tgui_login_get() return {"

[report_name]

[station_name()] Accounting Report
+ Generated By: [L?.id?.registered_name ? L.id.registered_name : "Unknown"], [L?.id?.assignment ? L.id.assignment : "Unknown"]

- Generated By: [held_card.registered_name], [held_card.assignment]
"} /obj/machinery/computer/account_database/attackby(obj/O, mob/user, params) - if(!istype(O, /obj/item/card/id)) - return ..() + if(tgui_login_attackby(O, user)) + return + return ..() - if(!held_card) - user.drop_item() - O.loc = src - held_card = O +/obj/machinery/computer/account_database/attack_hand(mob/user) + tgui_interact(user) - SSnanoui.update_uis(src) - - attack_hand(user) - -/obj/machinery/computer/account_database/attack_hand(mob/user as mob) - ui_interact(user) - -/obj/machinery/computer/account_database/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) - user.set_machine(src) - ui = SSnanoui.try_update_ui(user, src, ui_key, ui, force_open) +/obj/machinery/computer/account_database/tgui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/tgui_state/state = GLOB.tgui_default_state) + ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) if(!ui) - ui = new(user, src, ui_key, "accounts_terminal.tmpl", src.name, 400, 640) + ui = new(user, src, ui_key, "AccountsUplinkTerminal", name, 800, 600, master_ui, state) ui.open() -/obj/machinery/computer/account_database/ui_data(mob/user, ui_key = "main", datum/topic_state/state = GLOB.default_state) - var/data[0] +/obj/machinery/computer/account_database/tgui_data(mob/user, ui_key = "main", datum/topic_state/state = GLOB.default_state) + var/list/data = list() + data["currentPage"] = current_page + data["is_printing"] = (next_print > world.time) + tgui_login_data(data, user) + if(data["loginState"]["logged_in"]) + switch(current_page) + if(AUT_ACCLST) + var/list/accounts = list() + for(var/i in 1 to length(GLOB.all_money_accounts)) + var/datum/money_account/D = GLOB.all_money_accounts[i] + accounts.Add(list(list( + "account_number" = D.account_number, + "owner_name" = D.owner_name, + "suspended" = D.suspended ? "SUSPENDED" : "Active", + "account_index" = i))) - data["src"] = UID() - data["id_inserted"] = !!held_card - data["id_card"] = held_card ? text("[held_card.registered_name], [held_card.assignment]") : "-----" - data["access_level"] = get_access_level(user) - data["machine_id"] = machine_id - data["creating_new_account"] = creating_new_account - data["detailed_account_view"] = !!detailed_account_view - data["station_account_number"] = GLOB.station_account.account_number - data["transactions"] = null - data["accounts"] = null + data["accounts"] = accounts - if(detailed_account_view) - data["account_number"] = detailed_account_view.account_number - data["owner_name"] = detailed_account_view.owner_name - data["money"] = detailed_account_view.money - data["suspended"] = detailed_account_view.suspended + if(AUT_ACCINF) + data["account_number"] = detailed_account_view.account_number + data["owner_name"] = detailed_account_view.owner_name + data["money"] = detailed_account_view.money + data["suspended"] = detailed_account_view.suspended - var/list/trx[0] - for(var/datum/transaction/T in detailed_account_view.transaction_log) - trx.Add(list(list(\ - "date" = T.date, \ - "time" = T.time, \ - "target_name" = T.target_name, \ - "purpose" = T.purpose, \ - "amount" = T.amount, \ - "source_terminal" = T.source_terminal))) - - if(trx.len > 0) - data["transactions"] = trx - - var/list/accounts[0] - for(var/i=1, i<=GLOB.all_money_accounts.len, i++) - var/datum/money_account/D = GLOB.all_money_accounts[i] - accounts.Add(list(list(\ - "account_number"=D.account_number,\ - "owner_name"=D.owner_name,\ - "suspended"=D.suspended ? "SUSPENDED" : "",\ - "account_index"=i))) - - if(accounts.len > 0) - data["accounts"] = accounts + var/list/transactions = list() + for(var/datum/transaction/T in detailed_account_view.transaction_log) + transactions.Add(list(list( + "date" = T.date, + "time" = T.time, + "target_name" = T.target_name, + "purpose" = T.purpose, + "amount" = T.amount, + "source_terminal" = T.source_terminal))) + data["transactions"] = transactions return data -/obj/machinery/computer/account_database/Topic(href, href_list) + +/obj/machinery/computer/account_database/tgui_act(action, list/params) if(..()) - return 1 + return - if(href_list["insert_card"]) - if(held_card) - held_card.forceMove(loc) + . = TRUE - if(ishuman(usr) && !usr.get_active_hand()) - usr.put_in_hands(held_card) - held_card = null + if(tgui_login_act(action, params)) + return - else - var/obj/item/I = usr.get_active_hand() - if(istype(I, /obj/item/card/id)) - var/obj/item/card/id/C = I - usr.drop_item() - C.forceMove(src) - held_card = C + if(!tgui_login_get().logged_in) + return - if(!get_access_level(usr)) - return 1 + switch(action) + if("view_account_detail") + var/index = text2num(params["index"]) + if(index && index > 0 && index <= length(GLOB.all_money_accounts)) + detailed_account_view = GLOB.all_money_accounts[index] + current_page = AUT_ACCINF - var/datum/nanoui/ui = SSnanoui.get_open_ui(usr, src, "main") + if("back") + detailed_account_view = null + current_page = AUT_ACCLST - if(href_list["choice"]) - switch(href_list["choice"]) - if("create_account") - creating_new_account = 1 + if("toggle_suspension") + if(detailed_account_view) + detailed_account_view.suspended = !detailed_account_view.suspended - if("toggle_suspension") - if(detailed_account_view) - detailed_account_view.suspended = !detailed_account_view.suspended + if("create_new_account") + current_page = AUT_ACCNEW - if("finalise_create_account") - var/account_name = href_list["holder_name"] - var/starting_funds = max(text2num(href_list["starting_funds"]), 0) + if("finalise_create_account") + var/account_name = params["holder_name"] + var/starting_funds = max(text2num(params["starting_funds"]), 0) + if(!account_name || !starting_funds) + return - starting_funds = clamp(starting_funds, 0, GLOB.station_account.money) // Not authorized to put the station in debt. - starting_funds = min(starting_funds, fund_cap) // Not authorized to give more than the fund cap. + starting_funds = clamp(starting_funds, 0, GLOB.station_account.money) // Not authorized to put the station in debt. + starting_funds = min(starting_funds, fund_cap) // Not authorized to give more than the fund cap. - var/datum/money_account/M = create_account(account_name, starting_funds, src) - if(starting_funds > 0) - GLOB.station_account.charge(starting_funds, null, "New account activation", - "", "New account activation", M.owner_name) + var/datum/money_account/M = create_account(account_name, starting_funds, src) + if(starting_funds > 0) + GLOB.station_account.charge(starting_funds, null, "New account activation", "", "New account activation", M.owner_name) - creating_new_account = 0 - ui.close() + current_page = AUT_ACCLST - creating_new_account = 0 - if("view_account_detail") - var/index = text2num(href_list["account_index"]) - if(index && index <= GLOB.all_money_accounts.len) - detailed_account_view = GLOB.all_money_accounts[index] + if("print_records") + // Anti spam measures + if(next_print > world.time) + to_chat(usr, "The printer is busy spooling. It will be ready in [(next_print - world.time) / 10] seconds.") + return + var/text + playsound(loc, 'sound/goonstation/machines/printer_thermal.ogg', 50, 1) + var/obj/item/paper/P = new(loc) + P.name = "financial account list" + text = {" + [accounting_letterhead("Financial Account List")] - if("view_accounts_list") - detailed_account_view = null - creating_new_account = 0 + + + + + + + + + + + "} - if("print") - var/text - playsound(loc, 'sound/goonstation/machines/printer_thermal.ogg', 50, 1) - var/obj/item/paper/P = new(loc) - if(detailed_account_view) - P.name = "account #[detailed_account_view.account_number] details" - var/title = "Account #[detailed_account_view.account_number] Details" - text = {" - [accounting_letterhead(title)] - Holder: [detailed_account_view.owner_name]
- Balance: $[detailed_account_view.money]
- Status: [detailed_account_view.suspended ? "Suspended" : "Active"]
- Transactions: ([detailed_account_view.transaction_log.len])
-
Account NumberHolderBalanceStatus
- - - - - - - - - - - "} + for(var/i in 1 to length(GLOB.all_money_accounts)) + var/datum/money_account/D = GLOB.all_money_accounts[i] + text += {" + + + + + + + "} - for(var/datum/transaction/T in detailed_account_view.transaction_log) - text += {" - - - - - - - - "} + text += {" + +
TimestampTargetReasonValueTerminal
#[D.account_number][D.owner_name]$[D.money][D.suspended ? "Suspended" : "Active"]
[T.date] [T.time][T.target_name][T.purpose][T.amount][T.source_terminal]
+ "} - text += {" - - - "} + P.info = text + visible_message("[src] prints out a report.") + next_print = world.time + 30 SECONDS - else - P.name = "financial account list" - text = {" - [accounting_letterhead("Financial Account List")] + if("print_account_details") + // Anti spam measures + if(next_print > world.time) + to_chat(usr, "The printer is busy spooling. It will be ready in [(next_print - world.time) / 10] seconds.") + return + var/text + playsound(loc, 'sound/goonstation/machines/printer_thermal.ogg', 50, 1) + var/obj/item/paper/P = new(loc) + P.name = "account #[detailed_account_view.account_number] details" + var/title = "Account #[detailed_account_view.account_number] Details" + text = {" + [accounting_letterhead(title)] + Holder: [detailed_account_view.owner_name]
+ Balance: $[detailed_account_view.money]
+ Status: [detailed_account_view.suspended ? "Suspended" : "Active"]
+ Transactions: ([detailed_account_view.transaction_log.len])
+ + + + + + + + + + + + "} -
TimestampTargetReasonValueTerminal
- - - - - - - - - + for(var/datum/transaction/T in detailed_account_view.transaction_log) + text += {" + + + + + + + "} - for(var/i=1, i<=GLOB.all_money_accounts.len, i++) - var/datum/money_account/D = GLOB.all_money_accounts[i] - text += {" - - - - - - - "} + text += {" + +
Account NumberHolderBalanceStatus
[T.date] [T.time][T.target_name][T.purpose][T.amount][T.source_terminal]
#[D.account_number][D.owner_name]$[D.money][D.suspended ? "Suspended" : "Active"]
+ "} - text += {" - - - "} + P.info = text + visible_message("[src] prints out a report.") + next_print = world.time + 30 SECONDS - P.info = text - visible_message("[src] prints out a report.") - - return 1 +#undef AUT_ACCLST +#undef AUT_ACCINF +#undef AUT_ACCNEW diff --git a/nano/templates/accounts_terminal.tmpl b/nano/templates/accounts_terminal.tmpl deleted file mode 100644 index de738cd2940..00000000000 --- a/nano/templates/accounts_terminal.tmpl +++ /dev/null @@ -1,146 +0,0 @@ -
-
- Machine: -
-
- {{:data.machine_id}} -
-
-
-
- ID: -
-
- {{:helper.link(data.id_card, 'eject', {'insert_card' : 1}, null, data.id_inserted ? 'fixedLeftWidest' : 'fixedLeft')}} -
-
- -{{if data.access_level > 0}} -
-

Menu

-
- {{:helper.link('Home', 'home', {'choice' : 'view_accounts_list'}, !data.creating_new_account && !data.detailed_account_view ? 'disabled' : null, 'fixedLeft')}} - {{:helper.link('New Account', 'gear', {'choice' : 'create_account'}, data.creating_new_account ? 'disabled' : null, 'fixedLeft')}} - {{:helper.link('Print', 'print', {'choice' : 'print'}, data.creating_new_account ? 'disabled' : null, 'fixedLeft')}} - - {{if data.creating_new_account}} -
-

Create Account

-
- -
- - -
-
- Account Holder: -
-
- -
-
-
-
- Initial Deposit: -
-
- -
-
-
- -
-
- {{else data.detailed_account_view}} -
-

Account Details

-
- -
-
- Account Number: -
-
- #{{:data.account_number}} -
-
- -
-
- Holder: -
-
- {{:data.owner_name}} -
-
- -
-
- Balance: -
-
- ${{:helper.formatNumber(data.money)}} -
-
- -
-
- Status: -
-
- - {{:data.suspended ? "Suspended" : "Active"}} - -
-
-
- {{:helper.link(data.suspended ? "Unsuspend" : "Suspend", 'gear', {'choice' : 'toggle_suspension'})}} -
- -
- {{if data.transactions}} - - - - - - - - - - - - {{for data.transactions}} - - - - - - - - {{/for}} - -
TimestampTargetReasonValueTerminal
{{:value.date}} {{:value.time}}{{:value.target_name}}{{:value.purpose}}{{:value.amount}}{{:value.source_terminal}}
- {{else}} - This account has no financial transactions on record for today. - {{/if}} -
- {{else}} -
-

Nanotrasen Accounts

-
- {{if data.accounts}} - - {{for data.accounts}} - - - - - - {{/for}} -
{{:helper.link('#' + value.account_number, '', {'choice' : 'view_account_detail', 'account_index' : value.account_index})}}{{:value.owner_name}}{{:value.suspended}}
- {{else}} - There are no accounts available. - {{/if}} - {{/if}} -{{/if}} diff --git a/tgui/packages/tgui/interfaces/AccountsUplinkTerminal.js b/tgui/packages/tgui/interfaces/AccountsUplinkTerminal.js new file mode 100644 index 00000000000..b6d073574bd --- /dev/null +++ b/tgui/packages/tgui/interfaces/AccountsUplinkTerminal.js @@ -0,0 +1,288 @@ +import { createSearch, decodeHtmlEntities } from 'common/string'; +import { Fragment } from 'inferno'; +import { useBackend, useLocalState } from "../backend"; +import { Box, Button, Flex, Icon, Input, LabeledList, NumberInput, Section, Table, Tabs } from '../components'; +import { FlexItem } from '../components/Flex'; +import { Window } from "../layouts"; +import { ComplexModal, modalOpen } from './common/ComplexModal'; +import { LoginInfo } from './common/LoginInfo'; +import { LoginScreen } from './common/LoginScreen'; +import { TemporaryNotice } from './common/TemporaryNotice'; + +export const AccountsUplinkTerminal = (properties, context) => { + const { act, data } = useBackend(context); + const { + loginState, + currentPage, + } = data; + + let body; + if (!loginState.logged_in) { + return ( + + + + + + ); + } else { + if (currentPage === 1) { + body = ; + } else if (currentPage === 2) { + body = ; + } else if (currentPage === 3) { + body = ; + } + } + + return ( + + + + {body} + + + ); +}; + +const AccountsRecordList = (properties, context) => { + const { act, data } = useBackend(context); + const { + accounts, + } = data; + const [searchText, setSearchText] = useLocalState(context, "searchText", ""); + const [sortId, _setSortId] = useLocalState(context, "sortId", "owner_name"); + const [sortOrder, _setSortOrder] = useLocalState(context, "sortOrder", true); + return ( + + + +
+ + + Account Holder + Account Number + Account Status + + {accounts + .filter(createSearch(searchText, account => { + return account.owner_name + "|" + + account.account_number + "|" + + account.suspended; + })) + .sort((a, b) => { + const i = sortOrder ? 1 : -1; + return a[sortId].localeCompare(b[sortId]) * i; + }) + .map(account => ( + act('view_account_detail', { index: account.account_index }) + }> + {account.owner_name} + #{account.account_number} + {account.suspended} + + ))} +
+
+
+
+ ); +}; + +const SortButton = (properties, context) => { + const [sortId, setSortId] = useLocalState(context, "sortId", "name"); + const [sortOrder, setSortOrder] = useLocalState(context, "sortOrder", true); + const { + id, + children, + } = properties; + return ( + + + + ); +}; + +const AccountsActions = (properties, context) => { + const { act, data } = useBackend(context); + const { + is_printing, + } = data; + const [searchText, setSearchText] = useLocalState(context, "searchText", ""); + return ( + + +