Skip to content

Commit 7700125

Browse files
feat: add table selection
1 parent 8743c79 commit 7700125

9 files changed

Lines changed: 42 additions & 20 deletions

File tree

app/components/Package/Card.vue

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,9 @@ const props = defineProps<{
1616
searchQuery?: string
1717
}>()
1818
19-
const selected = defineModel<boolean>('selected', {
20-
default: false,
19+
const { isPackageSelected, togglePackageSelection } = usePackageSelection()
20+
const isSelected = computed<boolean>(() => {
21+
return isPackageSelected(props.result)
2122
})
2223
2324
const emit = defineEmits<{
@@ -43,7 +44,7 @@ const numberFormatter = useNumberFormatter()
4344
</script>
4445

4546
<template>
46-
<BaseCard :selected :isExactMatch="isExactMatch">
47+
<BaseCard :selected="isSelected" :isExactMatch="isExactMatch">
4748
<header class="mb-4 flex items-baseline justify-between gap-2">
4849
<component
4950
:is="headingLevel ?? 'h3'"
@@ -64,16 +65,14 @@ const numberFormatter = useNumberFormatter()
6465
>
6566
</component>
6667

67-
<div class="flex items-center gap-4">
68-
<div class="relative z-1">
69-
<input
70-
data-package-card-checkbox
71-
class="md:opacity-0 group-focus-within:opacity-100 checked:opacity-100 md:group-hover:opacity-100 size-4 cursor-pointer accent-accent border border-fg-muted/30 hover:border-accent transition-colors"
72-
type="checkbox"
73-
:checked="!!selected"
74-
v-model="selected"
75-
/>
76-
</div>
68+
<div class="relative z-1">
69+
<input
70+
data-package-card-checkbox
71+
class="md:opacity-0 group-focus-within:opacity-100 checked:opacity-100 md:group-hover:opacity-100 size-4 cursor-pointer accent-accent border border-fg-muted/30 hover:border-accent transition-colors"
72+
type="checkbox"
73+
:checked="isSelected"
74+
@change="togglePackageSelection(result)"
75+
/>
7776
</div>
7877
</header>
7978

app/components/Package/List.vue

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -147,8 +147,6 @@ function scrollToIndex(index: number, smooth = true) {
147147
defineExpose({
148148
scrollToIndex,
149149
})
150-
151-
const { isPackageSelected, togglePackageSelection } = usePackageSelection()
152150
</script>
153151

154152
<template>
@@ -190,8 +188,6 @@ const { isPackageSelected, togglePackageSelection } = usePackageSelection()
190188
class="motion-safe:animate-fade-in motion-safe:animate-fill-both"
191189
:filters="filters"
192190
:style="{ animationDelay: `${Math.min(index * 0.02, 0.3)}s` }"
193-
:selected="isPackageSelected(item)"
194-
@update:selected="togglePackageSelection(item)"
195191
@click-keyword="emit('clickKeyword', $event)"
196192
/>
197193
</div>

app/components/Package/Table.vue

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@ const columnLabels = computed(() => ({
102102
maintenanceScore: t('filters.columns.maintenance_score'),
103103
combinedScore: t('filters.columns.combined_score'),
104104
security: t('filters.columns.security'),
105+
selection: t('filters.columns.selection'),
105106
}))
106107
107108
function getColumnLabel(id: ColumnId): string {
@@ -299,6 +300,9 @@ function getColumnLabel(id: ColumnId): string {
299300
>
300301
{{ getColumnLabel('security') }}
301302
</th>
303+
<th class="w-8">
304+
<span class="sr-only">{{ getColumnLabel('selection') }}</span>
305+
</th>
302306
</tr>
303307
</thead>
304308
<tbody>

app/components/Package/TableRow.vue

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,10 @@ const pkg = computed(() => props.result.package)
1717
const score = computed(() => props.result.score)
1818
1919
const updatedDate = computed(() => props.result.package.date)
20+
const { isPackageSelected, togglePackageSelection } = usePackageSelection()
21+
const isSelected = computed<boolean>(() => {
22+
return isPackageSelected(props.result)
23+
})
2024
2125
function formatDownloads(count?: number): string {
2226
if (count === undefined) return '-'
@@ -196,6 +200,18 @@ const allMaintainersText = computed(() => {
196200
</span>
197201
<span v-else class="text-fg-subtle"> - </span>
198202
</td>
203+
204+
<td class="pe-2 relative z-1">
205+
<div class="flex items-center justify-center h-full">
206+
<input
207+
data-package-card-checkbox
208+
class="md:opacity-0 group-focus-within:opacity-100 checked:opacity-100 md:group-hover:opacity-100 size-4 cursor-pointer accent-accent border border-fg-muted/30 hover:border-accent transition-colors"
209+
type="checkbox"
210+
:checked="isSelected"
211+
@change="togglePackageSelection(result)"
212+
/>
213+
</div>
214+
</td>
199215
</tr>
200216
</template>
201217

i18n/locales/en.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -807,7 +807,8 @@
807807
"popularity_score": "Popularity score",
808808
"maintenance_score": "Maintenance score",
809809
"combined_score": "Combined score",
810-
"security": "Security"
810+
"security": "Security",
811+
"selection": "Select package"
811812
},
812813
"view_mode": {
813814
"label": "View mode",

i18n/schema.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2427,6 +2427,9 @@
24272427
},
24282428
"security": {
24292429
"type": "string"
2430+
},
2431+
"selection": {
2432+
"type": "string"
24302433
}
24312434
},
24322435
"additionalProperties": false

lunaria/files/en-GB.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -806,7 +806,8 @@
806806
"popularity_score": "Popularity score",
807807
"maintenance_score": "Maintenance score",
808808
"combined_score": "Combined score",
809-
"security": "Security"
809+
"security": "Security",
810+
"selection": "Select package"
810811
},
811812
"view_mode": {
812813
"label": "View mode",

lunaria/files/en-US.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -806,7 +806,8 @@
806806
"popularity_score": "Popularity score",
807807
"maintenance_score": "Maintenance score",
808808
"combined_score": "Combined score",
809-
"security": "Security"
809+
"security": "Security",
810+
"selection": "Select package"
810811
},
811812
"view_mode": {
812813
"label": "View mode",

shared/types/preferences.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ export type ColumnId =
2020
| 'maintenanceScore'
2121
| 'combinedScore'
2222
| 'security'
23+
| 'selection'
2324

2425
export interface ColumnConfig {
2526
id: ColumnId

0 commit comments

Comments
 (0)