Skip to content

Утилиты

Краткое описание

ФункцияНазначениеПринимаетВозвращает
extractEntityFromPathИзвлечение имени сущности из URL-пути (после сегмента global или site/[id])stringstring | null
extractPageTypeFromPathОпределение типа страницы (edit или create) по последнему сегменту путиstring'edit' | 'create' | null
generateSlugFromTextГенерация слага из текста: транслитерация, приведение к нижнему регистру, очистка от символовstringstring
transformResponseDataПреобразование массива из API в формат для селекта с объектами {id, label}, добавляя вариант "Нет"any[]{id: number, label: string}[]
transformResponseFieldsПреобразование одного объекта API в {id, label}, с обработкой nullobject | null{id: number, label: string}
assignTransformedFieldПрисвоение в объект преобразованного поля из одного ключа в другойobject, string, stringvoid
validationRulesНабор универсальных правил валидации для разных типов полей (текст, число, email, телефон и др.)object (параметры)object (правила)
attachMediaПрикрепляет медиафайлы к сущностиurl: string, entityName: string, entityId: number, mediaIds: number[]-

Подробное описание

extractEntityFromPath(path: string): string | null

  • Разбивает путь по /, игнорируя пустые элементы.
  • Если найден сегмент global, возвращает следующий за ним сегмент.
  • Если найден сегмент site, проверяет, есть ли после него числовой ID сайта и следующий сегмент — возвращает его.
  • Иначе возвращает null.

Пример использования:

ts
extractEntityFromPath('/global/products/edit') // вернёт 'products'
extractEntityFromPath('/site/123/categories/create') // вернёт 'categories'
extractEntityFromPath('/random/path') // вернёт null

extractPageTypeFromPath(path: string): 'edit' | 'create' | null

  • Возвращает 'edit' или 'create', если последний сегмент пути совпадает с этими значениями.
  • В противном случае возвращает null.

Пример использования:

ts
extractPageTypeFromPath('/global/products/edit') // 'edit'
extractPageTypeFromPath('/site/5/items/create') // 'create'
extractPageTypeFromPath('/global/products/view') // null

generateSlugFromText(text: string): string

  • Проверяет, что вход — строка.
  • Транслитерирует (например, кириллицу в латиницу).
  • Приводит к нижнему регистру.
  • Заменяет пробелы на дефисы.
  • Удаляет все символы, кроме букв, цифр и дефисов.

Пример использования:

ts
generateSlugFromText('Пример заголовка статьи') // 'primer-zagolovka-stati'
generateSlugFromText('  Тест! @Slug * ') // 'test-slug'
generateSlugFromText('') // ''

transformResponseData(responseData: any[]): {id: number, label: string}[]

  • Если вход не массив, возвращает массив с одним элементом {id: 0, label: 'Нет'}.
  • Иначе формирует новый массив с элементом {id: 0, label: 'Нет'} и мапит входные объекты в {id, label} по menutitle.

Пример использования:

ts
transformResponseData([
	{ id: 1, menutitle: 'Категория 1' },
	{ id: 2, menutitle: 'Категория 2' },
])

// Ответ:
// [
//   {id: 0, label: 'Нет'},
//   {id: 1, label: 'Категория 1'},
//   {id: 2, label: 'Категория 2'}
// ]

transformResponseData(null)

// Ответ:
// [{id: 0, label: 'Нет'}]

transformResponseFields(field: object | null): {id: number, label: string}

  • Если поле null или undefined, возвращает {id: 0, label: 'Нет'}.
  • Иначе извлекает id и menutitle из объекта.

Пример использования:

ts
transformResponseFields({ id: 10, menutitle: 'Поле A' }) // {id: 10, label: 'Поле A'}
transformResponseFields(null) // {id: 0, label: 'Нет'}

assignTransformedField(data: object, sourceKey: string, targetKey: string): void

  • Берёт значение из data[sourceKey].
  • Преобразует его через transformResponseFields.
  • Записывает результат в data[targetKey].

Пример использования:

ts
const data = {
	category: { id: 5, menutitle: 'Категория 5' },
}
assignTransformedField(data, 'category', 'category_id')

// Ответ:
// data теперь содержит:
// {
//   category_id: {id: 5, label: 'Категория 5'}
// }

validationRules

Набор валидаторов с сообщениями:

ТипОписание правил
textОбязательность (по умолчанию), мин/макс длина символов
numberОбязательность, мин/макс значение
emailОбязательность, проверка формата email, мин/макс длина
phoneОбязательность, мин длина (обычно для номеров +7)
checkboxОбязательность (например, согласие с условиями)
fileОбязательность выбора файла
selectОбязательность выбора из списка

Пример использования:

ts
const rules = {
	menutitle: {
		value: validationRules.text({ min: 3 }),
	},
	slug: {
		value: validationRules.text({ min: 3 }),
	},
}

attachMedia

Используется для прикрепления медиафайлов к сущности.

Сигнатура функции:

ts
(url: string, entityName: string, entityId: number, mediaIds: number[]): void => undefined

Пример использования:

См: configs/forms/products.ts

Внутренний ресурс компании