Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
170 commits
Select commit Hold shift + click to select a range
cede3bf
replace DOMNodeInserted with MutationObserver approach
yl5682 Jul 1, 2025
d70127c
Remove dependabot file
jayvarner Jul 30, 2025
8529478
Merge branch 'develop' into ui-bug-triage
yl5682 Aug 26, 2025
170336b
update external image download link
yl5682 Aug 27, 2025
265b2b1
webpack watch js changes
yl5682 Aug 27, 2025
50c0041
remove visibility page
yl5682 Sep 1, 2025
1c7fb60
make ocr text react to canvasswitch
yl5682 Sep 1, 2025
fb2958d
update ocr labels
yl5682 Sep 1, 2025
25314a8
update label for ocr text overlay
yl5682 Sep 1, 2025
7ae3bfc
add loader to the ocr text area; disable when text is unavailable
yl5682 Sep 1, 2025
ff7b6e5
refactor name of the ocr options
yl5682 Sep 1, 2025
82e122e
componentize the ocr overlay toggle
yl5682 Sep 1, 2025
19bcfae
consolidated and streamlined the ocr experience
yl5682 Sep 1, 2025
cc34699
italicize the OCR overlay prompt
yl5682 Sep 2, 2025
350c793
revise no ocr lable language
yl5682 Sep 2, 2025
8148bfe
remove a duplicated load
yl5682 Sep 2, 2025
4d82f9e
remove .rx-nav-item
yl5682 Sep 16, 2025
ff6875b
remove sort_dropdown.html and related javascript
yl5682 Sep 16, 2025
fcb7a8d
remove fontawesome.js (use package.json to load instead)
yl5682 Sep 16, 2025
3c110e3
remove uikit-icons.min.js
yl5682 Sep 16, 2025
d393f5d
add necessary uikit-icons
yl5682 Sep 16, 2025
54db71c
remove jquery from base.html, add to package.json
yl5682 Sep 16, 2025
0effdf6
refactor css
yl5682 Sep 16, 2025
d531466
remove nav-link class
yl5682 Sep 16, 2025
12e943b
remove nav-link .alert-debug and .alert-error
yl5682 Sep 16, 2025
9ad44fe
remove unused styles
yl5682 Sep 16, 2025
c2d68d2
add logic to include book cover in search result
yl5682 Sep 16, 2025
3b8c008
add a mixin and drop in no-list-style
yl5682 Sep 16, 2025
088c352
remove unused block-paragraph_block
yl5682 Sep 16, 2025
72b33fa
remove duplicate css style declaration
yl5682 Sep 16, 2025
fbd4ce4
remove unused css
yl5682 Sep 16, 2025
899a4ab
break out social-auth related styles
yl5682 Sep 16, 2025
41dc94b
break out wagtail styles
yl5682 Sep 16, 2025
3cb182c
remove collectionbox and others
yl5682 Sep 16, 2025
49df7ae
remove #page-bg related styles
yl5682 Sep 16, 2025
064c0cb
remove boxInner and innerContent styles
yl5682 Sep 16, 2025
333dcc5
remove one part of rx-* styles
yl5682 Sep 16, 2025
f855f58
remove one part of rx-* styles
yl5682 Sep 16, 2025
81033b1
remove one part of rx-* styles
yl5682 Sep 16, 2025
c8ba15f
remove #offcanvas-usage styles
yl5682 Sep 16, 2025
48c80b8
merge .selectize-control.plugin-clear_button into search.scss
yl5682 Sep 16, 2025
c40cbc3
tweak uk-button-primary colors
yl5682 Sep 16, 2025
af9a439
remove one part of rx-* styles
yl5682 Sep 16, 2025
2ab1c3d
remove unused styles
yl5682 Sep 16, 2025
f9f28fa
change uk-text-x-large to uk-text-large
yl5682 Sep 17, 2025
fd6dacc
remove showOCR hideOCR preventSeadragonEvents and observeWebpageUpdat…
yl5682 Sep 17, 2025
03571e2
remove obsolete ecds-annotator.min.js loading
yl5682 Sep 17, 2025
0714755
rename custom.js to page-image-download.js
yl5682 Sep 17, 2025
b5a29e1
move vue.js to dist
yl5682 Sep 17, 2025
0004853
let npm manage selectize and nouislider js
yl5682 Sep 17, 2025
074ea67
migrate menu-inverse.css and login.css
yl5682 Sep 17, 2025
364e608
refactor css file structure
yl5682 Sep 17, 2025
2f3f3e3
remove search-form.scss
yl5682 Sep 17, 2025
4b58204
remove duplicate in search.scss
yl5682 Sep 17, 2025
317d618
remove duplicate in main.scss
yl5682 Sep 17, 2025
d606d82
refactor project.scss
yl5682 Sep 17, 2025
3b4f9a1
remove unused css
yl5682 Sep 19, 2025
4dff93d
extract colors for uk-switch.scss
yl5682 Sep 19, 2025
a0e5efb
refactor css colors
yl5682 Sep 19, 2025
80cb04a
remove v-readux style
yl5682 Sep 19, 2025
aac1710
remove uk-alert z-index
yl5682 Sep 19, 2025
0971784
organize main.scss
yl5682 Sep 19, 2025
96340c5
consolidate project.scss and main.scss into readux.scss
yl5682 Sep 19, 2025
feb2f43
fix a few cosmetic bugs from refactoring
yl5682 Sep 19, 2025
3b01fff
refactor css further
yl5682 Sep 19, 2025
00ef6d4
fix a reference bug to css components
yl5682 Sep 19, 2025
7a50e1e
overhaul vue (not working)
yl5682 Sep 19, 2025
685ede9
Revert "overhaul vue (not working)"
yl5682 Sep 20, 2025
9c952a0
update scss loading
yl5682 Sep 20, 2025
b0b4f9c
overhaul Vue
yl5682 Sep 20, 2025
fc2cd7b
fix a style bug
yl5682 Sep 20, 2025
cf83e40
speed up the js build time (17s to 2s)
yl5682 Sep 20, 2025
7816295
update copyText and notification
yl5682 Sep 20, 2025
f6d8a2e
fix a filename typo
yl5682 Sep 20, 2025
a058283
adopt ocrLoaded
yl5682 Sep 20, 2025
0b21cec
use canvasUpdate event to update page image link
yl5682 Sep 20, 2025
d421b63
update uikit version
yl5682 Sep 20, 2025
9a752b4
refactor download/export page and components
yl5682 Sep 20, 2025
8b63e40
use page not found when it's not found
yl5682 Sep 20, 2025
1b8cd26
add missing static library
yl5682 Sep 20, 2025
cf451d3
show "open page image" only on pages
yl5682 Oct 21, 2025
e0ed555
change the site's subtitle color to white
yl5682 Oct 21, 2025
e87d5d9
replace download icon with cloud-download icon
yl5682 Oct 21, 2025
584be37
remove font-weight bold for top navbar
yl5682 Oct 21, 2025
2cdf45f
add missing flatpage styles
yl5682 Oct 22, 2025
abd6300
add thumbnails to the search result list view
yl5682 Oct 22, 2025
502c981
make the flatpage sidebar responsive
yl5682 Oct 22, 2025
a352819
center the search eye glass icon
yl5682 Oct 22, 2025
7b01399
move the chevron in breadcrumb down by 1px
yl5682 Oct 22, 2025
9686b6f
align no volume/collection message
yl5682 Oct 22, 2025
d87cd4d
create a thumbnail view
yl5682 Oct 22, 2025
2883927
improve thumbnail view
yl5682 Oct 22, 2025
47b63e7
use authors list vs. string
yl5682 Oct 22, 2025
7c2f937
improve volume list view
yl5682 Oct 22, 2025
8e61c84
add the list/thumbnail toggle to the form
yl5682 Oct 22, 2025
58add1c
update logic for list view author rendering
yl5682 Oct 22, 2025
333880d
use a black square to contain the cover image
yl5682 Oct 29, 2025
a7bccf5
fix bug with the "black box" thumbnail view
yl5682 Oct 29, 2025
f01566a
"clamp" title to three lines with CSS for thumbnail view
yl5682 Oct 29, 2025
ddde64a
try to add a publication year in YYYY format
yl5682 Nov 1, 2025
f32a287
opt for version 1 for the thumbnail view
yl5682 Nov 1, 2025
796e07a
Merge pull request #1130 from ecds/ui-bug-triage
jayvarner Nov 4, 2025
abe18a2
Fix for signup form
jayvarner Nov 17, 2025
f21e7d3
Another fix for signup form
jayvarner Nov 17, 2025
38b69f7
Yet another signup form fix
jayvarner Nov 17, 2025
aeeb0f0
Update Allauth
jayvarner Nov 17, 2025
89adc64
Save user before returning
jayvarner Nov 17, 2025
51e6861
Signup form change
jayvarner Nov 17, 2025
a57f507
Add some debugging to users
jayvarner Nov 17, 2025
45a69b0
change from thumbnail view to grid view (label)
yl5682 Nov 24, 2025
0b5287a
adopt cover-square style for list view thumbnails
yl5682 Nov 24, 2025
8763ca4
use vertical pipe to separate collections
yl5682 Nov 24, 2025
604c25d
make every cover use the same exact style
yl5682 Nov 24, 2025
2aefcd4
show full description only if the description length is greater than …
yl5682 Nov 24, 2025
7b25d4b
add margin to improve readability
yl5682 Nov 24, 2025
0f63703
remove obsolete p element grey color
yl5682 Nov 24, 2025
33d0e9a
prevent sidebar from overlapping other elements on page
yl5682 Nov 24, 2025
e151b61
Remove signup override.
jayvarner Nov 24, 2025
8860119
Update readux.scss
yl5682 Nov 24, 2025
d13e663
Merge branch 'develop' into ui-bug-triage
yl5682 Nov 24, 2025
74bb4a5
Merge pull request #1131 from ecds/ui-bug-triage
jayvarner Nov 25, 2025
5ec3b46
update long collection name handling and collection name style
yl5682 Dec 8, 2025
52e381c
update flatpage content style
yl5682 Dec 8, 2025
5038b99
add space for ; separated strings
yl5682 Dec 9, 2025
5f7038a
add space for ; separated authors
yl5682 Dec 9, 2025
8def7b2
add pagination to the collections page
yl5682 Dec 9, 2025
e0e6623
add pagination to search results page
yl5682 Dec 9, 2025
bec73e2
include missing collections in the breadcrumb
yl5682 Dec 9, 2025
b053159
Merge branch 'develop' into ui-bug-triage
yl5682 Dec 9, 2025
e2aeebd
Merge pull request #1132 from ecds/ui-bug-triage
jayvarner Dec 9, 2025
8387d24
adjust collection desc styles
yl5682 Dec 11, 2025
e11eaed
tweak collection styles
yl5682 Dec 11, 2025
dfef59f
adjust the collection banner so that it expands based on the size of …
yl5682 Dec 11, 2025
e315678
reset ocr overlay before applying new ones
yl5682 Dec 11, 2025
9bb9fed
Merge branch 'develop' into ui-bug-triage
yl5682 Dec 12, 2025
0724eb8
Merge pull request #1133 from ecds/ui-bug-triage
jayvarner Dec 12, 2025
c2f81e0
striptags to avoid injected html on collections page
yl5682 Dec 30, 2025
5f87a14
use a tooltip for when the title is longer than 50 chars
yl5682 Dec 30, 2025
e71dfc1
default search display item to 60 (instead of 20)
yl5682 Dec 31, 2025
ea97437
add number of items to view on collections' landing page
yl5682 Dec 31, 2025
5110c33
add missing space for language, published_city, and publisher; remove…
yl5682 Dec 31, 2025
ee8b9e2
truncate collection names when the char count > 25; sort A->Z
yl5682 Dec 31, 2025
8574e33
add interactive-color midnight blue effect to links
yl5682 Dec 31, 2025
3b9f65a
flatpage: update ul margin-top to 0.5rem
yl5682 Dec 31, 2025
9ff3505
flatpage: use decimal for ordered list
yl5682 Dec 31, 2025
9e26355
rework breadcrumb collection rendering logic
yl5682 Dec 31, 2025
1bebdfd
Merge branch 'develop' into ui-bug-triage
yl5682 Dec 31, 2025
d9c8001
Merge pull request #1134 from ecds/ui-bug-triage
jayvarner Jan 6, 2026
350694e
Remove a duplicated Collections label in breadcrumb
yl5682 Jan 24, 2026
090a21c
Update char limit to 40 for collection labels
yl5682 Jan 24, 2026
3fe11a7
cap collection summary at 70 chars; description at 4 lines
yl5682 Jan 24, 2026
215099c
update line-height and spacing for grid view labels
yl5682 Jan 24, 2026
2dd106c
grid view label capped at three lines
yl5682 Jan 24, 2026
8fca651
clamp grid view authors field to three lines
yl5682 Jan 24, 2026
b24a053
Merge branch 'develop' into ui-bug-triage
yl5682 Jan 29, 2026
6c5b38e
Merge pull request #1135 from ecds/ui-bug-triage
jayvarner Feb 3, 2026
5d97f24
Update LICENSE.md
jayvarner Feb 3, 2026
e8ad990
Remove errant line from schema
jayvarner Feb 13, 2026
6f15d9b
search result - make year visibility persistent
yl5682 Feb 17, 2026
54b9eab
update collection char limit to 40 in information panel
yl5682 Feb 17, 2026
ccee5a4
adopt search grid view pattern to featured volumes
yl5682 Feb 17, 2026
d77ed39
update char limit to 50 to match truncation
yl5682 Feb 17, 2026
4aef040
adopt the same truncation behavior for featured collections on home
yl5682 Feb 17, 2026
0b6c22a
fix white-colored text issue
yl5682 Feb 17, 2026
414b2d0
Merge pull request #1137 from ecds/ui-bug-triage
jayvarner Feb 17, 2026
df55598
add authors field to the model (backend)
yl5682 Mar 3, 2026
dba5061
remove clunky underline for certain anchors, align close btn with acc…
yl5682 Mar 3, 2026
8c76562
fine tune positioning of buttons and reader panel elements
yl5682 Mar 3, 2026
f7a1ebc
Merge branch 'develop' into ui-bug-triage
yl5682 Mar 3, 2026
b2bd565
Merge pull request #1138 from ecds/ui-bug-triage
jayvarner Mar 3, 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
32 changes: 0 additions & 32 deletions .github/dependabot.yml

