Releases: MashSoftware/time-tracker
Releases · MashSoftware/time-tracker
v0.29.0
Added
- Dark mode. There is no light mode. This is the way.
Changed
- Cancel button on time entry forms now goes back to the referring page with url query strings, instead of the latest weekly page.
- Next page navigation button is removed on the current week page.
- Previous page navigation button is removed on the 12th week page, as per the users time entry history limit.
- Tests follow redirects to login page where authentication is required.
Fixed
- Radios not populating when editing an existing time entry or setting a default tag/location.
v0.28.3
Fixed
- Heroku Postgres dialect difference
- Updated SQLAlchemy UUID types cast as Strings
v0.28.2
v0.28.1
Changed
- Upgraded requirements
- Bump Python version to 3.10.6
Fixed
- Error on account activation due to trying to log the current user when not signed in.
- Incorrect link URL to GitHub releases page.
v0.28.0
Added
- Custom locations can be created and added to time entries, allowing tracking of working from multiple places.
- New URL: time-tracker.mashsoftware.com.
- Aria labels on icons where needed, i.e. where used decoratively without additional text.
- More meta keywords for better search engine indexing.
Changed
- Renamed application from "The Button" to "Mash Time Tracker", following a new naming convention for Mash Software projects.
- Redesigned home page highlighting main features of the app and secondary technical features.
- Application now doesn't go to sleep after a period of inactivity.
- Actions on cards (entries, tags and locations) now appear in a card footer.
- Increased gap between block level buttons in mobile widths for easier tap targets.
Fixed
- Time entries recorded on Sundays were saved and accounted for in totals, but not displayed in the weekly view. Thanks @ahosgood
v0.27.0
Added
- Cookie page detailing what cookies the app uses and the ability to accept or reject non-essential cookies. Link also added to footer.
- Cookie banner to allow users to accept or reject non-essential cookies.
- Persistent
cookies_policy
cookie is set to store preferences with an expiry of one year. - App-wide CSRF protection. All forms were already CRSF protected using WTForms, but this setting protects every route unless explicitly exempt.
- Highlight active navigation item in navbar.
- Development-only requirements containing packages used for linting, formatting, testing and requirements management.
- Using Pytest Coverage to measure unit test coverage, including in branching code.
- Refactored unit and functional tests. Thanks @jonodrew.
- Error handling if email send request to service providers API fails for any reason. Re-raised as a 500 internal server error and logged.
- Error pages contain a back link taking the user back to the referring page if there was one.
Changed
- Time entries spanning multiple days now add the date to the end time e.g. instead of "22:00 to 06:00" it's now "22:00 to 28/03/2021 06:00".
- "Remember me" checkbox is removed from the login page if the user has not accepted non-essential cookies.
session
andremember_token
cookies are set toHttpOnly
andSecure
to prevent access over non-HTTPS connections or via JavaScript to mitigate cookie theft via cross-site scripting (XSS) or eavesdropping.- Reduced
remember_token
cookie expiration from one year, to thirty days. - Content Security Policy (CSP) updated to require HTTPS connection to all sources.
- Require a fresh login (not a restored session) prior to any delete action.
- CSRF errors are now explicitly handled with a flash message to inform the user to try again, rather than a form validation error.
- Flash messages have been simplified to three categories; error, important and success. Error messages are used for form validation and are not dismissable. Important and success messages are dismissable contextual confirmation of user actions.
- Form fields validation error messages are now added to the
aria-describedby
attribute. - Non-primary action buttons now use the "outline" style.
- Footer layout redesigned for multiple columns on desktop and single column on mobile.
- Reduce header content margin.
- Swapped Fontawesome icons out for Bootstrap icons
- Upgraded to Bootstrap v5.2.0
Removed
- Python 3.6 support
- Postgres 10 support
- Redis 5 support
Fixed
- Prevent other users time entries from appearing in search results. Other users entries could not be edited or deleted, this resulted in a 403 forbidden error.
- Pre-select "None" when changing default tag and user has no tags.
- Database URI using deprecated scheme designator.
v0.26.0
Added
- Search for time entries based on comment contents.
- Set a default tag to use for all new time entries created with the "Start now" button. Thanks @ahosgood.
- Use webmanifest shortcuts to expose start / stop now function to OS. Thanks @andymantell.
- Better logging to
stdout
andstderr
to aid app monitoring. - More unit tests.
- Versioning, contributors, support to the README
- Contributor Covenant Code of Conduct
- Contribution guidelines
Changed
- Pre-select users default tag, or "None" if not set, on manual time entry form.
- Tag page highlights which tag is the current default.
Fixed
- Pre-select "None" tag when editing and existing entry if no tag was previously selected. Thanks @ahosgood.
- Prevent viewing other users tagged time entries pages if you knew the UUID of the tag.
v0.25.0
Added
- Scheduled task to delete all time entries older than 12 weeks. This is run daily at midnight UTC and based on the start date and time of the time entry. This helps to minimise the storage requirements of the app.
- Display time entry history retention period and date in user account page.
- Total amount of time associated with each tag on both the tag list page and tagged time entry pages.
- Date a tag was last used displayed on tag card.
Changed
- Time entry limit changed to entry history retention period in account settings.
- Weekly summary now includes the current duration of in-progress time entries in both time and tag totals.
- Redesigned home page and re-written selling-points.
- Redesigned page title headers.
- Redesigned layout of tag card.
- Moved more code to common utils with additional unit tests.
Removed
- User account based limit of 120 entries. Now you can create as many time entries as you like, but they will be deleted after 12 weeks.
v0.24.0
Added
- New tagged entry page showing all time entries linked to a particular tag.
- In-progress time entry cards now have a header that displays how long ago that entry started (on page load/refresh, not real-time). Thanks @ahosgood.
- Count of time entries and tags used vs limits on the account page.
Changed
- Tag page layout now shows tags alongside the number of times each has been used, link to view all time entries linked to that tag and links to edit or delete.
- Tags on time entry cards are now links to the new tagged time entries page showing all entries with that tag.
- Delete tag page now says how many time entries will be impacted, with a link to view them before confirming or cancelling the delete action.
- Removed italic (emphasis) from time entry comments so that emojis don't look weird.
- Improved 404 error pages where URL pattern matches the expected type, but is not a valid instance of that type.
- Removed drop-down from "Stop now" button since all items on it are disabled anyway. Now only show dropdown on the "Start now" button state. Thanks @andymantell.
- Delete account confirmation page now says how many entries and tags will be deleted along with the account.
Fixed
- Tag names containing only whitespace now fail form validation, must contain some other characters.
- Strip whitespace before checking for duplicated tag names.
- Strip whitespace before creating or editing a tag name.
v0.23.2
Added
- Unit test to cover verification token generation bug found in previous release.
Changed
- Renamed default branch from
master
tomain
and renamed all references.
Fixed
- Error when requesting activation for unregistered email addresses.
- Whitespace not stripped from comments, resulting in empty strings stored instead of null.