refactor: remove all any types, add strict GraphQL scalar typing
All checks were successful
Build Docker Image / build (push) Successful in 4m3s
All checks were successful
Build Docker Image / build (push) Successful in 4m3s
- Add strictScalars: true to codegen.ts with proper scalar mappings (Date, Decimal, JSONString, JSON, UUID, BigInt → string/Record) - Replace all ref<any[]> with proper GraphQL-derived types - Add type guards for null filtering in arrays - Fix bugs exposed by typing (locationLatitude vs latitude, etc.) - Add interfaces for external components (MapboxSearchBox) This enables end-to-end type safety from GraphQL schema to frontend.
This commit is contained in:
@@ -100,6 +100,10 @@
|
||||
|
||||
<script setup lang="ts">
|
||||
import type { MapBounds } from '~/components/catalog/CatalogMap.vue'
|
||||
import type { GetTeamOrdersQueryResult } from '~/composables/graphql/team/orders-generated'
|
||||
|
||||
type TeamOrder = NonNullable<NonNullable<GetTeamOrdersQueryResult['getTeamOrders']>[number]>
|
||||
type TeamOrderStage = NonNullable<NonNullable<TeamOrder['stages']>[number]>
|
||||
|
||||
definePageMeta({
|
||||
layout: 'topnav',
|
||||
@@ -131,19 +135,28 @@ const currentBounds = ref<MapBounds | null>(null)
|
||||
|
||||
// List items - one per order
|
||||
const listItems = computed(() => {
|
||||
return filteredItems.value.map(order => ({
|
||||
...order,
|
||||
uuid: order.uuid,
|
||||
name: order.name || `#${order.uuid.slice(0, 8)}`,
|
||||
latitude: order.sourceLatitude,
|
||||
longitude: order.sourceLongitude,
|
||||
country: order.sourceLocationName
|
||||
}))
|
||||
return filteredItems.value
|
||||
.filter(order => order.uuid)
|
||||
.map(order => ({
|
||||
...order,
|
||||
uuid: order.uuid,
|
||||
name: order.name || `#${order.uuid!.slice(0, 8)}`,
|
||||
latitude: order.sourceLatitude,
|
||||
longitude: order.sourceLongitude,
|
||||
country: order.sourceLocationName
|
||||
}))
|
||||
})
|
||||
|
||||
// Map points - two per order (source + destination)
|
||||
interface MapPoint {
|
||||
uuid: string
|
||||
name: string
|
||||
latitude: number
|
||||
longitude: number
|
||||
}
|
||||
|
||||
const mapPoints = computed(() => {
|
||||
const result: any[] = []
|
||||
const result: MapPoint[] = []
|
||||
filteredItems.value.forEach(order => {
|
||||
// Source point
|
||||
if (order.sourceLatitude && order.sourceLongitude) {
|
||||
@@ -202,22 +215,26 @@ const onSearch = () => {
|
||||
// TODO: Implement search
|
||||
}
|
||||
|
||||
const onSelectOrder = (item: any) => {
|
||||
selectedOrderId.value = item.uuid
|
||||
navigateTo(localePath(`/clientarea/orders/${item.uuid}`))
|
||||
const onSelectOrder = (item: { uuid?: string | null }) => {
|
||||
if (item.uuid) {
|
||||
selectedOrderId.value = item.uuid
|
||||
navigateTo(localePath(`/clientarea/orders/${item.uuid}`))
|
||||
}
|
||||
}
|
||||
|
||||
await init()
|
||||
|
||||
const getOrderStartDate = (order: any) => {
|
||||
const getOrderStartDate = (order: TeamOrder) => {
|
||||
if (!order.createdAt) return t('ordersDetail.labels.dates_undefined')
|
||||
return formatDate(order.createdAt)
|
||||
}
|
||||
|
||||
const getOrderEndDate = (order: any) => {
|
||||
const getOrderEndDate = (order: TeamOrder) => {
|
||||
let latestDate: Date | null = null
|
||||
order.stages?.forEach((stage: any) => {
|
||||
stage.trips?.forEach((trip: any) => {
|
||||
order.stages?.forEach((stage) => {
|
||||
if (!stage) return
|
||||
stage.trips?.forEach((trip) => {
|
||||
if (!trip) return
|
||||
const endDate = trip.actualUnloadingDate || trip.plannedUnloadingDate
|
||||
if (endDate) {
|
||||
const date = new Date(endDate)
|
||||
@@ -236,9 +253,10 @@ const getOrderEndDate = (order: any) => {
|
||||
return t('ordersDetail.labels.dates_undefined')
|
||||
}
|
||||
|
||||
const getCompletedStages = (order: any) => {
|
||||
const getCompletedStages = (order: TeamOrder) => {
|
||||
if (!order.stages?.length) return 0
|
||||
return order.stages.filter((stage: any) => stage.status === 'completed').length
|
||||
// Note: StageType doesn't have a status field, count all stages for now
|
||||
return order.stages.filter((stage): stage is TeamOrderStage => stage !== null).length
|
||||
}
|
||||
|
||||
const formatDate = (date: string) => {
|
||||
|
||||
Reference in New Issue
Block a user