diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm
index b655d8b5e7..b70af8354d 100644
--- a/code/modules/admin/admin.dm
+++ b/code/modules/admin/admin.dm
@@ -229,8 +229,17 @@ proc/admin_notice(var/message, var/rights)
return
PlayerNotesPage(1)
-/datum/admins/proc/PlayerNotesPage(page)
- var/dat = "Player notes
"
+/datum/admins/proc/PlayerNotesFilter()
+ if (!istype(src,/datum/admins))
+ src = usr.client.holder
+ if (!istype(src,/datum/admins))
+ to_chat(usr, "Error: you are not an admin!")
+ return
+ var/filter = input(usr, "Filter string (case-insensitive regex)", "Player notes filter") as text|null
+ PlayerNotesPage(1, filter)
+
+/datum/admins/proc/PlayerNotesPage(page, filter)
+ var/dat = "Player notes - Apply Filter
"
var/savefile/S=new("data/player_notes.sav")
var/list/note_keys
S >> note_keys
@@ -240,29 +249,38 @@ proc/admin_notice(var/message, var/rights)
dat += ""
note_keys = sortList(note_keys)
+ if(filter)
+ var/list/results = list()
+ var/regex/needle = regex(filter, "i")
+ for(var/haystack in note_keys)
+ if(needle.Find(haystack))
+ results += haystack
+ note_keys = results
+
// Display the notes on the current page
var/number_pages = note_keys.len / PLAYER_NOTES_ENTRIES_PER_PAGE
// Emulate CEILING(why does BYOND not have ceil, 1)
if(number_pages != round(number_pages))
number_pages = round(number_pages) + 1
var/page_index = page - 1
+
if(page_index < 0 || page_index >= number_pages)
- return
+ dat += "| No keys found. |
"
+ else
+ var/lower_bound = page_index * PLAYER_NOTES_ENTRIES_PER_PAGE + 1
+ var/upper_bound = (page_index + 1) * PLAYER_NOTES_ENTRIES_PER_PAGE
+ upper_bound = min(upper_bound, note_keys.len)
+ for(var/index = lower_bound, index <= upper_bound, index++)
+ var/t = note_keys[index]
+ dat += "| [t] |
"
- var/lower_bound = page_index * PLAYER_NOTES_ENTRIES_PER_PAGE + 1
- var/upper_bound = (page_index + 1) * PLAYER_NOTES_ENTRIES_PER_PAGE
- upper_bound = min(upper_bound, note_keys.len)
- for(var/index = lower_bound, index <= upper_bound, index++)
- var/t = note_keys[index]
- dat += "| [t] |
"
-
- dat += "
"
+ dat += "
"
// Display a footer to select different pages
for(var/index = 1, index <= number_pages, index++)
if(index == page)
dat += ""
- dat += "[index] "
+ dat += "[index] "
if(index == page)
dat += ""
diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm
index 2c80b58274..44b3c9e16b 100644
--- a/code/modules/admin/topic.dm
+++ b/code/modules/admin/topic.dm
@@ -1971,7 +1971,12 @@
if("show")
show_player_info(ckey)
if("list")
- PlayerNotesPage(text2num(href_list["index"]))
+ var/filter
+ if(href_list["filter"] && href_list["filter"] != "0")
+ filter = url_decode(href_list["filter"])
+ PlayerNotesPage(text2num(href_list["index"]), filter)
+ if("filter")
+ PlayerNotesFilter()
return
mob/living/proc/can_centcom_reply()