Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
55 commits
Select commit Hold shift + click to select a range
b31c12f
refactor: Use only project id for permission check function
CrawlerCode May 29, 2025
49f6eb6
refactor: Improve create time entry modal
CrawlerCode May 29, 2025
bd55541
feat: Multiple timers & timer tab
CrawlerCode May 30, 2025
10d56e3
lang(lang): Declare react-intl types and fixed german translations
CrawlerCode May 30, 2025
60b9e43
refactor: Move to tanstack form + zod (removed formik + yup)
CrawlerCode Jun 3, 2025
aa42fbb
refactor: Upgrade tailwindcss to v4
CrawlerCode Jun 4, 2025
274e220
refactor(ui): Migrate to shadcn components (#48)
CrawlerCode Oct 22, 2025
a019c16
fix: Skip failed mutations for multi create time spend entires
CrawlerCode Oct 22, 2025
90933a9
fix(ui): Display deleted issues as strike-through text
CrawlerCode Oct 22, 2025
e2a5a98
feat: Enhance issue grouping (#38)
CrawlerCode Oct 25, 2025
899c21a
fix: Handle issue priorities when no default is specified
CrawlerCode Oct 25, 2025
acb8551
perf: Add react compiler and reduce unnecessary re-renders
CrawlerCode Oct 27, 2025
2d2bef8
feat: Display custom field values for info tooltips
CrawlerCode Oct 27, 2025
770fa4b
feat: Enhance search (#51)
CrawlerCode Dec 6, 2025
6b22f6b
perf: Improving data loading and increasing page loading speed (#52)
CrawlerCode Dec 14, 2025
a83bf30
build: Migrate to wxt framework (#53)
CrawlerCode Dec 18, 2025
c46486f
test: Fix all e2e tests
CrawlerCode Dec 18, 2025
4c2d534
fix: Display translated error message until redmine url is configured…
CrawlerCode Dec 18, 2025
f2a1c80
feat: Add project info tooltip
CrawlerCode Dec 30, 2025
bd1e7d0
fix: Update min browser versions to match current requirements
CrawlerCode Dec 30, 2025
df1d96c
ci: Add build number for canary version
CrawlerCode Dec 31, 2025
e7807e2
feat(filter): Add issue status filter
CrawlerCode Jan 2, 2026
d66aa6a
feat(timers): Group timers by project and sort them by newest first
CrawlerCode Jan 3, 2026
0b32d3e
refactor(timer): Refactor timer components and permission improvements
CrawlerCode Jan 7, 2026
946c4b6
fix: Fix default time entry activity selection
CrawlerCode Jan 7, 2026
37a0ebf
docs(license): Update license text for consistency
CrawlerCode Jan 7, 2026
a245275
fix: Fix eslint errors
CrawlerCode Jan 7, 2026
bff5fcf
fix: Save persistent comments per timer instead of issue
CrawlerCode Jan 10, 2026
840f48d
refactor: Run settings migration on extension update
CrawlerCode Jan 10, 2026
70994f0
refactor(ui): Move to shadcn base-ui components (#57)
CrawlerCode Jan 17, 2026
3a65610
refactor(settings): Redesign settings page and add testing redmine co…
CrawlerCode Jan 22, 2026
9e51a23
fix(timer): Close alert dialog on reset confirm
CrawlerCode Jan 22, 2026
2c0322b
feat: Allow to specify the rounding mode (#49)
CrawlerCode Jan 24, 2026
6121441
fix: Fix broken persistent comments behavior
CrawlerCode Jan 24, 2026
cd2f4d8
refactor: Use null as form default values and update zod to v4
CrawlerCode Jan 24, 2026
6c806b9
chore: Update npm dependencies
CrawlerCode Jan 24, 2026
1336e31
fix: Fix legacy settings migrations
CrawlerCode Jan 25, 2026
c2fd501
fix: Implement legacy data migrations for issues and timers
CrawlerCode Jan 25, 2026
4c3733c
refactor: Remove add notes settings option
CrawlerCode Jan 25, 2026
0319a42
fix(ui): Fix toaster styles inside shadow root
CrawlerCode Jan 25, 2026
2ca9621
ci: Add semantic release
CrawlerCode Jan 27, 2026
fade882
chore: Enforce next release version to v2.0.0
CrawlerCode Jan 27, 2026
b258127
chore(release): 2.0.0-beta.1 [skip ci]
semantic-release-bot Jan 27, 2026
9855905
ci: Publish production only for real releases not for pre-releases
CrawlerCode Jan 27, 2026
ac8f132
ci: Fix pre-release asset upload
CrawlerCode Jan 27, 2026
6f800bd
chore(deps): Update dependencies
CrawlerCode Jan 27, 2026
8011225
docs: Update README
CrawlerCode Jan 27, 2026
1d7d37c
fix: Enforce next release
CrawlerCode Jan 27, 2026
5428b51
chore(release): 2.0.0-beta.2 [skip ci]
semantic-release-bot Jan 27, 2026
cfc47f3
fix: Fix suspense settings provider (#60)
CrawlerCode Feb 14, 2026
30b9aeb
perf: Add query client restoring gate instead of restoring twice
CrawlerCode Feb 14, 2026
4a922ff
perf: Set NODE_ENV=production for release & pre-release builds
CrawlerCode Feb 14, 2026
bb79a02
chore: Add docker compose for dev setup
CrawlerCode Feb 14, 2026
2a3f1fb
chore(deps): Update dependencies
CrawlerCode Feb 14, 2026
9db6385
ci: Add super-linter for pull requests (#59)
CrawlerCode Feb 15, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 8 additions & 7 deletions .github/DISCUSSION_TEMPLATE/feature-request-ideas.yml
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
body:
- type: textarea
attributes:
label: Describe the feature you'd like
description: A clear and concise description of what you want to happen
validations:
required: true
---
body:
- type: textarea
attributes:
label: Describe the feature you'd like
description: A clear and concise description of what you want to happen
validations:
required: true
1 change: 1 addition & 0 deletions .github/ISSUE_TEMPLATE/bug_report.yml
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
---
name: Report an issue
description: Create a report to help us improve
labels: ["bug"]
Expand Down
1 change: 1 addition & 0 deletions .github/ISSUE_TEMPLATE/config.yml
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
---
blank_issues_enabled: false
contact_links:
- name: Feature request / Ideas
Expand Down
2 changes: 2 additions & 0 deletions .github/linters/.codespellrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
[codespell]
skip = */src/lang/*.json
3 changes: 3 additions & 0 deletions .github/linters/.stylelintrc.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"extends": ["../../stylelint.config.mjs"]
}
3 changes: 3 additions & 0 deletions .github/linters/eslint.config.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
import config from "../../eslint.config.mjs";

export default config;
6 changes: 6 additions & 0 deletions .github/linters/zizmor.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
rules:
unpinned-uses:
config:
policies:
"*": ref-pin
42 changes: 42 additions & 0 deletions .github/workflows/lint.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
---
name: Lint

on:
pull_request: null

permissions: {}

jobs:
lint:
name: Lint
runs-on: ubuntu-latest

permissions:
contents: read
statuses: write

steps:
- uses: actions/checkout@v5
with:
fetch-depth: 0
persist-credentials: false

- uses: pnpm/action-setup@v4

- uses: actions/setup-node@v6
with:
node-version: 24
cache: "pnpm"

- run: pnpm install --frozen-lockfile

- name: super-linter
uses: super-linter/super-linter/slim@v8.4.0
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
IGNORE_GITIGNORED_FILES: true
STRIP_DEFAULT_WORKSPACE_FOR_REGEX: true
FILTER_REGEX_EXCLUDE: ^(CHANGELOG\.md|pnpm-lock\.yaml)$
VALIDATE_BIOME_FORMAT: false # Prettier is used instead
VALIDATE_BIOME_LINT: false # Prettier is used instead
VALIDATE_JSCPD: false # TODO: Enable this linter in the future to detect code duplication
45 changes: 45 additions & 0 deletions .github/workflows/publish-pre-release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
---
name: Publish Pre-Release

on:
release:
types:
- prereleased

permissions: {}

jobs:
publish-chrome-pre-release:
name: Publish Pre-Release to Chrome Web Store
runs-on: ubuntu-latest

permissions:
contents: write

steps:
- uses: actions/checkout@v4
with:
persist-credentials: false

- uses: pnpm/action-setup@v4

- uses: actions/setup-node@v6
with:
node-version: 22

- run: pnpm install --frozen-lockfile

- run: pnpm run build:chrome:pre-release

- run: gh release upload "${RELEASE_TAG}" "$(ls .output/*-chrome.zip)"
env:
GITHUB_TOKEN: ${{ github.token }}
RELEASE_TAG: ${{ github.event.release.tag_name }}

- run: pnpm wxt submit \
--chrome-zip .output/*-chrome.zip
env:
CHROME_EXTENSION_ID: adgcdimdkkaddeopcabokepmaihfhklb
CHROME_CLIENT_ID: ${{ secrets.CHROME_CLIENT_ID }}
CHROME_CLIENT_SECRET: ${{ secrets.CHROME_CLIENT_SECRET }}
CHROME_REFRESH_TOKEN: ${{ secrets.CHROME_REFRESH_TOKEN }}
156 changes: 78 additions & 78 deletions .github/workflows/publish.yml
Original file line number Diff line number Diff line change
@@ -1,78 +1,78 @@
name: Publish
on:
release:
types: [published]
permissions:
contents: write
jobs:
publish-chrome:
name: Publish to Chrome Web Store
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: pnpm/action-setup@v4
- uses: actions/setup-node@v4
with:
node-version: 20
cache: "pnpm"
- run: pnpm install --frozen-lockfile
- run: pnpm run build:chrome
- run: gh release upload ${{ github.event.release.tag_name }} releases/redmine-time-tracking-${{ github.event.release.tag_name }}-chrome.zip
env:
GITHUB_TOKEN: ${{ github.TOKEN }}
- uses: mnao305/chrome-extension-upload@v5.0.0
with:
file-path: releases/redmine-time-tracking-${{ github.event.release.tag_name }}-chrome.zip
extension-id: ldcanhhkffokndenejhafhlkapflgcjg
client-id: ${{ secrets.CHROME_CLIENT_ID }}
client-secret: ${{ secrets.CHROME_CLIENT_SECRET }}
refresh-token: ${{ secrets.CHROME_REFRESH_TOKEN }}
publish-firefox:
name: Publish to Firefox Addon Store
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: pnpm/action-setup@v4
- uses: actions/setup-node@v4
with:
node-version: 20
cache: "pnpm"
- run: pnpm install --frozen-lockfile
- run: pnpm run build:firefox
- run: gh release upload ${{ github.event.release.tag_name }} releases/redmine-time-tracking-${{ github.event.release.tag_name }}-firefox.zip
env:
GITHUB_TOKEN: ${{ github.TOKEN }}
- uses: kewisch/action-web-ext@v1
id: web-ext-sign
with:
cmd: sign
source: releases/redmine-time-tracking-${{ github.event.release.tag_name }}-firefox.zip
artifacts: releases
channel: listed
approvalNotes: "GitHub: https://github.com/CrawlerCode/redmine-time-tracking"
apiKey: ${{ secrets.FIREFOX_API_KEY }}
apiSecret: ${{ secrets.FIREFOX_API_SECRET }}
- run: mv ${{ steps.web-ext-sign.outputs.target }} releases/redmine-time-tracking-${{ github.event.release.tag_name }}-firefox.xpi
- run: gh release upload ${{ github.event.release.tag_name }} releases/redmine-time-tracking-${{ github.event.release.tag_name }}-firefox.xpi
env:
GITHUB_TOKEN: ${{ github.TOKEN }}
---
name: Publish

on:
release:
types:
- released

permissions: {}

jobs:
publish-chrome:
name: Publish to Chrome Web Store
runs-on: ubuntu-latest

permissions:
contents: write

steps:
- uses: actions/checkout@v4
with:
persist-credentials: false

- uses: pnpm/action-setup@v4

- uses: actions/setup-node@v6
with:
node-version: 22

- run: pnpm install --frozen-lockfile

- run: pnpm run build:chrome:release

- run: gh release upload "${RELEASE_TAG}" "$(ls .output/*-chrome.zip)"
env:
GITHUB_TOKEN: ${{ github.token }}
RELEASE_TAG: ${{ github.event.release.tag_name }}
- run: pnpm wxt submit --chrome-zip .output/*-chrome.zip
env:
CHROME_EXTENSION_ID: ldcanhhkffokndenejhafhlkapflgcjg
CHROME_CLIENT_ID: ${{ secrets.CHROME_CLIENT_ID }}
CHROME_CLIENT_SECRET: ${{ secrets.CHROME_CLIENT_SECRET }}
CHROME_REFRESH_TOKEN: ${{ secrets.CHROME_REFRESH_TOKEN }}

publish-firefox:
name: Publish to Firefox Addon Store
runs-on: ubuntu-latest

permissions:
contents: write

steps:
- uses: actions/checkout@v4
with:
persist-credentials: false

- uses: pnpm/action-setup@v4

- uses: actions/setup-node@v6
with:
node-version: 22

- run: pnpm install --frozen-lockfile

- run: pnpm run build:firefox:release

- run: gh release upload "${RELEASE_TAG}" "$(ls .output/*-firefox.zip)"
env:
GITHUB_TOKEN: ${{ github.token }}
RELEASE_TAG: ${{ github.event.release.tag_name }}

- run: pnpm wxt submit \
--firefox-zip .output/*-firefox.zip \
--firefox-sources-zip .output/*-sources.zip
env:
FIREFOX_EXTENSION_ID: "{ea2ad5bc-e458-414d-8565-5cfe9f7cf0c2}"
FIREFOX_JWT_ISSUER: ${{ secrets.FIREFOX_JWT_ISSUER }}
FIREFOX_JWT_SECRET: ${{ secrets.FIREFOX_JWT_SECRET }}
38 changes: 38 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
---
name: Release

on:
push:
branches:
- main
workflow_dispatch:

permissions: {}

jobs:
release:
name: Release
runs-on: ubuntu-latest

permissions:
contents: write
issues: write
pull-requests: write

steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
persist-credentials: false

- uses: pnpm/action-setup@v4

- uses: actions/setup-node@v6
with:
node-version: 24

- run: pnpm install --frozen-lockfile

- run: pnpm run release
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
9 changes: 7 additions & 2 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,15 +1,20 @@
node_modules

dist
.output
.wxt

.env

.vscode/*
!.vscode/extensions.json
!.vscode/settings.json

/test-results/
/playwright-report/
/blob-report/
/playwright/.cache/

releases
release_notes.md
.redmine/data/
.redmine/themes/*
!.redmine/themes/.gitkeep
3 changes: 3 additions & 0 deletions .prettierignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
CHANGELOG.md
pnpm-lock.yaml
src/routeTree.gen.ts
24 changes: 24 additions & 0 deletions .redmine/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
# Redmine dev setup

This folder provides local Redmine instances for manual testing against multiple Redmine versions.

## Start a version

Run from this directory (`.redmine`):

```bash
docker compose up -d redmine-v6
```

Available services and ports:

- Redmine 6: [http://localhost:3006](http://localhost:3006) (service `redmine-v6`)
- Redmine 5: [http://localhost:3005](http://localhost:3005) (service `redmine-v5`)
- Redmine 4: [http://localhost:3004](http://localhost:3004) (service `redmine-v4`)
- Redmine 3: [http://localhost:3003](http://localhost:3003) (service `redmine-v3`)
- Redmine 2: [http://localhost:3002](http://localhost:3002) (service `redmine-v2`)

## Notes

- [Default credentials](https://hub.docker.com/_/redmine#accessing-the-application): `admin`/`admin`
- [Themes](https://www.redmine.org/projects/redmine/wiki/theme_list) are mounted from `.redmine/themes`
Loading
Loading