Apariencia
Módulos del admin (@/*)
Una página de plugin importa vue, vue-router y @/…. Todo sale de window.__HURY_ADMIN__, así que comparte Vue, componentes, tiendas y estilos con el panel (no se empaquetan). @/… no es una ruta de ficheros libre: solo se alcanza lo que enumera el import.meta.glob de admin/src/plugins/runtime.ts. Importar otra cosa falla al cargar con «El panel no expone…».
Reglas
- Se importan los nombres:
import * as x from "@/…"no se admite. - Las dependencias propias del plugin (p. ej.
qrcode) se resuelven desde las del admin y sí se empaquetan en el plugin. - Un
importde@/modules/…no funciona, salvo las tres rutas concretas de la lista. - El texto en español es la clave de traducción:
t("Texto")de@/i18n.
Entrada del plugin (admin/index.ts)
export default de un objeto PluginAdminModule:
| Campo | Tipo | Descripción |
|---|---|---|
feature | texto | Clave del módulo. El panel oculta la entrada y bloquea las rutas si está apagado. |
routes | RouteRecordRaw[] | Rutas de vue-router bajo el AppShell. El meta.permission (lista) restringe quién entra. |
nav | NavEntry | Entrada de menú plana; el runtime la aplana con PROMOTE, como las del núcleo. |
settingsLink, settingsGroup | SettingsLink, texto | Enlace en la página de Ajustes, dentro del grupo con ese título en español («TPV», «Sistema»…). |
tour | ModuleTour | Tutorial del módulo. |
slots | Array<{ slot, feature?, component }> | Componentes que el plugin engancha en puntos del panel; component es una importación dinámica. |
Slots reservados
El núcleo pinta <PluginSlot name="área.punto" … /> y el plugin engancha componentes. PluginSlot pinta, en orden, los componentes cuyo feature está encendido, y no pinta nada si no hay ninguno.
| Slot | Props / eventos | Dónde |
|---|---|---|
pos.order.payments | orderId, compact? | ficha del pedido del TPV y hoja de mesa del TPV 2 |
pos.order.detail | order ({ id, tableId }) | detalle de un pedido |
pos.requests | emite open(orderId) | avisos pendientes en Vender |
terminals.row | terminal; emite changed | fila de un terminal |
Sesión y módulos
useSession() (@/stores/session) expone can(...permisos), canAny(...), feature(clave) y isAdmin. Para una clave de plugin, session.feature(clave) solo es verdadero si me.features[clave] === true: así un paso de tutorial o un panel del núcleo ligado a un plugin no salen mientras no esté instalado.
Lo que alcanza un plugin
Rutas que alcanza import.meta.glob en admin/src/plugins/runtime.ts:
/src/components/**/*.vue/src/composables/**/*.ts/src/lib/**/*.ts/src/stores/**/*.ts/src/api/*.ts/src/app/*.ts/src/i18n/index.ts/src/brand.ts/src/modules/crm/labels.ts/src/modules/pos/components/ReasonModal.vue/src/modules/media/access.ts
| Importación | Valores | Solo tipos |
|---|---|---|
@/api/fetchAll | fetchAll | — |
@/api/http | ApiError apiBase buildQuery downloadFile http renewSession sessionLost setOnSessionLost streamUrl tokens uploadFile | — |
@/api/setup | markSetupDone needsSetup setupApi setupStatus | LicenseCheck SetupPayload SetupResult SetupStatus |
@/api/types | — | Me Paged |
@/app/env | apiOrigin storagePrefix | — |
@/app/features | FEATURE_KEYS FEATURE_PATHS NEW_MODULES featureOfPath | FeatureKey ModuleInfo ModuleKey |
@/app/kiosk | KIOSK_HOST KIOSK_PATH | — |
@/app/navigation | NAV PROMOTE SECTIONS SECTION_LABELS SETTINGS_GROUPS SETTINGS_ROUTES activeFor activeIn flattenEntries | NavEntry NavSection NavView Promote SettingsLink |
@/app/pageNav | PAGE_NAV pageNavFor usePageNav visibleEntries | PageNavItem PageNavState PageNavToggle |
@/app/pluginKeys.generated | PLUGIN_FEATURE_KEYS | — |
@/app/router | router | — |
@/app/setupRules | COUNTRY_CODES MIN_DISTINCT_CHARS MIN_PASSWORD MIN_PASSWORD_SCORE checkPassword defaultCountry licenseReason mapServerIssues | LicenseReason MappedIssues PasswordCheck PasswordIssue ServerIssue SetupField |
@/app/styles | APP_STYLES applyStyle isStyleId loadStyle | AppStyle StyleId |
@/app/tourSteps | TOUR_STEPS | TourStep |
@/app/usageProfiles | QR_FEATURES blockLabel blockOf detectProfile profileFeatures profileSkipped profileSplit skippedMessage skippedOf | BlockReason FeaturesState UsageProfile |
@/brand | brand | — |
@/components/CardSetupNotice | componente (default) | — |
@/components/CommandPalette | componente (default) | — |
@/components/CrudPage | componente (default) | — |
@/components/ImageInput | componente (default) | — |
@/components/LocaleMenu | componente (default) | — |
@/components/LocaleSelect | componente (default) | — |
@/components/PanelVersion | componente (default) | — |
@/components/PluginSlot | componente (default) | — |
@/components/sales/SalesWindowFields | componente (default) | — |
@/components/sales/TpvSalesPanel | componente (default) | — |
@/components/shell/SideRail | componente (default) | — |
@/components/shell/TourOverlay | componente (default) | — |
@/components/ui/AppPage | componente (default) | — |
@/components/ui/ConfirmHost | componente (default) | — |
@/components/ui/StatusBadge | componente (default) | — |
@/components/ui/UiBadge | componente (default) | — |
@/components/ui/UiButton | componente (default) | — |
@/components/ui/UiCallout | componente (default) | — |
@/components/ui/UiCard | componente (default) | — |
@/components/ui/UiCheckbox | componente (default) | — |
@/components/ui/UiChoiceChips | componente (default) | — |
@/components/ui/UiDesc | componente (default) | — |
@/components/ui/UiDescList | componente (default) | — |
@/components/ui/UiDrawer | componente (default) | — |
@/components/ui/UiEmpty | componente (default) | — |
@/components/ui/UiField | componente (default) | — |
@/components/ui/UiFileInput | componente (default) | — |
@/components/ui/UiIcon | componente (default) | — |
@/components/ui/UiInput | componente (default) | — |
@/components/ui/UiLinkList | componente (default) | — |
@/components/ui/UiList | componente (default) | — |
@/components/ui/UiListItem | componente (default) | — |
@/components/ui/UiLoadError | componente (default) | — |
@/components/ui/UiMenu | componente (default) | — |
@/components/ui/UiModal | componente (default) | — |
@/components/ui/UiMoneyInput | componente (default) | — |
@/components/ui/UiSearch | componente (default) | — |
@/components/ui/UiSection | componente (default) | — |
@/components/ui/UiSegmented | componente (default) | — |
@/components/ui/UiSelect | componente (default) | — |
@/components/ui/UiSkeleton | componente (default) | — |
@/components/ui/UiSortHandle | componente (default) | — |
@/components/ui/UiSortableList | componente (default) | — |
@/components/ui/UiStat | componente (default) | — |
@/components/ui/UiStats | componente (default) | — |
@/components/ui/UiSwitch | componente (default) | — |
@/components/ui/UiTable | componente (default) | — |
@/components/ui/UiTabs | componente (default) | — |
@/components/ui/UiTextarea | componente (default) | — |
@/components/ui/UiThumb | componente (default) | — |
@/components/ui/UiToaster | componente (default) | — |
@/components/ui/UiToolbar | componente (default) | — |
@/composables/useCardStatus | useCardStatus | — |
@/composables/useRealtime | useRealtime | RealtimeMessage |
@/composables/useReorder | useReorder | ReorderContext UseReorderOptions |
@/composables/useResource | usePaged useResource | — |
@/composables/useSortable | arrayMove keyboardDirection refocusItem useSortable | SortableChange UseSortableOptions |
@/i18n | LOCALES LOCALE_NAMES addMessages initI18n intlLocale locale setLocale t | Locale Params |
@/lib/format | DAY_START_HOUR TIME_ZONE businessToday centsToInput date dateTime dayLabel delta fromLocalInput inputToCents money number percent relative switchPercentMoney time toLocalInput today weekdayNames | — |
@/lib/salesWindow | channelName channelOptions statusLabel statusTone whenText | SalesChannel SalesStatus SalesWindowBlock SalesWindowForm |
@/modules/crm/labels | CAMPAIGN_STATUS CHANNEL CHANNEL_OPTIONS COUPON_SOURCE COUPON_STATUS COUPON_TYPE DAYS DAY_OPTIONS LOYALTY_TX MESSAGE_STATUS ORDER_STATUS PAYMENT_STATUS PROMOTION_TYPE REWARD_TYPE SHOP_ORDER_STATUS SOURCE fullName loadCategories loadClubStores loadProducts loadPromotions loadSegments loadTemplates | ClubStoreOption |
@/modules/media/access | MEDIA_EDIT MEDIA_VIEW useMediaAccess | — |
@/modules/pos/components/ReasonModal | componente (default) | — |
@/stores/feedback | useFeedback | ConfirmRequest Toast |
@/stores/session | useSession | — |
@/stores/tour | markVisited tourDone useTour visitedPaths | — |