DONE: The dropdown excludes users who have "claimed" their name (i.e. added a password) DONE Backend change? DONE - If names are fetched on dropdown load, use a backend filter to remove claimed user names. DONE Frontend change? DONE - If names get added from data already on frontend then we apply the filter on frontend only. DONE: Good to have timestamps. R: I've added this. DONE Frontend changes: DONE - Order by created_at on admin page DONE - Created time on player card on admin page DONE - Created time on player account screen DONE DB: DONE - Added invited_at and registered_at columns. DONE Backend: DONE - Return invited_at and registered_at cols in the /admin and /account pages DONE: Sunday games are counted separately to midweek. Can we differentiate? DONE I've updated the code so it switches that checkbox to 'off' DONE default when a weekend day is selected. DONE Frontend change: default "prioritise regulars" checkbox off on weekend day selection. DONE: The balance can be tweaked by going to the admin page, selecting the DONE actions dropdown on a player and then hitting "Received payment". DONE Frontend change: more prominent "actions" dropdown button. DONE: they're (claimed users) never asked to select their name from a dropdown while DONE signing up DONE: No-shows can be logged after games end (ONLY). DONE Frontend: DONE - Hide no-show button on games that haven't ended yet. DONE: Player comparisons submitted by users (DEF/FWD/GKP) are timestamped DONE: Can it prioritise the 3 tiers? White (rows 1-25) have priority, then blue DONE (31-41) and then the rest? R: I've added this now. DONE Admins can add or revoke "regular" statuses on the admin page. DONE Backend, frontend and DB: DONE Add table for player_class and class (class_id FK, order INT) DONE Replace 'regular' checkbox with a dropdown. DONE Replace backend PATCH endpoint to handle multi-class values. DONE Replace backend registration listing GET endpoint to order by int class values, not bool. DONE : I've added an excel export option on the admin page. Backend: DONE Integrate regulars ordering and coloring into the excel export. DONE Integrate no-shows into the excel export support. DONE: There is an admin page, and I've now added the no-show stat. DONE /admin SORT by no-show count DONE: The sign up stats are derived from game history. DONE Frontend: DONE - /account and /admin pages receive sign up counts per player. DONE - SORT BY sign ups allowed on admin page. DONE Backend: DONE - Alter the endpoints to include these aggregated stats. DONE: Do you plan on putting the scores in for each game? DONE I've added this option. DONE Frontend: DONE - Add ability to log game scores after the game ends DONE - Only show button for those who played the game DONE - Show a 'log in to log game score' overlay if session not associated with a user. DONE - If logged scores exist show an aggregate of these. DONE - Use the mode score gap (darks_score - lights_score), or median DONE if no mode exists, or midpoint if there are only two scores logged, DONE or the closest gap to 0 if the midpoint is non-whole. Call this the 'best_guess_difference) DONE - Then, use the aggregate of the light_score logged values to get a best_guess_light_score. This aggregate uses rounded mean DONE (round down in the case of .50) DONE - best_guess_darks_score = best_guess_lights_score + best_guess_difference DONE Backend: DONE - POST /games/:id/score DONE - Update game get request to show scores if present. DONE DB: DONE - game_scores table DONE - game_id DONE - player_id DONE - lights_score DONE - darks_score DONE: The SQL database is backed up to a file intermittently. DONE Cronjobs: DONE - Backup: DONE - 5 minutes ago. DONE - 20 minutes ago. DONE - 1 hour ago. DONE - 2 hours ago. DONE - 4 hours ago. DONE - 12 hours ago. DONE - 1 day ago. DONE - 2 days ago. DONE - 7 days ago. DONE - 2 weeks ago. DONE - 1 month ago. DONE - 3 months ago. DONE - 6 months ago. DONE - 1 year ago. DONE: That file can be downloaded from the admin page too. DONE Backend: DONE GET /backups DONE GET /backups/:timestamp DONE Frontend: Add backups page DONE - backups.html DONE - backups.js DONE - UPDATE header-loader.js DONE - Link in sidebar for admins DONE - Link in admin page to backups area. DONE: I've added a modifiable 'Notices' page. It can be viewed by all players, but only modified by admins. DONE - Add sidebar link for notices. DONE Add html and JS for notices screen. DONE Support for loading GET /notice/latest DONE Support for save via POST /notice DONE Support for undo via DELETE /notice/latest DONE Modify header-loader.js DONE DB changes: DONE - Notices table. DONE - created_at (default NOW) DONE - text DONE Backend: DONE - GET /notice/latest DONE - POST /notice DONE: If something goes wrong, we just have to replace the database file with an earlier version (add an endpoint to allow this). DONE Backend: DONE - PATCH /backup/:timestamp/status (active) DONE Frontend: DONE - Restore buttons next to backups. DONE: If a whole load of new accounts linked to a particular bad actor account turn out to be problematic (e.g. a bunch of bots attempting to sign up), all accounts linked to the "patient zero" can be banned in one go. DONE Backend: DONE DELETE /players/:id/tree DONE Frontend: DONE Add a "Ban [player] and all his friends" option on player actions. DONE DB: DONE Add a banned_at DATE column on players table. DONE: Position is derived from player comparisons made by users. DONE DB: DONE Like the rankings table, add a table for positions. DONE - Same expired_at and created_at column DONE - player_id DONE - position (GKP, DEF, MID, FWD) DONE - created_at DONE - expired_at DONE: Predicted position on admin/account pages. DONE Backend: DONE Add logic in the GET clause for getting no-show and predicted position per player on admin page. DONE Add logic in the GET clause for getting no-show and predicted position per player on /account page. DONE Frontend: DONE Update /admin and /account to have: DONE /admin FILTER by predicted position = DEF / FWD / MID / GKP DONE: I can add a section to the "hall of fame" page, showcasing who is most in arrears, if you think that might help. DONE Frontend: DONE - Add hall of fame section for most in arrears. DONE Backend: DONE - Add leaderboard GET endpoint changes for "Most in arrears" DONE : I've added a feature allowing normal users to "invite a friend". DONE ...names that have inputted into the system at a previous date by trusted players. DONE The friend is marked as their "sponsor". DONE ... their name should just appear in the dropdown (added there when their friend DONE invited them). DONE ... players are only allowed to invite friends if they are themselves DONE registered on the system (password + phone number). DONE Frontend: DONE - Modal requires login before proceeding. DONE Backend: DONE - Update the POST endpoint for players so that it populates created_at and sponsor_id DONE DB: DONE - sponsor_id->players column in the players table. DONE: Would be great if balances were automatically deducted after every game for each player. That would save me effort. €5 for Tues/Thurs and €3 for Sunday. R: This feature has now been added. DONE DB: DONE - Add a total cost field in the games DB DONE CRON: DONE - After game time has started, cost is deducted automatically from each player's DONE balance. DONE Backend: DONE - Update post endpoint for games (add cost field) DONE - Add a means to update game metadata (regular prioritisation, cost). DONE - Time and date can only be modified if no registration yet, or if all registrations cancelled. DONE Frontend: DONE - The new game modal should have a field for cost. DONE: When they return to the webapp after following this link, they are asked to confirm if they completed the payment, then the payment is marked as "pending confirmation" and they are signed up to the game. DONE DB: DONE - Add a table for logging payment attempts: DONE player_payments: DONE - player_id DONE - created_at DONE - status = "in_progress" | "submitted" | "confirmed" DONE Backend: DONE - Insert a notification after the payment link was followed. DONE: You'll see a list of payment confirmation requests on your notifications view, so you just need to confirm or deny each one. Frontend: DONE - Add support for confirmation notifications. DONE - Add support for link confirmations. DONE - Add notifications link in sidebar. DONE - Add notifications.html and notifications.js DONE Backend: DONE - GET /notifications DONE [ DONE { DONE "body": "free text", DONE "url?": "a valid HTTP path" DONE "type": "message" | "confirmation" | "link" DONE } DONE ] DONE - PATCH /notifications/:id/flag DONE "read" DONE - PATCH /notifications/:id/flag DONE "unread" - DONE /notifications/:id/flag DONE "confirm" - DONE /notifications/:id/flag DONE "deny" DONE: Login requires refresh to take frontend effect. DONE: reduce header z-index while modals open. DONE: Fix off-by-1h bug on /information page save. DONE: reduce games.js length by code reuse. DONE: isAdmin is coming up as false for user:me DONE: I've also added a feature allowing players themselves to report a payment. ... I've added a link in the app that brings players directly to revolut with the amount they owe you already filled in as a payment amount. DONE Backend: DONE Add a POST /payments endpoint in the backend DONE - Creates a row in payments with status = in progress (status_id = 1) DONE - Redirects user to revolut link. DONE: The sponsor is asked to confirm the phone number before the new player can themselves become a sponsor for another batch of new players. DB: DONE - Add a column on players, next to phone_number: phone_number_status DONE - phone_number_status = "unclaimed" | "unconfirmed" | "confirmed" DONE unclaimed -> sponsor set the invite up as "allowed to invite other users", and was prompted for a number. DONE However, the number and account are yet to be claimed by anyone. DONE unconfirmed -> player added their phone number (allowing them to invite others), but the phone number needs DONE to be confirmed by the player's sponsor. DONE The user's phone number is confirmed by their sponsor, and the account has been claimed (password-protected). DONE: add a sign out button DONE: Add a treasurer. DONE: share button on invite modal needs to open up whatsapp DONE: copy button on invite modal needs to show toast DONE: Replace cancel buttons on modals with an X button (top right) DONE: Hide "ask a friend" area when number already confirmed (/account) DONE: Better colors and size for balance on /account DONE: Stylise the MID/DEF/whatever badges on account and admin pages. DONE: Move backup.py logic to JS DONE: Write a time mocker for testing cron actions. DONE: ensure the header is genuinely at the top of the screen on each page. DONE: Replace information page with unmodifiable HTML for non-admins. DONE: Treasurer and admins listed on information page. DONE: photo misalignment issue on /account page DONE: fix notification refresh bug DONE: little flag next to phone number field DONE: Parse phone number (set assumed country code in settings) DONE: Fix glitchy behaviour on phone input. DONE: Use phone number input component on registration DONE: Add optional email support for phone input (for login) DONE: Privacy: obfuscate names on game listings for non-registered users. DONE: De-prioritise players in the red. DONE: differentiate between signups and actually playing. DONE: signout should redirect to welcome page DONE: make / redirect to /games DONE: fix login redirect. DONE: fetch pairs to compare from the backend DONE : implement more emojis on input fields (left side) DONE registration, password login, account, game scheduling, invites DONE: need more consistent input boxes on account page. DONE: generate teams on the backend to obscure player scores DONE: Move admin checkmark Goalkeeper (sometimes, never, always), Regular (Non-regular, Past-regular, Regular) to the player actions menu on the admin page. I don't want them to be displayed on each player card. DONE: Group input fields better on the account page. DONE: settings page DONE: header not loaded on login (bug) DONE: the account page should show an profile picture if none is there. DONE: add phone flag span for registration form DONE: implement cost-per-player alternative while scheduling games DONE: discontinue the captain skill DONE: only registered players for each game can log score. DONE: security, prevent unregistered users from creating games DONE: security, prevent unregistered users from creating/viewing the invite link DONE: prevent invitation link button from working (or appearing) for logged out users. DONE: also have a notification indicator on the hamburger icon DONE: privacy: hide past games for logged out users. DONE: fix the invite page DONE: style the settings page DONE: add auto-cancel logic DONE: hide the create game button from logged out users. DONE: prevent users from copying blurred names DONE: security, when logged in via an invite link, show 'Guest' in top right. DONE: for guest users (invite link), replace the games link in the sidebar with the invite link DONE: security, only registered users can rank other players DONE: space phone numbers properly when the 0 hasn't yet been replaced by the country code. DONE: hide past/cancelled games from invited users DONE: on the registration list, show time not rel time. DONE: don't list unapproved players on the admin screen. DONE: move the sign out button and account link to the top right name button (also need visual indicator that name is a menu button) DONE: fix sponsor dropdown bug DONE: fix revolut and sponsor inputs on /account DONE: separate modal styles on mobile and desktop: DONE desktop: modal is smaller if possible, rounded corners DONE mobile: modal fills screen, no rounded corners. DONE: standardise the modal save button (bottom right) DONE: security, require sponsor approval for name changes DONE: no need to re-confirm number when it's the same as before. DONE: Create a registration flow for users without an invite (e.g. players DONE arriving via meetup.com DONE Required details: DONE - Name DONE - Email (confirmed) DONE - Phone number DONE - Location DONE - Date of birth DONE - How you heard about us DONE - Preferred contact method: DONE - WhatsApp DONE - SMS DONE - Email DONE - Password DONE Additional requirements: DONE - Admin approval DONE - Admin confirms their number and becomes their inviter/sponsor DONE: bigger text on invite modal DONE: don't let users update their own name without approval DONE: opening one dropdown menu from the header should replace the other immediately. DONE: don't let unapproved users see past and cancelled games DONE: number confirmation flow DONE: handle the DOB field on the membership form, and also in /account DONE: UI: make the header links undraggable and unselectable via CSS DONE: security, only the same user should be allowed to delete their game registration. DONE: backup link styling needs work. DONE: require password when user is changing password. DONE: make notification links span entire row. DONE: Create smaller image versions for thumbnails. DONE: signout button broken for guests DONE: Use more granular invited_at and registered_at display on /admin and /account DONE: rss feed for the notifications DONE: each notification gets a link DONE: fix bug... cancellations no longer appearing below teams/subs DONE: remove sign in button if already on /welcome page DONE: hide rev tag input on non-treasurer accounts. DONE: Add a visual que for no-show. DONE: top up buttons broken for some users (e.g. just-invited non-registered users). DONE: security, when accepting an invite as a particular user, upgrade guest to that user DONE: no obfuscation for logged in user surname DONE: for users that registered on the game sign up screen, add them to the game also. DONE: add functionality allowing players to un-cancel their game sign up. DONE: Add a footnote on the invite page: note that a number is needed to allow player to invite others. DONE: textarea styling (intro) on mobile needs work DONE: fix red name highlighting on game invite page. DONE: rss link too long DONE: Link up "can invite others" on invite screen to DB. DONE: block guest users or invitees without numbers from inviting others by name. DONE: the invite modal should inform those lacking permissions why they aren't allowed to invite others DONE: better phone input on invite modal DONE: set password modal should have consistent save button in bottom right DONE: record payment modal needs work DONE: Disallow poll opening periods that make no sense (e.g. 2D when the game is scheduled later today). DONE: we won't implement this. DONE: modal should be used to set player names DONE: first modal input field should receive focus on opening DONE: admins get to set name straight away (no request needed) DONE: When saving an account change, check if: (1) number changed or (2) inviter changed. DONE (1) and (2): ask old and new inviter to confirm the inviter change (first response confirms/denies it), then ask new inviter to confirm number change. DONE: (1) and NOT (2): ask inviter to confirm number change DONE: NOT (1) and (2): ask old and new inviter to confirm the inviter change (first response confirms/denies it). DONE: NOT (1) and NOT (2): do nothing. DONE: phone login screen for game signup has better styling DONE: most fields on registration form should be obligatory. DONE: phone is either filled or null (not blank) DONE: fix bug... phone numbers entering the DB with spaces DONE: issue a new JWT immediately after name/phone change approved (expire the old one) DONE: C+Backspace broken on phone input (leave it for now) DONE: ensure the notification for confirmation of name+phone change mentions the target name+phone. DONE: for new number game signups, present registration form. DONE: fix DEFECT, when a user is approved, they should not need to logout and back in again to gain full access DONE: fix styling on login form within game signup modal DONE: failure on registration modal for games should show error DONE: ESC should close the current modal. DONE: fix ui a bit around names on the admin screen DONE: fix defect, when user signs up via game modal, their name should appear in the players list straight away DONE: tapping or clicking anywhere on the share link should automatically copy it to clipboard DONE : Does that include scorers, etc? DONE This could be added. DONE Frontend: DONE - On the games view, allow users to log their own goals. DONE Backend: DONE - POST /games/:game_id/goals/:player_id DONE (wontfix) - Check to ensure goals is less than the amount logged as game score. DONE DB: DONE: ensure scores transmitted via API DONE: extra table needed for goal and no-show logs, to track reporter IDs and conflicting reports. DONE: admin should be able to change player phone numbers. DONE: make it impossible to log goals for no-shows. DONE: use sockets for notification updates. DONE: use prior games to select comparison pairs effectively DONE collect past poll responses DONE collect past team messages DONE split team messages into separate files DONE split poll log into separate files DONE extract players from poll responses (most importantly: numbers, and names if present) DONE extract datetime from each teams file DONE extract team text regions from each teams file (lights and darks), store in separate files (darks.txt, lights.txt) DONE extract name lines from each team file (dark_names.txt, light_names.txt) DONE extract min datetime from each poll file DONE link team files to nearest past poll (poll.txt, teams.txt) DONE - link players in the polls (canonical) to players in team listings DONE - link simple/exact matches DONE - find alias set for phone numbers DONE - manually remove erroneous poll-game mappings DONE - prioritise first responding when linking breaks down with duplicate names DONE shuttle new polls/teams into dataset DONE estimate game dates based on teams (nearest next TUE@8PM, THUR@8PM or SUN@11AM) DONE make an import file for past games DONE add admin option for importing past games DONE - create games with registrations DONE - populate teams for created games DONE populate missing players DONE: add player name aliases table DONE - player_id (int) DONE - alias (text) DONE - count (int) DONE: when a team member is not listed in the poll (out-of-group reg likely) at present this results in them being omitted DONE from the polls and teams view. As an alternative: place such players in the poll with a response time equal to the DONE last responder's DONE: some subs getting cut out on past games import DONE: past games should be be recent first DONE: on the frontend, don't display 0 - 0 for games lacking match report DONE: remove 'scheduled' icon from past games DONE: some users still unapproved after import DONE: clicking the name on the admin panel should open the menu modal, not edit name modal DONE: subs badges too close together DONE: no cropping text on subs list DONE: game names less cropped please DONE: allow full length name clicks on games DONE: edit phone number modal on admin screen needs improvement DONE: little avatar next to name when logged in (top right) DONE: more consistent game component across games and invite pages... also, include day of week DONE: time should include day of week DONE: generated past games from import file should include price (5 EUR weekday, 3 EUR weekend) DONE: use a default image rather than 404 on /profile/:id DONE: add midfielders section to the leaderboard DONE - HTML update DONE - API update DONE: "prioritise regulars" needs styling on modal for game creation DONE: (won't fix) name "nan" getting into the DB via the import route DONE: don't notify with payment reminder if the game cost 0 EUR (free) DONE: on the /welcome page, merge the login and registration forms into one dynamic one which loads additional fields when necessary. DONE: replace generic yellow buttons DONE: disable input change on login form identifier field. DONE: add a back button on reg form and login DONE: auto-focus name on reg form DONE: disable input change on reg form identifier field. DONE: use server IP-blocking for repeated calls to user existence checks DONE: (won't implement) use client-side proof of work hashing to check if email/phone registered on system DONE: (won't implement) allow user to sign up with a "Child account" checkbox rather than DOB field. DONE: don't leak user account data on lookup DONE: flag should auto-load on reg form with number DONE: split DOB into three fields: year, month, day. Only require month/day if necessary (i.e. to determine child/adult status) DONE - Frontend: three separate fields DONE - DB: three separate columns DONE - /account three separate fields DONE - API update (registration and GET and PUT /account) DONE: highlight select when in focus (reg form, month field) DONE: implement "group notifications" (send to many, mark read once) DONE: add a way to mark all notifications as read DONE: display an avatar for those who read the notification in the bottom right DONE - Add a read_by column on the DB DONE - Retrieve notifications with read_by col DONE - Set read_by on marking notification as read DONE - Load an avatar on the notification if read by another user. DONE: the read box should not be a bool but rather the ID of the user who marked it read. DONE: registration should refresh page and bring user to games view DONE: notification needed when admin status or treasurer status changes DONE: notif and visual que needed for account change requests DONE: disallow invalid birthdays DONE: create a separate file for notif templates (localisation prep) DONE: move server stuff to ./server/ DONE: and frontend stuff to ./frontend/ (actually no, /html and /js DONE: also treat email lookup failure with IP rate limit DONE: if a user changes their DOB to adult from child or child from adult, then sponsor approval is needed. DONE: disable mark all read button if no unread notifications exist DONE: set password fields on modal in /admin needs consistent styling DONE: no weird twitching when hovering over admin player panels DONE: account save button same style as on modal, and disabled if no changes occurred DONE: better styling for goalkeeping / reg status multi-select DONE: When paying, use a modal to ascertain if payment has already occurred: DONE - Record completed payment DONE - Pay now through Revolut DONE: Add excel players import feature DONE: sign up button on invite page should just sign up the player outright (no phone input) DONE: notify user when change is pending DONE: players should be allowed to manually edit teams after they are generated DONE - Frontend changes DONE - Save flow (API) DONE - DB changes - a table for storing player-suggested teams DONE: display the created_by name on the game card DONE: ability for player to report a payment of a specific amount DONE: (won't implement; doesn't contain numbers) import WhatsApp chat feature DONE: split admin page into different panels DONE: fix timezone bug... game scheduled for 8pm fires off at 7pm DONE: weekend football defaulting to 40 EUR per player. DONE: "Remove from game" should be "Cancel registration" for editing own status DONE: add ability for admin to re-instate player after cancelling on their behalf (no created_at reset in this case) DONE: Only admins and game creator should be able to remove others from games, and in this scenario the player should not be able to sign up DONE again, unless re-instated by the admin or game host themselves. DONE: add import button on each future game card DONE: underline edited names after swap mode exited DONE: only allow modifying teams one game at a time DONE: add the admin ability to merge two users DONE: better icons and styling for player search, sort & filter DONE: move /backups to /admin/backups DONE: remove /backups link in sidebar DONE: back buttons on /admin/import and /backups DONE: little flag bug on login DONE: show count of selected items at top DONE: unique constraint on phone numbers DONE: fix bug whereby app-shell contents get center-aligned (should align to baseline) DONE: merge needs to handle profile images too. DONE: limit merge action to player pairs DONE: record goals on past games appears broken DONE: add account deletion procedure. DONE: display JPGs on admin screen DONE: when search has a string already on /admin/players, filter immediately DONE: add ability to clear selection on admin page DONE: mark all read should not change read_by if already set DONE: when merging players, keep non-null columns, admin status, reg status, etc. DONE: move notifs link to the right DONE: allow importing past games. DONE: if cancelling as the first player, delete registration outright. DONE: allow moving players to different teams or cancellations via drag and drop DONE: teams by / posted by should use first name only, and should be trimmed if no team author listed DONE: only allow a user to rank players if they have played with them before, or if they are the player's sponsor DONE: order pairs for comparison in a more intelligent way DONE: save button styling needs work DONE: ability to cancel team changes (no saving)... simply refreshes the page DONE: admin should be able to cancel any game DONE: Failed to register player: Error: UNIQUE constraint failed: players.name DONE: better heuristics for ordering past games import dropdown list DONE: import 7 June poll and game DONE: save score with same flow as the save team changes (top action bar) DONE: recall skip ranking action for a day DONE: auto-capitalise name on sign up DONE: forms should be centered in modals DONE: title text sizes are too large on the mobile app DONE: re-word notif toggle label, and prompt for notif toggle on first login if inside the webapp DONE: populate info page, even for logged out users. DONE: hide PWA install link on mobile home app DONE: fix phone login DONE: older cancelled weirdly on page #1? DONE: prompt for enabling notifications immediately on mobile app open DONE: pagination when past games go back too far DONE: clicking anywhere on the dropdown should zip it back up DONE: only notify about payments when the match is over (pointless) DONE: avatars should use name as title on mouse hover DONE: ENTER key no longer works on login (phone/continue) DONE: rss bug... the RSS URL keeps changing. DONE: allow user to update their score submission DONE: wording should not be "1 players signed up" DONE: wording should not be "14 playing (past games)" DONE: only show sign-up count if it is over 4 or if it is 0. DONE : find way to rank players in midfield DONE: allow first cancellation via drag-n-drop (area usually invisible due to emptiness) WONTFIX: now have a separate cancel button DONE: guest-mode should not have a logout button DONE: on guest-mode, the account dropdown should be disabled rigorously. DONE: guide users by making phone input default, requiring alternative signup route for email. DONE: signup for anon/guest users should use a phone input box in place of the signup button. DONE: phone input should lose focus or trigger action once the last digit is inserted. DONE: e-mail based forgotten password flow. DONE - Button for 'reset pword' DONE - Modal DONE Create a password reset link table DONE Random, unique, long ID DONE player_id DONE expiration_date (seconds since epoch format) DONE Create an emails table for logging past outbound email DONE Write backend code in the password reset request endpoint to draft the email and insert the rows in the DB DONE Write frontend code for a password reset page DONE Write API stuff for password reset pages DONE Require email when setting a password (tooltip explaining that this is for password recovery) DONE: disallow passwords over 24 chars DONE: ESC key should close modals and dropdowns DONE: intermittent bug... invite leads to login at times DONE: double entry accounting DONE: add basic email validation for signup DONE: fin 16th July fix DONE: ensure invite links disappear for past games (404). DONE: the SVG has the wrong time (off by an hour) DONE: add ability to update RSVP (sub-out, etc.) DONE: remove cost from the column in profile page DONE: use an R server to generate plots, i.e. don't run the script each time. DONE: add ability to filter and sort games DONE: URLs need pagination too DONE: "You're in" should be "Waitlisted" or "Sub #1" if not in main team. DONE: add ability for players to self-identify as defensive, attacking or goalkeeper (WONTFIX: added peer review of this sort of question instead) DONE: way to mark an account as delisted (+1s, etc., hiding the account from the leaderboard). DONE: When no pairs for ordering, rather than stalling, find pairs from another player, use that, and then run pair population code in a thread not really an issue since we started to order by player mental maps DONE: replace night mode with bright mode icon on click DONE: notifications should use templates, so wording of past notifications can be tweaked over time DONE: fix glitchy notifications DONE: updating teams causes cancellations to show as "moments ago" DONE: need visual signifier for SUB signups DONE: Notification web socket appears to be broken. DONE: change price symbol to euro on group directory DONE: with more recent comparisons given extra weight/power. WONTFIX: users can no update/delete their past votes instead. DONE: payment reminder notification wording needs work This notification type is deprecated, and notification wording is now dynamic (admin-controlled). DONE: add ability to have custom placeholders in phone/email input DONE: rate page needs work: DONE surnames needed DONE prioritise rating of particular positions DONE avoid rank-sinks somehow DONE: invalid credentials line should not be inlined DONE: submitting goals causes the cancellation time for players to go negative. DONE: ensure code for team generation never goes concurrent for a given game DONE: games need better score style for non-admins post-game DARKS x - y LIGHTS DONE: websockets appear broken on prod (likely proxy issue) DONE: remove the thing at the top of each pitches page DONE: Notifications "+34" needs to be styled right (overflow invite count) --------------- DONE: import WhatsApp responses poll feature DONE - OCR setup DONE - frontend page DONE - backend API DONE confirm inserts DONE use fuzzy string matching on names in the absence of phone numbers DONE import should create new players if not yet existing - reg star visualisable on poll import page - make in-debt status visualisable (red name) on import and games / invites page - visualise unapproved player with wavy underline, not color TODO: There's also a "subcribe to email updates" option for registered users. DONE - Set up localteams.org DNS records for mail. DONE - Set up pslc-footy@localteams.org DONE - Request port 25 outgoing access. DONE - Test imap and msmtp for the above DONE - Test actually receiving mail (requires port 25) DONE - Save credentials in server-side GNU pass DONE Test msmtp on the server side DONE Wrap msmtp in node, and test - Create an email_id column on the notifications table for whether it was sent to the user (default null) - Create new tables: DONE - emails: DONE - email_id DONE - subject DONE - body DONE - created_at DONE - email_recipients DONE - email_id - name DONE - email_address TODO: notify users of additional events DONE - game scheduled DONE: sub-status changed "sub 8+" -> "sub 4" -> "sub 2" -> "sub 1" -> "in team" - also in rare cases: "in team" -> "sub" (when a regular, past regular signs up, or when someone with no outstanding payments signs up) reminder of newly generated teams - two more players needed - one more player needed - @12/min AND booking reminder - new teams generated @14/max or @12/min if game begins in 12 hours - Add settings in /account for notification types TODO: Add "share teams" button on game invite modal. - Drafts a WhatsApp message with the teams... TODO: group-style notification to be used for "Did X invite Y to the group?" TODO: when a user changes their name/phone/DOB or sponsor back to the original, then delete the change request and any related notifications TODO: link notifications and change requests so that when the sponsor changes the other change request notifications can be re-routed. TODO: fix YYYY-MM-null issue on dob notif TODO: when editing a form, if state returns to previous save state, disable save button again. DONE - edit game TODO: same save button disabling on admin modals when name, number, password, received payment etc. unchanged. DONE Likewise on /account TODO: show a line above subs on import TODO: handle brackets and hyphens in phone number fields TODO: fix bug with name/phone etc fields pre-populating with old data on /admin TODO: login sends the wrong username TODO: notify user when admin changed their password TODO: make frontend refresh automatically on new software version TODO: read_by should also have an attached name for notifications page TODO: notify user after they are merged with another. TODO: add constraints to avoid overlapping game schedules TODO: marking someone as cancelled after game ended should be replaced with marking as no-show TODO: fix dash error in query-ci TODO: add support for locations/venues. TODO: on logout, remove notif worker TODO: custom invite not getting copied on desktop. TODO: notify users to set a password once they've signed up to first game. TODO: better 404 error page TODO: when closing and re-opening signup modal on invite screen, de-populate the user, so that the number must be re-entered. TODO: emails should be more personal (first name only), use full name in to line though. TODO: signup on invite page blanks the screen. TODO: changing one score but not the other results in 0 score for other team when previous score was already logged TODO: SVGs, cards and teams generate overnight TODO: changing price for game with signups should be possible TODO: setting price for facility on game creation should be possible TODO: scroll bar on the players admin page should be over the players div alone, not the search area. TODO: refresh should not depopulate registration form TODO: guest account should not be able to reach /account, manually or via link TODO: guest account should not see profile link TODO: backups need to consider state of wal and shm files - use sqlite's .backup function TODO: backups need to be diservified: main machine, home server, daily copy to USB TODO: reset password via phone numbers seems broken TODO: SVG should not have so many labels on the y-axis TODO: leaderboard pitch needs better texture and lines TODO: leaderboard Dream cards need work (remove trophies in favour of metallic backdrops: gold, silver, bronze, white) TODO: better app icon on install the app link, and no such link on desktop TODO: signup button remains visible on named invite screen after clicking sign up TODO: reliability should be mapped to normal distribution to avoid vast majority in the 98%+ category TODO: replace this dependency injection approach with basic function imports TODO: allow players to sign up 'as sub' even when a dependant is playing TODO: child accounts should not get charged (parent account should instead) TODO: add conditional-RSVP feature (yes to 7v7, no to 6v6) TODO: hide the upload button for .fit files if already uploaded... hide the graph button if no upload present. TODO: should be impossible on the backend to sign up when it is not open yet. TODO: after players merged, those logged in under old ID enter broken state on frontend TODO: give voters feedback on how impactful their data annotation was on fair team generation - Player comparisons x% - Player positions x% - Familiarity graph (x% complete) - Bell curve view (unlock after completing 50% of player comparisons) TODO: who wins? team feedback quiz TODO: "between" similarity question needs work - it continues to ask about strangers - it needs to be personalised to the user's own mental model. - show a bell curve over the drag and drop TODO: fix error on grading question... low and high players should be valid with regards the subject (subject needs to be between each) TODO: if teams are already fair, then the lp_teams program should end TODO: force insecure password users to reset password on next login TODO: admin cancellation analysis page (per-month, per-DOW) TODO: admin page for signup analysis TODO: availability should not be over 100% TODO: add weather forecast to games TODO: right now we support multi-groups per-rank in player mental model page... however, we should instead have a high and low rank range for each player... first sift players down the ranking by weeding out losers, this produces a bunch of winner-top rank groups. next, sift players down based on winners (losers to the top)... this produces loser-top rank groups. Reverse the rank numbers for the loser-top variety. Use both varieties to find a range for the player (e.g. rank 2 -> 10) This way, we can start to select other-side candidates for pairs from any of those rank groups between 2 and 10. E.g. pick an other half from the midpoint group (rank 6), like a form of binary search. TODO: auto-confirm if a statement import only explains already accounted for balance TODO: when balance marked cleared, set that transaction as the balance one on the account TODO: allow subs to add a "distance away from game" field to allow for no-fault cancellation a certain period before game start TODO: set up hello@localteams.org TODO: "Soccer" needs to be replaced with "Football" TODO: replace beacon sport text with word embeddings TODO: mark read should not remove action buttons TODO: when updating a player's class, only insert a new row if it differs from their old class. TODO: when updating a player's class, modal should close. TODO: when updating a player's goalkeeping, modal should close. TODO: setStatus disappears too quickly on /admin/players TODO: "Delete invited" doesn't work, and needs a confirmation step anyway. TODO: No way to add/delete actions for notifications TODO: GPM is wrong. TODO: form should account for games beyong the past 5: 80:20 -> 80% of form is made up of past 5 games, 20% made up of the rest. Within that 20%, 80% made up of games 6->10. TODO: silver XI contains duplicates. TODO: remove "add your DOB" if they already did. TODO: "Known by you" should be ordered by most frequently played with players (frecency). TODO: When a user visits their notification page, mark all read after 2s of reading... do this on the backend only, so the UI doesn't update while they read. TODO: on signing out, sign the user out on all their other tabs... use websockets TODO: suggested invitees shouldn't include own name TODO: team-wise fairness questions TODO: hide teams from non-prolific until just before kickoff TODO: mark notifications read when visiting the notifications page TODO: action-type notifications not displaying buttons. TODO: consolidate accounting and import pages into one... TODO: allow attaching multiple files at once. TODO: place the submit button at the top header always TODO: add interstitial page for the following: TODO: update weak password TODO: agree to terms TODO: if admin - upload statement TODO: if admin and no upcoming games scheduled - schedule a game TODO: if played last game - submit score, teams review, man of the match, etc. TODO: if name violates policy (no surname, matches a banned word, etc.) https://en.wikipedia.org/wiki/Interstitial_webpage TODO: pitches icon needs changing TODO: add achievement badges: TODO: 10 games played TODO: 25 games played TODO: 100 games played TODO: 200 games played TODO: link up game was cancelled button to report table for game cancellation TODO: link up man of the match input to db TODO: bottom notice needs styling (somewhat masked by background at present) TODO: "There is 1 item that requires your attention..." wording needs to change TODO: server admin page needs to show the git commit. TODO: review game tab needs work (TUE/THUR REVIEW would be better) TODO: icons needed on tabs (review, terms, security), final score, player of the match, goals scored by you TODO: give needed actions a notification column TODO: on completion of the action, mark the notification as read TODO: "Save review" button needs to be "Submit"