You've already forked reloading-manager
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:
@@ -13,6 +13,7 @@ import (
|
|||||||
"github.com/jackc/pgx/v5/pgtype"
|
"github.com/jackc/pgx/v5/pgtype"
|
||||||
"github.com/labstack/echo/v4"
|
"github.com/labstack/echo/v4"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
type row struct {
|
type row struct {
|
||||||
@@ -325,7 +326,58 @@ func getQuery(c echo.Context, countOnly bool) postgres.SelectStatement {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// where expressions
|
||||||
expressions := make([]postgres.BoolExpression, 0)
|
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") != "" {
|
if c.QueryParam("search_cartridge") != "" {
|
||||||
expressions = append(expressions, ctg.Name.LIKE(postgres.String(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
|
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
|
||||||
|
}
|
||||||
|
|||||||
@@ -8,6 +8,7 @@
|
|||||||
:value="loads"
|
:value="loads"
|
||||||
filterDisplay="row"
|
filterDisplay="row"
|
||||||
paginator
|
paginator
|
||||||
|
size="small"
|
||||||
:sortField="sortField"
|
:sortField="sortField"
|
||||||
:sortOrder="sortOrder"
|
:sortOrder="sortOrder"
|
||||||
@update:sortField="(e: string) => {sortField = e; fetchLoads()}"
|
@update:sortField="(e: string) => {sortField = e; fetchLoads()}"
|
||||||
@@ -25,7 +26,8 @@
|
|||||||
|
|
||||||
<Column field="cartridge_name" header="Name" :sortable="true" :showFilterMenu="false">
|
<Column field="cartridge_name" header="Name" :sortable="true" :showFilterMenu="false">
|
||||||
<template #filter>
|
<template #filter>
|
||||||
<Select />
|
<MultiSelect size="small" filter placeholder="Select" v-model="cartridgeSelected"
|
||||||
|
:options="cartridgeOptions" optionLabel="label" optionValue="value" @change="fetchLoads" />
|
||||||
</template>
|
</template>
|
||||||
<template #body="{ data }">
|
<template #body="{ data }">
|
||||||
{{ data.cartridge }}
|
{{ data.cartridge }}
|
||||||
@@ -35,7 +37,9 @@
|
|||||||
|
|
||||||
<Column field="bullet_manufacturer_name" header="Bullet Manufacturer" :sortable="true" :showFilterMenu="false">
|
<Column field="bullet_manufacturer_name" header="Bullet Manufacturer" :sortable="true" :showFilterMenu="false">
|
||||||
<template #filter>
|
<template #filter>
|
||||||
<Select />
|
<MultiSelect size="small" filter placeholder="Select" v-model="bulletManufacturerSelected"
|
||||||
|
:options="bulletManufacturerOptions" optionLabel="label" optionValue="value"
|
||||||
|
@change="fetchLoads" />
|
||||||
</template>
|
</template>
|
||||||
<template #body="{ data }">
|
<template #body="{ data }">
|
||||||
{{ data.bullet.manufacturer.name }}
|
{{ data.bullet.manufacturer.name }}
|
||||||
@@ -43,7 +47,8 @@
|
|||||||
</Column>
|
</Column>
|
||||||
<Column field="bullet_name" header="Bullet" :sortable="true" :showFilterMenu="false">
|
<Column field="bullet_name" header="Bullet" :sortable="true" :showFilterMenu="false">
|
||||||
<template #filter>
|
<template #filter>
|
||||||
<Select />
|
<MultiSelect size="small" filter placeholder="Select" v-model="bulletSelected" :options="bulletOptions"
|
||||||
|
optionLabel="label" optionValue="value" @change="fetchLoads" />
|
||||||
</template>
|
</template>
|
||||||
<template #body="{ data }">
|
<template #body="{ data }">
|
||||||
{{ data.bullet.name }}
|
{{ data.bullet.name }}
|
||||||
@@ -51,24 +56,42 @@
|
|||||||
.{{ data.bullet.diameter }}
|
.{{ data.bullet.diameter }}
|
||||||
</template>
|
</template>
|
||||||
</Column>
|
</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 }">
|
<template #body="{ data }">
|
||||||
{{ data.primer.manufacturer.name }}
|
{{ data.primer.manufacturer.name }}
|
||||||
</template>
|
</template>
|
||||||
</Column>
|
</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 }">
|
<template #body="{ data }">
|
||||||
{{ data.primer.name }}
|
{{ data.primer.name }}
|
||||||
</template>
|
</template>
|
||||||
</Column>
|
</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 }">
|
<template #body="{ data }">
|
||||||
{{ data.powder.manufacturer.name }}
|
{{ data.powder.manufacturer.name }}
|
||||||
</template>
|
</template>
|
||||||
</Column>
|
</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 }">
|
<template #body="{ data }">
|
||||||
{{ data.powder.name }}
|
{{ data.powder.name }}
|
||||||
</template>
|
</template>
|
||||||
@@ -108,6 +131,11 @@ interface Load {
|
|||||||
primer: Primers
|
primer: Primers
|
||||||
col: number
|
col: number
|
||||||
}
|
}
|
||||||
|
|
||||||
|
interface Option {
|
||||||
|
label: string
|
||||||
|
value: string
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
import { defineAsyncComponent, onMounted, ref } from 'vue'
|
import { defineAsyncComponent, onMounted, ref } from 'vue'
|
||||||
@@ -119,7 +147,7 @@ import { icons } from '../../lib/icons.ts'
|
|||||||
const DataTable = defineAsyncComponent(() => import('primevue/datatable'))
|
const DataTable = defineAsyncComponent(() => import('primevue/datatable'))
|
||||||
const Card = defineAsyncComponent(() => import('primevue/card'))
|
const Card = defineAsyncComponent(() => import('primevue/card'))
|
||||||
const Button = defineAsyncComponent(() => import('primevue/button'))
|
const Button = defineAsyncComponent(() => import('primevue/button'))
|
||||||
const Select = defineAsyncComponent(() => import('primevue/select'))
|
const MultiSelect = defineAsyncComponent(() => import('primevue/multiselect'))
|
||||||
|
|
||||||
const loads = ref<Load[]>([])
|
const loads = ref<Load[]>([])
|
||||||
const total = ref(0)
|
const total = ref(0)
|
||||||
@@ -128,6 +156,27 @@ const loading = ref(true)
|
|||||||
const sortField = ref('cartridge_name')
|
const sortField = ref('cartridge_name')
|
||||||
const sortOrder = ref<number | undefined>(-1)
|
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 () => {
|
const fetchLoads = async () => {
|
||||||
loading.value = true
|
loading.value = true
|
||||||
|
|
||||||
@@ -139,9 +188,36 @@ const fetchLoads = async () => {
|
|||||||
searchParams.unshift(`sortOrder=${sortOrder.value}`)
|
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
|
loads.value = resp.data.payload.results
|
||||||
total.value = resp.data.payload.total
|
total.value = resp.data.payload.total
|
||||||
@@ -151,6 +227,49 @@ const fetchLoads = async () => {
|
|||||||
|
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
fetchLoads()
|
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>
|
</script>
|
||||||
|
|||||||
1
frontend/src/types/bullet.d.ts
vendored
1
frontend/src/types/bullet.d.ts
vendored
@@ -4,5 +4,6 @@ export interface Bullet {
|
|||||||
id: string
|
id: string
|
||||||
name: string
|
name: string
|
||||||
weight: number
|
weight: number
|
||||||
|
diameter: number
|
||||||
manufacturer: Manufacturer
|
manufacturer: Manufacturer
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user