From aa206048269a8c7c214668e032c94cf97d0583df Mon Sep 17 00:00:00 2001 From: Fluffy <65877598+FluffyGhoster@users.noreply.github.com> Date: Tue, 30 Jul 2024 00:49:41 +0200 Subject: [PATCH] Extended list viewer now has an edit button (#19706) Extended list viewer now has an edit button, and the ability to edit the extended list it's seeing; it's also (opinionately) better formatted. --- code/modules/admin/verbs/viewlist.dm | 69 +++++++++++++++++-- code/modules/admin/view_variables/topic.dm | 2 +- .../admin/view_variables/view_variables.dm | 10 +-- .../fluffyghost-empowerextendedlistviewer.yml | 58 ++++++++++++++++ tgui/packages/tgui/interfaces/ListViewer.tsx | 34 +++++++-- 5 files changed, 155 insertions(+), 18 deletions(-) create mode 100644 html/changelogs/fluffyghost-empowerextendedlistviewer.yml diff --git a/code/modules/admin/verbs/viewlist.dm b/code/modules/admin/verbs/viewlist.dm index a0a068b9197..275e12c6ef7 100644 --- a/code/modules/admin/verbs/viewlist.dm +++ b/code/modules/admin/verbs/viewlist.dm @@ -1,18 +1,32 @@ -/client/proc/view_extended_list(var/list/L) - if(!check_rights(R_VAREDIT|R_DEV)) return +/** + * Used to create a tgui Extended List Viewer + * + * Accepts either an associative list or a flat list + * + * If an associative list is passed, the key is a string and the value the datum + */ +/client/proc/view_extended_list(list/L, datum/original_datum) + if(!check_rights(R_VAREDIT|R_DEV)) + return if(istype(L)) - new /datum/tgui_module/list_viewer(L, usr) + new /datum/tgui_module/list_viewer(L, usr, original_datum = original_datum) /datum/tgui_module/list_viewer var/list/viewed_list + var/datum/weakref/original_datum_ref -/datum/tgui_module/list_viewer/New(var/list/L, mob/user) +/datum/tgui_module/list_viewer/New(list/L, mob/user, datum/original_datum) if(istype(L)) viewed_list = L + if(istype(original_datum)) + original_datum_ref = WEAKREF(original_datum) + if(!original_datum_ref) + stack_trace("Unable to create a weakref to the original datum, please report this to a developer") + ui_interact(user) -/datum/tgui_module/list_viewer/ui_interact(mob/user, var/datum/tgui/ui) +/datum/tgui_module/list_viewer/ui_interact(mob/user, datum/tgui/ui) if(!check_rights(R_VAREDIT|R_DEV|R_MOD)) return @@ -41,3 +55,48 @@ index++ return data + +/datum/tgui_module/list_viewer/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) + . = ..() + if(.) + return + + if(!check_rights(R_VAREDIT|R_DEV)) + return + + var/client/user_client = ui.user?.client + if(!user_client) + stack_trace("No client found to open entry in, despite having received a request to edit a list, uh oh!") + return + + switch(action) + + if("open_entry") + + var/datum/entry_to_open = null + + if(isnum(text2num(params["open_entry_key"]))) + entry_to_open = viewed_list[text2num(params["open_entry_key"])] + else + entry_to_open = viewed_list[params["open_entry_key"]] + + if(!entry_to_open) + to_chat(usr, "No entry found to open!") + return FALSE + + user_client.debug_variables_open(entry_to_open) + + return TRUE + + if("open_whole_list") + if(tgui_alert(usr, "Opening the whole list in VV might take a long time or cause issues, are you sure?", "Confirm", list("Yes", "No")) != "Yes") + return FALSE + + var/datum/original_datum = original_datum_ref.resolve() + if(!original_datum) + tgui_alert(usr, "Unable to open the list, the original datum has been deleted or has never been set.") + return FALSE + + user_client.mod_list(viewed_list, original_datum) + + return TRUE diff --git a/code/modules/admin/view_variables/topic.dm b/code/modules/admin/view_variables/topic.dm index 9212ecb1c01..3dab1edd738 100644 --- a/code/modules/admin/view_variables/topic.dm +++ b/code/modules/admin/view_variables/topic.dm @@ -67,7 +67,7 @@ to_chat(usr, "This can only be used on instances of type /list") return - view_extended_list(L, href_list["varnameview"]) + view_extended_list(L, locate(href_list["original_datum"])) else if(href_list["mob_player_panel"]) if(!check_rights(0)) return diff --git a/code/modules/admin/view_variables/view_variables.dm b/code/modules/admin/view_variables/view_variables.dm index 3c0db8cb524..274b8e129c8 100644 --- a/code/modules/admin/view_variables/view_variables.dm +++ b/code/modules/admin/view_variables/view_variables.dm @@ -133,7 +133,7 @@ . += x return . -/proc/make_view_variables_value(value, varname = "*") +/proc/make_view_variables_value(datum/D, value, varname = "*") var/vtext = "" var/debug_type = get_debug_type(value, FALSE) var/extra = list() @@ -161,12 +161,12 @@ for (var/index = 1 to L.len) var/entry = L[index] if(!isnum(entry) && !isnull(entry) && !(varname in view_variables_no_assoc) && L[entry] != null) - extra += "
  • [index]: [make_view_variables_value(entry)] -> [make_view_variables_value(L[entry])]
  • " + extra += "
  • [index]: [make_view_variables_value(D, entry)] -> [make_view_variables_value(D, L[entry])]
  • " else - extra += "
  • [index]: [make_view_variables_value(entry)]
  • " + extra += "
  • [index]: [make_view_variables_value(D, entry)]
  • " extra += "" else if(L.len >= 100) - vtext = "([L.len]): " + vtext = "([L.len]): " else vtext = "[value]" @@ -183,6 +183,6 @@ (M) "} - var/valuestr = make_view_variables_value(value, varname) + var/valuestr = make_view_variables_value(D, value, varname) return "
  • [ecm][varname] = [valuestr]
  • " diff --git a/html/changelogs/fluffyghost-empowerextendedlistviewer.yml b/html/changelogs/fluffyghost-empowerextendedlistviewer.yml new file mode 100644 index 00000000000..1cf3709f514 --- /dev/null +++ b/html/changelogs/fluffyghost-empowerextendedlistviewer.yml @@ -0,0 +1,58 @@ +################################ +# Example Changelog File +# +# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. +# +# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) +# When it is, any changes listed below will disappear. +# +# Valid Prefixes: +# bugfix +# - (fixes bugs) +# wip +# - (work in progress) +# qol +# - (quality of life) +# soundadd +# - (adds a sound) +# sounddel +# - (removes a sound) +# rscadd +# - (adds a feature) +# rscdel +# - (removes a feature) +# imageadd +# - (adds an image or sprite) +# imagedel +# - (removes an image or sprite) +# spellcheck +# - (fixes spelling or grammar) +# experiment +# - (experimental change) +# balance +# - (balance changes) +# code_imp +# - (misc internal code change) +# refactor +# - (refactors code) +# config +# - (makes a change to the config files) +# admin +# - (makes changes to administrator tools) +# server +# - (miscellaneous changes to server) +################################# + +# Your name. +author: FluffyGhost + +# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. +delete-after: True + +# Any changes you've made. See valid prefix list above. +# INDENT WITH TWO SPACES. NOT TABS. SPACES. +# SCREW THIS UP AND IT WON'T WORK. +# Also, this gets changed to [] after reading. Just remove the brackets when you add new shit. +# Please surround your changes in double quotes ("). It works without them, but if you use certain characters it screws up compiling. The quotes will not show up in the changelog. +changes: + - admin: "Extended list viewer now has an edit button, and the ability to edit the extended list it's seeing; it's also (opinionately) better formatted." diff --git a/tgui/packages/tgui/interfaces/ListViewer.tsx b/tgui/packages/tgui/interfaces/ListViewer.tsx index 28b09d6247c..21884f2be74 100644 --- a/tgui/packages/tgui/interfaces/ListViewer.tsx +++ b/tgui/packages/tgui/interfaces/ListViewer.tsx @@ -1,5 +1,5 @@ import { useBackend } from '../backend'; -import { Box, LabeledList, Section } from '../components'; +import { Box, Button, Section, Table } from '../components'; import { Window } from '../layouts'; export type ListData = { @@ -17,16 +17,36 @@ export const ListViewer = (props, context) => { return ( -
    - +
    act('open_whole_list')}> + Open Whole List + + }> + + + Key + Value + Actions + {data.listvar.map((list) => ( - - {list.value} - + + {list.key} + {list.value} + + + + ))} - +