changed things... (#29)

Reviewed-on: rrise/reloading-manager#29
Co-authored-by: Ron Rise <ron@siteworxpro.com>
Co-committed-by: Ron Rise <ron@siteworxpro.com>
This commit is contained in:
2025-04-18 19:31:31 -04:00
committed by Siteworx Pro Gitea
parent a9b82332e1
commit d0fbac51aa
3 changed files with 196 additions and 10 deletions

View File

@@ -13,6 +13,7 @@ import (
"github.com/jackc/pgx/v5/pgtype"
"github.com/labstack/echo/v4"
"net/http"
"strings"
)
type row struct {
@@ -325,7 +326,58 @@ func getQuery(c echo.Context, countOnly bool) postgres.SelectStatement {
)
}
// where expressions
expressions := make([]postgres.BoolExpression, 0)
if c.QueryParam("cartridge_id") != "" {
ids := strings.Split(c.QueryParam("cartridge_id"), ",")
if len(ids) > 0 {
expressions = append(expressions, ctg.ID.IN(getUuidExpr(ids)...))
}
}
if c.QueryParam("bullet_manufacturer_id") != "" {
ids := strings.Split(c.QueryParam("bullet_manufacturer_id"), ",")
if len(ids) > 0 {
expressions = append(expressions, ctg.ID.IN(getUuidExpr(ids)...))
}
}
if c.QueryParam("bullet_id") != "" {
ids := strings.Split(c.QueryParam("bullet_id"), ",")
if len(ids) > 0 {
expressions = append(expressions, b.ID.IN(getUuidExpr(ids)...))
}
}
if c.QueryParam("primer_manufacturer_id") != "" {
ids := strings.Split(c.QueryParam("primer_manufacturer_id"), ",")
if len(ids) > 0 {
expressions = append(expressions, pm.ID.IN(getUuidExpr(ids)...))
}
}
if c.QueryParam("primer_id") != "" {
ids := strings.Split(c.QueryParam("primer_id"), ",")
if len(ids) > 0 {
expressions = append(expressions, p.ID.IN(getUuidExpr(ids)...))
}
}
if c.QueryParam("powder_manufacturer_id") != "" {
ids := strings.Split(c.QueryParam("powder_manufacturer_id"), ",")
if len(ids) > 0 {
expressions = append(expressions, pwdm.ID.IN(getUuidExpr(ids)...))
}
}
if c.QueryParam("powder_id") != "" {
ids := strings.Split(c.QueryParam("powder_id"), ",")
if len(ids) > 0 {
expressions = append(expressions, pwd.ID.IN(getUuidExpr(ids)...))
}
}
if c.QueryParam("search_cartridge") != "" {
expressions = append(expressions, ctg.Name.LIKE(postgres.String(c.QueryParam("search_cartridge")+"%")))
}
@@ -396,3 +448,17 @@ func getQuery(c echo.Context, countOnly bool) postgres.SelectStatement {
return q
}
func getUuidExpr(ids []string) []postgres.Expression {
expr := make([]postgres.Expression, 0)
for _, id := range ids {
uuid, err := handlers.ParseUuid(id)
if err != nil {
continue
}
expr = append(expr, postgres.UUID(uuid))
}
return expr
}

View File

@@ -8,6 +8,7 @@
:value="loads"
filterDisplay="row"
paginator
size="small"
:sortField="sortField"
:sortOrder="sortOrder"
@update:sortField="(e: string) => {sortField = e; fetchLoads()}"
@@ -25,7 +26,8 @@
<Column field="cartridge_name" header="Name" :sortable="true" :showFilterMenu="false">
<template #filter>
<Select />
<MultiSelect size="small" filter placeholder="Select" v-model="cartridgeSelected"
:options="cartridgeOptions" optionLabel="label" optionValue="value" @change="fetchLoads" />
</template>
<template #body="{ data }">
{{ data.cartridge }}
@@ -35,7 +37,9 @@
<Column field="bullet_manufacturer_name" header="Bullet Manufacturer" :sortable="true" :showFilterMenu="false">
<template #filter>
<Select />
<MultiSelect size="small" filter placeholder="Select" v-model="bulletManufacturerSelected"
:options="bulletManufacturerOptions" optionLabel="label" optionValue="value"
@change="fetchLoads" />
</template>
<template #body="{ data }">
{{ data.bullet.manufacturer.name }}
@@ -43,7 +47,8 @@
</Column>
<Column field="bullet_name" header="Bullet" :sortable="true" :showFilterMenu="false">
<template #filter>
<Select />
<MultiSelect size="small" filter placeholder="Select" v-model="bulletSelected" :options="bulletOptions"
optionLabel="label" optionValue="value" @change="fetchLoads" />
</template>
<template #body="{ data }">
{{ data.bullet.name }}
@@ -51,24 +56,42 @@
.{{ data.bullet.diameter }}
</template>
</Column>
<Column field="primer_manufacturer_name" header="Primer Manufacturer" :sortable="true">
<Column field="primer_manufacturer_name" header="Primer Manufacturer" :sortable="true" :showFilterMenu="false">
<template #filter>
<MultiSelect size="small" filter placeholder="Select" v-model="primerManufacturerSelected"
:options="primerManufacturerOptions" optionLabel="label" optionValue="value"
@change="fetchLoads" />
</template>
<template #body="{ data }">
{{ data.primer.manufacturer.name }}
</template>
</Column>
<Column field="primer_name" header="Primer" :sortable="true">
<Column field="primer_name" header="Primer" :sortable="true" :showFilterMenu="false">
<template #filter>
<MultiSelect size="small" filter placeholder="Select" v-model="primerSelected" :options="primerOptions"
optionLabel="label" optionValue="value" @change="fetchLoads" />
</template>
<template #body="{ data }">
{{ data.primer.name }}
</template>
</Column>
<Column field="powder_manufacturer_name" header="Powder Manufacturer" :sortable="true">
<Column field="powder_manufacturer_name" header="Powder Manufacturer" :sortable="true" :showFilterMenu="false">
<template #filter>
<MultiSelect size="small" filter placeholder="Select" v-model="powderManufacturerSelected"
:options="powderManufacturerOptions" optionLabel="label" optionValue="value"
@change="fetchLoads" />
</template>
<template #body="{ data }">
{{ data.powder.manufacturer.name }}
</template>
</Column>
<Column field="powder_name" header="Powder" :sortable="true">
<Column field="powder_name" header="Powder" :sortable="true" :showFilterMenu="false">
<template #filter>
<MultiSelect size="small" filter placeholder="Select" v-model="powderSelected" :options="powderOptions"
optionLabel="label" optionValue="value" @change="fetchLoads" />
</template>
<template #body="{ data }">
{{ data.powder.name }}
</template>
@@ -108,6 +131,11 @@ interface Load {
primer: Primers
col: number
}
interface Option {
label: string
value: string
}
</script>
<script lang="ts" setup>
import { defineAsyncComponent, onMounted, ref } from 'vue'
@@ -119,7 +147,7 @@ import { icons } from '../../lib/icons.ts'
const DataTable = defineAsyncComponent(() => import('primevue/datatable'))
const Card = defineAsyncComponent(() => import('primevue/card'))
const Button = defineAsyncComponent(() => import('primevue/button'))
const Select = defineAsyncComponent(() => import('primevue/select'))
const MultiSelect = defineAsyncComponent(() => import('primevue/multiselect'))
const loads = ref<Load[]>([])
const total = ref(0)
@@ -128,6 +156,27 @@ const loading = ref(true)
const sortField = ref('cartridge_name')
const sortOrder = ref<number | undefined>(-1)
const cartridgeOptions = ref<Option[]>([])
const cartridgeSelected = ref<string[]>([])
const bulletManufacturerOptions = ref<Option[]>([])
const bulletManufacturerSelected = ref<string[]>([])
const bulletOptions = ref<Option[]>([])
const bulletSelected = ref<string[]>([])
const primerManufacturerOptions = ref<Option[]>([])
const primerManufacturerSelected = ref<string[]>([])
const primerOptions = ref<Option[]>([])
const primerSelected = ref<string[]>([])
const powderManufacturerOptions = ref<Option[]>([])
const powderManufacturerSelected = ref<string[]>([])
const powderOptions = ref<Option[]>([])
const powderSelected = ref<string[]>([])
const fetchLoads = async () => {
loading.value = true
@@ -139,9 +188,36 @@ const fetchLoads = async () => {
searchParams.unshift(`sortOrder=${sortOrder.value}`)
}
console.log(searchParams)
if (cartridgeSelected.value.length > 0) {
searchParams.unshift(`cartridge_id=${cartridgeSelected.value.join(',')}`)
}
const resp = await axios.get<any, Response<LoadResponse>>(`${import.meta.env.VITE_API}/load?${searchParams.join('&')}`)
if (bulletManufacturerSelected.value.length > 0) {
searchParams.unshift(`bullet_manufacturer_id=${bulletManufacturerSelected.value.join(',')}`)
}
if (bulletSelected.value.length > 0) {
searchParams.unshift(`bullet_id=${bulletSelected.value.join(',')}`)
}
if (primerManufacturerSelected.value.length > 0) {
searchParams.unshift(`primer_manufacturer_id=${primerManufacturerSelected.value.join(',')}`)
}
if (primerSelected.value.length > 0) {
searchParams.unshift(`primer_id=${primerSelected.value.join(',')}`)
}
if (powderManufacturerSelected.value.length > 0) {
searchParams.unshift(`powder_manufacturer_id=${powderManufacturerSelected.value.join(',')}`)
}
if (powderSelected.value.length > 0) {
searchParams.unshift(`powder_id=${powderSelected.value.join(',')}`)
}
const resp = await axios.get<any, Response<LoadResponse>>(
`${import.meta.env.VITE_API}/load?${searchParams.join('&')}`)
loads.value = resp.data.payload.results
total.value = resp.data.payload.total
@@ -151,6 +227,49 @@ const fetchLoads = async () => {
onMounted(() => {
fetchLoads()
axios.get(`${import.meta.env.VITE_API}/cartridge`).then((resp: Response<{ id: string, name: string }[]>) => {
cartridgeOptions.value = resp.data.payload.map((cartridge) => ({
label: cartridge.name,
value: cartridge.id,
}))
})
axios.get(`${import.meta.env.VITE_API}/bullet`).then((resp: Response<Bullet[]>) => {
bulletManufacturerOptions.value = resp.data.payload.map((bullet) => ({
label: bullet.manufacturer.name,
value: bullet.manufacturer.id,
}))
bulletOptions.value = resp.data.payload.map((bullet) => ({
label: `${bullet.name} ${bullet.weight}gr .${bullet.diameter}`,
value: bullet.id,
}))
})
axios.get(`${import.meta.env.VITE_API}/primer`).then((resp: Response<Primers[]>) => {
primerManufacturerOptions.value = resp.data.payload.map((primer) => ({
label: primer.manufacturer.name,
value: primer.manufacturer.id,
}))
primerOptions.value = resp.data.payload.map((primer) => ({
label: primer.name,
value: primer.id,
}))
})
axios.get(`${import.meta.env.VITE_API}/powder`).then((resp: Response<Powder[]>) => {
powderManufacturerOptions.value = resp.data.payload.map((powder) => ({
label: powder.manufacturer.name,
value: powder.manufacturer.id,
}))
powderOptions.value = resp.data.payload.map((powder) => ({
label: powder.name,
value: powder.id,
}))
})
})
</script>

View File

@@ -4,5 +4,6 @@ export interface Bullet {
id: string
name: string
weight: number
diameter: number
manufacturer: Manufacturer
}