Plugin components wrap heavy third-party libraries (charts, calendars, data grids, editors, drag-and-drop). They are exported from the adminlte-vue/plugins entry — separate from the core components — so the plugin libs stay out of the default import. Each wrapper renders a host element, then await import(...)s its library inside onMounted and destroys the instance in onBeforeUnmount.
Because these wrappers load their library only in the browser, the consuming app must install the matching peer dependency and its CSS, and the component must run client-side only.
Each wrapper depends on its own (optional) peer library. Install only the ones you use, and import the library's stylesheet yourself.
# install the peer lib for the wrapper(s) you use
pnpm add apexcharts # LteApexChart, LteSparklineChart
pnpm add @fullcalendar/core @fullcalendar/daygrid @fullcalendar/interaction # LteCalendar
pnpm add tabulator-tables # LteDatatable
pnpm add quill # LteEditor
pnpm add tom-select # LteTomSelect
pnpm add flatpickr # LteFlatpickr
pnpm add jsvectormap # LteVectorMap
pnpm add sortablejs # LteSortable, LteKanban
In a Nuxt (SSR) app, wrap every plugin component in <ClientOnly> so it only mounts in the browser. A #fallback keeps the layout stable during hydration.
<template>
<ClientOnly>
<LteApexChart type="line" :series="series" />
<template #fallback>
<div style="height: 350px" />
</template>
</ClientOnly>
</template>
<script setup lang="ts">
const series = [{ name: 'Sales', data: [30, 40, 35, 50, 49, 60, 70] }]
</script>
Wraps ApexCharts. The host options are built as { chart: { type, height, width }, series }, with options merged over the top. The chart updates reactively when series, options, type, or height change.
| Name | Type | Default | Description |
|---|
series | unknown[] | — (required) | The chart series data. |
type | string | 'line' | ApexCharts chart type (e.g. bar, area, donut). |
options | ApexOptions | undefined | Extra ApexCharts options merged over { chart: { type, height }, series }. |
height | number | string | 350 | Chart height. |
width | number | string | undefined | Chart width. |
<LteApexChart
type="bar"
:series="[{ name: 'Net Profit', data: [44, 55, 57, 56] }]"
:options="{ xaxis: { categories: ['Q1', 'Q2', 'Q3', 'Q4'] } }"
/>
Wraps FullCalendar with the daygrid and interaction plugins. The header toolbar and editable: true are preset; pass options to override or extend the FullCalendar config. Updating events reloads the event sources.
| Name | Type | Default | Description |
|---|
events | EventInput[] | [] | FullCalendar event inputs. |
initialView | string | 'dayGridMonth' | The initial calendar view. |
options | Partial<CalendarOptions> | undefined | Extra FullCalendar options spread over the defaults. |
| Name | Payload | Description |
|---|
dateClick | DateClickArg | A calendar date was clicked. |
eventClick | EventClickArg | An event was clicked. |
eventDrop | EventDropArg | An event was dragged to a new date. |
| Name | Returns | Description |
|---|
getApi() | Calendar | null | The underlying FullCalendar instance (null until mounted). |
<template>
<ClientOnly>
<LteCalendar ref="cal" :events="events" @event-click="onEventClick" />
</ClientOnly>
</template>
<script setup lang="ts">
const cal = ref()
const events = [{ title: 'Meeting', date: '2026-06-01' }]
function onEventClick(arg) {
console.log(arg.event.title)
}
</script>
Wraps Tabulator. The host options default to { layout: 'fitColumns', height, columns, data }, with options merged over the top. Updating data calls Tabulator's replaceData.
| Name | Type | Default | Description |
|---|
columns | Array<Record<string, unknown>> | [] | Tabulator column definitions. |
data | unknown[] | [] | Row data. |
options | Record<string, unknown> | undefined | Extra Tabulator options merged over { columns, data }. |
height | string | undefined | Table height. |
| Name | Payload | Description |
|---|
ready | table | Fired on Tabulator's tableBuilt; receives the Tabulator instance. |
| Name | Returns | Description |
|---|
getTable() | Tabulator | null | The underlying Tabulator instance (null until mounted). |
<LteDatatable
:columns="[{ title: 'Name', field: 'name' }, { title: 'Age', field: 'age' }]"
:data="[{ name: 'Ada', age: 36 }, { name: 'Linus', age: 54 }]"
@ready="(table) => console.log(table)"
/>
A generic drag-to-reorder list backed by SortableJS. It renders a configurable host tag containing your default slot and emits update:modelValue with the reordered array. Use v-model to bind the list.
| Name | Type | Default | Description |
|---|
modelValue | T[] | [] | v-model — the ordered list. |
tag | string | 'div' | The host element tag to render. |
options | Options (sortablejs) | undefined | Extra SortableJS options (merged over { animation: 150 }). |
| Name | Payload | Description |
|---|
update:modelValue | T[] | The reordered list. |
end | SortableEvent | The underlying SortableJS onEnd event. |
<template>
<LteSortable v-model="items" tag="ul" class="list-group">
<li v-for="item in items" :key="item" class="list-group-item">{{ item }}</li>
</LteSortable>
</template>
<script setup lang="ts">
const items = ref(['Alpha', 'Bravo', 'Charlie'])
</script>
A multi-column drag-and-drop board built on SortableJS (shared group: 'kanban', so cards move between columns). It renders Bootstrap cards per column and emits move when a card is dropped. The KanbanCard and KanbanColumn types are exported from adminlte-vue/plugins.
interface KanbanCard {
id: string
title: string
text?: string
}
interface KanbanColumn {
id: string
title: string
theme?: BootstrapTheme
cards: KanbanCard[]
}
| Name | Type | Default | Description |
|---|
columns | KanbanColumn[] | — (required) | The board columns and their cards. |
| Name | Payload | Description |
|---|
move | { card: string; from: string; to: string; newIndex: number } | A card was moved; identifies the card and source/target column ids and its new index. |
<template>
<LteKanban :columns="columns" @move="onMove" />
</template>
<script setup lang="ts">
import type { KanbanColumn } from 'adminlte-vue/plugins'
const columns = ref<KanbanColumn[]>([
{ id: 'todo', title: 'To Do', theme: 'primary', cards: [{ id: '1', title: 'Draft spec' }] },
{ id: 'done', title: 'Done', theme: 'success', cards: [] },
])
function onMove(payload) {
console.log(payload.card, payload.from, '->', payload.to, payload.newIndex)
}
</script>
The plugins entry also exports these wrappers, which follow the same dynamic-import / <ClientOnly> pattern:
| Component | Peer library |
|---|
LteSparklineChart | apexcharts |
LteEditor | quill |
LteTomSelect | tom-select |
LteFlatpickr | flatpickr |
LteVectorMap | jsvectormap |