@luminix/mui-cms 0.2.13 → 1.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/README.md +32 -22
- package/bundle/mui-cms.bundle.iife.js +42 -36
- package/dist/mui-cms.js +2765 -2367
- package/docs/acoes.md +196 -0
- package/docs/componentes.md +147 -0
- package/docs/configuracao.md +117 -0
- package/docs/extensibilidade.md +216 -0
- package/docs/facades.md +183 -0
- package/docs/hooks.md +307 -0
- package/docs/index.md +25 -0
- package/docs/instalacao.md +95 -0
- package/docs/introducao.md +72 -0
- package/docs/tipos.md +238 -0
- package/package.json +15 -5
- package/tsconfig.json +1 -0
- package/tsconfig.test.json +16 -0
- package/vitest.config.ts +22 -0
- package/types/main.dev.d.ts +0 -0
package/docs/facades.md
ADDED
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
# Facades
|
|
2
|
+
|
|
3
|
+
As facades são a interface pública dos serviços internos da biblioteca. Elas seguem o padrão `Reducible`, o que significa que qualquer método pode ser extendido via redutores.
|
|
4
|
+
|
|
5
|
+
## Cms
|
|
6
|
+
|
|
7
|
+
Facade do `CmsService`. Gerencia rotas, menu, componentes e ações do painel.
|
|
8
|
+
|
|
9
|
+
```ts
|
|
10
|
+
import { Cms } from '@luminix/mui-cms';
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
### Métodos
|
|
14
|
+
|
|
15
|
+
#### `Cms.getRoutes(): RouteObject[]`
|
|
16
|
+
|
|
17
|
+
Retorna as rotas registradas no painel (formato do `react-router-dom`).
|
|
18
|
+
|
|
19
|
+
#### `Cms.getMenuItems(): MenuItem[]`
|
|
20
|
+
|
|
21
|
+
Retorna os itens do menu lateral. Por padrão inclui o Dashboard e um item para cada modelo do manifesto.
|
|
22
|
+
|
|
23
|
+
#### `Cms.getComponents(): Record<string, React.ComponentType>`
|
|
24
|
+
|
|
25
|
+
Retorna o mapa de componentes registrados (ver [Componentes](componentes.md)).
|
|
26
|
+
|
|
27
|
+
#### `Cms.getComponent(name: string): React.ComponentType`
|
|
28
|
+
|
|
29
|
+
Retorna um componente pelo nome.
|
|
30
|
+
|
|
31
|
+
#### `Cms.getModelFormProps(item: ModelType): ModelFormProps`
|
|
32
|
+
|
|
33
|
+
Retorna as props do `ModelForm` para um item específico.
|
|
34
|
+
|
|
35
|
+
#### `Cms.getMassActions(ModelClass, currentTab): MassAction[]`
|
|
36
|
+
|
|
37
|
+
Retorna as ações em massa disponíveis para o modelo e aba ativos.
|
|
38
|
+
|
|
39
|
+
#### `Cms.getInstanceActions(ModelClass, currentTab): InstanceAction[]`
|
|
40
|
+
|
|
41
|
+
Retorna as ações de instância (por linha) disponíveis.
|
|
42
|
+
|
|
43
|
+
#### `Cms.getStaticActions(ModelClass, currentTab): StaticAction[]`
|
|
44
|
+
|
|
45
|
+
Retorna as ações estáticas (nível de listagem, ex.: "Criar novo").
|
|
46
|
+
|
|
47
|
+
### Redutores disponíveis
|
|
48
|
+
|
|
49
|
+
| Redutor | Assinatura | Uso |
|
|
50
|
+
|---|---|---|
|
|
51
|
+
| `cmsRoutes` | `(routes, components, models) => routes` | Adicionar/modificar rotas |
|
|
52
|
+
| `componentMap` | `(map) => map` | Substituir componentes internos |
|
|
53
|
+
| `menuItems` | `(items, models) => items` | Personalizar o menu lateral |
|
|
54
|
+
| `wireModelFormProps` | `(props, item) => props` | Alterar props do formulário por modelo |
|
|
55
|
+
| `massActions` | `(actions, ModelClass, tab) => actions` | Adicionar/remover ações em massa |
|
|
56
|
+
| `instanceActions` | `(actions, ModelClass, tab) => actions` | Adicionar/remover ações de instância |
|
|
57
|
+
| `staticActions` | `(actions, ModelClass, tab) => actions` | Adicionar/remover ações estáticas |
|
|
58
|
+
| `model{Name}Columns` | `() => Column[]` | Definir colunas da tabela por modelo |
|
|
59
|
+
| `mass{Name}Actions` | idem massActions | Ações em massa específicas por modelo |
|
|
60
|
+
| `instance{Name}Actions` | idem instanceActions | Ações de instância específicas por modelo |
|
|
61
|
+
| `static{Name}Actions` | idem staticActions | Ações estáticas específicas por modelo |
|
|
62
|
+
|
|
63
|
+
> `{Name}` é o nome do modelo em StudlyCase. Ex.: `modelPostColumns`, `massPostActions`.
|
|
64
|
+
|
|
65
|
+
---
|
|
66
|
+
|
|
67
|
+
## Filter
|
|
68
|
+
|
|
69
|
+
Facade do `FilterService`. Gerencia os filtros avançados da tabela.
|
|
70
|
+
|
|
71
|
+
```ts
|
|
72
|
+
import { Filter } from '@luminix/mui-cms';
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
### Métodos
|
|
76
|
+
|
|
77
|
+
#### `Filter.getInputType(type: string): string`
|
|
78
|
+
|
|
79
|
+
Converte o tipo PHP/Eloquent do atributo no tipo de input HTML correspondente.
|
|
80
|
+
|
|
81
|
+
| Tipo do modelo | Input retornado |
|
|
82
|
+
|---|---|
|
|
83
|
+
| `int`, `float`, `number` | `number` |
|
|
84
|
+
| `date` | `date` |
|
|
85
|
+
| `datetime`, `timestamp` | `datetime-local` |
|
|
86
|
+
| `bool`, `boolean` | `boolean` |
|
|
87
|
+
| `autocomplete` | `autocomplete` |
|
|
88
|
+
| demais | `text` |
|
|
89
|
+
|
|
90
|
+
#### `Filter.getOperators(): string[]`
|
|
91
|
+
|
|
92
|
+
Retorna a lista de operadores configurada em `luminix.admin.filter.operators`.
|
|
93
|
+
|
|
94
|
+
#### `Filter.getMatchingOperators(column: FilterColumn): InputOption[]`
|
|
95
|
+
|
|
96
|
+
Retorna os operadores aplicáveis a uma coluna específica, filtrando por tipo e nullable.
|
|
97
|
+
|
|
98
|
+
#### `Filter.getFilterableColumns(ModelClass): FilterColumn[]`
|
|
99
|
+
|
|
100
|
+
Retorna as colunas filtráveis do modelo (atributos não ocultos e relacionamentos).
|
|
101
|
+
|
|
102
|
+
#### `Filter.checkIfCanApplyFilters(columnsFilter: FilteredColumn[]): boolean`
|
|
103
|
+
|
|
104
|
+
Verifica se o estado atual dos filtros é válido para envio (retorna `true` se houver filtro incompleto).
|
|
105
|
+
|
|
106
|
+
### Redutores disponíveis
|
|
107
|
+
|
|
108
|
+
| Redutor | Assinatura | Uso |
|
|
109
|
+
|---|---|---|
|
|
110
|
+
| `filterableColumns` | `(columns, ModelClass) => columns` | Adicionar/remover colunas filtráveis |
|
|
111
|
+
|
|
112
|
+
---
|
|
113
|
+
|
|
114
|
+
## Icon
|
|
115
|
+
|
|
116
|
+
Serviço de gerenciamento de ícones. **Não** é uma facade `Reducible`; é um singleton instanciado diretamente.
|
|
117
|
+
|
|
118
|
+
```ts
|
|
119
|
+
import { Icon } from '@luminix/mui-cms';
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
### Ícones registrados por padrão
|
|
123
|
+
|
|
124
|
+
A biblioteca pré-registra os seguintes ícones do `@mui/icons-material`:
|
|
125
|
+
|
|
126
|
+
`Add`, `AddCircleOutline`, `ArrowDownward`, `ArrowDropDown`, `ArrowUpward`, `CategoryOutlined`, `ChevronLeft`, `ChevronRight`, `Close`, `DashboardOutlined`, `ExpandLess`, `ExpandMore`, `FilterList`, `FirstPage`, `HighlightOffOutlined`, `LastPage`, `Menu`, `MoreVert`, `PeopleOutlined`, `Search`, `SwapVert`
|
|
127
|
+
|
|
128
|
+
### Métodos
|
|
129
|
+
|
|
130
|
+
#### `Icon.registerIcon(name, component)`
|
|
131
|
+
|
|
132
|
+
Registra um ícone individual:
|
|
133
|
+
|
|
134
|
+
```ts
|
|
135
|
+
import { Icon } from '@luminix/mui-cms';
|
|
136
|
+
import { Star } from '@mui/icons-material';
|
|
137
|
+
|
|
138
|
+
Icon.registerIcon('Star', Star);
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
#### `Icon.registerIcon(iconMap)`
|
|
142
|
+
|
|
143
|
+
Registra múltiplos ícones de uma vez:
|
|
144
|
+
|
|
145
|
+
```ts
|
|
146
|
+
import { Star, Home } from '@mui/icons-material';
|
|
147
|
+
|
|
148
|
+
Icon.registerIcon({ Star, Home });
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
#### `Icon.make(name: string): React.ComponentType`
|
|
152
|
+
|
|
153
|
+
Retorna o componente do ícone pelo nome.
|
|
154
|
+
|
|
155
|
+
#### `Icon.render(name: string, props?): React.ReactNode`
|
|
156
|
+
|
|
157
|
+
Renderiza o ícone como nó React:
|
|
158
|
+
|
|
159
|
+
```ts
|
|
160
|
+
Icon.render('Star', { fontSize: 'small', color: 'primary' })
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
#### `Icon.forModel(model: string, icon: string)`
|
|
164
|
+
|
|
165
|
+
Associa um ícone a um modelo. O nome do modelo deve ser o `schemaName` (snake_case):
|
|
166
|
+
|
|
167
|
+
```ts
|
|
168
|
+
Icon.forModel('post', 'Article');
|
|
169
|
+
Icon.forModel('user', 'PeopleOutlined'); // já registrado por padrão
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
#### `Icon.all(): string[]`
|
|
173
|
+
|
|
174
|
+
Lista os nomes de todos os ícones registrados.
|
|
175
|
+
|
|
176
|
+
---
|
|
177
|
+
|
|
178
|
+
## Próximos passos
|
|
179
|
+
|
|
180
|
+
- [Hooks](hooks.md) — hooks para uso em componentes customizados
|
|
181
|
+
- [Ações](acoes.md) — como definir ações para os modelos
|
|
182
|
+
- [Extensibilidade](extensibilidade.md) — redutores em profundidade
|
|
183
|
+
- [Volta ao índice](index.md)
|
package/docs/hooks.md
ADDED
|
@@ -0,0 +1,307 @@
|
|
|
1
|
+
# Hooks
|
|
2
|
+
|
|
3
|
+
Todos os hooks abaixo são exportados de `@luminix/mui-cms` e devem ser usados dentro da árvore de componentes do `LuminixCms`.
|
|
4
|
+
|
|
5
|
+
```ts
|
|
6
|
+
import { useNotify, useDialog, useTable, /* ... */ } from '@luminix/mui-cms';
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## Navegação e página
|
|
12
|
+
|
|
13
|
+
### usePageTitle
|
|
14
|
+
|
|
15
|
+
Retorna o título atual da página.
|
|
16
|
+
|
|
17
|
+
```ts
|
|
18
|
+
const title = usePageTitle(); // string
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
### useSetPageTitle
|
|
22
|
+
|
|
23
|
+
Recebe um `title` como argumento e define o título da página enquanto o componente está montado. Remove o título automaticamente no unmount.
|
|
24
|
+
|
|
25
|
+
```ts
|
|
26
|
+
useSetPageTitle('Meus Posts');
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
Não retorna valor.
|
|
30
|
+
|
|
31
|
+
### useSearch
|
|
32
|
+
|
|
33
|
+
Torna a barra de busca visível enquanto o componente está montado. Esconde-a automaticamente no unmount.
|
|
34
|
+
|
|
35
|
+
```ts
|
|
36
|
+
useSearch();
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
Não recebe parâmetros nem retorna valor. Para ler o valor atual da busca (query string), use diretamente `useSearchParams` do `react-router-dom`.
|
|
40
|
+
|
|
41
|
+
### useHasSearch
|
|
42
|
+
|
|
43
|
+
Retorna `true` se a barra de busca está visível no momento.
|
|
44
|
+
|
|
45
|
+
```ts
|
|
46
|
+
const hasSearch = useHasSearch(); // boolean
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
### useBackButton
|
|
50
|
+
|
|
51
|
+
Torna o botão voltar visível enquanto o componente está montado. Esconde-o automaticamente no unmount.
|
|
52
|
+
|
|
53
|
+
```ts
|
|
54
|
+
useBackButton();
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
Não recebe parâmetros nem retorna valor.
|
|
58
|
+
|
|
59
|
+
### useHasBackButton
|
|
60
|
+
|
|
61
|
+
Retorna `true` se o botão voltar está visível no momento.
|
|
62
|
+
|
|
63
|
+
```ts
|
|
64
|
+
const hasBack = useHasBackButton(); // boolean
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
---
|
|
68
|
+
|
|
69
|
+
## Estado da tabela
|
|
70
|
+
|
|
71
|
+
### useTable
|
|
72
|
+
|
|
73
|
+
Retorna o valor completo do `TableContext`. Disponível dentro de componentes filhos do `TableProvider`.
|
|
74
|
+
|
|
75
|
+
```ts
|
|
76
|
+
const {
|
|
77
|
+
columns, // Column[]
|
|
78
|
+
columnCount, // number
|
|
79
|
+
massActions, // MassAction[]
|
|
80
|
+
items, // Collection<Model> | undefined
|
|
81
|
+
loading, // boolean | undefined
|
|
82
|
+
error, // Error | null
|
|
83
|
+
Model, // typeof ModelType
|
|
84
|
+
selected, // Collection<Model>
|
|
85
|
+
} = useTable();
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
### useSelection
|
|
89
|
+
|
|
90
|
+
Retorna utilitários para gerenciar a seleção de linhas da tabela.
|
|
91
|
+
|
|
92
|
+
```ts
|
|
93
|
+
const {
|
|
94
|
+
selected, // Collection<Model> — itens selecionados (reativo)
|
|
95
|
+
indeterminate, // boolean — true se parte dos itens está selecionada
|
|
96
|
+
allSelected, // boolean — true se todos os itens da página estão selecionados
|
|
97
|
+
isSelected, // (item: Model) => boolean
|
|
98
|
+
handleClearSelected, // () => void
|
|
99
|
+
handleSelectToggle, // (item: Model) => void
|
|
100
|
+
handleSelectToggleAll, // () => void
|
|
101
|
+
} = useSelection();
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
### useCurrentModel
|
|
105
|
+
|
|
106
|
+
Retorna a classe do modelo ativo na tela atual. Disponível dentro de um `ModelProvider`.
|
|
107
|
+
|
|
108
|
+
```ts
|
|
109
|
+
const ModelClass = useCurrentModel(); // typeof ModelType
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
---
|
|
113
|
+
|
|
114
|
+
## Notificações
|
|
115
|
+
|
|
116
|
+
### useNotify
|
|
117
|
+
|
|
118
|
+
Retorna a função `notify` para exibir notificações toast.
|
|
119
|
+
|
|
120
|
+
```ts
|
|
121
|
+
const notify = useNotify();
|
|
122
|
+
|
|
123
|
+
// forma simplificada
|
|
124
|
+
notify('Salvo com sucesso!');
|
|
125
|
+
|
|
126
|
+
// com objeto completo
|
|
127
|
+
notify({
|
|
128
|
+
message: 'Post publicado.',
|
|
129
|
+
severity: 'success', // 'success' | 'error' | 'warning' | 'info'
|
|
130
|
+
title: 'Sucesso', // opcional
|
|
131
|
+
actions: [ // opcional — botões de ação no toast
|
|
132
|
+
{ label: 'Desfazer', callback: () => { /* ... */ } },
|
|
133
|
+
],
|
|
134
|
+
});
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
A assinatura completa:
|
|
138
|
+
|
|
139
|
+
```ts
|
|
140
|
+
type NotifyFunction = (notification: string | Notification) => void;
|
|
141
|
+
|
|
142
|
+
type Notification = {
|
|
143
|
+
message: React.ReactNode;
|
|
144
|
+
severity?: 'success' | 'error' | 'warning' | 'info';
|
|
145
|
+
title?: React.ReactNode;
|
|
146
|
+
actions?: { label: React.ReactNode; callback: () => void }[];
|
|
147
|
+
};
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
### useNotifications
|
|
151
|
+
|
|
152
|
+
Acessa o estado interno do `NotificationContext`. Útil para criar providers de notificação customizados.
|
|
153
|
+
|
|
154
|
+
```ts
|
|
155
|
+
const {
|
|
156
|
+
isOpen,
|
|
157
|
+
notify,
|
|
158
|
+
dismissNotification,
|
|
159
|
+
notifications, // Notification[]
|
|
160
|
+
current, // Notification | undefined — notificação sendo exibida
|
|
161
|
+
displacement, // string — deslocamento CSS atual do Snackbar
|
|
162
|
+
} = useNotifications();
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
### useDisplaceNotifications
|
|
166
|
+
|
|
167
|
+
Define o deslocamento (offset) do Snackbar de notificações. Útil para evitar sobreposição com elementos fixos como FABs ou rodapés.
|
|
168
|
+
|
|
169
|
+
```ts
|
|
170
|
+
useDisplaceNotifications(value);
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
- `value: string | number | false` — número de unidades de espaçamento MUI, string CSS ou `false` para restaurar o valor padrão.
|
|
174
|
+
- O deslocamento é restaurado automaticamente no unmount.
|
|
175
|
+
|
|
176
|
+
```ts
|
|
177
|
+
// desloca 8 unidades de espaçamento MUI acima do padrão
|
|
178
|
+
useDisplaceNotifications(8);
|
|
179
|
+
|
|
180
|
+
// restaura o deslocamento padrão
|
|
181
|
+
useDisplaceNotifications(false);
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
---
|
|
185
|
+
|
|
186
|
+
## Diálogos
|
|
187
|
+
|
|
188
|
+
### useDialog
|
|
189
|
+
|
|
190
|
+
Retorna a função `dialog` para abrir diálogos modais. Retorna uma `Promise` que resolve com o resultado da interação do usuário.
|
|
191
|
+
|
|
192
|
+
```ts
|
|
193
|
+
const dialog = useDialog();
|
|
194
|
+
|
|
195
|
+
// forma simplificada — abre um alerta
|
|
196
|
+
const confirmed = await dialog('Tem certeza?');
|
|
197
|
+
|
|
198
|
+
// com objeto completo
|
|
199
|
+
const result = await dialog({
|
|
200
|
+
title: 'Confirmar exclusão',
|
|
201
|
+
message: 'Esta ação não pode ser desfeita.',
|
|
202
|
+
type: 'confirm', // 'alert' | 'confirm' | 'prompt'
|
|
203
|
+
dismissable: true, // permite fechar clicando fora
|
|
204
|
+
confirmText: 'Excluir',
|
|
205
|
+
cancelText: 'Cancelar',
|
|
206
|
+
// para type: 'prompt':
|
|
207
|
+
defaultValue: '',
|
|
208
|
+
textFieldProps: { label: 'Nome do arquivo' },
|
|
209
|
+
});
|
|
210
|
+
// result: true (confirmou) | false (cancelou) | string (prompt)
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
A assinatura completa:
|
|
214
|
+
|
|
215
|
+
```ts
|
|
216
|
+
type DialogFunction = (message: string | DialogMessage) => Promise<boolean | string>;
|
|
217
|
+
|
|
218
|
+
type DialogMessage = {
|
|
219
|
+
title?: React.ReactNode;
|
|
220
|
+
message: React.ReactNode;
|
|
221
|
+
type?: 'alert' | 'confirm' | 'prompt';
|
|
222
|
+
dismissable?: boolean;
|
|
223
|
+
confirmText?: string;
|
|
224
|
+
cancelText?: string;
|
|
225
|
+
defaultValue?: string; // valor inicial para type 'prompt'
|
|
226
|
+
dialogProps?: Partial<DialogProps>;
|
|
227
|
+
textFieldProps?: Partial<TextFieldProps>;
|
|
228
|
+
};
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
---
|
|
232
|
+
|
|
233
|
+
## Layout
|
|
234
|
+
|
|
235
|
+
### useLayoutConfig
|
|
236
|
+
|
|
237
|
+
Lê um valor da configuração de layout (`CmsConfig['layout']`) pelo caminho (dot notation).
|
|
238
|
+
|
|
239
|
+
```ts
|
|
240
|
+
const drawerWidth = useLayoutConfig('drawer.width', 240);
|
|
241
|
+
const appBarColor = useLayoutConfig('appBar.color');
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
Parâmetros:
|
|
245
|
+
- `path: string` — caminho no objeto de layout (ex.: `'drawer.width'`, `'appBar.height'`)
|
|
246
|
+
- `defaultValue?: unknown` — valor retornado se o caminho não estiver definido
|
|
247
|
+
|
|
248
|
+
### useIsDesktopMode
|
|
249
|
+
|
|
250
|
+
Retorna `true` quando a largura da tela está acima do breakpoint configurado em `layout.breakpoint`.
|
|
251
|
+
|
|
252
|
+
```ts
|
|
253
|
+
const isDesktop = useIsDesktopMode(); // boolean
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
### useMenu
|
|
257
|
+
|
|
258
|
+
Retorna o estado de abertura do Drawer lateral e funções para controlá-lo.
|
|
259
|
+
|
|
260
|
+
```ts
|
|
261
|
+
const {
|
|
262
|
+
open, // boolean — true se o Drawer está aberto
|
|
263
|
+
handleDrawerOpen, // () => void
|
|
264
|
+
handleDrawerClose, // () => void
|
|
265
|
+
toggle, // () => void
|
|
266
|
+
} = useMenu();
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
---
|
|
270
|
+
|
|
271
|
+
## Eventos e ações
|
|
272
|
+
|
|
273
|
+
### useActionEvent
|
|
274
|
+
|
|
275
|
+
Monta o objeto `ActionCallbackEvent` — útil para chamar manualmente callbacks de ações em componentes customizados.
|
|
276
|
+
|
|
277
|
+
```ts
|
|
278
|
+
const event = useActionEvent();
|
|
279
|
+
|
|
280
|
+
event.navigate('/posts');
|
|
281
|
+
event.refresh();
|
|
282
|
+
event.notify('Salvo!');
|
|
283
|
+
await event.dialog({ message: 'Confirmar?' });
|
|
284
|
+
event.t('chave.de.traducao');
|
|
285
|
+
```
|
|
286
|
+
|
|
287
|
+
### useHandleError
|
|
288
|
+
|
|
289
|
+
Retorna uma função que trata erros de requisição e os exibe como notificação.
|
|
290
|
+
|
|
291
|
+
```ts
|
|
292
|
+
const handleError = useHandleError();
|
|
293
|
+
|
|
294
|
+
try {
|
|
295
|
+
await model.save();
|
|
296
|
+
} catch (err) {
|
|
297
|
+
handleError(err);
|
|
298
|
+
}
|
|
299
|
+
```
|
|
300
|
+
|
|
301
|
+
---
|
|
302
|
+
|
|
303
|
+
## Próximos passos
|
|
304
|
+
|
|
305
|
+
- [Ações](acoes.md) — como definir ações estáticas, de instância e em massa
|
|
306
|
+
- [Extensibilidade](extensibilidade.md) — customizações via redutores
|
|
307
|
+
- [Volta ao índice](index.md)
|
package/docs/index.md
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# Documentação — @luminix/mui-cms
|
|
2
|
+
|
|
3
|
+
Bem-vindo à documentação da biblioteca `@luminix/mui-cms`.
|
|
4
|
+
|
|
5
|
+
## Páginas
|
|
6
|
+
|
|
7
|
+
| Página | Descrição |
|
|
8
|
+
|---|---|
|
|
9
|
+
| [Introdução](introducao.md) | O que é a biblioteca, visão geral do ecossistema Luminix |
|
|
10
|
+
| [Instalação](instalacao.md) | Como instalar e configurar o ambiente |
|
|
11
|
+
| [Configuração](configuracao.md) | Opções de configuração do layout e tema |
|
|
12
|
+
| [Componentes](componentes.md) | `LuminixCms`, `Link` e providers de contexto |
|
|
13
|
+
| [Facades](facades.md) | `Cms`, `Filter` e `Icon` |
|
|
14
|
+
| [Hooks](hooks.md) | Todos os hooks exportados pela biblioteca |
|
|
15
|
+
| [Ações](acoes.md) | Ações estáticas, de instância e em massa |
|
|
16
|
+
| [Extensibilidade](extensibilidade.md) | Como customizar via redutores |
|
|
17
|
+
| [Referência de tipos](tipos.md) | Tipos TypeScript exportados |
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## Próximos passos
|
|
22
|
+
|
|
23
|
+
- Comece pela [Introdução](introducao.md) para entender o ecossistema.
|
|
24
|
+
- Se já conhece o Luminix, vá direto para [Instalação](instalacao.md).
|
|
25
|
+
- Para customizar o painel, consulte [Extensibilidade](extensibilidade.md).
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
# Instalação
|
|
2
|
+
|
|
3
|
+
## Via luminix/admin (recomendado)
|
|
4
|
+
|
|
5
|
+
O caminho mais simples é usar o pacote Laravel `luminix/admin`, que instala e configura todas as dependências automaticamente:
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
composer require luminix/admin
|
|
9
|
+
php artisan luminix:admin-ui
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
O comando `luminix:admin-ui` publica os arquivos JavaScript em `resources/js/`, instala as dependências npm e configura o Vite. Após isso, basta compilar:
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
npm run build
|
|
16
|
+
# ou, em desenvolvimento:
|
|
17
|
+
npm run dev
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
O painel estará disponível em `/admin`.
|
|
21
|
+
|
|
22
|
+
> Consulte a documentação do `luminix/admin` para detalhes sobre middleware, permissões e configuração do servidor.
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
## Instalação manual
|
|
27
|
+
|
|
28
|
+
Se preferir integrar a biblioteca em um projeto React existente, instale as dependências:
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
npm install @luminix/mui-cms \
|
|
32
|
+
@luminix/core \
|
|
33
|
+
@luminix/react \
|
|
34
|
+
@luminix/support \
|
|
35
|
+
@mui/material \
|
|
36
|
+
@mui/icons-material \
|
|
37
|
+
@emotion/react \
|
|
38
|
+
@emotion/styled \
|
|
39
|
+
@fontsource/roboto \
|
|
40
|
+
i18next \
|
|
41
|
+
react-i18next \
|
|
42
|
+
react-router-dom@6.25.1
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
### Ponto de entrada
|
|
46
|
+
|
|
47
|
+
```tsx
|
|
48
|
+
// src/main.tsx
|
|
49
|
+
import '@fontsource/roboto/300.css';
|
|
50
|
+
import '@fontsource/roboto/400.css';
|
|
51
|
+
import '@fontsource/roboto/500.css';
|
|
52
|
+
import '@fontsource/roboto/700.css';
|
|
53
|
+
|
|
54
|
+
import React from 'react';
|
|
55
|
+
import ReactDOM from 'react-dom/client';
|
|
56
|
+
import { LuminixCms } from '@luminix/mui-cms';
|
|
57
|
+
|
|
58
|
+
ReactDOM.createRoot(document.getElementById('root')!).render(
|
|
59
|
+
<React.StrictMode>
|
|
60
|
+
<LuminixCms />
|
|
61
|
+
</React.StrictMode>
|
|
62
|
+
);
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
### Pré-requisitos no backend
|
|
66
|
+
|
|
67
|
+
A instalação manual requer que o backend Laravel já tenha os pacotes `luminix/backend` e `luminix/frontend` configurados, com `@luminixEmbed()` presente no template Blade que carrega o JavaScript.
|
|
68
|
+
|
|
69
|
+
---
|
|
70
|
+
|
|
71
|
+
## Dependências peer
|
|
72
|
+
|
|
73
|
+
| Pacote | Versão mínima |
|
|
74
|
+
|---|---|
|
|
75
|
+
| `react` | ^18.3.1 |
|
|
76
|
+
| `react-dom` | ^18.3.1 |
|
|
77
|
+
| `react-router-dom` | 6.25.1 |
|
|
78
|
+
| `@mui/material` | ^5.16.5 |
|
|
79
|
+
| `@mui/icons-material` | ^5.16.5 |
|
|
80
|
+
| `@emotion/react` | ^11.13.0 |
|
|
81
|
+
| `@emotion/styled` | ^11.13.0 |
|
|
82
|
+
| `@fontsource/roboto` | ^5.0.12 |
|
|
83
|
+
| `@luminix/core` | ^1.0.0 |
|
|
84
|
+
| `@luminix/react` | ^1.0.0 |
|
|
85
|
+
| `@luminix/support` | ^1.0.1 |
|
|
86
|
+
| `i18next` | ^23.12.2 |
|
|
87
|
+
| `react-i18next` | ^15.0.1 |
|
|
88
|
+
|
|
89
|
+
---
|
|
90
|
+
|
|
91
|
+
## Próximos passos
|
|
92
|
+
|
|
93
|
+
- [Configuração](configuracao.md) — personalize o tema e o layout
|
|
94
|
+
- [Componentes](componentes.md) — conheça o `LuminixCms` e os providers
|
|
95
|
+
- [Volta ao índice](index.md)
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
# Introdução
|
|
2
|
+
|
|
3
|
+
`@luminix/mui-cms` é a camada de interface do ecossistema Luminix: uma biblioteca de componentes React construída sobre o Material-UI que entrega um painel administrativo (CMS) completo e extensível, pronto para ser integrado a qualquer aplicação Laravel.
|
|
4
|
+
|
|
5
|
+
## O ecossistema Luminix
|
|
6
|
+
|
|
7
|
+
O Luminix é composto por pacotes que cooperam em camadas bem definidas:
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
Laravel (servidor)
|
|
11
|
+
├── luminix/backend → Gera endpoints REST automáticos para modelos Eloquent
|
|
12
|
+
└── luminix/frontend → Injeta dados de boot no HTML via @luminixEmbed()
|
|
13
|
+
|
|
14
|
+
↓ dados chegam ao navegador
|
|
15
|
+
|
|
16
|
+
JavaScript (cliente)
|
|
17
|
+
├── @luminix/support → Utilitários, padrões Reducible/Macroable, cliente HTTP
|
|
18
|
+
├── @luminix/core → Contêiner de app, sistema de modelos, roteamento
|
|
19
|
+
├── @luminix/react → Hooks e componentes React base (formulários, paginação)
|
|
20
|
+
└── @luminix/mui-cms → Interface MUI: layout, tabelas, filtros, notificações
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
O pacote `luminix/admin` (Laravel) orquestra toda a integração: publica os arquivos React, configura o Vite e serve o painel em `/admin`.
|
|
24
|
+
|
|
25
|
+
## Responsabilidades de cada camada
|
|
26
|
+
|
|
27
|
+
### luminix/backend
|
|
28
|
+
Aplica a trait `LuminixModel` nos modelos Eloquent e expõe automaticamente endpoints REST em `/luminix-api/*`. Suporta filtros avançados, paginação, ordenação, soft deletes e controle de acesso via Laravel Gates.
|
|
29
|
+
|
|
30
|
+
Documentação: `luminix/backend/docs/`
|
|
31
|
+
|
|
32
|
+
### luminix/frontend
|
|
33
|
+
Fornece a diretiva Blade `@luminixEmbed()` que injeta no HTML o manifesto de modelos e rotas, configuração da aplicação, usuário autenticado e token CSRF — tudo o que o frontend JavaScript precisa para inicializar.
|
|
34
|
+
|
|
35
|
+
Documentação: `luminix/frontend/docs/`
|
|
36
|
+
|
|
37
|
+
### @luminix/support
|
|
38
|
+
Base de infraestrutura: coleções, manipulação de strings/objetos/arrays, cliente HTTP com axios, container de aplicação e os padrões `Reducible` e `Macroable` usados em toda a stack.
|
|
39
|
+
|
|
40
|
+
Documentação: `@luminix/support/docs/`
|
|
41
|
+
|
|
42
|
+
### @luminix/core
|
|
43
|
+
Fachadas de alto nível (`App`, `Auth`, `Config`, `Model`, `Route`) e o sistema de modelos com suporte a relacionamentos e queries encadeadas.
|
|
44
|
+
|
|
45
|
+
Documentação: `@luminix/core/docs/`
|
|
46
|
+
|
|
47
|
+
### @luminix/react
|
|
48
|
+
Camada React: `LuminixProvider`, `ModelForm`, hooks de formulário (`useForm`), paginação (`usePagination`), requisições (`useQuery`) e acesso a coleções (`useCollection`).
|
|
49
|
+
|
|
50
|
+
Documentação: `@luminix/react/docs/`
|
|
51
|
+
|
|
52
|
+
### @luminix/mui-cms _(esta biblioteca)_
|
|
53
|
+
Interface completa: layout responsivo com AppBar e Drawer, tabelas com filtros, ações (estáticas, de instância, em massa), sistema de notificações, diálogos e todas as extensões via redutores.
|
|
54
|
+
|
|
55
|
+
### luminix/admin _(não documentado ainda)_
|
|
56
|
+
Pacote Laravel que integra tudo: publica os arquivos React em `resources/js/`, configura o Vite, registra as rotas do painel e serve a SPA em `/admin`. É o ponto de entrada recomendado para quem quer usar o Luminix CMS em um projeto Laravel sem precisar configurar cada peça manualmente.
|
|
57
|
+
|
|
58
|
+
## Fluxo de dados
|
|
59
|
+
|
|
60
|
+
1. O Laravel renderiza o HTML com `@luminixEmbed()` — que injeta boot data e manifesto.
|
|
61
|
+
2. O JavaScript inicializa o contêiner de aplicação via `@luminix/core`.
|
|
62
|
+
3. O `LuminixCms` monta a SPA com `react-router-dom` e Material-UI.
|
|
63
|
+
4. O painel descobre os modelos pelo manifesto e gera rotas, menus e telas automaticamente.
|
|
64
|
+
5. Toda requisição de dados passa pelo cliente HTTP de `@luminix/support` com o token CSRF já configurado.
|
|
65
|
+
|
|
66
|
+
---
|
|
67
|
+
|
|
68
|
+
## Próximos passos
|
|
69
|
+
|
|
70
|
+
- [Instalação](instalacao.md) — como instalar e configurar o ambiente de desenvolvimento
|
|
71
|
+
- [Configuração](configuracao.md) — tema MUI, layout e opções disponíveis
|
|
72
|
+
- [Volta ao índice](index.md)
|