@asteby/metacore-runtime-react 44.0.0 → 45.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +11 -0
- package/dist/dynamic-columns.d.ts +11 -0
- package/dist/dynamic-columns.d.ts.map +1 -1
- package/dist/dynamic-columns.js +13 -1
- package/dist/dynamic-kanban.d.ts.map +1 -1
- package/dist/dynamic-kanban.js +4 -5
- package/dist/dynamic-row-actions.d.ts.map +1 -1
- package/dist/dynamic-row-actions.js +12 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/model-action-toolbar.d.ts.map +1 -1
- package/dist/model-action-toolbar.js +16 -3
- package/dist/requires-addon.d.ts +37 -0
- package/dist/requires-addon.d.ts.map +1 -0
- package/dist/requires-addon.js +104 -0
- package/dist/types.d.ts +23 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +3 -3
- package/src/__tests__/requires-addon.test.tsx +201 -0
- package/src/dynamic-columns.tsx +36 -6
- package/src/dynamic-kanban.tsx +6 -7
- package/src/dynamic-row-actions.tsx +15 -1
- package/src/index.ts +11 -0
- package/src/model-action-toolbar.tsx +28 -3
- package/src/requires-addon.tsx +160 -0
- package/src/types.ts +24 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,16 @@
|
|
|
1
1
|
# @asteby/metacore-runtime-react
|
|
2
2
|
|
|
3
|
+
## 45.0.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- 42c0e43: Acciones que requieren un addon opcional (`requiresAddon`). Cuando el host marca una acción con `requires_addon` / `requiresAddon` (`{ key, name?, reason? }`), la acción sigue visible pero bloqueada en el menú de fila (tabla y kanban) y en `ModelActionToolbar`: candado + tooltip "Requiere «name»". Al hacer clic no abre el dispatcher, el modal federado ni llama al backend; abre un diálogo "Esta acción requiere «name»" con "Instalar" y "Cancelar". "Instalar" invoca el handler registrado con `setAddonInstallHandler(fn)` o, si no hay, navega con el router a `/marketplace/<key>`. Nuevas exportaciones: `resolveRequiresAddon`, `setAddonInstallHandler`, `getAddonInstallHandler`, `requiresAddonName`, `useRequiresAddonLabel`, `RequiresAddonLock`, `RequiresAddonDialog`, tipo `RequiresAddon`.
|
|
8
|
+
|
|
9
|
+
### Patch Changes
|
|
10
|
+
|
|
11
|
+
- Updated dependencies [42c0e43]
|
|
12
|
+
- @asteby/metacore-sdk@3.11.0
|
|
13
|
+
|
|
3
14
|
## 44.0.0
|
|
4
15
|
|
|
5
16
|
### Minor Changes
|
|
@@ -38,6 +38,17 @@ export declare const aggregateOf: (col: ColumnDefinition) => string | undefined;
|
|
|
38
38
|
* empty filtered set reads cleanly.
|
|
39
39
|
*/
|
|
40
40
|
export declare const formatAggregateTotal: (col: ColumnDefinition, value: unknown, currency?: string, locale?: string) => string;
|
|
41
|
+
/**
|
|
42
|
+
* One entry of the row "…" menu. An action gated by a missing optional addon
|
|
43
|
+
* (`requiresAddon`) stays listed with a lock + tooltip; the click still goes to
|
|
44
|
+
* `onAction`, whose shared handler (useDynamicRowActions) opens the
|
|
45
|
+
* requires-addon dialog instead of executing.
|
|
46
|
+
*/
|
|
47
|
+
export declare function RowActionMenuItem({ action, label, onSelect, }: {
|
|
48
|
+
action: any;
|
|
49
|
+
label: React.ReactNode;
|
|
50
|
+
onSelect: (e: React.MouseEvent) => void;
|
|
51
|
+
}): React.JSX.Element;
|
|
41
52
|
/**
|
|
42
53
|
* State-machine gate for per-row actions.
|
|
43
54
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dynamic-columns.d.ts","sourceRoot":"","sources":["../src/dynamic-columns.tsx"],"names":[],"mappings":"AAcA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B,OAAO,EAAU,KAAK,MAAM,EAAE,MAAM,UAAU,CAAA;
|
|
1
|
+
{"version":3,"file":"dynamic-columns.d.ts","sourceRoot":"","sources":["../src/dynamic-columns.tsx"],"names":[],"mappings":"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"}
|
package/dist/dynamic-columns.js
CHANGED
|
@@ -30,6 +30,7 @@ import { DynamicIcon, isLucideIconName } from './dynamic-icon';
|
|
|
30
30
|
import { CollectionCell } from './collection-cell';
|
|
31
31
|
import { isNilUuid, normalizeNilUuid } from './nil-uuid';
|
|
32
32
|
import { useOptionsResolver } from './use-options-resolver';
|
|
33
|
+
import { RequiresAddonLock, resolveRequiresAddon, useRequiresAddonLabel } from './requires-addon';
|
|
33
34
|
import { isColumnVisibleInTable } from './column-visibility';
|
|
34
35
|
const defaultGetImageUrl = (path) => path;
|
|
35
36
|
const getNestedValue = (obj, path) => path.split('.').reduce((acc, part) => acc && acc[part], obj);
|
|
@@ -108,6 +109,17 @@ const CodeCell = ({ text, maxLength }) => {
|
|
|
108
109
|
};
|
|
109
110
|
return (_jsxs("div", { className: "group flex items-center gap-1.5", children: [_jsx("code", { className: "rounded bg-muted px-1.5 py-0.5 font-mono text-xs text-foreground/80", title: text, children: display }), _jsx("button", { type: "button", onClick: onCopy, className: "opacity-0 transition-opacity group-hover:opacity-100 text-muted-foreground hover:text-foreground", "aria-label": "Copiar", title: "Copiar", children: copied ? (_jsx(Check, { className: "h-3.5 w-3.5 text-green-500" })) : (_jsx(Copy, { className: "h-3.5 w-3.5" })) })] }));
|
|
110
111
|
};
|
|
112
|
+
/**
|
|
113
|
+
* One entry of the row "…" menu. An action gated by a missing optional addon
|
|
114
|
+
* (`requiresAddon`) stays listed with a lock + tooltip; the click still goes to
|
|
115
|
+
* `onAction`, whose shared handler (useDynamicRowActions) opens the
|
|
116
|
+
* requires-addon dialog instead of executing.
|
|
117
|
+
*/
|
|
118
|
+
export function RowActionMenuItem({ action, label, onSelect, }) {
|
|
119
|
+
const requirement = resolveRequiresAddon(action);
|
|
120
|
+
const requiresAddonLabel = useRequiresAddonLabel();
|
|
121
|
+
return (_jsxs(DropdownMenuItem, { onClick: onSelect, title: requirement ? requiresAddonLabel(requirement) : undefined, "data-requires-addon": requirement?.key, children: [_jsx(DynamicIcon, { name: action.icon || 'Zap', className: "mr-2 h-4 w-4" }), label, requirement && _jsx(RequiresAddonLock, { requirement: requirement })] }));
|
|
122
|
+
}
|
|
111
123
|
/**
|
|
112
124
|
* Lifecycle column used by `requiresState`: prefer `status` (workshop, vehicles,
|
|
113
125
|
* …) and fall back to `state` (purchases, inventory transfers, …). Empty string
|
|
@@ -1018,7 +1030,7 @@ export function makeDefaultGetDynamicColumns(helpers = {}) {
|
|
|
1018
1030
|
meta: {},
|
|
1019
1031
|
cell: ({ row }) => (_jsx("div", { className: "flex items-center justify-end", children: _jsxs(DropdownMenu, { children: [_jsx(DropdownMenuTrigger, { asChild: true, children: _jsxs(Button, { variant: "ghost", className: "h-8 w-8 p-0", children: [_jsx("span", { className: "sr-only", children: "Abrir men\u00FA" }), _jsx(MoreHorizontal, { className: "h-4 w-4" })] }) }), _jsx(DropdownMenuContent, { align: "end", children: resolvedActions
|
|
1020
1032
|
.filter((action) => isRowActionVisible(action, row.original))
|
|
1021
|
-
.map((action) => (
|
|
1033
|
+
.map((action) => (_jsx(RowActionMenuItem, { action: action, label: translateMetadataLabel(action.label, t), onSelect: () => onAction && onAction(action.key, row.original) }, action.key))) })] }) })),
|
|
1022
1034
|
});
|
|
1023
1035
|
}
|
|
1024
1036
|
return columns;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dynamic-kanban.d.ts","sourceRoot":"","sources":["../src/dynamic-kanban.tsx"],"names":[],"mappings":"AA0BA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"dynamic-kanban.d.ts","sourceRoot":"","sources":["../src/dynamic-kanban.tsx"],"names":[],"mappings":"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"}
|
package/dist/dynamic-kanban.js
CHANGED
|
@@ -10,7 +10,7 @@ import { CSS } from '@dnd-kit/utilities';
|
|
|
10
10
|
import { arrayMove } from '@dnd-kit/sortable';
|
|
11
11
|
import { Calendar, CircleDot, GripVertical, Hash, ListFilter, MoreHorizontal, RotateCcw, Search, Settings2, Tag, ToggleLeft, Type, X, } from 'lucide-react';
|
|
12
12
|
import { toast } from 'sonner';
|
|
13
|
-
import { Badge, Button, Card, CardContent, DropdownMenu, DropdownMenuContent,
|
|
13
|
+
import { Badge, Button, Card, CardContent, DropdownMenu, DropdownMenuContent, DropdownMenuTrigger, Input, Popover, PopoverContent, PopoverTrigger, Select, SelectContent, SelectItem, SelectTrigger, SelectValue, Sheet, SheetContent, SheetHeader, SheetTitle, SheetTrigger, Skeleton, } from '@asteby/metacore-ui/primitives';
|
|
14
14
|
import { ColumnFilterControl, FilterValueCombobox } from '@asteby/metacore-ui/data-table';
|
|
15
15
|
import { generateBadgeStyles, optionColor } from '@asteby/metacore-ui/lib';
|
|
16
16
|
import { useApi } from './api-context';
|
|
@@ -27,9 +27,8 @@ import { PortalDragOverlay } from './portal-drag-overlay';
|
|
|
27
27
|
import { objectLabel } from './dynamic-relation-helpers';
|
|
28
28
|
import { useMetadataCache } from './metadata-cache';
|
|
29
29
|
import { ActivityValueRenderer } from './activity-value-renderer';
|
|
30
|
-
import { DynamicIcon } from './dynamic-icon';
|
|
31
30
|
import { isColumnVisibleInTable } from './column-visibility';
|
|
32
|
-
import { aggregateOf, formatAggregateTotal, isRowActionVisible, relationKeyFor, } from './dynamic-columns';
|
|
31
|
+
import { aggregateOf, formatAggregateTotal, isRowActionVisible, relationKeyFor, RowActionMenuItem, } from './dynamic-columns';
|
|
33
32
|
import { useCan, usePermissionsActive, resolveRowActions } from './permissions-context';
|
|
34
33
|
import { useDynamicRowActions } from './dynamic-row-actions';
|
|
35
34
|
import { useStageLayout } from './stage-layout';
|
|
@@ -1752,10 +1751,10 @@ function KanbanCard({ card, titleCol, fieldCols, actions, locale, timeZone, curr
|
|
|
1752
1751
|
const visibleActions = actions.filter((a) => isRowActionVisible(a, card));
|
|
1753
1752
|
const menu = visibleActions.length > 0 ? (_jsxs(DropdownMenu, { children: [_jsx(DropdownMenuTrigger, { asChild: true, children: _jsx(Button, { variant: "ghost", size: "icon", className: "h-6 w-6 shrink-0 -mr-1 -mt-1",
|
|
1754
1753
|
// Don't start a drag / card click from the menu button.
|
|
1755
|
-
onPointerDown: (e) => e.stopPropagation(), onKeyDown: (e) => e.stopPropagation(), onClick: (e) => e.stopPropagation(), children: _jsx(MoreHorizontal, { className: "h-4 w-4" }) }) }), _jsx(DropdownMenuContent, { align: "end", onClick: (e) => e.stopPropagation(), children: visibleActions.map((a) => (
|
|
1754
|
+
onPointerDown: (e) => e.stopPropagation(), onKeyDown: (e) => e.stopPropagation(), onClick: (e) => e.stopPropagation(), children: _jsx(MoreHorizontal, { className: "h-4 w-4" }) }) }), _jsx(DropdownMenuContent, { align: "end", onClick: (e) => e.stopPropagation(), children: visibleActions.map((a) => (_jsx(RowActionMenuItem, { action: a, label: a.label, onSelect: (e) => {
|
|
1756
1755
|
e.stopPropagation();
|
|
1757
1756
|
onAction(a.key, card);
|
|
1758
|
-
}
|
|
1757
|
+
} }, a.key))) })] })) : null;
|
|
1759
1758
|
return (_jsx(Card, { ref: draggable ? setNodeRef : undefined, ...(draggable ? attributes : {}), ...(draggable ? listeners : {}), className: `w-full min-w-0 shrink-0 border-border/70 shadow-sm outline-none focus-visible:ring-2 focus-visible:ring-ring ${draggable ? 'cursor-grab active:cursor-grabbing' : 'cursor-default'}`, style: { opacity: isDragging ? 0.4 : 1 }, onClick: () => onClick?.(card), "data-card-id": String(card.id), "data-flip-key": draggable ? String(card.id) : undefined, "aria-busy": pending || undefined, children: _jsx(CardBody, { card: card, titleCol: titleCol, fieldCols: fieldCols, locale: locale, timeZone: timeZone, currency: currency, menu: menu }) }));
|
|
1760
1759
|
}
|
|
1761
1760
|
// Static preview rendered inside the DragOverlay (no dnd hooks, no menu). It
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dynamic-row-actions.d.ts","sourceRoot":"","sources":["../src/dynamic-row-actions.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"dynamic-row-actions.d.ts","sourceRoot":"","sources":["../src/dynamic-row-actions.tsx"],"names":[],"mappings":"AAuCA,OAAO,KAAK,EAAE,aAAa,EAAiC,MAAM,SAAS,CAAA;AAE3E,MAAM,WAAW,0BAA0B;IACvC,6DAA6D;IAC7D,KAAK,EAAE,MAAM,CAAA;IACb;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB;;;;;OAKG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,2EAA2E;IAC3E,QAAQ,EAAE,aAAa,GAAG,IAAI,CAAA;IAC9B;;;;OAIG;IACH,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,KAAK,IAAI,CAAA;IAC7C,4EAA4E;IAC5E,SAAS,EAAE,MAAM,IAAI,CAAA;CACxB;AAED,MAAM,WAAW,iBAAiB;IAC9B,+CAA+C;IAC/C,oBAAoB,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IACjE;;;OAGG;IACH,OAAO,EAAE,KAAK,CAAC,YAAY,CAAA;CAC9B;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,EACjC,KAAK,EACL,QAAQ,EACR,gBAAgB,EAChB,QAAQ,EACR,QAAQ,EACR,SAAS,GACZ,EAAE,0BAA0B,GAAG,iBAAiB,CAkIhD"}
|
|
@@ -12,6 +12,8 @@ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-run
|
|
|
12
12
|
// view / edit → host `onAction(action, row)` when provided (string
|
|
13
13
|
// contract), else the built-in record dialog.
|
|
14
14
|
// link action → navigate to the action's templated `linkUrl`.
|
|
15
|
+
// requiresAddon → opens the "requires addon" dialog; the action is
|
|
16
|
+
// never dispatched (no modal, no backend call).
|
|
15
17
|
// custom (modal/fields/
|
|
16
18
|
// confirm/executable) → opens the ActionModal via the dispatcher.
|
|
17
19
|
// anything else → host `onAction` + refresh (or just refresh).
|
|
@@ -26,6 +28,7 @@ import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent,
|
|
|
26
28
|
import { useApi } from './api-context';
|
|
27
29
|
import { ActionModalDispatcher } from './action-modal-dispatcher';
|
|
28
30
|
import { DynamicRecordDialog } from './dialogs/dynamic-record';
|
|
31
|
+
import { RequiresAddonDialog, resolveRequiresAddon } from './requires-addon';
|
|
29
32
|
/**
|
|
30
33
|
* Owns the state + dialogs + dispatch logic for per-row actions, shared by
|
|
31
34
|
* DynamicTable and DynamicKanban so both behave identically.
|
|
@@ -39,7 +42,15 @@ export function useDynamicRowActions({ model, endpoint, mutationEndpoint, metada
|
|
|
39
42
|
const [rowToDelete, setRowToDelete] = useState(null);
|
|
40
43
|
const [isDeleting, setIsDeleting] = useState(false);
|
|
41
44
|
const [actionModal, setActionModal] = useState({ open: false, action: null, record: null });
|
|
45
|
+
const [missingAddon, setMissingAddon] = useState(null);
|
|
42
46
|
const handleInternalAction = useCallback(async (action, row) => {
|
|
47
|
+
// A missing optional addon gates the action BEFORE any other routing:
|
|
48
|
+
// it must not reach the dispatcher, the host, or the backend.
|
|
49
|
+
const requirement = resolveRequiresAddon(metadata?.actions?.find((a) => a.key === action));
|
|
50
|
+
if (requirement) {
|
|
51
|
+
setMissingAddon(requirement);
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
43
54
|
if (action === 'delete') {
|
|
44
55
|
setRowToDelete(row);
|
|
45
56
|
return;
|
|
@@ -109,6 +120,6 @@ export function useDynamicRowActions({ model, endpoint, mutationEndpoint, metada
|
|
|
109
120
|
setRowToDelete(null);
|
|
110
121
|
}
|
|
111
122
|
};
|
|
112
|
-
const dialogs = (_jsxs(_Fragment, { children: [_jsx(AlertDialog, { open: !!rowToDelete, onOpenChange: (open) => !open && setRowToDelete(null), children: _jsxs(AlertDialogContent, { children: [_jsxs(AlertDialogHeader, { children: [_jsx(AlertDialogTitle, { children: "\u00BFEst\u00E1 absolutamente seguro?" }), _jsx(AlertDialogDescription, { children: "Esta acci\u00F3n no se puede deshacer. Esto eliminar\u00E1 permanentemente el registro seleccionado de nuestros servidores." })] }), _jsxs(AlertDialogFooter, { children: [_jsx(AlertDialogCancel, { disabled: isDeleting, children: t('common.cancel') }), _jsx(AlertDialogAction, { onClick: (e) => { e.preventDefault(); confirmDelete(); }, className: "bg-red-600 hover:bg-red-700", disabled: isDeleting, children: isDeleting ? 'Eliminando...' : 'Eliminar' })] })] }) }), _jsx(DynamicRecordDialog, { open: recordDialog.open, onOpenChange: (open) => setRecordDialog((prev) => ({ ...prev, open })), mode: recordDialog.mode, model: model, recordId: recordDialog.recordId, endpoint: endpoint, onSaved: onRefresh }), actionModal.action && (_jsx(ActionModalDispatcher, { open: actionModal.open, onOpenChange: (open) => setActionModal((prev) => ({ ...prev, open })), action: actionModal.action, model: model, record: actionModal.record, endpoint: endpoint, onSuccess: onRefresh }))] }));
|
|
123
|
+
const dialogs = (_jsxs(_Fragment, { children: [_jsx(AlertDialog, { open: !!rowToDelete, onOpenChange: (open) => !open && setRowToDelete(null), children: _jsxs(AlertDialogContent, { children: [_jsxs(AlertDialogHeader, { children: [_jsx(AlertDialogTitle, { children: "\u00BFEst\u00E1 absolutamente seguro?" }), _jsx(AlertDialogDescription, { children: "Esta acci\u00F3n no se puede deshacer. Esto eliminar\u00E1 permanentemente el registro seleccionado de nuestros servidores." })] }), _jsxs(AlertDialogFooter, { children: [_jsx(AlertDialogCancel, { disabled: isDeleting, children: t('common.cancel') }), _jsx(AlertDialogAction, { onClick: (e) => { e.preventDefault(); confirmDelete(); }, className: "bg-red-600 hover:bg-red-700", disabled: isDeleting, children: isDeleting ? 'Eliminando...' : 'Eliminar' })] })] }) }), _jsx(DynamicRecordDialog, { open: recordDialog.open, onOpenChange: (open) => setRecordDialog((prev) => ({ ...prev, open })), mode: recordDialog.mode, model: model, recordId: recordDialog.recordId, endpoint: endpoint, onSaved: onRefresh }), actionModal.action && (_jsx(ActionModalDispatcher, { open: actionModal.open, onOpenChange: (open) => setActionModal((prev) => ({ ...prev, open })), action: actionModal.action, model: model, record: actionModal.record, endpoint: endpoint, onSuccess: onRefresh })), _jsx(RequiresAddonDialog, { requirement: missingAddon, onOpenChange: (open) => !open && setMissingAddon(null) })] }));
|
|
113
124
|
return { handleInternalAction, dialogs };
|
|
114
125
|
}
|
package/dist/index.d.ts
CHANGED
|
@@ -37,6 +37,7 @@ export * from './slot';
|
|
|
37
37
|
export * from './capability-gate';
|
|
38
38
|
export { PermissionsProvider, useCan, usePermissionsActive, makeCan, capabilityForActionKey, modelCapability, gateTableMetadata, resolveRowActions, type CanFn, type PermissionsProviderProps, } from './permissions-context';
|
|
39
39
|
export { useDynamicRowActions, type UseDynamicRowActionsParams, type DynamicRowActions, } from './dynamic-row-actions';
|
|
40
|
+
export { resolveRequiresAddon, setAddonInstallHandler, getAddonInstallHandler, requiresAddonName, useRequiresAddonLabel, RequiresAddonLock, RequiresAddonDialog, type RequiresAddon, type RequiresAddonDialogProps, } from './requires-addon';
|
|
40
41
|
export { ColorPickerField, DEFAULT_ROLE_COLOR, normalizeHex } from './color-picker-field';
|
|
41
42
|
export { PermissionsManager, moduleActionCapability, moduleCapabilities, grantedCountForModule, capabilitySetsEqual, defaultActionIcon, suggestRoleIcon, normalizeCatalogGroups, flattenGroups, filterModuleGroups, groupModuleActions, type PermissionsManagerProps, type PermissionsCatalog, type GroupedPermissionsCatalog, type FlatPermissionsCatalog, type ModuleGroup, type PermissionModuleDef, type PermissionActionDef, type GeneralPermissionDef, type RoleDef, type RoleInput, } from './permissions-manager';
|
|
42
43
|
export { applySidebarLayout, collectFolderKeys, folderAccessCapability, coreRefKey, addonModelRefKey, addonUrlRefKey, urlRefKey, leafRefFor, normalizeNavPath, slugifyFolderKey, isValidFolderKey, layoutTreeFromNavGroups, type CatalogLeaf, type SidebarLayoutDoc, type SidebarLayoutNode, type AppliedNavGroup, type AppliedNavItem, } from './apply-sidebar-layout';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -42,6 +42,7 @@ export * from './slot';
|
|
|
42
42
|
export * from './capability-gate';
|
|
43
43
|
export { PermissionsProvider, useCan, usePermissionsActive, makeCan, capabilityForActionKey, modelCapability, gateTableMetadata, resolveRowActions, } from './permissions-context';
|
|
44
44
|
export { useDynamicRowActions, } from './dynamic-row-actions';
|
|
45
|
+
export { resolveRequiresAddon, setAddonInstallHandler, getAddonInstallHandler, requiresAddonName, useRequiresAddonLabel, RequiresAddonLock, RequiresAddonDialog, } from './requires-addon';
|
|
45
46
|
export { ColorPickerField, DEFAULT_ROLE_COLOR, normalizeHex } from './color-picker-field';
|
|
46
47
|
export { PermissionsManager, moduleActionCapability, moduleCapabilities, grantedCountForModule, capabilitySetsEqual, defaultActionIcon, suggestRoleIcon, normalizeCatalogGroups, flattenGroups, filterModuleGroups, groupModuleActions, } from './permissions-manager';
|
|
47
48
|
export { applySidebarLayout, collectFolderKeys, folderAccessCapability, coreRefKey, addonModelRefKey, addonUrlRefKey, urlRefKey, leafRefFor, normalizeNavPath, slugifyFolderKey, isValidFolderKey, layoutTreeFromNavGroups, } from './apply-sidebar-layout';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model-action-toolbar.d.ts","sourceRoot":"","sources":["../src/model-action-toolbar.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"model-action-toolbar.d.ts","sourceRoot":"","sources":["../src/model-action-toolbar.tsx"],"names":[],"mappings":"AAiCA,OAAO,KAAK,EAAE,gBAAgB,EAAgD,MAAM,SAAS,CAAA;AAE7F,MAAM,MAAM,eAAe,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,CAAA;AAExD,MAAM,WAAW,uBAAuB;IACpC,oEAAoE;IACpE,KAAK,EAAE,MAAM,CAAA;IACb,8EAA8E;IAC9E,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB;;;;OAIG;IACH,OAAO,CAAC,EAAE,gBAAgB,EAAE,CAAA;IAC5B,qEAAqE;IACrE,UAAU,CAAC,EAAE,eAAe,EAAE,CAAA;IAC9B,qDAAqD;IACrD,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAA;IACrB,iDAAiD;IACjD,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;;;;OAIG;IACH,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,gBAAgB,KAAK,IAAI,CAAA;CACtD;AAID;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAgBzD;AAQD;;;GAGG;AACH,wBAAgB,eAAe,CAC3B,KAAK,EAAE,MAAM,EACb,UAAU,GAAE,eAAe,EAAuB,EAClD,QAAQ,CAAC,EAAE,gBAAgB,EAAE,GAC9B,gBAAgB,EAAE,CA2BpB;AAED,wBAAgB,kBAAkB,CAAC,EAC/B,KAAK,EACL,QAAQ,EACR,OAAO,EACP,UAA+B,EAC/B,QAAQ,EACR,SAAS,EACT,cAAc,GACjB,EAAE,uBAAuB,sCAwFzB"}
|
|
@@ -26,6 +26,7 @@ import { useMetadataCache } from './metadata-cache';
|
|
|
26
26
|
import { DynamicIcon } from './dynamic-icon';
|
|
27
27
|
import { ActionModalDispatcher } from './action-modal-dispatcher';
|
|
28
28
|
import { useCan, modelCapability } from './permissions-context';
|
|
29
|
+
import { RequiresAddonDialog, RequiresAddonLock, resolveRequiresAddon, useRequiresAddonLabel, } from './requires-addon';
|
|
29
30
|
const DEFAULT_PLACEMENTS = ['table', 'create'];
|
|
30
31
|
/**
|
|
31
32
|
* Last-resort label when `t(key)` has no translation yet: never flash the full
|
|
@@ -95,22 +96,34 @@ export function ModelActionToolbar({ model, endpoint, actions, placements = DEFA
|
|
|
95
96
|
const can = useCan();
|
|
96
97
|
const surfaced = useMemo(() => all.filter((a) => can(modelCapability(model, a.key))), [all, can, model]);
|
|
97
98
|
const [active, setActive] = useState(null);
|
|
99
|
+
const [missingAddon, setMissingAddon] = useState(null);
|
|
100
|
+
const requiresAddonLabel = useRequiresAddonLabel();
|
|
98
101
|
const dataEndpoint = endpoint ?? `/data/${model}/me`;
|
|
99
102
|
if (surfaced.length === 0)
|
|
100
103
|
return null;
|
|
101
104
|
return (_jsxs(_Fragment, { children: [_jsx("div", { className: className ?? 'flex items-center gap-2', children: surfaced.map((a) => {
|
|
102
105
|
const isCreate = (a.placement ?? 'row') === 'create';
|
|
106
|
+
// Locked while its optional addon is missing: still shown,
|
|
107
|
+
// but a click explains + offers install instead of running.
|
|
108
|
+
const requirement = resolveRequiresAddon(a);
|
|
103
109
|
return (_jsxs(Button, { variant: isCreate ? 'default' : 'outline', "data-aby-target": isCreate
|
|
104
110
|
? `model.${model}.create`
|
|
105
|
-
: `model.${model}.action.${a.key}`, onClick: () => {
|
|
111
|
+
: `model.${model}.action.${a.key}`, "data-requires-addon": requirement?.key, title: requirement ? requiresAddonLabel(requirement) : undefined, onClick: () => {
|
|
112
|
+
if (requirement) {
|
|
113
|
+
setMissingAddon(requirement);
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
106
116
|
onActionIntent?.(a);
|
|
107
117
|
setActive(toActionMetadata(a));
|
|
108
|
-
}, onMouseEnter: () => onActionIntent?.(a), onFocus: () => onActionIntent?.(a), style: a.color && !isCreate ? { borderColor: a.color, color: a.color } : undefined, children: [_jsx(DynamicIcon, { name: a.icon || (isCreate ? 'Plus' : 'Zap'), className: "mr-2 h-4 w-4" }), t(a.label, { defaultValue: humanizeActionLabel(a.label) })] }, a.key));
|
|
118
|
+
}, onMouseEnter: () => !requirement && onActionIntent?.(a), onFocus: () => !requirement && onActionIntent?.(a), style: a.color && !isCreate ? { borderColor: a.color, color: a.color } : undefined, children: [_jsx(DynamicIcon, { name: a.icon || (isCreate ? 'Plus' : 'Zap'), className: "mr-2 h-4 w-4" }), t(a.label, { defaultValue: humanizeActionLabel(a.label) }), requirement && _jsx(RequiresAddonLock, { requirement: requirement })] }, a.key));
|
|
109
119
|
}) }), active && (_jsx(ActionModalDispatcher, { open: !!active, onOpenChange: (open) => {
|
|
110
120
|
if (!open)
|
|
111
121
|
setActive(null);
|
|
112
122
|
}, action: active, model: model, record: {}, endpoint: dataEndpoint, onSuccess: () => {
|
|
113
123
|
setActive(null);
|
|
114
124
|
onChange?.();
|
|
115
|
-
} }))
|
|
125
|
+
} })), _jsx(RequiresAddonDialog, { requirement: missingAddon, onOpenChange: (open) => {
|
|
126
|
+
if (!open)
|
|
127
|
+
setMissingAddon(null);
|
|
128
|
+
} })] }));
|
|
116
129
|
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { RequiresAddon } from './types';
|
|
2
|
+
export type { RequiresAddon };
|
|
3
|
+
/**
|
|
4
|
+
* Reads the addon requirement off an action, tolerating both the camelCase
|
|
5
|
+
* `requiresAddon` and the snake_case `requires_addon` the host serves. Returns
|
|
6
|
+
* null when the action is freely executable (no requirement, or a malformed one
|
|
7
|
+
* without a `key` — degrade to "runs", never to "locked forever").
|
|
8
|
+
*/
|
|
9
|
+
export declare function resolveRequiresAddon(action: any): RequiresAddon | null;
|
|
10
|
+
type AddonInstallHandler = (key: string) => void;
|
|
11
|
+
/**
|
|
12
|
+
* Registers the host's "install this addon" flow (e.g. open the marketplace
|
|
13
|
+
* install drawer). Pass `null` to unregister. Without a handler the SDK
|
|
14
|
+
* navigates to `/marketplace/<key>` via the router.
|
|
15
|
+
*/
|
|
16
|
+
export declare function setAddonInstallHandler(fn: AddonInstallHandler | null): void;
|
|
17
|
+
/** Current host install handler, or null when none is registered. */
|
|
18
|
+
export declare function getAddonInstallHandler(): AddonInstallHandler | null;
|
|
19
|
+
/** Display name for a requirement: the host-provided name, else the key. */
|
|
20
|
+
export declare function requiresAddonName(req: RequiresAddon): string;
|
|
21
|
+
/** Tooltip text for a gated action: "Requiere «<name>»". */
|
|
22
|
+
export declare function useRequiresAddonLabel(): (req: RequiresAddon) => string;
|
|
23
|
+
/** Lock marker rendered next to a gated action's label (hover = addon name). */
|
|
24
|
+
export declare function RequiresAddonLock({ requirement }: {
|
|
25
|
+
requirement: RequiresAddon;
|
|
26
|
+
}): import("react").JSX.Element;
|
|
27
|
+
export interface RequiresAddonDialogProps {
|
|
28
|
+
/** The requirement to explain; the dialog renders nothing while null. */
|
|
29
|
+
requirement: RequiresAddon | null;
|
|
30
|
+
onOpenChange: (open: boolean) => void;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Compact "this action requires <addon>" dialog. Never touches the backend:
|
|
34
|
+
* "Instalar" hands the key to the host handler or routes to the marketplace.
|
|
35
|
+
*/
|
|
36
|
+
export declare function RequiresAddonDialog({ requirement, onOpenChange }: RequiresAddonDialogProps): import("react").JSX.Element | null;
|
|
37
|
+
//# sourceMappingURL=requires-addon.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"requires-addon.d.ts","sourceRoot":"","sources":["../src/requires-addon.tsx"],"names":[],"mappings":"AA4BA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAE5C,YAAY,EAAE,aAAa,EAAE,CAAA;AAE7B;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,GAAG,GAAG,aAAa,GAAG,IAAI,CAStE;AAED,KAAK,mBAAmB,GAAG,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;AAIhD;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,EAAE,EAAE,mBAAmB,GAAG,IAAI,GAAG,IAAI,CAE3E;AAED,qEAAqE;AACrE,wBAAgB,sBAAsB,IAAI,mBAAmB,GAAG,IAAI,CAEnE;AAED,4EAA4E;AAC5E,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,aAAa,GAAG,MAAM,CAE5D;AAED,4DAA4D;AAC5D,wBAAgB,qBAAqB,IAAI,CAAC,GAAG,EAAE,aAAa,KAAK,MAAM,CAOtE;AAED,gFAAgF;AAChF,wBAAgB,iBAAiB,CAAC,EAAE,WAAW,EAAE,EAAE;IAAE,WAAW,EAAE,aAAa,CAAA;CAAE,+BAYhF;AAED,MAAM,WAAW,wBAAwB;IACrC,yEAAyE;IACzE,WAAW,EAAE,aAAa,GAAG,IAAI,CAAA;IACjC,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAA;CACxC;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,EAAE,WAAW,EAAE,YAAY,EAAE,EAAE,wBAAwB,sCAoD1F"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
// requiresAddon — an action that depends on an OPTIONAL addon the org has not
|
|
3
|
+
// installed yet (e.g. link_inbox "Conectar WhatsApp" needs connector_whatsapp).
|
|
4
|
+
//
|
|
5
|
+
// The manifest declares `compatibility.requires[].enables: ["action:<Model>.<key>"]`
|
|
6
|
+
// and the host stamps each affected action's metadata, only while the required
|
|
7
|
+
// addon is missing:
|
|
8
|
+
//
|
|
9
|
+
// "requires_addon": { "key": "connector_whatsapp", "name": "Conector WhatsApp", "reason": "…" }
|
|
10
|
+
//
|
|
11
|
+
// The action is NOT hidden (the user should discover the feature) and NOT
|
|
12
|
+
// executed: row menus / kanban cards / the model toolbar render it with a lock
|
|
13
|
+
// and a tooltip, and a click opens <RequiresAddonDialog> instead of the action
|
|
14
|
+
// dispatcher. "Instalar" delegates to the host (setAddonInstallHandler) or, when
|
|
15
|
+
// none is registered, navigates to `/marketplace/<key>` through the SDK router so
|
|
16
|
+
// the host basepath (ops lives under /app) is respected.
|
|
17
|
+
import { useNavigate } from '@tanstack/react-router';
|
|
18
|
+
import { useTranslation } from 'react-i18next';
|
|
19
|
+
import { Lock } from 'lucide-react';
|
|
20
|
+
import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, } from '@asteby/metacore-ui/primitives';
|
|
21
|
+
/**
|
|
22
|
+
* Reads the addon requirement off an action, tolerating both the camelCase
|
|
23
|
+
* `requiresAddon` and the snake_case `requires_addon` the host serves. Returns
|
|
24
|
+
* null when the action is freely executable (no requirement, or a malformed one
|
|
25
|
+
* without a `key` — degrade to "runs", never to "locked forever").
|
|
26
|
+
*/
|
|
27
|
+
export function resolveRequiresAddon(action) {
|
|
28
|
+
const raw = action?.requiresAddon ?? action?.requires_addon;
|
|
29
|
+
if (!raw || typeof raw !== 'object')
|
|
30
|
+
return null;
|
|
31
|
+
const key = typeof raw.key === 'string' ? raw.key.trim() : '';
|
|
32
|
+
if (!key)
|
|
33
|
+
return null;
|
|
34
|
+
const out = { key };
|
|
35
|
+
if (typeof raw.name === 'string' && raw.name)
|
|
36
|
+
out.name = raw.name;
|
|
37
|
+
if (typeof raw.reason === 'string' && raw.reason)
|
|
38
|
+
out.reason = raw.reason;
|
|
39
|
+
return out;
|
|
40
|
+
}
|
|
41
|
+
let installHandler = null;
|
|
42
|
+
/**
|
|
43
|
+
* Registers the host's "install this addon" flow (e.g. open the marketplace
|
|
44
|
+
* install drawer). Pass `null` to unregister. Without a handler the SDK
|
|
45
|
+
* navigates to `/marketplace/<key>` via the router.
|
|
46
|
+
*/
|
|
47
|
+
export function setAddonInstallHandler(fn) {
|
|
48
|
+
installHandler = fn;
|
|
49
|
+
}
|
|
50
|
+
/** Current host install handler, or null when none is registered. */
|
|
51
|
+
export function getAddonInstallHandler() {
|
|
52
|
+
return installHandler;
|
|
53
|
+
}
|
|
54
|
+
/** Display name for a requirement: the host-provided name, else the key. */
|
|
55
|
+
export function requiresAddonName(req) {
|
|
56
|
+
return req.name || req.key;
|
|
57
|
+
}
|
|
58
|
+
/** Tooltip text for a gated action: "Requiere «<name>»". */
|
|
59
|
+
export function useRequiresAddonLabel() {
|
|
60
|
+
const { t } = useTranslation();
|
|
61
|
+
return (req) => t('dynamic.requires_addon_badge', {
|
|
62
|
+
defaultValue: 'Requiere «{{name}}»',
|
|
63
|
+
name: requiresAddonName(req),
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
/** Lock marker rendered next to a gated action's label (hover = addon name). */
|
|
67
|
+
export function RequiresAddonLock({ requirement }) {
|
|
68
|
+
const label = useRequiresAddonLabel()(requirement);
|
|
69
|
+
return (_jsx("span", { className: "ml-auto inline-flex shrink-0 items-center pl-2 text-muted-foreground", title: label, "aria-label": label, "data-requires-addon": requirement.key, children: _jsx(Lock, { className: "h-3.5 w-3.5" }) }));
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Compact "this action requires <addon>" dialog. Never touches the backend:
|
|
73
|
+
* "Instalar" hands the key to the host handler or routes to the marketplace.
|
|
74
|
+
*/
|
|
75
|
+
export function RequiresAddonDialog({ requirement, onOpenChange }) {
|
|
76
|
+
const { t } = useTranslation();
|
|
77
|
+
const navigate = useNavigate();
|
|
78
|
+
if (!requirement)
|
|
79
|
+
return null;
|
|
80
|
+
const name = requiresAddonName(requirement);
|
|
81
|
+
const install = () => {
|
|
82
|
+
onOpenChange(false);
|
|
83
|
+
const handler = installHandler;
|
|
84
|
+
if (handler)
|
|
85
|
+
handler(requirement.key);
|
|
86
|
+
else
|
|
87
|
+
navigate({ to: `/marketplace/${encodeURIComponent(requirement.key)}` });
|
|
88
|
+
};
|
|
89
|
+
return (_jsx(AlertDialog, { open: true, onOpenChange: onOpenChange, children: _jsxs(AlertDialogContent, { className: "sm:max-w-md", children: [_jsxs(AlertDialogHeader, { children: [_jsxs(AlertDialogTitle, { className: "flex items-center gap-2", children: [_jsx(Lock, { className: "h-4 w-4 shrink-0 text-muted-foreground" }), t('dynamic.requires_addon_title', {
|
|
90
|
+
defaultValue: 'Esta acción requiere «{{name}}»',
|
|
91
|
+
name,
|
|
92
|
+
})] }), _jsx(AlertDialogDescription, { children: requirement.reason
|
|
93
|
+
? t(requirement.reason, { defaultValue: requirement.reason })
|
|
94
|
+
: t('dynamic.requires_addon_description', {
|
|
95
|
+
defaultValue: 'Instala «{{name}}» para habilitar esta acción.',
|
|
96
|
+
name,
|
|
97
|
+
}) })] }), _jsxs(AlertDialogFooter, { children: [_jsx(AlertDialogCancel, { children: t('dynamic.requires_addon_cancel', { defaultValue: 'Cancelar' }) }), _jsx(AlertDialogAction, { onClick: (e) => {
|
|
98
|
+
e.preventDefault();
|
|
99
|
+
install();
|
|
100
|
+
}, children: t('dynamic.requires_addon_install', {
|
|
101
|
+
defaultValue: 'Instalar «{{name}}»',
|
|
102
|
+
name,
|
|
103
|
+
}) })] })] }) }));
|
|
104
|
+
}
|
package/dist/types.d.ts
CHANGED
|
@@ -597,6 +597,15 @@ export interface FieldOptionsConfig {
|
|
|
597
597
|
/** Optional column projected into `option.image`. */
|
|
598
598
|
image?: string;
|
|
599
599
|
}
|
|
600
|
+
/** An optional addon an action needs before it can run. */
|
|
601
|
+
export interface RequiresAddon {
|
|
602
|
+
/** Addon key, e.g. "connector_whatsapp". */
|
|
603
|
+
key: string;
|
|
604
|
+
/** Localized display name, e.g. "Conector WhatsApp". Falls back to `key`. */
|
|
605
|
+
name?: string;
|
|
606
|
+
/** Why the action needs it (literal or i18n key). */
|
|
607
|
+
reason?: string;
|
|
608
|
+
}
|
|
600
609
|
export interface ActionDefinition {
|
|
601
610
|
key: string;
|
|
602
611
|
name: string;
|
|
@@ -623,6 +632,13 @@ export interface ActionDefinition {
|
|
|
623
632
|
* "create" — toolbar button that replaces the generic create button.
|
|
624
633
|
*/
|
|
625
634
|
placement?: 'row' | 'table' | 'create';
|
|
635
|
+
/**
|
|
636
|
+
* Optional addon this action depends on, stamped by the host only while it
|
|
637
|
+
* is NOT installed (served as `requires_addon`; read through
|
|
638
|
+
* resolveRequiresAddon). The action stays visible but locked: a click opens
|
|
639
|
+
* the "requires addon" dialog instead of executing.
|
|
640
|
+
*/
|
|
641
|
+
requiresAddon?: RequiresAddon;
|
|
626
642
|
}
|
|
627
643
|
export interface ApiResponse<T> {
|
|
628
644
|
success: boolean;
|
|
@@ -660,5 +676,12 @@ export interface ActionMetadata {
|
|
|
660
676
|
/** Federated modal slug "<addon_key>.<action_key>"; see ActionModalDispatcher. */
|
|
661
677
|
modal?: string;
|
|
662
678
|
placement?: 'row' | 'table' | 'create';
|
|
679
|
+
/**
|
|
680
|
+
* Optional addon this action depends on, stamped by the host only while it
|
|
681
|
+
* is NOT installed (served as `requires_addon`; read through
|
|
682
|
+
* resolveRequiresAddon). The action stays visible but locked: a click opens
|
|
683
|
+
* the "requires addon" dialog instead of executing.
|
|
684
|
+
*/
|
|
685
|
+
requiresAddon?: RequiresAddon;
|
|
663
686
|
}
|
|
664
687
|
//# sourceMappingURL=types.d.ts.map
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@asteby/metacore-runtime-react",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "45.0.0",
|
|
4
4
|
"description": "React runtime for metacore hosts — renders addon contributions dynamically",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
"zod": "^4.3.0"
|
|
27
27
|
},
|
|
28
28
|
"peerDependencies": {
|
|
29
|
-
"@asteby/metacore-sdk": "^3.
|
|
29
|
+
"@asteby/metacore-sdk": "^3.11.0",
|
|
30
30
|
"@asteby/metacore-ui": "^2.23.0",
|
|
31
31
|
"@tanstack/react-query": ">=5",
|
|
32
32
|
"@tanstack/react-router": ">=1.100",
|
|
@@ -50,7 +50,7 @@
|
|
|
50
50
|
}
|
|
51
51
|
},
|
|
52
52
|
"devDependencies": {
|
|
53
|
-
"@asteby/metacore-sdk": "3.
|
|
53
|
+
"@asteby/metacore-sdk": "3.11.0",
|
|
54
54
|
"@asteby/metacore-ui": "2.23.0",
|
|
55
55
|
"@tanstack/react-query": "^5.95.0",
|
|
56
56
|
"@tanstack/react-router": "^1.168.0",
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
// @vitest-environment happy-dom
|
|
2
|
+
//
|
|
3
|
+
// requiresAddon: an action gated by a missing optional addon stays visible but
|
|
4
|
+
// locked. A click must NOT reach the dispatcher / federated modal / backend; it
|
|
5
|
+
// opens the "requires addon" dialog whose "Instalar" hands the key to the host
|
|
6
|
+
// handler, or routes to /marketplace/<key> through the SDK router.
|
|
7
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
|
|
8
|
+
import { act, cleanup, fireEvent, render, renderHook, screen } from '@testing-library/react'
|
|
9
|
+
|
|
10
|
+
const I18N_T = (_k: string, opts?: { defaultValue?: string; [k: string]: unknown }) =>
|
|
11
|
+
(opts?.defaultValue ?? _k).replace(/\{\{(\w+)\}\}/g, (_: string, v: string) => String(opts?.[v] ?? ''))
|
|
12
|
+
const USE_TRANSLATION = { t: I18N_T, i18n: { language: 'es' } }
|
|
13
|
+
vi.mock('react-i18next', () => ({
|
|
14
|
+
useTranslation: () => USE_TRANSLATION,
|
|
15
|
+
}))
|
|
16
|
+
|
|
17
|
+
const navigate = vi.fn()
|
|
18
|
+
vi.mock('@tanstack/react-router', () => ({
|
|
19
|
+
useNavigate: () => navigate,
|
|
20
|
+
}))
|
|
21
|
+
|
|
22
|
+
// The dispatcher must never mount for a gated action.
|
|
23
|
+
const dispatcherSpy = vi.fn()
|
|
24
|
+
vi.mock('../action-modal-dispatcher', () => ({
|
|
25
|
+
ActionModalDispatcher: (props: unknown) => {
|
|
26
|
+
dispatcherSpy(props)
|
|
27
|
+
return <div data-testid="dispatcher" />
|
|
28
|
+
},
|
|
29
|
+
}))
|
|
30
|
+
|
|
31
|
+
import { useDynamicRowActions } from '../dynamic-row-actions'
|
|
32
|
+
import { ModelActionToolbar } from '../model-action-toolbar'
|
|
33
|
+
import { RowActionMenuItem } from '../dynamic-columns'
|
|
34
|
+
import { ApiProvider } from '../api-context'
|
|
35
|
+
import { resolveRequiresAddon, setAddonInstallHandler } from '../requires-addon'
|
|
36
|
+
import type { ActionDefinition, TableMetadata } from '../types'
|
|
37
|
+
import { DropdownMenu, DropdownMenuContent } from '@asteby/metacore-ui/primitives'
|
|
38
|
+
|
|
39
|
+
const post = vi.fn(async () => ({ data: { success: true } }))
|
|
40
|
+
const api = {
|
|
41
|
+
get: async () => ({ data: { data: {} } }),
|
|
42
|
+
post,
|
|
43
|
+
put: async () => ({ data: { success: true } }),
|
|
44
|
+
delete: async () => ({ data: { success: true } }),
|
|
45
|
+
} as never
|
|
46
|
+
|
|
47
|
+
const WIRE_REQUIREMENT = {
|
|
48
|
+
key: 'connector_whatsapp',
|
|
49
|
+
name: 'Conector WhatsApp',
|
|
50
|
+
reason: 'Necesitas el conector para vincular un número.',
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// Exactly as ops serves it: snake_case, plus a federated modal + executable so
|
|
54
|
+
// that, without the gate, the click would open the dispatcher.
|
|
55
|
+
const gatedRowAction = {
|
|
56
|
+
key: 'connect_device',
|
|
57
|
+
name: 'connect_device',
|
|
58
|
+
label: 'Conectar WhatsApp',
|
|
59
|
+
icon: 'QrCode',
|
|
60
|
+
class: '',
|
|
61
|
+
type: 'custom',
|
|
62
|
+
modal: 'link_inbox.connect_device',
|
|
63
|
+
executable: true,
|
|
64
|
+
requires_addon: WIRE_REQUIREMENT,
|
|
65
|
+
} as unknown as ActionDefinition
|
|
66
|
+
|
|
67
|
+
const metadata = { title: 'Devices', actions: [gatedRowAction] } as unknown as TableMetadata
|
|
68
|
+
|
|
69
|
+
function Wrapper({ children }: { children: React.ReactNode }) {
|
|
70
|
+
return <ApiProvider client={api}>{children}</ApiProvider>
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
beforeEach(() => {
|
|
74
|
+
post.mockClear()
|
|
75
|
+
navigate.mockClear()
|
|
76
|
+
dispatcherSpy.mockClear()
|
|
77
|
+
setAddonInstallHandler(null)
|
|
78
|
+
})
|
|
79
|
+
afterEach(cleanup)
|
|
80
|
+
|
|
81
|
+
describe('resolveRequiresAddon', () => {
|
|
82
|
+
it('normalizes the snake_case requires_addon served by the host', () => {
|
|
83
|
+
expect(resolveRequiresAddon({ requires_addon: WIRE_REQUIREMENT })).toEqual(WIRE_REQUIREMENT)
|
|
84
|
+
})
|
|
85
|
+
it('reads camelCase requiresAddon', () => {
|
|
86
|
+
expect(resolveRequiresAddon({ requiresAddon: { key: 'x' } })).toEqual({ key: 'x' })
|
|
87
|
+
})
|
|
88
|
+
it('treats absent / keyless requirements as runnable', () => {
|
|
89
|
+
expect(resolveRequiresAddon({ key: 'a' })).toBeNull()
|
|
90
|
+
expect(resolveRequiresAddon({ requires_addon: { name: 'Sin key' } })).toBeNull()
|
|
91
|
+
expect(resolveRequiresAddon(undefined)).toBeNull()
|
|
92
|
+
})
|
|
93
|
+
})
|
|
94
|
+
|
|
95
|
+
function RowHarness() {
|
|
96
|
+
const { handleInternalAction, dialogs } = useDynamicRowActions({
|
|
97
|
+
model: 'Device',
|
|
98
|
+
metadata,
|
|
99
|
+
onRefresh: () => {},
|
|
100
|
+
})
|
|
101
|
+
return (
|
|
102
|
+
<>
|
|
103
|
+
<button onClick={() => handleInternalAction('connect_device', { id: 'r1' })}>run</button>
|
|
104
|
+
{dialogs}
|
|
105
|
+
</>
|
|
106
|
+
)
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
describe('row actions (table / kanban shared handler)', () => {
|
|
110
|
+
it('does not dispatch nor post; opens the requires-addon dialog', async () => {
|
|
111
|
+
const onAction = vi.fn()
|
|
112
|
+
const { result } = renderHook(
|
|
113
|
+
() => useDynamicRowActions({ model: 'Device', metadata, onAction, onRefresh: () => {} }),
|
|
114
|
+
{ wrapper: Wrapper },
|
|
115
|
+
)
|
|
116
|
+
await act(() => result.current.handleInternalAction('connect_device', { id: 'r1' }))
|
|
117
|
+
expect(onAction).not.toHaveBeenCalled()
|
|
118
|
+
|
|
119
|
+
render(<RowHarness />, { wrapper: Wrapper })
|
|
120
|
+
await act(async () => fireEvent.click(screen.getByText('run')))
|
|
121
|
+
|
|
122
|
+
expect(screen.getByText('Esta acción requiere «Conector WhatsApp»')).toBeTruthy()
|
|
123
|
+
expect(screen.getByText(WIRE_REQUIREMENT.reason)).toBeTruthy()
|
|
124
|
+
expect(screen.queryByTestId('dispatcher')).toBeNull()
|
|
125
|
+
expect(dispatcherSpy).not.toHaveBeenCalled()
|
|
126
|
+
expect(post).not.toHaveBeenCalled()
|
|
127
|
+
})
|
|
128
|
+
|
|
129
|
+
it('Instalar invokes the host handler with the addon key', async () => {
|
|
130
|
+
const handler = vi.fn()
|
|
131
|
+
setAddonInstallHandler(handler)
|
|
132
|
+
render(<RowHarness />, { wrapper: Wrapper })
|
|
133
|
+
await act(async () => fireEvent.click(screen.getByText('run')))
|
|
134
|
+
await act(async () => fireEvent.click(screen.getByText('Instalar «Conector WhatsApp»')))
|
|
135
|
+
expect(handler).toHaveBeenCalledWith('connector_whatsapp')
|
|
136
|
+
expect(navigate).not.toHaveBeenCalled()
|
|
137
|
+
})
|
|
138
|
+
|
|
139
|
+
it('without a handler navigates through the router to /marketplace/<key>', async () => {
|
|
140
|
+
render(<RowHarness />, { wrapper: Wrapper })
|
|
141
|
+
await act(async () => fireEvent.click(screen.getByText('run')))
|
|
142
|
+
await act(async () => fireEvent.click(screen.getByText('Instalar «Conector WhatsApp»')))
|
|
143
|
+
expect(navigate).toHaveBeenCalledWith({ to: '/marketplace/connector_whatsapp' })
|
|
144
|
+
})
|
|
145
|
+
|
|
146
|
+
it('menu entry stays visible with a lock and the addon name as tooltip', () => {
|
|
147
|
+
render(
|
|
148
|
+
<DropdownMenu open>
|
|
149
|
+
<DropdownMenuContent>
|
|
150
|
+
<RowActionMenuItem action={gatedRowAction} label="Conectar WhatsApp" onSelect={() => {}} />
|
|
151
|
+
</DropdownMenuContent>
|
|
152
|
+
</DropdownMenu>,
|
|
153
|
+
)
|
|
154
|
+
const item = screen.getByText('Conectar WhatsApp').closest('[data-requires-addon]')
|
|
155
|
+
expect(item?.getAttribute('data-requires-addon')).toBe('connector_whatsapp')
|
|
156
|
+
expect(item?.getAttribute('title')).toBe('Requiere «Conector WhatsApp»')
|
|
157
|
+
})
|
|
158
|
+
})
|
|
159
|
+
|
|
160
|
+
describe('ModelActionToolbar', () => {
|
|
161
|
+
const toolbarAction = {
|
|
162
|
+
...gatedRowAction,
|
|
163
|
+
placement: 'table',
|
|
164
|
+
requires_addon: undefined,
|
|
165
|
+
requiresAddon: { key: 'connector_whatsapp', name: 'Conector WhatsApp' },
|
|
166
|
+
} as unknown as ActionDefinition
|
|
167
|
+
|
|
168
|
+
it('renders the action locked and opens the dialog instead of the dispatcher', async () => {
|
|
169
|
+
const intent = vi.fn()
|
|
170
|
+
render(
|
|
171
|
+
<Wrapper>
|
|
172
|
+
<ModelActionToolbar model="Device" actions={[toolbarAction]} onActionIntent={intent} />
|
|
173
|
+
</Wrapper>,
|
|
174
|
+
)
|
|
175
|
+
const button = screen.getByText('Conectar WhatsApp').closest('button')!
|
|
176
|
+
expect(button.getAttribute('title')).toBe('Requiere «Conector WhatsApp»')
|
|
177
|
+
expect(button.querySelector('[data-requires-addon="connector_whatsapp"]')).toBeTruthy()
|
|
178
|
+
|
|
179
|
+
await act(async () => fireEvent.click(button))
|
|
180
|
+
expect(screen.getByText('Esta acción requiere «Conector WhatsApp»')).toBeTruthy()
|
|
181
|
+
// No reason from the host → generic copy.
|
|
182
|
+
expect(screen.getByText('Instala «Conector WhatsApp» para habilitar esta acción.')).toBeTruthy()
|
|
183
|
+
expect(dispatcherSpy).not.toHaveBeenCalled()
|
|
184
|
+
expect(intent).not.toHaveBeenCalled()
|
|
185
|
+
expect(post).not.toHaveBeenCalled()
|
|
186
|
+
|
|
187
|
+
await act(async () => fireEvent.click(screen.getByText('Instalar «Conector WhatsApp»')))
|
|
188
|
+
expect(navigate).toHaveBeenCalledWith({ to: '/marketplace/connector_whatsapp' })
|
|
189
|
+
})
|
|
190
|
+
|
|
191
|
+
it('an ungated action still opens the dispatcher', async () => {
|
|
192
|
+
const plain = { ...toolbarAction, key: 'other', label: 'Otra', requiresAddon: undefined } as ActionDefinition
|
|
193
|
+
render(
|
|
194
|
+
<Wrapper>
|
|
195
|
+
<ModelActionToolbar model="Device" actions={[plain]} />
|
|
196
|
+
</Wrapper>,
|
|
197
|
+
)
|
|
198
|
+
await act(async () => fireEvent.click(screen.getByText('Otra')))
|
|
199
|
+
expect(dispatcherSpy).toHaveBeenCalled()
|
|
200
|
+
})
|
|
201
|
+
})
|
package/src/dynamic-columns.tsx
CHANGED
|
@@ -57,6 +57,7 @@ import { DynamicIcon, isLucideIconName } from './dynamic-icon'
|
|
|
57
57
|
import { CollectionCell } from './collection-cell'
|
|
58
58
|
import { isNilUuid, normalizeNilUuid } from './nil-uuid'
|
|
59
59
|
import { useOptionsResolver } from './use-options-resolver'
|
|
60
|
+
import { RequiresAddonLock, resolveRequiresAddon, useRequiresAddonLabel } from './requires-addon'
|
|
60
61
|
import type { TableMetadata, ColumnDefinition } from './types'
|
|
61
62
|
import { isColumnVisibleInTable } from './column-visibility'
|
|
62
63
|
import type {
|
|
@@ -207,6 +208,36 @@ const CodeCell: React.FC<{ text: string; maxLength?: number }> = ({ text, maxLen
|
|
|
207
208
|
)
|
|
208
209
|
}
|
|
209
210
|
|
|
211
|
+
/**
|
|
212
|
+
* One entry of the row "…" menu. An action gated by a missing optional addon
|
|
213
|
+
* (`requiresAddon`) stays listed with a lock + tooltip; the click still goes to
|
|
214
|
+
* `onAction`, whose shared handler (useDynamicRowActions) opens the
|
|
215
|
+
* requires-addon dialog instead of executing.
|
|
216
|
+
*/
|
|
217
|
+
export function RowActionMenuItem({
|
|
218
|
+
action,
|
|
219
|
+
label,
|
|
220
|
+
onSelect,
|
|
221
|
+
}: {
|
|
222
|
+
action: any
|
|
223
|
+
label: React.ReactNode
|
|
224
|
+
onSelect: (e: React.MouseEvent) => void
|
|
225
|
+
}) {
|
|
226
|
+
const requirement = resolveRequiresAddon(action)
|
|
227
|
+
const requiresAddonLabel = useRequiresAddonLabel()
|
|
228
|
+
return (
|
|
229
|
+
<DropdownMenuItem
|
|
230
|
+
onClick={onSelect}
|
|
231
|
+
title={requirement ? requiresAddonLabel(requirement) : undefined}
|
|
232
|
+
data-requires-addon={requirement?.key}
|
|
233
|
+
>
|
|
234
|
+
<DynamicIcon name={action.icon || 'Zap'} className="mr-2 h-4 w-4" />
|
|
235
|
+
{label}
|
|
236
|
+
{requirement && <RequiresAddonLock requirement={requirement} />}
|
|
237
|
+
</DropdownMenuItem>
|
|
238
|
+
)
|
|
239
|
+
}
|
|
240
|
+
|
|
210
241
|
/**
|
|
211
242
|
* Lifecycle column used by `requiresState`: prefer `status` (workshop, vehicles,
|
|
212
243
|
* …) and fall back to `state` (purchases, inventory transfers, …). Empty string
|
|
@@ -1528,13 +1559,12 @@ export function makeDefaultGetDynamicColumns(
|
|
|
1528
1559
|
{resolvedActions
|
|
1529
1560
|
.filter((action) => isRowActionVisible(action, row.original))
|
|
1530
1561
|
.map((action) => (
|
|
1531
|
-
<
|
|
1562
|
+
<RowActionMenuItem
|
|
1532
1563
|
key={action.key}
|
|
1533
|
-
|
|
1534
|
-
|
|
1535
|
-
|
|
1536
|
-
|
|
1537
|
-
</DropdownMenuItem>
|
|
1564
|
+
action={action}
|
|
1565
|
+
label={translateMetadataLabel(action.label, t)}
|
|
1566
|
+
onSelect={() => onAction && onAction(action.key, row.original)}
|
|
1567
|
+
/>
|
|
1538
1568
|
))}
|
|
1539
1569
|
</DropdownMenuContent>
|
|
1540
1570
|
</DropdownMenu>
|
package/src/dynamic-kanban.tsx
CHANGED
|
@@ -96,7 +96,6 @@ import {
|
|
|
96
96
|
CardContent,
|
|
97
97
|
DropdownMenu,
|
|
98
98
|
DropdownMenuContent,
|
|
99
|
-
DropdownMenuItem,
|
|
100
99
|
DropdownMenuTrigger,
|
|
101
100
|
Input,
|
|
102
101
|
Popover,
|
|
@@ -161,6 +160,7 @@ import {
|
|
|
161
160
|
formatAggregateTotal,
|
|
162
161
|
isRowActionVisible,
|
|
163
162
|
relationKeyFor,
|
|
163
|
+
RowActionMenuItem,
|
|
164
164
|
} from './dynamic-columns'
|
|
165
165
|
import { useCan, usePermissionsActive, resolveRowActions } from './permissions-context'
|
|
166
166
|
import { useDynamicRowActions } from './dynamic-row-actions'
|
|
@@ -3113,16 +3113,15 @@ function KanbanCard({
|
|
|
3113
3113
|
</DropdownMenuTrigger>
|
|
3114
3114
|
<DropdownMenuContent align="end" onClick={(e) => e.stopPropagation()}>
|
|
3115
3115
|
{visibleActions.map((a) => (
|
|
3116
|
-
<
|
|
3116
|
+
<RowActionMenuItem
|
|
3117
3117
|
key={a.key}
|
|
3118
|
-
|
|
3118
|
+
action={a}
|
|
3119
|
+
label={a.label}
|
|
3120
|
+
onSelect={(e) => {
|
|
3119
3121
|
e.stopPropagation()
|
|
3120
3122
|
onAction(a.key, card)
|
|
3121
3123
|
}}
|
|
3122
|
-
|
|
3123
|
-
<DynamicIcon name={a.icon || 'Zap'} className="mr-2 h-4 w-4" />
|
|
3124
|
-
{a.label}
|
|
3125
|
-
</DropdownMenuItem>
|
|
3124
|
+
/>
|
|
3126
3125
|
))}
|
|
3127
3126
|
</DropdownMenuContent>
|
|
3128
3127
|
</DropdownMenu>
|
|
@@ -11,6 +11,8 @@
|
|
|
11
11
|
// view / edit → host `onAction(action, row)` when provided (string
|
|
12
12
|
// contract), else the built-in record dialog.
|
|
13
13
|
// link action → navigate to the action's templated `linkUrl`.
|
|
14
|
+
// requiresAddon → opens the "requires addon" dialog; the action is
|
|
15
|
+
// never dispatched (no modal, no backend call).
|
|
14
16
|
// custom (modal/fields/
|
|
15
17
|
// confirm/executable) → opens the ActionModal via the dispatcher.
|
|
16
18
|
// anything else → host `onAction` + refresh (or just refresh).
|
|
@@ -34,7 +36,8 @@ import {
|
|
|
34
36
|
import { useApi } from './api-context'
|
|
35
37
|
import { ActionModalDispatcher } from './action-modal-dispatcher'
|
|
36
38
|
import { DynamicRecordDialog } from './dialogs/dynamic-record'
|
|
37
|
-
import
|
|
39
|
+
import { RequiresAddonDialog, resolveRequiresAddon } from './requires-addon'
|
|
40
|
+
import type { TableMetadata, ActionMetadata, RequiresAddon } from './types'
|
|
38
41
|
|
|
39
42
|
export interface UseDynamicRowActionsParams {
|
|
40
43
|
/** Model key as registered on the backend (e.g. "issue"). */
|
|
@@ -106,7 +109,13 @@ export function useDynamicRowActions({
|
|
|
106
109
|
record: any | null
|
|
107
110
|
}>({ open: false, action: null, record: null })
|
|
108
111
|
|
|
112
|
+
const [missingAddon, setMissingAddon] = useState<RequiresAddon | null>(null)
|
|
113
|
+
|
|
109
114
|
const handleInternalAction = useCallback(async (action: string, row: any) => {
|
|
115
|
+
// A missing optional addon gates the action BEFORE any other routing:
|
|
116
|
+
// it must not reach the dispatcher, the host, or the backend.
|
|
117
|
+
const requirement = resolveRequiresAddon(metadata?.actions?.find((a) => a.key === action))
|
|
118
|
+
if (requirement) { setMissingAddon(requirement); return }
|
|
110
119
|
if (action === 'delete') { setRowToDelete(row); return }
|
|
111
120
|
if (action === 'view' || action === 'edit') {
|
|
112
121
|
if (onAction) await Promise.resolve(onAction(action, row))
|
|
@@ -200,6 +209,11 @@ export function useDynamicRowActions({
|
|
|
200
209
|
onSuccess={onRefresh}
|
|
201
210
|
/>
|
|
202
211
|
)}
|
|
212
|
+
|
|
213
|
+
<RequiresAddonDialog
|
|
214
|
+
requirement={missingAddon}
|
|
215
|
+
onOpenChange={(open: boolean) => !open && setMissingAddon(null)}
|
|
216
|
+
/>
|
|
203
217
|
</>
|
|
204
218
|
)
|
|
205
219
|
|
package/src/index.ts
CHANGED
|
@@ -223,6 +223,17 @@ export {
|
|
|
223
223
|
type UseDynamicRowActionsParams,
|
|
224
224
|
type DynamicRowActions,
|
|
225
225
|
} from './dynamic-row-actions'
|
|
226
|
+
export {
|
|
227
|
+
resolveRequiresAddon,
|
|
228
|
+
setAddonInstallHandler,
|
|
229
|
+
getAddonInstallHandler,
|
|
230
|
+
requiresAddonName,
|
|
231
|
+
useRequiresAddonLabel,
|
|
232
|
+
RequiresAddonLock,
|
|
233
|
+
RequiresAddonDialog,
|
|
234
|
+
type RequiresAddon,
|
|
235
|
+
type RequiresAddonDialogProps,
|
|
236
|
+
} from './requires-addon'
|
|
226
237
|
export { ColorPickerField, DEFAULT_ROLE_COLOR, normalizeHex } from './color-picker-field'
|
|
227
238
|
export {
|
|
228
239
|
PermissionsManager,
|
|
@@ -25,7 +25,13 @@ import { useMetadataCache } from './metadata-cache'
|
|
|
25
25
|
import { DynamicIcon } from './dynamic-icon'
|
|
26
26
|
import { ActionModalDispatcher } from './action-modal-dispatcher'
|
|
27
27
|
import { useCan, modelCapability } from './permissions-context'
|
|
28
|
-
import
|
|
28
|
+
import {
|
|
29
|
+
RequiresAddonDialog,
|
|
30
|
+
RequiresAddonLock,
|
|
31
|
+
resolveRequiresAddon,
|
|
32
|
+
useRequiresAddonLabel,
|
|
33
|
+
} from './requires-addon'
|
|
34
|
+
import type { ActionDefinition, ActionMetadata, RequiresAddon, TableMetadata } from './types'
|
|
29
35
|
|
|
30
36
|
export type ActionPlacement = 'row' | 'table' | 'create'
|
|
31
37
|
|
|
@@ -144,6 +150,8 @@ export function ModelActionToolbar({
|
|
|
144
150
|
[all, can, model],
|
|
145
151
|
)
|
|
146
152
|
const [active, setActive] = useState<ActionMetadata | null>(null)
|
|
153
|
+
const [missingAddon, setMissingAddon] = useState<RequiresAddon | null>(null)
|
|
154
|
+
const requiresAddonLabel = useRequiresAddonLabel()
|
|
147
155
|
const dataEndpoint = endpoint ?? `/data/${model}/me`
|
|
148
156
|
|
|
149
157
|
if (surfaced.length === 0) return null
|
|
@@ -153,6 +161,9 @@ export function ModelActionToolbar({
|
|
|
153
161
|
<div className={className ?? 'flex items-center gap-2'}>
|
|
154
162
|
{surfaced.map((a) => {
|
|
155
163
|
const isCreate = (a.placement ?? 'row') === 'create'
|
|
164
|
+
// Locked while its optional addon is missing: still shown,
|
|
165
|
+
// but a click explains + offers install instead of running.
|
|
166
|
+
const requirement = resolveRequiresAddon(a)
|
|
156
167
|
return (
|
|
157
168
|
<Button
|
|
158
169
|
key={a.key}
|
|
@@ -162,12 +173,18 @@ export function ModelActionToolbar({
|
|
|
162
173
|
? `model.${model}.create`
|
|
163
174
|
: `model.${model}.action.${a.key}`
|
|
164
175
|
}
|
|
176
|
+
data-requires-addon={requirement?.key}
|
|
177
|
+
title={requirement ? requiresAddonLabel(requirement) : undefined}
|
|
165
178
|
onClick={() => {
|
|
179
|
+
if (requirement) {
|
|
180
|
+
setMissingAddon(requirement)
|
|
181
|
+
return
|
|
182
|
+
}
|
|
166
183
|
onActionIntent?.(a)
|
|
167
184
|
setActive(toActionMetadata(a))
|
|
168
185
|
}}
|
|
169
|
-
onMouseEnter={() => onActionIntent?.(a)}
|
|
170
|
-
onFocus={() => onActionIntent?.(a)}
|
|
186
|
+
onMouseEnter={() => !requirement && onActionIntent?.(a)}
|
|
187
|
+
onFocus={() => !requirement && onActionIntent?.(a)}
|
|
171
188
|
style={a.color && !isCreate ? { borderColor: a.color, color: a.color } : undefined}
|
|
172
189
|
>
|
|
173
190
|
<DynamicIcon name={a.icon || (isCreate ? 'Plus' : 'Zap')} className="mr-2 h-4 w-4" />
|
|
@@ -179,6 +196,7 @@ export function ModelActionToolbar({
|
|
|
179
196
|
already-localized label untouched; humanizeLastSegment avoids
|
|
180
197
|
flashing the full dotted key when the bundle is still in flight. */}
|
|
181
198
|
{t(a.label, { defaultValue: humanizeActionLabel(a.label) })}
|
|
199
|
+
{requirement && <RequiresAddonLock requirement={requirement} />}
|
|
182
200
|
</Button>
|
|
183
201
|
)
|
|
184
202
|
})}
|
|
@@ -200,6 +218,13 @@ export function ModelActionToolbar({
|
|
|
200
218
|
}}
|
|
201
219
|
/>
|
|
202
220
|
)}
|
|
221
|
+
|
|
222
|
+
<RequiresAddonDialog
|
|
223
|
+
requirement={missingAddon}
|
|
224
|
+
onOpenChange={(open) => {
|
|
225
|
+
if (!open) setMissingAddon(null)
|
|
226
|
+
}}
|
|
227
|
+
/>
|
|
203
228
|
</>
|
|
204
229
|
)
|
|
205
230
|
}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
// requiresAddon — an action that depends on an OPTIONAL addon the org has not
|
|
2
|
+
// installed yet (e.g. link_inbox "Conectar WhatsApp" needs connector_whatsapp).
|
|
3
|
+
//
|
|
4
|
+
// The manifest declares `compatibility.requires[].enables: ["action:<Model>.<key>"]`
|
|
5
|
+
// and the host stamps each affected action's metadata, only while the required
|
|
6
|
+
// addon is missing:
|
|
7
|
+
//
|
|
8
|
+
// "requires_addon": { "key": "connector_whatsapp", "name": "Conector WhatsApp", "reason": "…" }
|
|
9
|
+
//
|
|
10
|
+
// The action is NOT hidden (the user should discover the feature) and NOT
|
|
11
|
+
// executed: row menus / kanban cards / the model toolbar render it with a lock
|
|
12
|
+
// and a tooltip, and a click opens <RequiresAddonDialog> instead of the action
|
|
13
|
+
// dispatcher. "Instalar" delegates to the host (setAddonInstallHandler) or, when
|
|
14
|
+
// none is registered, navigates to `/marketplace/<key>` through the SDK router so
|
|
15
|
+
// the host basepath (ops lives under /app) is respected.
|
|
16
|
+
import { useNavigate } from '@tanstack/react-router'
|
|
17
|
+
import { useTranslation } from 'react-i18next'
|
|
18
|
+
import { Lock } from 'lucide-react'
|
|
19
|
+
import {
|
|
20
|
+
AlertDialog,
|
|
21
|
+
AlertDialogAction,
|
|
22
|
+
AlertDialogCancel,
|
|
23
|
+
AlertDialogContent,
|
|
24
|
+
AlertDialogDescription,
|
|
25
|
+
AlertDialogFooter,
|
|
26
|
+
AlertDialogHeader,
|
|
27
|
+
AlertDialogTitle,
|
|
28
|
+
} from '@asteby/metacore-ui/primitives'
|
|
29
|
+
import type { RequiresAddon } from './types'
|
|
30
|
+
|
|
31
|
+
export type { RequiresAddon }
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Reads the addon requirement off an action, tolerating both the camelCase
|
|
35
|
+
* `requiresAddon` and the snake_case `requires_addon` the host serves. Returns
|
|
36
|
+
* null when the action is freely executable (no requirement, or a malformed one
|
|
37
|
+
* without a `key` — degrade to "runs", never to "locked forever").
|
|
38
|
+
*/
|
|
39
|
+
export function resolveRequiresAddon(action: any): RequiresAddon | null {
|
|
40
|
+
const raw = action?.requiresAddon ?? action?.requires_addon
|
|
41
|
+
if (!raw || typeof raw !== 'object') return null
|
|
42
|
+
const key = typeof raw.key === 'string' ? raw.key.trim() : ''
|
|
43
|
+
if (!key) return null
|
|
44
|
+
const out: RequiresAddon = { key }
|
|
45
|
+
if (typeof raw.name === 'string' && raw.name) out.name = raw.name
|
|
46
|
+
if (typeof raw.reason === 'string' && raw.reason) out.reason = raw.reason
|
|
47
|
+
return out
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
type AddonInstallHandler = (key: string) => void
|
|
51
|
+
|
|
52
|
+
let installHandler: AddonInstallHandler | null = null
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Registers the host's "install this addon" flow (e.g. open the marketplace
|
|
56
|
+
* install drawer). Pass `null` to unregister. Without a handler the SDK
|
|
57
|
+
* navigates to `/marketplace/<key>` via the router.
|
|
58
|
+
*/
|
|
59
|
+
export function setAddonInstallHandler(fn: AddonInstallHandler | null): void {
|
|
60
|
+
installHandler = fn
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/** Current host install handler, or null when none is registered. */
|
|
64
|
+
export function getAddonInstallHandler(): AddonInstallHandler | null {
|
|
65
|
+
return installHandler
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/** Display name for a requirement: the host-provided name, else the key. */
|
|
69
|
+
export function requiresAddonName(req: RequiresAddon): string {
|
|
70
|
+
return req.name || req.key
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/** Tooltip text for a gated action: "Requiere «<name>»". */
|
|
74
|
+
export function useRequiresAddonLabel(): (req: RequiresAddon) => string {
|
|
75
|
+
const { t } = useTranslation()
|
|
76
|
+
return (req) =>
|
|
77
|
+
t('dynamic.requires_addon_badge', {
|
|
78
|
+
defaultValue: 'Requiere «{{name}}»',
|
|
79
|
+
name: requiresAddonName(req),
|
|
80
|
+
})
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/** Lock marker rendered next to a gated action's label (hover = addon name). */
|
|
84
|
+
export function RequiresAddonLock({ requirement }: { requirement: RequiresAddon }) {
|
|
85
|
+
const label = useRequiresAddonLabel()(requirement)
|
|
86
|
+
return (
|
|
87
|
+
<span
|
|
88
|
+
className="ml-auto inline-flex shrink-0 items-center pl-2 text-muted-foreground"
|
|
89
|
+
title={label}
|
|
90
|
+
aria-label={label}
|
|
91
|
+
data-requires-addon={requirement.key}
|
|
92
|
+
>
|
|
93
|
+
<Lock className="h-3.5 w-3.5" />
|
|
94
|
+
</span>
|
|
95
|
+
)
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
export interface RequiresAddonDialogProps {
|
|
99
|
+
/** The requirement to explain; the dialog renders nothing while null. */
|
|
100
|
+
requirement: RequiresAddon | null
|
|
101
|
+
onOpenChange: (open: boolean) => void
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* Compact "this action requires <addon>" dialog. Never touches the backend:
|
|
106
|
+
* "Instalar" hands the key to the host handler or routes to the marketplace.
|
|
107
|
+
*/
|
|
108
|
+
export function RequiresAddonDialog({ requirement, onOpenChange }: RequiresAddonDialogProps) {
|
|
109
|
+
const { t } = useTranslation()
|
|
110
|
+
const navigate = useNavigate()
|
|
111
|
+
if (!requirement) return null
|
|
112
|
+
const name = requiresAddonName(requirement)
|
|
113
|
+
|
|
114
|
+
const install = () => {
|
|
115
|
+
onOpenChange(false)
|
|
116
|
+
const handler = installHandler
|
|
117
|
+
if (handler) handler(requirement.key)
|
|
118
|
+
else navigate({ to: `/marketplace/${encodeURIComponent(requirement.key)}` })
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
return (
|
|
122
|
+
<AlertDialog open onOpenChange={onOpenChange}>
|
|
123
|
+
<AlertDialogContent className="sm:max-w-md">
|
|
124
|
+
<AlertDialogHeader>
|
|
125
|
+
<AlertDialogTitle className="flex items-center gap-2">
|
|
126
|
+
<Lock className="h-4 w-4 shrink-0 text-muted-foreground" />
|
|
127
|
+
{t('dynamic.requires_addon_title', {
|
|
128
|
+
defaultValue: 'Esta acción requiere «{{name}}»',
|
|
129
|
+
name,
|
|
130
|
+
})}
|
|
131
|
+
</AlertDialogTitle>
|
|
132
|
+
<AlertDialogDescription>
|
|
133
|
+
{requirement.reason
|
|
134
|
+
? t(requirement.reason, { defaultValue: requirement.reason })
|
|
135
|
+
: t('dynamic.requires_addon_description', {
|
|
136
|
+
defaultValue: 'Instala «{{name}}» para habilitar esta acción.',
|
|
137
|
+
name,
|
|
138
|
+
})}
|
|
139
|
+
</AlertDialogDescription>
|
|
140
|
+
</AlertDialogHeader>
|
|
141
|
+
<AlertDialogFooter>
|
|
142
|
+
<AlertDialogCancel>
|
|
143
|
+
{t('dynamic.requires_addon_cancel', { defaultValue: 'Cancelar' })}
|
|
144
|
+
</AlertDialogCancel>
|
|
145
|
+
<AlertDialogAction
|
|
146
|
+
onClick={(e: React.MouseEvent) => {
|
|
147
|
+
e.preventDefault()
|
|
148
|
+
install()
|
|
149
|
+
}}
|
|
150
|
+
>
|
|
151
|
+
{t('dynamic.requires_addon_install', {
|
|
152
|
+
defaultValue: 'Instalar «{{name}}»',
|
|
153
|
+
name,
|
|
154
|
+
})}
|
|
155
|
+
</AlertDialogAction>
|
|
156
|
+
</AlertDialogFooter>
|
|
157
|
+
</AlertDialogContent>
|
|
158
|
+
</AlertDialog>
|
|
159
|
+
)
|
|
160
|
+
}
|
package/src/types.ts
CHANGED
|
@@ -654,6 +654,16 @@ export interface FieldOptionsConfig {
|
|
|
654
654
|
image?: string
|
|
655
655
|
}
|
|
656
656
|
|
|
657
|
+
/** An optional addon an action needs before it can run. */
|
|
658
|
+
export interface RequiresAddon {
|
|
659
|
+
/** Addon key, e.g. "connector_whatsapp". */
|
|
660
|
+
key: string
|
|
661
|
+
/** Localized display name, e.g. "Conector WhatsApp". Falls back to `key`. */
|
|
662
|
+
name?: string
|
|
663
|
+
/** Why the action needs it (literal or i18n key). */
|
|
664
|
+
reason?: string
|
|
665
|
+
}
|
|
666
|
+
|
|
657
667
|
export interface ActionDefinition {
|
|
658
668
|
key: string
|
|
659
669
|
name: string
|
|
@@ -680,6 +690,13 @@ export interface ActionDefinition {
|
|
|
680
690
|
* "create" — toolbar button that replaces the generic create button.
|
|
681
691
|
*/
|
|
682
692
|
placement?: 'row' | 'table' | 'create'
|
|
693
|
+
/**
|
|
694
|
+
* Optional addon this action depends on, stamped by the host only while it
|
|
695
|
+
* is NOT installed (served as `requires_addon`; read through
|
|
696
|
+
* resolveRequiresAddon). The action stays visible but locked: a click opens
|
|
697
|
+
* the "requires addon" dialog instead of executing.
|
|
698
|
+
*/
|
|
699
|
+
requiresAddon?: RequiresAddon
|
|
683
700
|
}
|
|
684
701
|
|
|
685
702
|
export interface ApiResponse<T> {
|
|
@@ -724,4 +741,11 @@ export interface ActionMetadata {
|
|
|
724
741
|
/** Federated modal slug "<addon_key>.<action_key>"; see ActionModalDispatcher. */
|
|
725
742
|
modal?: string
|
|
726
743
|
placement?: 'row' | 'table' | 'create'
|
|
744
|
+
/**
|
|
745
|
+
* Optional addon this action depends on, stamped by the host only while it
|
|
746
|
+
* is NOT installed (served as `requires_addon`; read through
|
|
747
|
+
* resolveRequiresAddon). The action stays visible but locked: a click opens
|
|
748
|
+
* the "requires addon" dialog instead of executing.
|
|
749
|
+
*/
|
|
750
|
+
requiresAddon?: RequiresAddon
|
|
727
751
|
}
|