Skip to content

Commit 64a4ffa

Browse files
Merge branch 'development'
2 parents fab1cef + 13de1bd commit 64a4ffa

File tree

171 files changed

+8137
-1782
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

171 files changed

+8137
-1782
lines changed

.dockerignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,3 +49,4 @@ public/assets
4949
spec
5050
.github
5151
k8s
52+
development

.gitignore

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
# or operating system, you probably want to add a global ignore instead:
55
# git config --global core.excludesfile '~/.gitignore_global'
66

7+
.gitattributes
8+
79
*.dump
810

911
.ctags
@@ -67,3 +69,7 @@ yarn-debug.log*
6769
taxonworks.code-workspace
6870

6971
development
72+
_development/
73+
74+
.claude/
75+
claude/

CHANGELOG.md

Lines changed: 39 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,42 @@ This project <em>does not yet</em> adheres to [Semantic Versioning](https://semv
99

1010
\-
1111

12+
## [0.60.0] - 2026-02-20
13+
14+
### Added
15+
16+
- Match OTU by TaxonName task
17+
- DarwinCore summary task
18+
- Report per-object duplicate predicate use [#4741]
19+
- Batch import BibTeX sources option to include Identifier
20+
- Batch Upload Asserted Distributions now supports a `gazetteer_id` column [#4739]
21+
- Lock header bar button [#4750]
22+
- Filter namespaces [#4749]
23+
24+
### Fixed
25+
26+
- Improved scoping of Catalogue of Life Exports
27+
- Save notice is missing in New type specimen task
28+
- Fix: Rails now correctly applies time zones for `user_date_start` and `user_date_end` parameters from the `X-Timezone` header [#4721]
29+
- Classes not being eager loaded in background jobs, causing dwc importer to fail
30+
- Admin checkboxes in project members table are not visible to project administrators.
31+
- Add historical determination options to Taxon Name facet of Filter Collection Objects [#4742]
32+
- Serial author match out of order when reopened after one match selected [#4743]
33+
34+
### Changed
35+
36+
- Removed unused BibTeX task [#1440]
37+
- Updated Ruby gems
38+
39+
[#4741]: https://github.com/SpeciesFileGroup/taxonworks/issues/4741
40+
[#4742]: https://github.com/SpeciesFileGroup/taxonworks/issues/4742
41+
[#1440]: https://github.com/SpeciesFileGroup/taxonworks/issues/1440
42+
[#4721]: https://github.com/SpeciesFileGroup/taxonworks/issues/4721
43+
[#4739]: https://github.com/SpeciesFileGroup/taxonworks/issues/4739
44+
[#4743]: https://github.com/SpeciesFileGroup/taxonworks/issues/4743
45+
[#4749]: https://github.com/SpeciesFileGroup/taxonworks/issues/4749
46+
[#4750]: https://github.com/SpeciesFileGroup/taxonworks/issues/4750
47+
1248
## [0.59.0] - 2026-02-04
1349

1450
### Added
@@ -6062,8 +6098,9 @@ _Special thanks to Tom Klein for his amazing open-source contributions on this r
60626098
- Loosing input page numbers when switching tabs on New Taxon Name task
60636099

60646100
[#1532]: https://github.com/SpeciesFileGroup/taxonworks/issues/1532
6065-
[unreleased]: https://github.com/SpeciesFileGroup/taxonworks/compare/v0.59.0...development
6066-
[0.58.0]: https://github.com/SpeciesFileGroup/taxonworks/compare/v0.58.0...v0.59.0
6101+
[unreleased]: https://github.com/SpeciesFileGroup/taxonworks/compare/v0.60.0...development
6102+
[0.60.0]: https://github.com/SpeciesFileGroup/taxonworks/compare/v0.59.0...v0.60.0
6103+
[0.59.0]: https://github.com/SpeciesFileGroup/taxonworks/compare/v0.58.0...v0.59.0
60676104
[0.58.0]: https://github.com/SpeciesFileGroup/taxonworks/compare/v0.57.0...v0.58.0
60686105
[0.57.0]: https://github.com/SpeciesFileGroup/taxonworks/compare/v0.56.1...v0.57.0
60696106
[0.56.1]: https://github.com/SpeciesFileGroup/taxonworks/compare/v0.56.0...v0.56.1

CLAUDE.md

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,6 @@ TaxonWorks is a Biodiversity Informatics workbench.
1919
- Queries and filters `lib/queries/ARCHITECTURE.md`
2020
- Exports: `lib/export/ARCHITECTURE.md`
2121

22-
23-
2422
### Application
2523
- Both server-side and client-side rendering are used
2624
- Vue.js 3 is used for CS, e.g. `app/javascript/vue/` for Vue.js components and single-page applications
@@ -41,30 +39,30 @@ TaxonWorks is a Biodiversity Informatics workbench.
4139

4240
## Code
4341
- DO us a comment when you have provide > 50% of the code for a class "
44-
- Follow Conventions in ARCHITECTURE.md
45-
- When requesting clarification from a user, propose to add it to an ARCHITECTURE.md file if it appears systematic
42+
- DO follow conventions in ARCHITECTURE.md
43+
- When requesting clarification from a user, propose to add it to an ARCHITECTURE.md file if it appears systemic
4644

4745
### Syntax
48-
- Always prefer verbose method and variable names
49-
- Variable name abbreviation permitted in loops and simple assignments within methods
50-
- Only `sv_`, soft validation methods are allowed to be abbreviated
46+
- DO prefer verbose method and variable names
47+
- DO permit abbreviated variable names in loops and simple assignments within methods
48+
- DO NOT change quoting format unless specifically asked to
49+
- DO allow `sv_` abbreviation in soft validation methods
5150

5251
### New TaxonWorks Tasks
53-
- Task are nested within Rails conventions in `tasks/`, e.g. `app/controllers/tasks/`
5452
- Initialize with generator, see `rails generate taxon_works:task --help`
5553
- Then write a headless functional test that reaches page without a 404
54+
- Task are nested within Rails conventions in `tasks/`, e.g. `app/controllers/tasks/`
5655

5756
## Tests
5857
- Use `rspec` - `rspec path/to/test_spec.rb`
59-
- Tests facilitate developing complex processes
60-
- DO tend to write a test first, have it fail (RED), then make it pass (GREEN) when:
61-
- Work is complex
62-
- Work is on a model
63-
- Work is in lib/
58+
- DO tend to test first, have it fail (RED), then make it pass (GREEN) when:
59+
- Work is COMPLEX
60+
- Work is on a MODEL
61+
- Work is in `lib/`
6462
- At the start of adding a new resource/route/page
6563
- DO reference Factories
6664
- All models have a corresponding `valid_<model>` factory
67-
- NEVER write Controller tests by default
65+
- NEVER write Controller tests unless asked to
6866

6967
## Git
7068
- DO NOT try to commit unless asked

Gemfile.lock

Lines changed: 24 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -158,11 +158,11 @@ GEM
158158
racc (~> 1.7)
159159
bigdecimal (3.3.1)
160160
bindex (0.8.1)
161-
binding_of_caller (1.0.1)
161+
binding_of_caller (2.0.0)
162162
debug_inspector (>= 1.2.0)
163163
biodiversity (6.0.1)
164164
ffi (~> 1.15)
165-
bootsnap (1.22.0)
165+
bootsnap (1.23.0)
166166
msgpack (~> 1.2)
167167
brakeman (7.1.2)
168168
racc
@@ -258,7 +258,7 @@ GEM
258258
railties (>= 6.1.0)
259259
faker (3.6.0)
260260
i18n (>= 1.8.11, < 2)
261-
faraday (2.14.0)
261+
faraday (2.14.1)
262262
faraday-net_http (>= 2.0, < 3.5)
263263
json
264264
logger
@@ -288,7 +288,7 @@ GEM
288288
activesupport (>= 6.1)
289289
gnfinder (1.0.4)
290290
rest-client (~> 2.1)
291-
gpx (1.2.1)
291+
gpx (1.2.2)
292292
csv
293293
nokogiri (~> 1.7)
294294
rake
@@ -325,8 +325,9 @@ GEM
325325
indefinite_article (0.2.5)
326326
activesupport
327327
io-console (0.8.2)
328-
irb (1.16.0)
328+
irb (1.17.0)
329329
pp (>= 0.6.0)
330+
prism (>= 1.3.0)
330331
rdoc (>= 4.0.0)
331332
reline (>= 0.4.2)
332333
jbuilder (2.14.1)
@@ -401,7 +402,7 @@ GEM
401402
nenv (0.3.0)
402403
net-http (0.9.1)
403404
uri (>= 0.11.1)
404-
net-imap (0.6.2)
405+
net-imap (0.6.3)
405406
date
406407
net-protocol
407408
net-pop (0.1.2)
@@ -413,24 +414,24 @@ GEM
413414
netrc (0.11.0)
414415
nexus_parser (1.2.3)
415416
nio4r (2.7.5)
416-
nokogiri (1.19.0)
417+
nokogiri (1.19.1)
417418
mini_portile2 (~> 2.8.2)
418419
racc (~> 1.4)
419-
nokogiri (1.19.0-aarch64-linux-gnu)
420+
nokogiri (1.19.1-aarch64-linux-gnu)
420421
racc (~> 1.4)
421-
nokogiri (1.19.0-aarch64-linux-musl)
422+
nokogiri (1.19.1-aarch64-linux-musl)
422423
racc (~> 1.4)
423-
nokogiri (1.19.0-arm-linux-gnu)
424+
nokogiri (1.19.1-arm-linux-gnu)
424425
racc (~> 1.4)
425-
nokogiri (1.19.0-arm-linux-musl)
426+
nokogiri (1.19.1-arm-linux-musl)
426427
racc (~> 1.4)
427-
nokogiri (1.19.0-arm64-darwin)
428+
nokogiri (1.19.1-arm64-darwin)
428429
racc (~> 1.4)
429-
nokogiri (1.19.0-x86_64-darwin)
430+
nokogiri (1.19.1-x86_64-darwin)
430431
racc (~> 1.4)
431-
nokogiri (1.19.0-x86_64-linux-gnu)
432+
nokogiri (1.19.1-x86_64-linux-gnu)
432433
racc (~> 1.4)
433-
nokogiri (1.19.0-x86_64-linux-musl)
434+
nokogiri (1.19.1-x86_64-linux-musl)
434435
racc (~> 1.4)
435436
notiffany (0.1.3)
436437
nenv (~> 0.1)
@@ -447,9 +448,9 @@ GEM
447448
activerecord (>= 7.1)
448449
request_store (~> 1.4)
449450
parallel (1.27.0)
450-
parallel_tests (5.5.0)
451+
parallel_tests (5.6.0)
451452
parallel
452-
parser (3.3.10.1)
453+
parser (3.3.10.2)
453454
ast (~> 2.4.1)
454455
racc
455456
parslet (2.0.0)
@@ -498,7 +499,7 @@ GEM
498499
puma (7.2.0)
499500
nio4r (~> 2.0)
500501
racc (1.8.1)
501-
rack (3.2.4)
502+
rack (3.2.5)
502503
rack-cors (3.0.0)
503504
logger
504505
rack (>= 3.0.14)
@@ -561,7 +562,7 @@ GEM
561562
logger (~> 1.5)
562563
ostruct (~> 0.6)
563564
readline (~> 0.0)
564-
rdoc (7.1.0)
565+
rdoc (7.2.0)
565566
erb
566567
psych (>= 4.0.0)
567568
tsort
@@ -628,7 +629,7 @@ GEM
628629
rspec-mocks (3.13.7)
629630
diff-lcs (>= 1.2.0, < 2.0)
630631
rspec-support (~> 3.13.0)
631-
rspec-rails (8.0.2)
632+
rspec-rails (8.0.3)
632633
actionpack (>= 7.2)
633634
activesupport (>= 7.2)
634635
railties (>= 7.2)
@@ -638,7 +639,7 @@ GEM
638639
rspec-support (~> 3.13)
639640
rspec-support (3.13.7)
640641
rtesseract (3.1.4)
641-
rubocop (1.84.1)
642+
rubocop (1.84.2)
642643
json (~> 2.3)
643644
language_server-protocol (~> 3.17.0.2)
644645
lint_roller (~> 1.1.0)
@@ -691,7 +692,7 @@ GEM
691692
securerandom (0.4.1)
692693
seedbank (0.5.0)
693694
rake (>= 10.0)
694-
selenium-webdriver (4.40.0)
695+
selenium-webdriver (4.41.0)
695696
base64 (~> 0.2)
696697
logger (~> 1.4)
697698
rexml (~> 3.2, >= 3.2.5)
@@ -815,7 +816,7 @@ GEM
815816
xpath (3.2.0)
816817
nokogiri (~> 1.8)
817818
zaru (1.0.1)
818-
zeitwerk (2.7.4)
819+
zeitwerk (2.7.5)
819820
zip_tricks (5.6.0)
820821

821822
PLATFORMS

app/assets/javascripts/workbench/keyboard.js

Lines changed: 60 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -39,29 +39,58 @@ Object.assign(TW.workbench.keyboard, {
3939
this.handleEvents()
4040
},
4141

42+
// General shortcuts use a plain keydown listener instead of Mousetrap so
43+
// they work even when focus is in an input, select, or textarea.
44+
// platformKey() is Alt on Linux/Windows, Ctrl on Mac.
45+
// See app/javascript/vue/helpers/getPlatformKey.js.
4246
generalShortcuts() {
43-
const platformKey = navigator.platform.indexOf('Mac') > -1 ? 'ctrl' : 'alt'
44-
45-
this.createShortcut(
46-
`${platformKey}+h`,
47-
'Go to hub',
48-
'General shortcuts',
49-
function () {
50-
const element = document.querySelector('.hub_project_name')
51-
element.click()
47+
const isMac = navigator.platform.indexOf('Mac') > -1
48+
const platformKey = isMac ? 'ctrl' : 'alt'
49+
const modifierProp = isMac ? 'ctrlKey' : 'altKey'
50+
51+
const shortcuts = [
52+
{
53+
key: 'h',
54+
legend: `${platformKey}+h`,
55+
description: 'Go to hub',
56+
handler() {
57+
const element = document.querySelector('.hub_project_name')
58+
element.click()
59+
}
5260
},
53-
true
54-
)
55-
this.createShortcut(
56-
`${platformKey}+?`,
57-
'Show/hide help',
58-
'General shortcuts',
59-
function () {
60-
const element = document.querySelector('.help-button')
61-
element.click()
62-
},
63-
true
64-
)
61+
{
62+
key: '?',
63+
legend: `${platformKey}+?`,
64+
description: 'Show/hide help',
65+
handler() {
66+
const element = document.querySelector('.help-button')
67+
element.click()
68+
}
69+
}
70+
]
71+
72+
shortcuts.forEach((shortcut) => {
73+
const legendElement = this.createLegendElement(
74+
shortcut.legend,
75+
shortcut.description,
76+
'General shortcuts',
77+
true
78+
)
79+
80+
document.body.append(legendElement)
81+
})
82+
83+
this._keydownListener = (e) => {
84+
if (!e[modifierProp]) return
85+
86+
const match = shortcuts.find((s) => s.key === e.key)
87+
if (match) {
88+
e.preventDefault()
89+
match.handler()
90+
}
91+
}
92+
93+
window.addEventListener('keydown', this._keydownListener)
6594
},
6695

6796
createTable() {
@@ -251,3 +280,13 @@ document.addEventListener('turbolinks:load', () => {
251280
TW.workbench.help.init()
252281
TW.workbench.keyboard.init_keyShortcuts()
253282
})
283+
284+
document.addEventListener('turbolinks:before-cache', () => {
285+
if (TW.workbench.keyboard._keydownListener) {
286+
window.removeEventListener(
287+
'keydown',
288+
TW.workbench.keyboard._keydownListener
289+
)
290+
TW.workbench.keyboard._keydownListener = null
291+
}
292+
})

0 commit comments

Comments
 (0)