From eadfeb9529999acd1e8f09846be583b83a93ab9b Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 28 Oct 2025 16:07:23 +0000 Subject: [PATCH 01/10] Initial plan From 0cb18016d8d0d6e0d42066f3ca7fcc730ff13507 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 28 Oct 2025 16:21:48 +0000 Subject: [PATCH 02/10] Add part of speech filter to SearchFilter Co-authored-by: myieye <12587509+myieye@users.noreply.github.com> --- .../src/project/browse/SearchFilter.svelte | 12 +++++++- .../browse/filter/PartOfSpeechSelect.svelte | 29 +++++++++++++++++++ 2 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 frontend/viewer/src/project/browse/filter/PartOfSpeechSelect.svelte diff --git a/frontend/viewer/src/project/browse/SearchFilter.svelte b/frontend/viewer/src/project/browse/SearchFilter.svelte index 9d81ee0900..9b63af8a19 100644 --- a/frontend/viewer/src/project/browse/SearchFilter.svelte +++ b/frontend/viewer/src/project/browse/SearchFilter.svelte @@ -19,8 +19,9 @@ import FieldSelect, {type SelectedField} from './filter/FieldSelect.svelte'; import MissingSelect, {type MissingOption} from './filter/MissingSelect.svelte'; import SemanticDomainSelect from './filter/SemanticDomainSelect.svelte'; + import PartOfSpeechSelect from './filter/PartOfSpeechSelect.svelte'; import Label from '$lib/components/ui/label/label.svelte'; - import type {ISemanticDomain} from '$lib/dotnet-types'; + import type {ISemanticDomain, IPartOfSpeech} from '$lib/dotnet-types'; import {Switch} from '$lib/components/ui/switch'; const stats = useProjectStats(); @@ -42,6 +43,7 @@ let filterOp = $state('contains') let semanticDomain = $state(); let includeSubDomains = $state(false); + let partOfSpeech = $state(); $effect(() => { let newFilter: string[] = []; @@ -74,6 +76,10 @@ newFilter.push(`Senses.SemanticDomains.Code${includeSubDomains ? '^' : '='}${semanticDomain.code}`); } + if (partOfSpeech) { + newFilter.push(`Senses.PartOfSpeechId=${partOfSpeech.id}`); + } + gridifyFilter = newFilter.join(', '); }); @@ -141,6 +147,10 @@ +
+ + +
diff --git a/frontend/viewer/src/project/browse/filter/PartOfSpeechSelect.svelte b/frontend/viewer/src/project/browse/filter/PartOfSpeechSelect.svelte new file mode 100644 index 0000000000..7c39e9bf1b --- /dev/null +++ b/frontend/viewer/src/project/browse/filter/PartOfSpeechSelect.svelte @@ -0,0 +1,29 @@ + + + + + writingSystemService.pickBestAlternative(pos.name, 'analysis')} - placeholder={$t`Any part of speech`} + placeholder={pt($t`Any grammatical info.`, $t`Any part of speech`, $currentView)} clearable idSelector="id" /> From e352d4ccd2f7c70ee8c990ad40f01210b4176885 Mon Sep 17 00:00:00 2001 From: Tim Haasdyk Date: Wed, 29 Oct 2025 16:56:51 +0100 Subject: [PATCH 05/10] Handle items with no label --- .../src/lib/components/field-editors/multi-select.svelte | 6 +++--- .../viewer/src/lib/components/field-editors/select.svelte | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/frontend/viewer/src/lib/components/field-editors/multi-select.svelte b/frontend/viewer/src/lib/components/field-editors/multi-select.svelte index 57d4904fa2..e7a201f4be 100644 --- a/frontend/viewer/src/lib/components/field-editors/multi-select.svelte +++ b/frontend/viewer/src/lib/components/field-editors/multi-select.svelte @@ -166,7 +166,7 @@
{#each displayValues as value (getId(value))} - {getLabel(value)} + {getLabel(value) || $t`Untitled`} {:else} @@ -224,7 +224,7 @@ keywords={[label.toLocaleLowerCase()]} value={label.toLocaleLowerCase()} onSelect={() => toggleSelected(value, !dirty && !IsMobile.value)} - class="group max-md:h-12" + class={cn('group max-md:h-12', label || 'text-muted-foreground')} data-value-index={i} aria-label={label} > @@ -245,7 +245,7 @@ }} onCheckedChange={() => toggleSelected(value, false)} /> - {label} + {label || $t`Untitled`} {/each} {#if renderedOptions.length < filteredOptions.length} diff --git a/frontend/viewer/src/lib/components/field-editors/select.svelte b/frontend/viewer/src/lib/components/field-editors/select.svelte index 174a15abf3..6d5d0dcc2f 100644 --- a/frontend/viewer/src/lib/components/field-editors/select.svelte +++ b/frontend/viewer/src/lib/components/field-editors/select.svelte @@ -95,7 +95,7 @@ class={cn('w-full h-auto min-h-10 px-2 justify-between disabled:opacity-100 disabled:border-transparent', className)}> {#if value} - {getLabel(value)} + {getLabel(value) || $t`Untitled`} {:else} @@ -140,12 +140,12 @@ keywords={[label.toLocaleLowerCase()]} value={label.toLocaleLowerCase()} onSelect={() => selectValue(option)} - class="group max-md:h-12" + class={cn('group max-md:h-12', label || 'text-muted-foreground')} data-value-index={i} aria-label={label} > - {label} + {label || $t`Untitled`} {/each} {#if renderedOptions.length < filteredOptions.length} From 6386a84d161f515346cece09956f7952f80e996c Mon Sep 17 00:00:00 2001 From: Tim Haasdyk Date: Wed, 29 Oct 2025 16:57:23 +0100 Subject: [PATCH 06/10] Prevent ever-growing filter options from getting too tall --- frontend/viewer/src/project/browse/SearchFilter.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/viewer/src/project/browse/SearchFilter.svelte b/frontend/viewer/src/project/browse/SearchFilter.svelte index 47c4040bd6..187d4b8f3b 100644 --- a/frontend/viewer/src/project/browse/SearchFilter.svelte +++ b/frontend/viewer/src/project/browse/SearchFilter.svelte @@ -121,7 +121,7 @@ {/snippet}
- +
From 087d31241e62402a8a51a1a49533ee7b65d1d9c7 Mon Sep 17 00:00:00 2001 From: Tim Haasdyk Date: Wed, 29 Oct 2025 16:59:50 +0100 Subject: [PATCH 07/10] Add ellipsis for overflowing texts --- .../src/lib/components/field-editors/multi-select.svelte | 4 ++-- .../viewer/src/lib/components/field-editors/select.svelte | 4 ++-- frontend/viewer/src/lib/components/ui/button/x-button.svelte | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/frontend/viewer/src/lib/components/field-editors/multi-select.svelte b/frontend/viewer/src/lib/components/field-editors/multi-select.svelte index e7a201f4be..6d296269d5 100644 --- a/frontend/viewer/src/lib/components/field-editors/multi-select.svelte +++ b/frontend/viewer/src/lib/components/field-editors/multi-select.svelte @@ -163,13 +163,13 @@ {#snippet displayBadges()} -
+
{#each displayValues as value (getId(value))} {getLabel(value) || $t`Untitled`} {:else} - + {placeholder ?? $t`None`}   diff --git a/frontend/viewer/src/lib/components/ui/button/x-button.svelte b/frontend/viewer/src/lib/components/ui/button/x-button.svelte index 993437505a..7af0b9b036 100644 --- a/frontend/viewer/src/lib/components/ui/button/x-button.svelte +++ b/frontend/viewer/src/lib/components/ui/button/x-button.svelte @@ -12,5 +12,5 @@
- + {emptyResultsPlaceholder ?? $t`No items found`} {#each renderedOptions as value, i (getId(value))} diff --git a/frontend/viewer/src/lib/components/field-editors/select.svelte b/frontend/viewer/src/lib/components/field-editors/select.svelte index 88c3ea6d1a..65be500b7b 100644 --- a/frontend/viewer/src/lib/components/field-editors/select.svelte +++ b/frontend/viewer/src/lib/components/field-editors/select.svelte @@ -129,7 +129,7 @@ {/if}
- + {emptyResultsPlaceholder ?? $t`No items found`} {#each renderedOptions as option, i (getId(option))} From 5a86f84046c072a41ed058fa8e41b31dfff141a2 Mon Sep 17 00:00:00 2001 From: Tim Haasdyk Date: Wed, 29 Oct 2025 17:06:39 +0100 Subject: [PATCH 10/10] i18n:extract --- frontend/viewer/src/locales/en.po | 14 ++++++++++++++ frontend/viewer/src/locales/es.po | 14 ++++++++++++++ frontend/viewer/src/locales/fr.po | 14 ++++++++++++++ frontend/viewer/src/locales/id.po | 14 ++++++++++++++ frontend/viewer/src/locales/ko.po | 14 ++++++++++++++ frontend/viewer/src/locales/ms.po | 14 ++++++++++++++ frontend/viewer/src/locales/sw.po | 14 ++++++++++++++ 7 files changed, 98 insertions(+) diff --git a/frontend/viewer/src/locales/en.po b/frontend/viewer/src/locales/en.po index a49221f1a7..eba99b5467 100644 --- a/frontend/viewer/src/locales/en.po +++ b/frontend/viewer/src/locales/en.po @@ -130,6 +130,14 @@ msgstr "Add Word" msgid "an entry" msgstr "an entry" +#: src/project/browse/filter/PartOfSpeechSelect.svelte +msgid "Any grammatical info." +msgstr "Any grammatical info." + +#: src/project/browse/filter/PartOfSpeechSelect.svelte +msgid "Any part of speech" +msgstr "Any part of speech" + #: src/project/browse/filter/SemanticDomainSelect.svelte msgid "Any semantic domain" msgstr "Any semantic domain" @@ -576,6 +584,7 @@ msgstr "Gloss" msgid "Go to {0}" msgstr "Go to {0}" +#: src/project/browse/SearchFilter.svelte #: src/lib/entry-editor/object-editors/SenseEditorPrimitive.svelte msgid "Grammatical info." msgstr "Grammatical info." @@ -893,6 +902,7 @@ msgstr "Part" msgid "Part of" msgstr "Part of" +#: src/project/browse/SearchFilter.svelte #: src/lib/entry-editor/object-editors/SenseEditorPrimitive.svelte msgid "Part of speech" msgstr "Part of speech" @@ -1243,6 +1253,10 @@ msgstr "Unknown server" #: src/project/browse/EntryView.svelte #: src/project/browse/EntryRow.svelte #: src/project/browse/EntryMenu.svelte +#: src/lib/components/field-editors/select.svelte +#: src/lib/components/field-editors/select.svelte +#: src/lib/components/field-editors/multi-select.svelte +#: src/lib/components/field-editors/multi-select.svelte msgid "Untitled" msgstr "Untitled" diff --git a/frontend/viewer/src/locales/es.po b/frontend/viewer/src/locales/es.po index cb882c0b56..850b5db075 100644 --- a/frontend/viewer/src/locales/es.po +++ b/frontend/viewer/src/locales/es.po @@ -135,6 +135,14 @@ msgstr "" msgid "an entry" msgstr "una entrada" +#: src/project/browse/filter/PartOfSpeechSelect.svelte +msgid "Any grammatical info." +msgstr "" + +#: src/project/browse/filter/PartOfSpeechSelect.svelte +msgid "Any part of speech" +msgstr "" + #: src/project/browse/filter/SemanticDomainSelect.svelte msgid "Any semantic domain" msgstr "" @@ -581,6 +589,7 @@ msgstr "Glosa" msgid "Go to {0}" msgstr "Visite {0}" +#: src/project/browse/SearchFilter.svelte #: src/lib/entry-editor/object-editors/SenseEditorPrimitive.svelte msgid "Grammatical info." msgstr "Información gramatical." @@ -898,6 +907,7 @@ msgstr "Pieza" msgid "Part of" msgstr "Parte de" +#: src/project/browse/SearchFilter.svelte #: src/lib/entry-editor/object-editors/SenseEditorPrimitive.svelte msgid "Part of speech" msgstr "Parte de la oración" @@ -1248,6 +1258,10 @@ msgstr "" #: src/project/browse/EntryView.svelte #: src/project/browse/EntryRow.svelte #: src/project/browse/EntryMenu.svelte +#: src/lib/components/field-editors/select.svelte +#: src/lib/components/field-editors/select.svelte +#: src/lib/components/field-editors/multi-select.svelte +#: src/lib/components/field-editors/multi-select.svelte msgid "Untitled" msgstr "Sin título" diff --git a/frontend/viewer/src/locales/fr.po b/frontend/viewer/src/locales/fr.po index 0f7e31fafd..c0ff536c62 100644 --- a/frontend/viewer/src/locales/fr.po +++ b/frontend/viewer/src/locales/fr.po @@ -135,6 +135,14 @@ msgstr "" msgid "an entry" msgstr "une entrée" +#: src/project/browse/filter/PartOfSpeechSelect.svelte +msgid "Any grammatical info." +msgstr "" + +#: src/project/browse/filter/PartOfSpeechSelect.svelte +msgid "Any part of speech" +msgstr "" + #: src/project/browse/filter/SemanticDomainSelect.svelte msgid "Any semantic domain" msgstr "" @@ -581,6 +589,7 @@ msgstr "Glose" msgid "Go to {0}" msgstr "Aller sur {0}" +#: src/project/browse/SearchFilter.svelte #: src/lib/entry-editor/object-editors/SenseEditorPrimitive.svelte msgid "Grammatical info." msgstr "Informations grammaticales." @@ -898,6 +907,7 @@ msgstr "Partie" msgid "Part of" msgstr "Une partie de" +#: src/project/browse/SearchFilter.svelte #: src/lib/entry-editor/object-editors/SenseEditorPrimitive.svelte msgid "Part of speech" msgstr "Partie du discours" @@ -1248,6 +1258,10 @@ msgstr "" #: src/project/browse/EntryView.svelte #: src/project/browse/EntryRow.svelte #: src/project/browse/EntryMenu.svelte +#: src/lib/components/field-editors/select.svelte +#: src/lib/components/field-editors/select.svelte +#: src/lib/components/field-editors/multi-select.svelte +#: src/lib/components/field-editors/multi-select.svelte msgid "Untitled" msgstr "Sans titre" diff --git a/frontend/viewer/src/locales/id.po b/frontend/viewer/src/locales/id.po index 730ac4484d..0da1aaf714 100644 --- a/frontend/viewer/src/locales/id.po +++ b/frontend/viewer/src/locales/id.po @@ -135,6 +135,14 @@ msgstr "" msgid "an entry" msgstr "sebuah entri" +#: src/project/browse/filter/PartOfSpeechSelect.svelte +msgid "Any grammatical info." +msgstr "" + +#: src/project/browse/filter/PartOfSpeechSelect.svelte +msgid "Any part of speech" +msgstr "" + #: src/project/browse/filter/SemanticDomainSelect.svelte msgid "Any semantic domain" msgstr "" @@ -581,6 +589,7 @@ msgstr "Arti Singkat" msgid "Go to {0}" msgstr "Buka {0}" +#: src/project/browse/SearchFilter.svelte #: src/lib/entry-editor/object-editors/SenseEditorPrimitive.svelte msgid "Grammatical info." msgstr "Info tata bahasa." @@ -898,6 +907,7 @@ msgstr "Bagian" msgid "Part of" msgstr "Bagian dari" +#: src/project/browse/SearchFilter.svelte #: src/lib/entry-editor/object-editors/SenseEditorPrimitive.svelte msgid "Part of speech" msgstr "Bagian dari pidato" @@ -1248,6 +1258,10 @@ msgstr "" #: src/project/browse/EntryView.svelte #: src/project/browse/EntryRow.svelte #: src/project/browse/EntryMenu.svelte +#: src/lib/components/field-editors/select.svelte +#: src/lib/components/field-editors/select.svelte +#: src/lib/components/field-editors/multi-select.svelte +#: src/lib/components/field-editors/multi-select.svelte msgid "Untitled" msgstr "Tanpa judul" diff --git a/frontend/viewer/src/locales/ko.po b/frontend/viewer/src/locales/ko.po index e3a2c7d8d3..1c5372406f 100644 --- a/frontend/viewer/src/locales/ko.po +++ b/frontend/viewer/src/locales/ko.po @@ -135,6 +135,14 @@ msgstr "" msgid "an entry" msgstr "항목" +#: src/project/browse/filter/PartOfSpeechSelect.svelte +msgid "Any grammatical info." +msgstr "" + +#: src/project/browse/filter/PartOfSpeechSelect.svelte +msgid "Any part of speech" +msgstr "" + #: src/project/browse/filter/SemanticDomainSelect.svelte msgid "Any semantic domain" msgstr "" @@ -581,6 +589,7 @@ msgstr "광택" msgid "Go to {0}" msgstr "{0}으로 이동" +#: src/project/browse/SearchFilter.svelte #: src/lib/entry-editor/object-editors/SenseEditorPrimitive.svelte msgid "Grammatical info." msgstr "문법 정보." @@ -898,6 +907,7 @@ msgstr "Part" msgid "Part of" msgstr "의 일부" +#: src/project/browse/SearchFilter.svelte #: src/lib/entry-editor/object-editors/SenseEditorPrimitive.svelte msgid "Part of speech" msgstr "품사" @@ -1248,6 +1258,10 @@ msgstr "" #: src/project/browse/EntryView.svelte #: src/project/browse/EntryRow.svelte #: src/project/browse/EntryMenu.svelte +#: src/lib/components/field-editors/select.svelte +#: src/lib/components/field-editors/select.svelte +#: src/lib/components/field-editors/multi-select.svelte +#: src/lib/components/field-editors/multi-select.svelte msgid "Untitled" msgstr "제목 없음" diff --git a/frontend/viewer/src/locales/ms.po b/frontend/viewer/src/locales/ms.po index deea99d1f9..3b8d58b63e 100644 --- a/frontend/viewer/src/locales/ms.po +++ b/frontend/viewer/src/locales/ms.po @@ -135,6 +135,14 @@ msgstr "" msgid "an entry" msgstr "satu entri" +#: src/project/browse/filter/PartOfSpeechSelect.svelte +msgid "Any grammatical info." +msgstr "" + +#: src/project/browse/filter/PartOfSpeechSelect.svelte +msgid "Any part of speech" +msgstr "" + #: src/project/browse/filter/SemanticDomainSelect.svelte msgid "Any semantic domain" msgstr "" @@ -581,6 +589,7 @@ msgstr "Glos" msgid "Go to {0}" msgstr "Pergi ke {0}" +#: src/project/browse/SearchFilter.svelte #: src/lib/entry-editor/object-editors/SenseEditorPrimitive.svelte msgid "Grammatical info." msgstr "Maklumat tatabahasa." @@ -898,6 +907,7 @@ msgstr "Bahagian" msgid "Part of" msgstr "Sebahagian daripada" +#: src/project/browse/SearchFilter.svelte #: src/lib/entry-editor/object-editors/SenseEditorPrimitive.svelte msgid "Part of speech" msgstr "Jenis Perkataan" @@ -1248,6 +1258,10 @@ msgstr "" #: src/project/browse/EntryView.svelte #: src/project/browse/EntryRow.svelte #: src/project/browse/EntryMenu.svelte +#: src/lib/components/field-editors/select.svelte +#: src/lib/components/field-editors/select.svelte +#: src/lib/components/field-editors/multi-select.svelte +#: src/lib/components/field-editors/multi-select.svelte msgid "Untitled" msgstr "Tanpa Tajuk" diff --git a/frontend/viewer/src/locales/sw.po b/frontend/viewer/src/locales/sw.po index 1da9d02015..2d60b1dbbf 100644 --- a/frontend/viewer/src/locales/sw.po +++ b/frontend/viewer/src/locales/sw.po @@ -135,6 +135,14 @@ msgstr "" msgid "an entry" msgstr "" +#: src/project/browse/filter/PartOfSpeechSelect.svelte +msgid "Any grammatical info." +msgstr "" + +#: src/project/browse/filter/PartOfSpeechSelect.svelte +msgid "Any part of speech" +msgstr "" + #: src/project/browse/filter/SemanticDomainSelect.svelte msgid "Any semantic domain" msgstr "" @@ -581,6 +589,7 @@ msgstr "Glosi" msgid "Go to {0}" msgstr "" +#: src/project/browse/SearchFilter.svelte #: src/lib/entry-editor/object-editors/SenseEditorPrimitive.svelte msgid "Grammatical info." msgstr "" @@ -898,6 +907,7 @@ msgstr "Sehemu" msgid "Part of" msgstr "" +#: src/project/browse/SearchFilter.svelte #: src/lib/entry-editor/object-editors/SenseEditorPrimitive.svelte msgid "Part of speech" msgstr "Sehemu za mazungumzo" @@ -1248,6 +1258,10 @@ msgstr "" #: src/project/browse/EntryView.svelte #: src/project/browse/EntryRow.svelte #: src/project/browse/EntryMenu.svelte +#: src/lib/components/field-editors/select.svelte +#: src/lib/components/field-editors/select.svelte +#: src/lib/components/field-editors/multi-select.svelte +#: src/lib/components/field-editors/multi-select.svelte msgid "Untitled" msgstr ""