This file was deleted.

1 change: 1 addition & 0 deletions LICENSE.md
Original file line number Diff line number Diff line change
Expand Up @@ -186,6 +186,7 @@ third-party archives.
You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0


Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
Expand Down
24 changes: 20 additions & 4 deletions apps/cms/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ class CollectionsPage(Page):
FieldPanel('paragraph', classname="full"),
FieldPanel('layout', classname="full"),
]
initial = {"sort": "title", "order": "asc", "display": "grid"}
initial = {"sort": "title", "order": "asc", "display": "grid", "per_page": "60"}
sort_fields = {
"title": "label",
"added": "created_at",
Expand Down Expand Up @@ -99,7 +99,15 @@ def get_context(self, request):
form = self.get_form(request)
query_set = self.get_queryset(form, self.collections)

paginator = Paginator(query_set, 8) # Show 8 collections per page
per_page_default = int(self.initial.get("per_page", 20))
per_page = per_page_default
if form.is_valid():
try:
per_page = int(form.cleaned_data.get("per_page") or per_page_default)
except (TypeError, ValueError):
per_page = per_page_default

paginator = Paginator(query_set, per_page)

page = request.GET.get("page", 1)
try:
Expand Down Expand Up @@ -142,7 +150,7 @@ class VolumesPage(Page):
FieldPanel('paragraph', classname="full"),
FieldPanel('layout', classname="full"),
]
initial = {"sort": "title", "order": "asc", "display": "grid"}
initial = {"sort": "title", "order": "asc", "display": "grid", "per_page": "60"}
sort_fields = {
"title": "label",
"author": "author",
Expand Down Expand Up @@ -197,7 +205,15 @@ def get_context(self, request):
form = self.get_form(request)
query_set = self.get_queryset(form, self.volumes)

paginator = Paginator(query_set, 8) # Show 8 volumes per page
per_page_default = int(self.initial.get("per_page", 60))
per_page = per_page_default
if form.is_valid():
try:
per_page = int(form.cleaned_data.get("per_page") or per_page_default)
except (TypeError, ValueError):
per_page = per_page_default

paginator = Paginator(query_set, per_page) # Show volumes per selected page size

page = request.GET.get("page", 1)
try:
Expand Down
11 changes: 11 additions & 0 deletions apps/iiif/manifests/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -272,6 +272,17 @@ class Meta: # pylint: disable = too-few-public-methods, missing-class-docstring
ordering = ["published_date"]
# indexes = [GinIndex(fields=['search_vector'])]

@property
def authors(self):
"""Convert authors string into list

:return: List of authors or ["[no author]"] if author field is empty
:rtype: list
"""
if self.author:
return [s.strip() for s in self.author.split(";")]
return ["[no author]"]

@property
def publisher_bib(self):
"""Concatenated property for bib citation.
Expand Down
22 changes: 22 additions & 0 deletions apps/iiif/manifests/tests/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,28 @@ def test_properties(self):
"/iiif/%s/canvas/%s" % (self.volume.pid, self.start_canvas.pid)
)

def test_authors_property(self):
"""Test the authors property returns a list of authors from the author field."""
# Test with no author
manifest = Manifest(author=None)
assert manifest.authors == ["[no author]"]

# Test with empty string
manifest = Manifest(author="")
assert manifest.authors == ["[no author]"]

# Test with single author
manifest = Manifest(author="John Doe")
assert manifest.authors == ["John Doe"]

# Test with multiple authors separated by semicolon
manifest = Manifest(author="John Doe; Jane Smith")
assert manifest.authors == ["John Doe", "Jane Smith"]

# Test with multiple authors with extra whitespace
manifest = Manifest(author="John Doe ; Jane Smith ; Bob Jones")
assert manifest.authors == ["John Doe", "Jane Smith", "Bob Jones"]

def test_default_start_canvas(self):
image_server = ImageServerFactory.create(server_base="https://fake.info")
manifest = Manifest(image_server=image_server)
Expand Down
61 changes: 56 additions & 5 deletions apps/readux/forms.py
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,12 @@ def valid_value(self, value):
class ManifestSearchForm(forms.Form):
"""Django form for searching Manifests via Elasticsearch"""

PER_PAGE_CHOICES = [
("20", "20"),
("40", "40"),
("60", "60"),
("100", "100"),
]
q = forms.CharField(
label="Search for individual whole keywords. Multiple words will be searched as 'or' (e.g. Rome London = Rome or London).",
required=False,
Expand All @@ -73,11 +79,7 @@ class ManifestSearchForm(forms.Form):
("metadata", "Metadata only"),
("text", "Textual contents only"),
),
widget=forms.Select(
attrs={
"class": "uk-select",
},
),
widget=forms.Select(attrs={"class": "uk-select"}),
)
language = FacetedMultipleChoiceField(
label="Language",
Expand Down Expand Up @@ -121,9 +123,32 @@ class ManifestSearchForm(forms.Form):
("-label_alphabetical", "Title (Z-A)"),
("_score", "Relevance"),
),
widget=forms.Select(attrs={"class": "uk-select"}),
)
display = forms.ChoiceField(
label="View mode",
required=False,
choices=(
("list", "List view"),
("grid", "Grid view"),
),
initial="list",
widget=forms.Select(
attrs={
"class": "uk-select",
"aria-label": "Select view mode",
},
),
)
per_page = forms.ChoiceField(
label="Items per page",
required=False,
choices=PER_PAGE_CHOICES,
initial="60",
widget=forms.Select(
attrs={
"class": "uk-select",
"aria-label": "Items per page",
},
),
)
Expand Down Expand Up @@ -222,6 +247,12 @@ class AllVolumesForm(forms.Form):
("asc", "Ascending"),
("desc", "Descending"),
]
PER_PAGE_CHOICES = [
("20", "20"),
("40", "40"),
("60", "60"),
("100", "100"),
]
sort = forms.ChoiceField(
label="Sort by",
choices=SORT_CHOICES,
Expand All @@ -234,6 +265,13 @@ class AllVolumesForm(forms.Form):
required=False,
widget=CustomDropdownSelect,
)
per_page = forms.ChoiceField(
label="Items per page",
choices=PER_PAGE_CHOICES,
required=False,
initial="60",
widget=CustomDropdownSelect,
)


class AllCollectionsForm(forms.Form):
Expand All @@ -248,6 +286,12 @@ class AllCollectionsForm(forms.Form):
("asc", "Ascending"),
("desc", "Descending"),
]
PER_PAGE_CHOICES = [
("20", "20"),
("40", "40"),
("60", "60"),
("100", "100"),
]
sort = forms.ChoiceField(
label="Sort by",
choices=SORT_CHOICES,
Expand All @@ -260,3 +304,10 @@ class AllCollectionsForm(forms.Form):
required=False,
widget=CustomDropdownSelect,
)
per_page = forms.ChoiceField(
label="Items per page",
choices=PER_PAGE_CHOICES,
required=False,
initial="60",
widget=CustomDropdownSelect,
)
54 changes: 54 additions & 0 deletions apps/readux/templatetags/readux_extras.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,42 @@ def dict_item(dictionary, key):
return None


@register.filter
def attr(obj, attr_name):
"""Safely access an attribute on an object without raising if missing."""
try:
return getattr(obj, attr_name)
except AttributeError:
return None


@register.filter
def manifest_year(volume):
"""Return a 4-digit published year from a manifest or hit object."""
# try standard published_date first
published = getattr(volume, "published_date", None)
if published:
# handle datetime/date objects with a year attribute
year = getattr(published, "year", None)
if year:
return f"{int(year):04d}"
# fall back to parsing string content
match = re.search(r"\d{4}", str(published))
if match:
return match.group(0)
return str(published)[:4]

# fall back to elasticsearch stored string (may be missing on some hits)
edtf = getattr(volume, "published_date_edtf", None)
if edtf:
match = re.search(r"\d{4}", str(edtf))
if match:
return match.group(0)
return str(edtf)[:4]

return ""


@register.filter
def has_inner_hits(volume):
"""Template filter to determine if there are any inner hits across the volume"""
Expand Down Expand Up @@ -84,3 +120,21 @@ def vimeo_embed_url(vimeo_url):
# get the embed url from a vimeo link
# i.e. https://vimeo.com/76979871 --> https://player.vimeo.com/video/76979871
return re.sub(r"vimeo\.com\/(\d+)", r"player.vimeo.com/video/\1", vimeo_url)


@register.filter
def spaced_semicolons(value):
"""Ensure a single space follows each semicolon in a metadata string."""
try:
return re.sub(r";\s*", "; ", str(value))
except TypeError:
return value


@register.filter
def strip_trailing_commas(value):
"""Remove any trailing commas and surrounding whitespace."""
try:
return re.sub(r",\s*$", "", str(value))
except TypeError:
return value
Loading
Loading