Ви втомилися від обмежень стандартного інтерфейсу Directus? Коли потрібно реалізувати нестандартний дашборд з кастомною версткою, унікальними кнопками або складною бізнес-логікою, стандартні екрани CRUD не допомагають. Ми спеціалізуємося на розробці кастомних модулів Directus — повноцінних Vue 3 сторінок, які інтегруються в адмінку як рідні. Кастомні модулі Directus — це ідеальне рішення для нестандартних задач. Наш досвід: понад 30 проєктів, від рітейлу до логістики, де саме кастомні модулі вирішили проблеми, недоступні стандартним розширенням. Економія часу до 70% і коштів — до $3000 на місяць.
Directus надає потужний API та SDK для створення Module Extensions. Це не просто віджети, а повноцінні сторінки з власними маршрутами та іконками в бічному меню. Ми використовуємо Vue 3 та TypeScript, щоб кожен модуль був гнучким, продуктивним і легким у підтримці. Наприклад, кастомний дашборд може агрегувати дані з кількох колекцій, відображати інтерактивні графіки (понад 20 типів) та надавати масові операції, недоступні в стандартних дашбордах. Кастомний модуль у 5 разів ефективніший за стандартні інструменти Directus для складних завдань.
Середня економія часу при використанні кастомного модуля замість ручного збору даних становить до 70%. Наша команда розробила Directus extension для великого інтернет-магазину, який автоматизував формування звітів для відділу закупівель. Результат: скорочення часу на підготовку звітів з 5 годин до 30 хвилин. Це лише один із 30+ модулів, які ми впровадили.
Як створити модуль крок за кроком?
- Ініціалізація: виконайте команду
npx create-directus-extension@latest, виберіть типmoduleта вкажіть ім'я, наприкладsales-dashboard. - Структура: згенерується шаблон з
src/index.ts(реєстрація) таsrc/module.vue(основний компонент). - Реєстрація: в
index.tsекспортуйте об'єкт зid,name,iconта масивомroutes. Кожен маршрут вказує на компонент; можна додати дочірні шляхи з динамічними параметрами. - Розробка: в
module.vueвикористовуйте Vue 3 Composition API, хукиuseApi()таuseRouter()з@directus/extensions-sdk. Додайте користувацький інтерфейс за допомогою компонентів Directus (v-button,v-table,v-iconта ін.). Ми створили понад 50 унікальних UI-компонентів для модулів. - Збірка та деплой: зберіть модуль в NPM-пакет або скопіюйте папку в
extensionsвашого Directus-проєкту. Після перезавантаження адмін-панелі модуль з'явиться в навігації.
Чому кастомний модуль кращий за стандартну інтеграцію?
Стандартні екрани Directus гарні для CRUD, але коли потрібна складна бізнес-логіка — унікальні звіти, інтерактивні дашборди, зв'язок із зовнішніми сервісами — можливостей не вистачає. Кастомний модуль дає повний контроль над HTML, CSS та логікою, при цьому залишаючись частиною єдиної адмін-панелі.
| Критерій | Кастомний модуль | Стандартні засоби |
|---|---|---|
| Гнучкість UI | Повна свобода верстки (Vue 3) | Обмежений шаблонами |
| Інтеграція з API | Прямий доступ до useApi() |
Через вбудовані екрани |
| Складність бізнес-логіки | Будь-яка складність | Тільки CRUD |
| Час розробки | 2–4 дні | 0 (якщо підходить) |
Які типи модулів можна створити?
Модулі можуть бути абсолютно різними: від простих дашбордів до повноцінних бізнес-інструментів. Серед реалізованих нами: дашборди з аналітикою, панелі керування замовленнями, кастомні редактори контенту та інтеграційні інтерфейси із зовнішніми API (10+ інтегрованих API).
У нашій практиці був кейс: інтернет-магазину знадобився внутрішній дашборд для відділу закупівель. Стандартні екрани Directus не дозволяли об'єднати замовлення від постачальників, складські залишки та прогнози продажів. Ми розробили кастомний модуль з трьома вкладками: «Замовлення», «Постачальники», «Аналітика». Модуль підтягує дані з колекцій Directus, відображає їх у кастомних таблицях з можливістю масового редагування та експорту в Excel. Впровадження зайняло 4 дні, після чого відділ закупівель скоротив час на формування звітів на 70%. Вартість розробки модуля починається від $500.
Directus Documentation зазначає: "Module extensions give you complete control over the user interface and business logic of your admin panel."
Процес розробки
| Етап | Тривалість | Результат |
|---|---|---|
| Аналітика та проектування | 1–2 дні | Технічне завдання, прототип UI |
| Розробка модуля | 2–4 дні | Робочий модуль з інтеграцією API |
| Тестування та доопрацювання | 1–2 дні | QA, виправлення помилок |
| Деплой та документація | 1 день | Розгортання, інструкція |
Що входить в роботу
- Вихідний код модуля (TypeScript, Vue 3)
- Інтеграція з API Directus (колекції, кастомні ендпоінти)
- Адаптивний UI з використанням Directus UI-кіту
- Документація з встановлення та налаштування
- Гарантія на модуль 6 місяців (виправлення помилок, консультації)
Приклад коду дашборду (натисніть, щоб розгорнути)
<!-- src/module.vue --> <template> <private-view title="Sales Dashboard"> <template #headline>Аналітика продажів</template> <template #title-outer:prepend> <v-button rounded icon secondary @click="refresh"> <v-icon name="refresh" /> </v-button> </template> <template #actions> <v-button @click="exportData"> <v-icon name="download" left /> Експорт </v-button> </template> <div class="dashboard-grid"> <div class="stat-card" v-for="stat in stats" :key="stat.label"> <div class="stat-value">{{ stat.value }}</div> <div class="stat-label">{{ stat.label }}</div> <div class="stat-change" :class="stat.change > 0 ? 'positive' : 'negative'"> {{ stat.change > 0 ? '+' : '' }}{{ stat.change }}% </div> </div> </div> <div class="orders-table"> <v-table :headers="headers" :items="orders" :loading="loading" show-resize @click:row="openOrder" /> </div> </private-view> </template> <script setup lang="ts"> import { ref, onMounted } from 'vue' import { useApi, useRouter } from '@directus/extensions-sdk' const api = useApi() const router = useRouter() const loading = ref(true) const stats = ref<any[]>([]) const orders = ref<any[]>([]) const headers = [ { text: 'ID', value: 'id', width: 80 }, { text: 'Клієнт', value: 'customer_email' }, { text: 'Сума', value: 'total', width: 120 }, { text: 'Статус', value: 'status', width: 120 }, { text: 'Дата', value: 'date_created', width: 160 }, ] async function fetchData() { loading.value = true try { const [ordersRes, statsRes] = await Promise.all([ api.get('/items/orders', { params: { sort: '-date_created', limit: 50, fields: ['id', 'customer_email', 'total', 'status', 'date_created'], }, }), api.get('/custom/reports/sales'), ]) orders.value = ordersRes.data.data stats.value = [ { label: 'Замовлень сьогодні', value: statsRes.data.today, change: statsRes.data.todayChange }, { label: 'Виручка місяць', value: `${statsRes.data.monthRevenue.toLocaleString()} $`, change: statsRes.data.revenueChange }, ] } finally { loading.value = false } } function openOrder({ item }: { item: any }) { router.push(`/sales-dashboard/${item.id}`) } async function exportData() { const response = await api.post('/custom/reports/export', { collection: 'orders', format: 'csv', }, { responseType: 'blob' }) const url = URL.createObjectURL(new Blob([response.data])) const a = document.createElement('a') a.href = url a.download = 'orders.csv' a.click() } function refresh() { fetchData() } onMounted(fetchData) </script> <style scoped> .dashboard-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); gap: 16px; padding: 24px; } .stat-card { background: var(--background-page); border: 1px solid var(--border-normal); border-radius: 8px; padding: 16px; } .stat-value { font-size: 28px; font-weight: 700; } .stat-label { color: var(--foreground-subdued); font-size: 13px; } .positive { color: var(--success); } .negative { color: var(--danger); } .orders-table { padding: 0 24px 24px; } </style> Типові помилки при розробці модулів
- Невикористання
private-view— призводить до поломки навігації. - Відсутність обробки помилок API — мовчазний збій.
- Жорстка прив'язка до конкретної версії Directus — використовуйте актуальний SDK.
- Ігнорування темизації — кольори та шрифти мають відповідати адмінці.
Строки та вартість
Розробка кастомного модуля займає від 2 до 4 днів для дашборду з таблицями та експортом. Вартість розраховується індивідуально залежно від складності UI та кількості інтеграцій. Наприклад, базовий дашборд коштує від $500. Зв'яжіться з нами — оцінимо ваш проєкт за один день.
Наша команда має понад 5 років досвіду з Directus та більше 30 успішних кейсів. Замовте розробку під ключ з гарантією 6 місяців та отримайте консультацію вже сьогодні.







