Skip to content

Commit 8d76ced

Browse files
committed
Add searching
1 parent 37d4f74 commit 8d76ced

3 files changed

Lines changed: 36 additions & 27 deletions

File tree

backend/app.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ def filelist():
4242

4343

4444
@app.get("/api/coins")
45-
def coins(f, sort=None, reverse: bool = False, status_filter=None, country_filter=None, series_filter=None, type_filter=None,
45+
def coins(f, search=None, sort=None, reverse: bool = False, status_filter=None, country_filter=None, series_filter=None, type_filter=None,
4646
period_filter=None, mint_filter=None):
4747
file = f
4848
con = sqlite_connect(file)
@@ -55,6 +55,9 @@ def coins(f, sort=None, reverse: bool = False, status_filter=None, country_filte
5555

5656
params = []
5757
sql_filters = []
58+
if search:
59+
sql_filters.append("title LIKE ?")
60+
params.append(f"%{search}%")
5861
if status_filter:
5962
sql_filters.append("status = ?")
6063
params.append(status_filter)

frontend/src/components/CoinListView.vue

Lines changed: 22 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,14 @@ import {convertFraction, formatYear} from "@/utils/formatter.js";
88
import {useService} from "@/composables/useService.js";
99
import FilterItem from "@/components/FilterItem.vue";
1010
import SortItem from "@/components/SortItem.vue";
11+
import i18n from "@/i18n/index.js";
1112
1213
const router = useRouter()
1314
const service = useService();
1415
1516
const images = ref([])
1617
const coinsList = ref([])
18+
const searchVal = ref(null)
1719
const sortedBy = ref(null)
1820
const reverseSort = ref(false)
1921
const selectedStatus = ref(null)
@@ -41,6 +43,7 @@ onUnmounted(async () => {
4143
})
4244
4345
const onOpenFile = async () => {
46+
searchVal.value = null
4447
sortedBy.value = null
4548
reverseSort.value = false
4649
selectedStatus.value = null
@@ -90,21 +93,9 @@ function generateDescription( coin_data ) {
9093
return desc;
9194
}
9295
93-
const onFilterChanged = async (field, val) => {
94-
coinsList.value = await service.loadCoins(
95-
sortedBy.value,
96-
reverseSort.value,
97-
selectedStatus.value,
98-
selectedCountry.value,
99-
selectedSeries.value,
100-
selectedType.value,
101-
selectedPeriod.value,
102-
selectedMint.value
103-
);
104-
}
105-
106-
const onSortByChanged = async (val) => {
96+
const onChanged = async () => {
10797
coinsList.value = await service.loadCoins(
98+
searchVal.value,
10899
sortedBy.value,
109100
reverseSort.value,
110101
selectedStatus.value,
@@ -123,16 +114,26 @@ const loadImage = async (index, coinId) => {
123114

124115
<template>
125116
<v-container>
126-
<SortItem :fields="fields" :settings="settings" @sort-by-changed="onSortByChanged" v-model="sortedBy" v-model:reverse="reverseSort" />
117+
<SortItem :fields="fields" :settings="settings" @sort-by-changed="onChanged" v-model="sortedBy" v-model:reverse="reverseSort" />
118+
</v-container>
119+
120+
<v-container>
121+
<FilterItem :filters="filters['status']" field="status" :settings="settings" @filter-changed="onChanged" v-model="selectedStatus" />
122+
<FilterItem :filters="filters['country']" field="country" :settings="settings" @filter-changed="onChanged" v-model="selectedCountry" />
123+
<FilterItem :filters="filters['series']" field="series" :settings="settings" @filter-changed="onChanged" v-model="selectedSeries" />
124+
<FilterItem :filters="filters['type']" field="type" :settings="settings" @filter-changed="onChanged" v-model="selectedType" />
125+
<FilterItem :filters="filters['period']" field="period" :settings="settings" @filter-changed="onChanged" v-model="selectedPeriod" />
126+
<FilterItem :filters="filters['mint']" field="mint" :settings="settings" @filter-changed="onChanged" v-model="selectedMint" />
127127
</v-container>
128128

129129
<v-container>
130-
<FilterItem :filters="filters['status']" field="status" :settings="settings" @filter-changed="onFilterChanged" v-model="selectedStatus" />
131-
<FilterItem :filters="filters['country']" field="country" :settings="settings" @filter-changed="onFilterChanged" v-model="selectedCountry" />
132-
<FilterItem :filters="filters['series']" field="series" :settings="settings" @filter-changed="onFilterChanged" v-model="selectedSeries" />
133-
<FilterItem :filters="filters['type']" field="type" :settings="settings" @filter-changed="onFilterChanged" v-model="selectedType" />
134-
<FilterItem :filters="filters['period']" field="period" :settings="settings" @filter-changed="onFilterChanged" v-model="selectedPeriod" />
135-
<FilterItem :filters="filters['mint']" field="mint" :settings="settings" @filter-changed="onFilterChanged" v-model="selectedMint" />
130+
<v-text-field
131+
v-model="searchVal"
132+
:label="i18n.global.t('Search')"
133+
clearable
134+
@change="onChanged"
135+
@click:clear="onChanged"
136+
/>
136137
</v-container>
137138

138139
<v-container class="pa-0 ma-0">

frontend/src/composables/useService.js

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -256,20 +256,21 @@ export function useService(passwordDialogRef) {
256256
return {collectionSettings, collectionFilters};
257257
}
258258

259-
const loadCoins = async (sortBy=null, reverse=false, statusFilter=null, countryFilter=null,
259+
const loadCoins = async (search=null, sortBy=null, reverse=false, statusFilter=null, countryFilter=null,
260260
seriesFilter=null, typeFilter=null, periodFilter=null, mintFilter=null) => {
261261
if (connection_type === 'local')
262-
return loadCoinsLocal(sortBy, reverse, statusFilter, countryFilter, seriesFilter, typeFilter, periodFilter, mintFilter);
262+
return loadCoinsLocal(search, sortBy, reverse, statusFilter, countryFilter, seriesFilter, typeFilter, periodFilter, mintFilter);
263263
else if (connection_type === 'remote')
264-
return loadCoinsRemote(sortBy, reverse, statusFilter, countryFilter, seriesFilter, typeFilter, periodFilter, mintFilter, connected_file);
264+
return loadCoinsRemote(search, sortBy, reverse, statusFilter, countryFilter, seriesFilter, typeFilter, periodFilter, mintFilter, connected_file);
265265
}
266266

267-
const loadCoinsRemote = async (sortBy, reverse, statusFilter, countryFilter, seriesFilter, typeFilter, periodFilter, mintFilter, file) => {
267+
const loadCoinsRemote = async (search, sortBy, reverse, statusFilter, countryFilter, seriesFilter, typeFilter, periodFilter, mintFilter, file) => {
268268
let coinsList = [];
269269

270270
try {
271271
const responseCoins = await api.get('/api/coins', {params: {
272272
f: file,
273+
search: search,
273274
sort: sortBy,
274275
reverse: reverse,
275276
status_filter: statusFilter,
@@ -288,7 +289,7 @@ export function useService(passwordDialogRef) {
288289
return coinsList;
289290
}
290291

291-
const loadCoinsLocal = async (sortBy, reverse, statusFilter, countryFilter, seriesFilter, typeFilter, periodFilter, mintFilter) => {
292+
const loadCoinsLocal = async (search, sortBy, reverse, statusFilter, countryFilter, seriesFilter, typeFilter, periodFilter, mintFilter) => {
292293
let coinsList = [];
293294

294295
let sql = `
@@ -297,6 +298,10 @@ export function useService(passwordDialogRef) {
297298
`
298299
let params = [];
299300
let sql_filters = [];
301+
if (search) {
302+
sql_filters.push("title LIKE ?")
303+
params.push(`%${search}%`);
304+
}
300305
if (statusFilter) {
301306
sql_filters.push('status = ?')
302307
params.push(statusFilter);

0 commit comments

Comments
 (0)