Alkademi Logo
Guides

Panduan Membuat Plugin

Panduan ini membuat plugin sederhana bernama welcome-banner yang menambahkan halaman dashboard dan item sidebar baru.

Panduan Membuat Plugin

Panduan ini membuat plugin sederhana bernama welcome-banner yang menambahkan halaman dashboard dan item sidebar baru.

Langkah 1: Buat Struktur Folder

mkdir -p plugins/welcome-banner/pages/dashboard/welcome-banner
mkdir -p plugins/welcome-banner/components

Langkah 2: Buat Konfigurasi Layer

Buat plugins/welcome-banner/nuxt.config.ts:

export default defineNuxtConfig({
  imports: {
    dirs: ['stores']
  }
})

imports.dirs bersifat optional. Gunakan jika plugin memiliki folder stores/ atau folder auto-import lain.

Langkah 3: Buat Konfigurasi Plugin

Buat plugins/welcome-banner/plugin.config.ts:

import type { PluginConfig } from '../../shared/types/plugin'

export default {
  enabled: true,
  routes: [
    {
      key: 'welcome-banner',
      path: '/dashboard/welcome-banner',
      icon: 'i-heroicons-megaphone',
      label: 'Welcome Banner'
    }
  ]
} satisfies PluginConfig

Field routes menjadi sumber menu sidebar statis. path harus cocok dengan halaman yang Anda buat.

Langkah 4: Buat Halaman Plugin

Buat plugins/welcome-banner/pages/dashboard/welcome-banner/index.vue:

<template>
  <main class="space-y-4">
    <WelcomeBanner />
  </main>
</template>

Langkah 5: Buat Komponen

Buat plugins/welcome-banner/components/WelcomeBanner.vue:

<template>
  <section class="rounded-lg border border-primary-200 bg-primary-50 p-6">
    <h1 class="text-xl font-semibold text-primary-950">
      Selamat Datang di LMS
    </h1>
    <p class="mt-2 text-primary-700">
      Ini adalah halaman dari plugin yang dimuat sebagai Nuxt Layer.
    </p>
  </section>
</template>

Langkah 6: Tambahkan Sidebar Dinamis (Optional)

Jika plugin perlu menambahkan child menu dari API, buat plugins/welcome-banner/sidebar.ts:

import { defineSidebarProvider } from '../../shared/types/menu'

export default defineSidebarProvider(({ route }) => {
  if (!route.path.startsWith('/dashboard/welcome-banner')) {
    return []
  }

  return [
    {
      key: 'welcome-banner',
      path: '/dashboard/welcome-banner',
      icon: 'i-heroicons-megaphone',
      label: 'Welcome Banner',
      source: 'plugin',
      pluginId: 'welcome-banner',
      children: [
        {
          key: 'welcome-banner.settings',
          path: '/dashboard/welcome-banner/settings',
          icon: 'i-heroicons-cog-6-tooth',
          label: 'Settings',
          source: 'plugin',
          pluginId: 'welcome-banner'
        }
      ]
    }
  ]
})

Karena key sama dengan route statis, item ini akan digabung dan child menu akan muncul di bawah menu Welcome Banner.

Mengganti Core

Jika plugin ini ingin mengganti core tertentu, tambahkan replaces:

export default {
  enabled: true,
  replaces: ['program'],
  routes: [
    {
      key: 'welcome-banner',
      path: '/dashboard/welcome-banner',
      icon: 'i-heroicons-megaphone',
      label: 'Welcome Banner'
    }
  ]
}

Saat aktif, core program tidak akan dimuat oleh auto-discovery.

Verifikasi

Jalankan:

pnpm dev

Buka /dashboard/welcome-banner. Jika enabled: true, plugin akan dimuat sebagai layer dan item sidebar akan muncul dari plugin.config.ts.

Copyright © 2026