Card Tools / Composables
useCardComponent – all-in-one на рівні клієнта
Основний composable для роботи на рівні клієнта [цього пакета].
Імпортується в компонент враппера табів карточки (
opened-entity.vue).Отримує параметром
useCardStore, з цього ж модуля.Вертає все що треба (і не треба) для карточки. Тут вже дивіться типи, IDE вам підтягне.
Вкладені composables
WARNING
Зверніть увагу! Якщо вам треба там щось поміняти, але ви не є безпосереднім мейнтейнером цього пакета, то не певен, що вам варто лізти сюди в глибину згідно нашого 1-2 розділення 🙂
Ідея
Ідея така: мінімізувати кількість імпортів і коду на рівні клієнтського компонента. Тобто, щоб не було явного "розпаковування" useCardStore, і перекидання його параметрів по безлічі компоузаблів, між якими теж треба ті параметри перекидати туди-сюди.
Тому, модуль спеціально був задизайнений так, щоб мінімалізувати взаємодію клієнтських компонентів з нутрощами ліби. Тому і маємо тут вкладені composables, які "ковбасяться" в середині і вертають на "клієнта" тільки те що потрібно.
useCardValidation
IMPORTANT
Зверніть увагу! саме useCardValidation в результаті вертає на клієнтський компонент modelValue, до якого потім через v-model вʼяжуться інпути форми.
useNestedCardComponent – вкладена карточка
Для карточок, які живуть всередині іншої карточки — popup або child-route.
**Імпортується в вкладений компонент
Обгортка над
useCardComponentзmanualSetup: true.Параметр
routeParamName— ім'я ключа вroute.paramsдля ID вкладеного запису (напр.'statusConditionId'). Якщо відрізняється від дефолтного'id'— карточка вважається вкладеною.parentIdчитається автоматично зroute.params.id— передавати з компонента не потрібно.**Повертає той самий набір значень **, що й
useCardComponent:isNew,hasValidationErrors,save,modelValue
Детальний приклад: Nested Card Usage.
useCardAnyFieldEditedWatcher – dirty-флаг локального драфта
Той самий isAnyFieldEdited, що вертає useCardComponent, але для локального ref — popup без власного card store.
- Заміна
valueновим обʼєктом скидає dirty. - Мутація полів in-place вмикає dirty.
import { useCardAnyFieldEditedWatcher } from '@webitel/ui-datalist/card';
const draft = ref(emptyItem());
const { isAnyFieldEdited } = useCardAnyFieldEditedWatcher({
value: draft,
});
watch(shown, (isShown) => {
if (!isShown) return;
draft.value = { ...emptyItem(), ...item }; // reset
});useCardRouting
Внутрішній composable для синхронізації store itemId з URL.
- Для звичайної карточки:
routeParamName = 'id'(default). - Для вкладеної: custom
routeParamName— URL оновлюється лише після створення нового запису ('new'→ server ID).
Інші composables
1 composable => 1 ui фіча для типового компонента карточки.
Не певен, що тут варто розписувати. Але якщо треба описати щось, то пінгайте мене (@d.lohvinov).