@qor/helpers
Конвертация данных
Утилиты для преобразования данных между форматами.
toQueryParams
Конвертирует объект в URLSearchParams.
toQueryParams(params: Record<string, unknown>): URLSearchParams
Примеры
toQueryParams({ page: 1, limit: 10 })
// URLSearchParams: "page=1&limit=10"
toQueryParams({ search: 'test', page: null })
// null/undefined значения пропускаются: "search=test"
toQueryParams({ ids: [1, 2, 3] })
// Массивы с индексами: "ids[0]=1&ids[1]=2&ids[2]=3"
toQueryParams({ 'tags[]': ['a', 'b'] })
// Массивы с []: "tags[]=a&tags[]=b"
Использование с API
const filters = { page: 1, search: 'order', status: 'active' }
const params = toQueryParams(filters)
const response = await fetch(`/api/orders?${params.toString()}`)
toSelectOptions
Конвертирует массив объектов в формат options для select.
interface SelectOption {
label: string
value: string | number
}
toSelectOptions<T>(
items: T[] | null | undefined,
labelKey?: keyof T | ((item: T) => string),
valueKey?: keyof T | ((item: T) => string | number),
valueSuffix?: string
): SelectOption[]
Примеры
const services = [
{ id: 1, title: { ru: 'Услуга 1' } },
{ id: 2, title: { ru: 'Услуга 2' } }
]
// С путём к вложенному значению
toSelectOptions(services, 'title.ru', 'id')
// [{ label: 'Услуга 1', value: 1 }, { label: 'Услуга 2', value: 2 }]
// С кастомной функцией
toSelectOptions(users, u => `${u.first_name} ${u.last_name}`, 'id')
// [{ label: 'Иван Иванов', value: 1 }, ...]
// С суффиксом для value
toSelectOptions(services, 'title.ru', 'id', '_default')
// [{ label: 'Услуга 1', value: '1_default' }, ...]
Использование с USelect
<script setup>
const cities = await $fetch('/api/cities')
const cityOptions = toSelectOptions(cities, 'name', 'id')
</script>
<template>
<USelect v-model="selectedCity" :items="cityOptions" />
</template>
convertToFormData
Рекурсивно конвертирует объект в FormData для отправки файлов.
convertToFormData(obj: Record<string, unknown>): FormData
Примеры
const data = {
title: { ru: 'Заголовок', kk: 'Тақырып' },
file: fileInput.files[0]
}
const formData = convertToFormData(data)
// FormData с полями:
// - title[ru]: "Заголовок"
// - title[kk]: "Тақырып"
// - file: File
Использование для загрузки файлов
const uploadDocument = async (file: File, metadata: object) => {
const formData = convertToFormData({
document: file,
...metadata
})
return await $fetch('/api/documents', {
method: 'POST',
body: formData
})
}
getQueryValue
Безопасно извлекает значение из query параметров.
getQueryValue<T>(
query: Record<string, string | null | (string | null)[] | undefined>,
key: string,
defaultValue: T
): T
Примеры
const query = { page: '1', search: 'test' }
getQueryValue(query, 'page', 1) // "1"
getQueryValue(query, 'search', '') // "test"
getQueryValue(query, 'missing', 'default') // "default"
// Если значение — массив, возвращает первый элемент
const queryWithArray = { ids: ['1', '2'] }
getQueryValue(queryWithArray, 'ids', '') // "1"
Использование в страницах
<script setup>
const route = useRoute()
const page = getQueryValue(route.query, 'page', '1')
const search = getQueryValue(route.query, 'search', '')
</script>
getNestedValue
Безопасно получает вложенное значение из объекта по пути.
getNestedValue<T = unknown>(
obj: Record<string, unknown> | null | undefined,
path: string | string[]
): T | undefined
Примеры
const order = {
customer: {
address: {
city: 'Алматы'
}
}
}
getNestedValue(order, 'customer.address.city') // "Алматы"
getNestedValue(order, ['customer', 'address', 'city']) // "Алматы"
getNestedValue(order, 'customer.phone') // undefined
getNestedValue(null, 'any.path') // undefined
Использование в таблицах
const columns = [
{
key: 'city',
label: 'Город',
cell: ({ row }) => getNestedValue(row, 'customer.address.city') ?? '—'
}
]