@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') ?? ''
  }
]