Some checks failed
CI / build-test (push) Has been cancelled
commit a94394866d9e957693c7380b846cfee98739b8be
Author: jableader <jacobdunk@gmail.com>
Date: Mon Oct 20 00:11:28 2025 +1100
Ran codegen
commit affaa0e4a80edbb5185f06b3a252e1790e349ee3
Author: jableader <jacobdunk@gmail.com>
Date: Mon Oct 20 00:09:36 2025 +1100
Moved shopping.ts into composable
commit 83ced27a549784a35fa2715630d6fdca7f12f4aa
Author: jableader <jacobdunk@gmail.com>
Date: Sun Oct 19 23:43:09 2025 +1100
Purchase fixed
commit 2fff14016eedaeb773c0f8b4ee9ccf08a1027449
Author: jableader <jacobdunk@gmail.com>
Date: Sun Oct 19 22:54:36 2025 +1100
typescript migration complete
commit 17651bcc8b0f40ac1579563379c8fc45aba1997d
Author: jableader <jacobdunk@gmail.com>
Date: Sun Oct 19 22:38:22 2025 +1100
Removing redundant null checks and type checking
commit 0cc3a508cd5c7d723eb76d665443b4d0fdad493f
Author: jableader <jacobdunk@gmail.com>
Date: Sun Oct 19 22:30:52 2025 +1100
Moving date to sdk layer
commit 35d1189009b27876dd167f353c04f217b7c2805e
Author: jableader <jacobdunk@gmail.com>
Date: Sun Oct 19 21:42:47 2025 +1100
No components re-parse dates already decoded by the boundary.
commit c4b82a31fad75bd5ec987847847076b537d35a7d
Author: jableader <jacobdunk@gmail.com>
Date: Sun Oct 19 21:09:03 2025 +1100
Update spec and types
commit 55984bf7c9d51e76eaa6713a3ca86e9a73eb6b03
Author: jableader <jacobdunk@gmail.com>
Date: Sun Oct 19 20:22:01 2025 +1100
Disallow casting entirely
commit eb02dc6a7b52048281a87924765d9aab1303150f
Author: jableader <jacobdunk@gmail.com>
Date: Sun Oct 19 19:24:57 2025 +1100
Replaced components[schemas] outside sdk
commit 2f4c1bed56724e4f8a0d586921367604ce127a1a
Author: jableader <jacobdunk@gmail.com>
Date: Sun Oct 19 19:06:38 2025 +1100
removed persons.ts
commit ae966db8a330c9f521f3c3cb7417c4f201467661
Author: jableader <jacobdunk@gmail.com>
Date: Sun Oct 19 18:56:27 2025 +1100
Remove casts from sdk
commit 42c253021e504b45963834e56551ded55be377f1
Author: jableader <jacobdunk@gmail.com>
Date: Sun Oct 19 18:38:05 2025 +1100
Remove *Like types
commit b0a4e21f19005fd69c0e9e16edaa9c10b1ca8567
Author: jableader <jacobdunk@gmail.com>
Date: Sun Oct 19 18:32:26 2025 +1100
Defined quantity construct
commit bf4666b89e2d395bdd091ffb6ee66a9cfb866c6d
Author: jableader <jacobdunk@gmail.com>
Date: Sun Oct 19 18:27:55 2025 +1100
Moved shopping view-model mapping (DTO → UI groups/meals) into `useShopping` (`mapItemToUI`, `groupsFrom`, `mealsFrom`).
- Refactored `CurrentShoppingListPage.vue` to consume composable helpers (less duplication, no local cast-heavy mapping).
- Refactored `PurchasedShoppingListPage.vue` to consume composable helpers and return typed SDK result; removed casts.
commit e7f84b453509a8fcffbb9923ec001f5be85e67e4
Author: jableader <jacobdunk@gmail.com>
Date: Sun Oct 19 18:17:29 2025 +1100
Removing casts, any, unknown and runtime type checking
commit 6346eef4aff4d64b04f7dfa837c5b988645c242c
Author: jableader <jacobdunk@gmail.com>
Date: Sun Oct 19 17:42:14 2025 +1100
domain/decoders.ts: removed casts; `purchaseDate` and `quantity` now trust API shapes.
commit 8b62eb9a9f2c0fe058d2dd37cc80071089379c34
Author: jableader <jacobdunk@gmail.com>
Date: Sun Oct 19 17:36:50 2025 +1100
Plan alignment
commit dd81fd454b8e14874930cfc44828abddffd50c41
Author: jableader <jacobdunk@gmail.com>
Date: Sun Oct 19 17:10:11 2025 +1100
More cast removals
commit 377d143ffc8596f46a3b32746d3710d99eb257cd
Author: jableader <jacobdunk@gmail.com>
Date: Sun Oct 19 16:53:30 2025 +1100
Type tightening in sdk
commit ce2577f22190b18a52ae0fa4238c6d1beb7e3bb7
Author: jableader <jacobdunk@gmail.com>
Date: Sun Oct 19 16:24:51 2025 +1100
All mappers removed/neutralized
commit 177205561a2d44aae2683e046960ef5fe8992255
Author: jableader <jacobdunk@gmail.com>
Date: Sun Oct 19 16:20:34 2025 +1100
Replace ingredientnormalized with ingredient
commit fc75b24977cc89d420dc768fb4dc4ade84ed32c2
Author: jableader <jacobdunk@gmail.com>
Date: Sun Oct 19 16:16:03 2025 +1100
More type safety tweaks and changes
commit c35cc2d3d58307290bbc2d5978baa48c1eda97b6
Author: jableader <jacobdunk@gmail.com>
Date: Sun Oct 19 15:46:13 2025 +1100
Update vue-tsc
commit 2cd429804ca34a42c83ea81a3ae68e2cfccb5e36
Author: jableader <jacobdunk@gmail.com>
Date: Sun Oct 19 15:28:01 2025 +1100
Ongoing SDK changes to tighten datatypes
commit e11847ae515eadf1bd33e88e154125fe361a5191
Author: jableader <jacobdunk@gmail.com>
Date: Sun Oct 19 14:31:03 2025 +1100
Enforce template type checking
commit 777b8dee7e9ef0807a2b2c039443920671fe9c2d
Author: jableader <jacobdunk@gmail.com>
Date: Sun Oct 19 14:28:52 2025 +1100
Boilerplate Collapse mappers to “decoders” and delete ad‑hoc view types
commit 4169c69d59cc16a24298351c38a60b4d4845f0c9
Author: jableader <jacobdunk@gmail.com>
Date: Sun Oct 19 14:25:04 2025 +1100
Plan updates
commit de65164c91d9dc641ec86424bd4fe40f91bb4ada
Author: jableader <jacobdunk@gmail.com>
Date: Sun Oct 19 14:16:37 2025 +1100
More camelCase changes
commit 4121c2157511f706b4704c5d5f769034d9bce5a0
Author: jableader <jacobdunk@gmail.com>
Date: Sun Oct 19 14:00:48 2025 +1100
Remove unused js shims and autoformat project
commit d475565529bd0c12f06f85f0bcbf19c857176fa7
Author: jableader <jacobdunk@gmail.com>
Date: Sun Oct 19 13:59:10 2025 +1100
camelCase conversions and api type propogation
commit 7b3b633a9d21c74977d4de120138fff192faaa78
Author: jableader <jacobdunk@gmail.com>
Date: Sun Oct 19 13:11:22 2025 +1100
Strategise ts improvements
commit 9396e4928abcf9d8a74a656ad21913f95e8e3e41
Author: jableader <jacobdunk@gmail.com>
Date: Sun Oct 19 13:06:19 2025 +1100
Linting errors
commit 528fa3bc2f6c42de6de37d9593d2ed31630d0e81
Author: jableader <jacobdunk@gmail.com>
Date: Sun Oct 19 12:59:21 2025 +1100
Recipe search pagination
commit 4993c3e53f540e098f3275715c86754dee9392af
Author: jableader <jacobdunk@gmail.com>
Date: Sun Oct 19 12:33:13 2025 +1100
Removed redundant nonnull check
commit c03d0b582d0a8b17e675cdf9bdab09eac4091d44
Author: jableader <jacobdunk@gmail.com>
Date: Sun Oct 19 12:29:57 2025 +1100
Persons api pagination
commit 67008b4a94a90295ed811594ca0e7f37c80a8305
Author: jableader <jacobdunk@gmail.com>
Date: Sat Oct 18 22:44:32 2025 +1100
ts pages starting to work
commit 0144e7f70d19289007d6b035594786ce573cbc70
Author: jableader <jacobdunk@gmail.com>
Date: Sat Oct 18 22:39:17 2025 +1100
More typescript fixes
commit dc429f84b48ca5892c6043db81b89fa6431d872d
Author: jableader <jacobdunk@gmail.com>
Date: Sat Oct 18 18:28:54 2025 +1100
5) API client and codegen guardrails — DONE (scripts) / PARTIAL (CI wiring)
commit 36ba555d9a600ca8cca4c18571e0d96584243556
Author: jableader <jacobdunk@gmail.com>
Date: Sat Oct 18 18:26:30 2025 +1100
Tighten composable and UI types (remove last anys) — DONE
commit 97523a9ef6aa972497e62d63c6f666453bb7eefc
Author: jableader <jacobdunk@gmail.com>
Date: Sat Oct 18 18:24:11 2025 +1100
Align OpenAPI params to remove residual casts, Strengthen MSW tests for the typed client
commit 608f6b751cb982487e90560792aec33317981c60
Author: jableader <jacobdunk@gmail.com>
Date: Sat Oct 18 18:14:11 2025 +1100
ts complete, rerun codegen
commit ca28376ed7bcb4ff4c7669210ce6eebfd9cb6eaa
Author: jableader <jacobdunk@gmail.com>
Date: Sat Oct 18 18:09:29 2025 +1100
Document All JS under `src/` is now removed; the source tree is TS-only.
commit ff3338b108bbf094f987302a21f1779d8f23368f
Author: jableader <jacobdunk@gmail.com>
Date: Sat Oct 18 17:59:49 2025 +1100
Ts tests
commit ce4555a279c715f427f9d00c346561efd74705f8
Author: jableader <jacobdunk@gmail.com>
Date: Sat Oct 18 17:56:18 2025 +1100
Completed Generate real OpenAPI types and wire them
commit b7304aa7390f33a372acda46c593d6592aabf3f7
Author: jableader <jacobdunk@gmail.com>
Date: Sat Oct 18 17:02:27 2025 +1100
DatePicker ts conversion
commit cb6ebdba286d44dbaae522ee29d95aa3ccfb5dc1
Author: jableader <jacobdunk@gmail.com>
Date: Sat Oct 18 16:56:38 2025 +1100
Removed js files
commit 549eefd369499e0a1d35ff88a659c8aecd955a02
Author: jableader <jacobdunk@gmail.com>
Date: Sat Oct 18 16:49:31 2025 +1100
- Utilities converted to TS: `src/dateformats.ts`, `src/units.ts`; imports updated accordingly.
- Router converted to TS: `src/router/index.ts`; legacy `index.js` removed.
commit 6f7731287f4166df5c02164ec4220e370c6d7a35
Author: jableader <jacobdunk@gmail.com>
Date: Sat Oct 18 16:48:58 2025 +1100
alerts ts conversion
commit 4b1baec85a74b75e94d2392fea3b5abee294089c
Author: jableader <jacobdunk@gmail.com>
Date: Sat Oct 18 16:27:35 2025 +1100
use v1 api
commit da11976b96d791935cb16c7b1fdb074a2c87f53c
Author: jableader <jacobdunk@gmail.com>
Date: Sat Oct 18 16:18:17 2025 +1100
- Shopping pages converted to TS: `MyShoppingPage.vue`, `CurrentShoppingListPage.vue`, `PurchasedShoppingListPage.vue` (typed refs/computed; stable keys; wired to helpers).
commit acf740380bf53386e12e108ba09a507141176733
Author: jableader <jacobdunk@gmail.com>
Date: Sat Oct 18 16:08:22 2025 +1100
Shopping MyShoppingPage converted to TS with typed refs.
commit 744d7e792d013f0ed04f11280f3351950925beee
Author: jableader <jacobdunk@gmail.com>
Date: Sat Oct 18 16:05:19 2025 +1100
Shopping gets types
commit 4e576dca94424383bdf753403d7764e22a28f377
Author: jableader <jacobdunk@gmail.com>
Date: Sat Oct 18 15:57:50 2025 +1100
Error tests
commit ac6ae41b840c30196a370a077e02953c63977908
Author: jableader <jacobdunk@gmail.com>
Date: Sat Oct 18 15:56:20 2025 +1100
More datatypes
commit d7ea6538b1af6144933a2603d330cb17e04809db
Author: jableader <jacobdunk@gmail.com>
Date: Sat Oct 18 15:45:49 2025 +1100
spec updates
commit 0d6cfc1328df8ab4a4baf8f31a7a4e1ea50fd850
Author: jableader <jacobdunk@gmail.com>
Date: Sat Oct 18 15:44:34 2025 +1100
`codegen:check` warns when backend spec is newer than generated types
commit 54bff353b8e7429961364803300b38bc70f963c2
Author: jableader <jacobdunk@gmail.com>
Date: Sat Oct 18 15:42:24 2025 +1100
PersonList ts
commit e5ffcdde7e9538525704581a82606261596d31f5
Author: jableader <jacobdunk@gmail.com>
Date: Sat Oct 18 15:40:53 2025 +1100
MealCard ts
commit 5432d8333c023b0c6e25c9a6ac31519c818e6a58
Author: jableader <jacobdunk@gmail.com>
Date: Sat Oct 18 15:39:29 2025 +1100
ue CLI now serves/builds with TypeScript entry, ESLint configured to parse TS, use ts code
commit aba3fd532550a90adeb957b4ddbb43798bcf9e5a
Author: jableader <jacobdunk@gmail.com>
Date: Sat Oct 18 15:23:16 2025 +1100
composables typescript
commit 28ba44cc951fddfe64c386e77a91c2f46060cfb8
Author: jableader <jacobdunk@gmail.com>
Date: Sat Oct 18 15:19:09 2025 +1100
let the typescriptin begin
commit 98e57e4d65cecdd1ed5ed3fbf6b1ebf46ae6af10
Author: jableader <jacobdunk@gmail.com>
Date: Sat Oct 18 15:13:58 2025 +1100
Added typescript
227 lines
5 KiB
Vue
227 lines
5 KiB
Vue
<template>
|
|
<div
|
|
class="recipe-search-box"
|
|
@focusout="onFocusOut"
|
|
>
|
|
<input
|
|
v-model="searchTerm"
|
|
type="text"
|
|
:placeholder="placeholderText"
|
|
@keyup.enter="search"
|
|
@keyup.esc="clear"
|
|
@focusin="search"
|
|
>
|
|
<ul
|
|
v-if="dropdownVisible"
|
|
class="dropdown"
|
|
>
|
|
<template v-if="recipes.length">
|
|
<li
|
|
v-for="recipe in recipes"
|
|
:key="recipe.id"
|
|
class="recipe"
|
|
@mousedown="selectRecipe(recipe)"
|
|
>
|
|
<recipe-card :recipe="recipe" />
|
|
</li>
|
|
<li
|
|
v-if="prevCursor || nextCursor"
|
|
class="pager"
|
|
>
|
|
<button
|
|
class="pager-btn"
|
|
:disabled="!prevCursor"
|
|
@mousedown.prevent="loadPrev"
|
|
>
|
|
Prev
|
|
</button>
|
|
<button
|
|
class="pager-btn"
|
|
:disabled="!nextCursor"
|
|
@mousedown.prevent="loadNext"
|
|
>
|
|
Next
|
|
</button>
|
|
</li>
|
|
</template>
|
|
<li
|
|
v-else
|
|
class="empty"
|
|
>
|
|
No recipes found
|
|
</li>
|
|
</ul>
|
|
</div>
|
|
</template>
|
|
|
|
<script setup lang="ts">
|
|
import { ref, watch, onBeforeUnmount, computed } from 'vue'
|
|
import { listRecipes } from '@/api/sdk'
|
|
import type { Recipe } from '@/domain/types'
|
|
import { useAlert } from '@/composables/useAlert'
|
|
import { usePagination } from '@/composables/usePagination'
|
|
import RecipeCard from './RecipeCard.vue'
|
|
|
|
const props = withDefaults(defineProps<{ placeholder?: string }>(), {
|
|
placeholder: 'Add a recipe...',
|
|
})
|
|
const placeholderText: string = props.placeholder ?? 'Add a recipe...'
|
|
|
|
type RecipeItem = Pick<Recipe, 'id' | 'name' | 'imageUrls'>
|
|
const emit = defineEmits<{
|
|
(e: 'select-recipe', recipe: RecipeItem): void
|
|
}>()
|
|
|
|
const searchTerm = ref('')
|
|
const pageSize = 10
|
|
const { items: recipes, next: nextCursor, prev: prevCursor, load, loadNext: loadNextPage, loadPrev: loadPrevPage, reset } = usePagination<RecipeItem>(
|
|
async (params) => {
|
|
const page = await listRecipes(params)
|
|
return {
|
|
items: (page.items ?? []).map(toRecipeItem),
|
|
next: page.next ?? null,
|
|
prev: page.prev ?? null,
|
|
total: page.total ?? null,
|
|
}
|
|
},
|
|
{ pageSize }
|
|
)
|
|
const dropdownVisible = computed(() => recipes.value.length > 0 || (searchTerm.value.length > 0))
|
|
|
|
const { show: showAlert, scheduleAutoDismiss } = useAlert()
|
|
|
|
let debounceId: ReturnType<typeof setTimeout> | null = null
|
|
|
|
watch(
|
|
searchTerm,
|
|
(newVal) => {
|
|
if (!newVal) {
|
|
recipes.value = []
|
|
if (debounceId) clearTimeout(debounceId)
|
|
return
|
|
}
|
|
if (debounceId) clearTimeout(debounceId)
|
|
debounceId = setTimeout(() => {
|
|
if (newVal === searchTerm.value) {
|
|
search()
|
|
}
|
|
}, 200)
|
|
}
|
|
)
|
|
|
|
async function search() {
|
|
try {
|
|
await load({ q: searchTerm.value })
|
|
} catch {
|
|
// swallow errors and clear suggestions on failures, also notify user
|
|
reset()
|
|
showAlert({ type: 'error', heading: 'Recipe search failed', message: 'Please try again shortly.' })
|
|
scheduleAutoDismiss()
|
|
}
|
|
}
|
|
|
|
async function loadNext() {
|
|
if (!nextCursor.value) return
|
|
try {
|
|
await loadNextPage()
|
|
} catch {
|
|
showAlert({ type: 'error', heading: 'Unable to load more', message: 'Could not fetch the next page.' })
|
|
scheduleAutoDismiss()
|
|
}
|
|
}
|
|
|
|
async function loadPrev() {
|
|
if (!prevCursor.value) return
|
|
try {
|
|
await loadPrevPage()
|
|
} catch {
|
|
showAlert({ type: 'error', heading: 'Unable to load more', message: 'Could not fetch the previous page.' })
|
|
scheduleAutoDismiss()
|
|
}
|
|
}
|
|
|
|
function toRecipeItem(r: Recipe): RecipeItem {
|
|
return { id: r.id, name: r.name, imageUrls: r.imageUrls ?? [] }
|
|
}
|
|
|
|
function selectRecipe(recipe: RecipeItem) {
|
|
emit('select-recipe', recipe)
|
|
searchTerm.value = ''
|
|
recipes.value = []
|
|
}
|
|
|
|
function clear() {
|
|
searchTerm.value = ''
|
|
reset()
|
|
}
|
|
|
|
function onFocusOut() {
|
|
// keep results while focused; on blur, clear all
|
|
reset()
|
|
}
|
|
|
|
onBeforeUnmount(() => {
|
|
if (debounceId) clearTimeout(debounceId)
|
|
})
|
|
</script>
|
|
|
|
<style scoped>
|
|
.recipe-search-box {
|
|
position: relative;
|
|
}
|
|
|
|
.recipe-search-box input {
|
|
width: calc(100% - 2em);
|
|
padding: 8px;
|
|
border: 1px solid #ccc;
|
|
border-radius: 4px;
|
|
font-size: 16px;
|
|
outline: none;
|
|
}
|
|
|
|
.recipe-search-box .dropdown {
|
|
position: absolute;
|
|
top: 100%;
|
|
width: 100%;
|
|
margin: auto;
|
|
background-color: #fff;
|
|
border: 1px solid #ccc;
|
|
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
|
|
z-index: 1000;
|
|
|
|
list-style-type: none;
|
|
margin: 0;
|
|
padding: 0;
|
|
max-height: 40vh;
|
|
overflow-y: scroll;
|
|
}
|
|
|
|
.recipe-search-box .dropdown li {
|
|
padding: 8px;
|
|
cursor: pointer;
|
|
border-bottom: 1px solid #ccc;
|
|
}
|
|
|
|
.recipe-search-box .dropdown li:last-child {
|
|
border-bottom: none;
|
|
}
|
|
|
|
.recipe-search-box .dropdown li:hover {
|
|
background-color: #eee;
|
|
}
|
|
|
|
.recipe-search-box .dropdown .pager {
|
|
display: flex;
|
|
justify-content: space-between;
|
|
gap: 8px;
|
|
}
|
|
|
|
.recipe-search-box .dropdown .pager-btn {
|
|
width: 48%;
|
|
}
|
|
|
|
.recipe-search-box .dropdown .empty {
|
|
padding: 8px;
|
|
color: #666;
|
|
}
|
|
</style>
|