ThreadCount Community edition

Uniform stock management for healthcare linen rooms: the coordinator app, the phone counter and the staff app, for your own server. Built from 2d04e45 on 2026-09-15. Licensed under the Functional Source License (FSL-1.1-ALv2).
This commit is contained in:
ThreadCount
2026-09-16 04:04:31 +10:00
commit 8c86c988c1
424 changed files with 53598 additions and 0 deletions
+132
View File
@@ -0,0 +1,132 @@
/* Plain-English names for audit ops, and the ops worth a mark in a list of hundreds. Moved here from
* the old /app/activity page. */
export const LABELS: Record<string, string> = {
"issue.create": "Issued garments",
"issue.return": "Recorded a return",
"issue.exchange": "Exchanged a size",
"issue.delete": "Deleted an issue",
"issue.receipt": "Attached a signed receipt",
"stocktake.apply": "Committed a stocktake",
"stock.reorder": "Changed a par level",
"stock.moves": "Adjusted stock",
"stock.orderFlagged": "Raised an order from low stock",
"catalog.add": "Added a garment",
"catalog.update": "Edited a garment",
"catalog.delete": "Deleted a garment",
"catalog.duplicate": "Duplicated a garment",
"catalog.bulk": "Bulk-changed the catalogue",
"catalog.variantAdd": "Added a size",
"catalog.removeSize": "Removed a size",
"barcode.bind": "Bound a barcode",
"barcode.unbind": "Unbound a barcode",
"order.create": "Created an order",
"order.receive": "Received an order",
"order.status": "Changed an orders status",
"order.update": "Edited an order",
"order.duplicate": "Duplicated an order",
"order.lineAdd": "Added an order line",
"order.lineQty": "Changed an order quantity",
"order.lineRemove": "Removed an order line",
"staff.save": "Added or edited a staff record",
"staff.patch": "Edited a staff record",
"staff.delete": "Deleted a staff record",
"dept.save": "Edited a department",
"dept.delete": "Deleted a department",
"supplier.add": "Added a supplier",
"supplier.update": "Edited a supplier",
"supplier.remove": "Removed a supplier",
"location.save": "Added or edited a location",
"location.delete": "Deleted a location",
"location.place": "Placed stock on a shelf",
"approval.add": "Recorded a manager's approval",
"approval.remove": "Removed a manager's approval",
"alteration.add": "Logged an alteration",
"alteration.advance": "Advanced an alteration",
"alteration.remove": "Removed an alteration",
"handin.add": "Recorded a hand-in",
"pickup.contacted": "Marked a pickup contacted",
"pickup.pickedUp": "Marked a pickup collected",
"pickup.deliver": "Delivered to a ward",
"request.raise": "Raised a request for somebody",
"request.pick": "Started picking a request",
"request.hold": "Held a request at the counter",
"request.round": "Put a request on the ward round",
"request.collected": "Handed a request over",
"request.reply": "Wrote back about a request",
"request.reassign": "Sent a request to a different approver",
"request.withdraw": "Withdrew a request",
"damage.handedIn": "Took a damaged garment back",
"dispute.resolve": "Closed a record query",
"notice.set": "Changed the ward notice",
"kitcheck.open": "Started a kit check",
"kitcheck.close": "Closed a kit check",
"waitlist.offer": "Offered a waiting size",
"staff.selfCode": "Made a staff-app activation code",
"staff.selfClear": "Cancelled an activation code",
"staff.selfUnlink": "Removed somebodys staff-app access",
"users.add": "Invited a user",
"users.update": "Changed a user",
"users.remove": "Removed a user",
"settings.update": "Changed settings",
"import.rows": "Imported data",
"backup.restore": "Restored a backup",
"data.reset": "Reset facility data",
"data.wipeActivity": "Wiped activity history",
"me.password": "Changed their own password",
"me.profile": "Edited their own profile",
"me.deleteAccount": "Deleted their own account",
/* Signing in and out, and the second factor.
*
* The page promises "every change made in this facility", and who reached the account is part of
* that — a stock adjustment nobody disputes reads differently next to a run of failed sign-ins
* from an address nobody recognises. Without these lines the trail rendered the raw op names. */
"auth:signin": "Signed in",
"auth:signin.failed": "A failed sign-in",
"auth:signin.refused": "Sign-in refused (deactivated)",
"auth:signout": "Signed out",
"auth:signup": "Created the facility",
"auth:password.reset": "Set a new password from a reset link",
"2fa:setup": "Started two-factor setup",
"2fa:enable": "Turned two-factor on",
"2fa:disable": "Turned two-factor OFF",
"2fa:regenerate": "Made new recovery codes",
/* The staff app. Every one of these is somebody on a ward changing something the linen room has
* to live with, so they belong in the same trail rather than a second one nobody opens. */
"staff:signin": "Signed in to the staff app",
"staff:signin.failed": "A failed staff-app sign-in",
"staff:signin.refused": "Staff-app sign-in refused (deactivated)",
"staff:signout": "Signed out of the staff app",
"staff:activate": "Claimed their own record",
"staff:request.create": "Raised a uniform request",
"staff:request.approve": "Approved a request (in the app)",
"staff:request.decline": "Declined a request (in the app)",
"staff:request.approve.email": "Approved a request (email link)",
"staff:request.decline.email": "Declined a request (email link)",
"staff:request.message": "Wrote about a request",
"staff:round.sign": "Signed for a ward delivery",
"staff:round.claim": "Confirmed a ward bag was collected",
"staff:damage.report": "Reported damage",
"staff:dispute.raise": "Said their record is wrong",
"staff:waitlist.join": "Joined a waiting list",
"staff:waitlist.leave": "Left a waiting list",
"staff:waitlist.accept": "Took up a waitlist offer",
"staff:kit.answer": "Answered a kit check",
"staff:account.password": "Changed their own staff-app password",
};
/** Operations worth noticing in a list of hundreds. */
export const NOTABLE = new Set([
"catalog.delete", "catalog.removeSize", "staff.delete", "dept.delete", "location.delete", "supplier.remove",
"users.add", "users.remove", "users.update", "settings.update", "backup.restore",
"data.reset", "data.wipeActivity", "me.deleteAccount", "catalog.bulk",
// Turning the second factor off weakens every account in the facility, and a refused sign-in is
// somebody with a password trying to get in after their access was taken away. Both are worth
// catching an eye in a list of hundreds.
"2fa:disable", "auth:signin.refused", "staff:signin.refused",
// The two ends of staff-app access: selfCode mints a credential that opens somebody's record,
// selfUnlink takes their account away. Both are the linen room reaching into a person's access
// rather than into stock, which is exactly what an admin is looking for when they open this.
"staff.selfCode", "staff.selfUnlink",
]);