@luminix/mui-cms 1.2.0 → 1.2.1

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@luminix/mui-cms",
3
- "version": "1.2.0",
3
+ "version": "1.2.1",
4
4
  "type": "module",
5
5
  "main": "bundle/mui-cms.js",
6
6
  "module": "dist/mui-cms.js",
@@ -25,7 +25,7 @@
25
25
  "@fontsource/roboto": "^5.0.12",
26
26
  "@luminix/core": "^1.0.0",
27
27
  "@luminix/react": "^1.0.0",
28
- "@luminix/support": "^1.0.1",
28
+ "@luminix/support": "^1.1.1",
29
29
  "@mui/icons-material": "^5.16.5",
30
30
  "@mui/material": "^5.16.5",
31
31
  "i18next": "^23.12.2",
package/.eslintrc.cjs DELETED
@@ -1,18 +0,0 @@
1
- module.exports = {
2
- root: true,
3
- env: { browser: true, es2020: true },
4
- extends: [
5
- 'eslint:recommended',
6
- 'plugin:@typescript-eslint/recommended',
7
- 'plugin:react-hooks/recommended',
8
- ],
9
- ignorePatterns: ['dist', '.eslintrc.cjs'],
10
- parser: '@typescript-eslint/parser',
11
- plugins: ['react-refresh'],
12
- rules: {
13
- 'react-refresh/only-export-components': [
14
- 'warn',
15
- { allowConstantExport: true },
16
- ],
17
- },
18
- }
package/CLAUDE.md DELETED
@@ -1,8 +0,0 @@
1
- # @luminix/mui-cms
2
-
3
- This project is a TypeScript/React library to create admin areas on Laravel applications. Part of the Luminix stack. Check if the skills `/luminix` and/or `/luminix-cms` are available to understand the ecossystem and how to use this library.
4
-
5
- ## When working on this project
6
-
7
- - Always update and/or create new tests, relevant to the context, unless the user explicitly tells you not to.
8
- - Always update the documentation, keeping its current style, again, unless the user explicitly tells you not to.
package/docs/acoes.md DELETED
@@ -1,196 +0,0 @@
1
- # Ações
2
-
3
- O sistema de ações permite adicionar comportamentos às telas de listagem dos modelos. Existem três tipos:
4
-
5
- | Tipo | Contexto | Exemplo de uso |
6
- |---|---|---|
7
- | **Estáticas** | Nível de listagem, sem item selecionado | "Criar novo post" |
8
- | **De instância** | Por linha da tabela | "Editar", "Excluir" |
9
- | **Em massa** | Múltiplos itens selecionados | "Excluir selecionados", "Restaurar" |
10
-
11
- ---
12
-
13
- ## ActionCallbackEvent
14
-
15
- Todo callback de ação recebe um objeto `ActionCallbackEvent` com utilitários prontos:
16
-
17
- ```ts
18
- type ActionCallbackEvent = {
19
- navigate: (path: string) => void; // navega para uma rota interna
20
- refresh: () => void; // recarrega a listagem atual
21
- notify: NotifyFunction; // (notification: string | Notification) => void
22
- dialog: DialogFunction; // (message: string | DialogMessage) => Promise<boolean | string>
23
- t: TFunction; // função de tradução (i18next)
24
- };
25
- ```
26
-
27
- Ações de instância recebem também `item: ModelType` (o registro da linha):
28
-
29
- ```ts
30
- type InstanceActionCallbackEvent = ActionCallbackEvent & {
31
- item: Model;
32
- };
33
- ```
34
-
35
- Ações em massa recebem `selected: Collection<Model>` (todos os itens selecionados):
36
-
37
- ```ts
38
- type MassActionCallbackEvent = ActionCallbackEvent & {
39
- selected: Collection<Model>;
40
- };
41
- ```
42
-
43
- ---
44
-
45
- ## Ações estáticas (StaticAction)
46
-
47
- Aparecem na barra de ferramentas da listagem (ex.: botão "Criar").
48
-
49
- ```ts
50
- type StaticAction = {
51
- key?: string;
52
- label: string;
53
- icon?: React.ReactNode;
54
- callback: (e: ActionCallbackEvent) => void;
55
- };
56
- ```
57
-
58
- **Padrão registrado:** "Create {Model}" — navega para a rota de criação quando a aba ativa não é "trashed".
59
-
60
- ### Adicionar uma ação estática global
61
-
62
- ```ts
63
- import { Cms } from '@luminix/mui-cms';
64
-
65
- Cms.reducer('staticActions', (actions, ModelClass, tab) => [
66
- ...actions,
67
- {
68
- key: 'export',
69
- label: 'Exportar CSV',
70
- callback: ({ notify }) => {
71
- // lógica de exportação
72
- notify('Exportação iniciada!', 'info');
73
- },
74
- },
75
- ]);
76
- ```
77
-
78
- ### Adicionar ação apenas para um modelo específico
79
-
80
- ```ts
81
- Cms.reducer('staticPostActions', (actions, ModelClass, tab) => [
82
- ...actions,
83
- {
84
- key: 'publish-all',
85
- label: 'Publicar todos',
86
- callback: async ({ refresh, notify }) => {
87
- await fetch('/api/posts/publish-all', { method: 'POST' });
88
- refresh();
89
- notify('Posts publicados!', 'success');
90
- },
91
- },
92
- ]);
93
- ```
94
-
95
- ---
96
-
97
- ## Ações de instância (InstanceAction)
98
-
99
- Aparecem no menu de contexto de cada linha da tabela.
100
-
101
- ```ts
102
- type InstanceAction = {
103
- key?: string;
104
- label: string;
105
- icon?: React.ReactNode;
106
- callback: (e: InstanceActionCallbackEvent) => void;
107
- };
108
- ```
109
-
110
- **Padrão registrado:**
111
- - "Send to trash" / "Delete permanently" — para modelos com/sem soft deletes.
112
- - "Restore" + "Delete permanently" — quando a aba ativa é "trashed".
113
-
114
- ### Adicionar ação de instância
115
-
116
- ```ts
117
- import { Cms } from '@luminix/mui-cms';
118
-
119
- Cms.reducer('instanceActions', (actions, ModelClass, tab) => [
120
- ...actions,
121
- {
122
- label: 'Ver detalhes',
123
- callback: ({ item, navigate }) => {
124
- navigate(`/posts/${item.getKey()}/detalhes`);
125
- },
126
- },
127
- ]);
128
- ```
129
-
130
- ---
131
-
132
- ## Ações em massa (MassAction)
133
-
134
- Aparecem quando um ou mais itens estão selecionados na tabela.
135
-
136
- ```ts
137
- type MassAction = {
138
- key: string; // obrigatório — identificador único
139
- label: string;
140
- callback: (e: MassActionCallbackEvent) => void;
141
- };
142
- ```
143
-
144
- **Padrão registrado:**
145
- - "Send to trash" / "Delete permanently" — conforme soft deletes e aba ativa.
146
- - "Restore" + "Delete permanently" — na aba "trashed".
147
-
148
- ### Adicionar ação em massa
149
-
150
- ```ts
151
- import { Cms } from '@luminix/mui-cms';
152
- import { Http } from '@luminix/core';
153
-
154
- Cms.reducer('massActions', (actions, ModelClass, tab) => [
155
- ...actions,
156
- {
157
- key: 'archive',
158
- label: 'Arquivar selecionados',
159
- callback: async ({ selected, refresh, notify, dialog }) => {
160
- const confirmed = await dialog({
161
- title: 'Arquivar itens',
162
- message: `Deseja arquivar ${selected.count()} itens?`,
163
- type: 'confirm',
164
- });
165
- if (confirmed) {
166
- const ids = selected.map(item => item.getKey()).toArray();
167
- await Http.post('/api/posts/archive', { ids });
168
- refresh();
169
- notify('Itens arquivados!');
170
- }
171
- },
172
- },
173
- ]);
174
- ```
175
-
176
- ---
177
-
178
- ## Ações padrão (comportamento automático)
179
-
180
- O `CmsServiceProvider` registra automaticamente as ações padrão com prioridade `0`. Suas ações customizadas podem ser adicionadas com prioridade maior (padrão `undefined`) para aparecerem antes ou depois das padrão.
181
-
182
- Para remover uma ação padrão, filtre pelo `key`:
183
-
184
- ```ts
185
- Cms.reducer('staticActions', (actions) =>
186
- actions.filter(a => a.key !== 'create')
187
- );
188
- ```
189
-
190
- ---
191
-
192
- ## Próximos passos
193
-
194
- - [Extensibilidade](extensibilidade.md) — redutores em profundidade e como encadear transformações
195
- - [Hooks](hooks.md) — `useActionEvent` para montar o evento manualmente em componentes customizados
196
- - [Volta ao índice](index.md)
@@ -1,166 +0,0 @@
1
- # Componentes
2
-
3
- ## LuminixCms
4
-
5
- Componente raiz da aplicação. Deve ser renderizado uma única vez no ponto de entrada do projeto.
6
-
7
- ```tsx
8
- import { LuminixCms } from '@luminix/mui-cms';
9
-
10
- <LuminixCms
11
- theme={themeOptions} // ThemeOptions (MUI) — opcional
12
- themeArgs={[extraTheme]} // object[] — argumentos adicionais para createTheme
13
- providers={[MyProvider]} // ServiceProvider[] — providers adicionais
14
- />
15
- ```
16
-
17
- Internamente, o `LuminixCms`:
18
- 1. Cria o tema MUI com suporte automático a modo escuro.
19
- 2. Registra `CmsServiceProvider` e `i18NextServiceProvider`.
20
- 3. Delega a renderização ao `LuminixProvider` de `@luminix/react`, que inicializa o contêiner de aplicação e o roteador.
21
-
22
- ---
23
-
24
- ## Link
25
-
26
- Componente de navegação interna. Equivale ao `Link` do `react-router-dom`, mas integrado ao sistema de layout da biblioteca.
27
-
28
- ```tsx
29
- import { Link } from '@luminix/mui-cms';
30
-
31
- <Link to="/posts">Ver posts</Link>
32
- ```
33
-
34
- ---
35
-
36
- ## LogoutButton
37
-
38
- Botão de logout exibido no rodapé do menu lateral. Pode ser importado diretamente quando precisar ser usado fora do contexto do Drawer padrão.
39
-
40
- ```tsx
41
- import { LogoutButton } from '@luminix/mui-cms';
42
-
43
- <LogoutButton collapsed={false} />
44
- ```
45
-
46
- | Prop | Tipo | Padrão | Descrição |
47
- |---|---|---|---|
48
- | `collapsed` | `boolean` | `false` | Quando `true`, exibe apenas o ícone (modo recolhido do drawer) com um Tooltip |
49
-
50
- O comportamento padrão ao clicar é chamar `auth().logout()` do `@luminix/core`. Veja [Extensibilidade](extensibilidade.md#logoutbutton) para formas de customização.
51
-
52
- ---
53
-
54
- ## Providers de contexto
55
-
56
- Os providers a seguir são usados internamente pelas views e componentes da biblioteca. Em cenários avançados, você pode usá-los para acessar os contextos em componentes customizados.
57
-
58
- ### DialogProvider
59
-
60
- Fornece o contexto de diálogos modais. Necessário para que `useDialog` funcione.
61
-
62
- ```tsx
63
- import { DialogProvider } from '@luminix/mui-cms';
64
-
65
- <DialogProvider>
66
- {/* seus componentes */}
67
- </DialogProvider>
68
- ```
69
-
70
- ### NotificationProvider
71
-
72
- Fornece o contexto de notificações toast. Necessário para `useNotify`.
73
-
74
- ```tsx
75
- import { NotificationProvider } from '@luminix/mui-cms';
76
-
77
- <NotificationProvider
78
- anchorOrigin={{ vertical: 'bottom', horizontal: 'right' }} // SnackbarProps
79
- variant="filled" // 'filled' | 'outlined' | 'standard'
80
- >
81
- {/* seus componentes */}
82
- </NotificationProvider>
83
- ```
84
-
85
- ### LayoutProvider
86
-
87
- Gerencia o estado do layout (drawer aberto/fechado, breakpoint, título da página).
88
-
89
- ```tsx
90
- import { LayoutProvider } from '@luminix/mui-cms';
91
-
92
- <LayoutProvider>
93
- {/* seus componentes */}
94
- </LayoutProvider>
95
- ```
96
-
97
- ### ModelProvider
98
-
99
- Disponibiliza a classe de modelo atual para os componentes filhos (ex.: dentro de uma tela de listagem).
100
-
101
- ```tsx
102
- import { ModelProvider } from '@luminix/mui-cms';
103
-
104
- <ModelProvider Model={PostModel}>
105
- {/* seus componentes */}
106
- </ModelProvider>
107
- ```
108
-
109
- ### TableProvider
110
-
111
- Fornece o estado da tabela (seleção, ordenação, paginação) para os componentes de `ModelIndex`.
112
-
113
- ```tsx
114
- import { TableProvider } from '@luminix/mui-cms';
115
-
116
- <TableProvider>
117
- {/* seus componentes */}
118
- </TableProvider>
119
- ```
120
-
121
- ---
122
-
123
- ## Componentes internos (registrados via redutor)
124
-
125
- O `CmsServiceProvider` registra um mapa de componentes acessível via `Cms.getComponent(name)`. Esses componentes podem ser substituídos por customizados usando o redutor `componentMap`.
126
-
127
- | Chave | Componente padrão |
128
- |---|---|
129
- | `Layout` | Layout raiz da aplicação |
130
- | `Dashboard` | Tela inicial |
131
- | `ModelIndex` | Tela de listagem de modelos |
132
- | `ModelItem` | Tela de criação/edição |
133
- | `Error` | Tela de erro |
134
- | `Layout.AppBar` | Barra superior |
135
- | `Layout.AppLogo` | Logo no drawer |
136
- | `Layout.Drawer` | Menu lateral |
137
- | `Layout.Drawer.LogoutButton` | Botão de logout no rodapé do drawer |
138
- | `Layout.SearchBar` | Campo de busca |
139
- | `Layout.BackButton` | Botão voltar |
140
- | `ModelIndex.Filter` | Painel de filtros avançados |
141
- | `ModelIndex.Table` | Tabela de dados |
142
- | `ModelIndex.Pagination` | Paginação |
143
- | `ModelIndex.MassActions` | Ações em massa |
144
- | `ModelIndex.InstanceActions` | Ações por linha |
145
- | `ModelIndex.StaticActions` | Ações globais (ex.: "Criar") |
146
- | `ModelIndex.Tabs` | Abas de filtro (ex.: lixeira) |
147
-
148
- Para substituir um componente:
149
-
150
- ```ts
151
- import { Cms } from '@luminix/mui-cms';
152
- import MeuDashboard from './MeuDashboard';
153
-
154
- Cms.reducer('componentMap', (map) => ({
155
- ...map,
156
- Dashboard: MeuDashboard,
157
- }));
158
- ```
159
-
160
- ---
161
-
162
- ## Próximos passos
163
-
164
- - [Facades](facades.md) — como usar `Cms`, `Filter` e `Icon`
165
- - [Hooks](hooks.md) — hooks disponíveis para uso em componentes customizados
166
- - [Volta ao índice](index.md)
@@ -1,160 +0,0 @@
1
- # Configuração
2
-
3
- ## Tema MUI
4
-
5
- O `LuminixCms` aceita uma prop `theme` do tipo `ThemeOptions` (Material-UI). O tema padrão é:
6
-
7
- ```ts
8
- {
9
- palette: {
10
- primary: { main: '#1d9798' },
11
- secondary: { main: '#fa510c' },
12
- },
13
- }
14
- ```
15
-
16
- Para sobrescrever, passe seu próprio objeto:
17
-
18
- ```tsx
19
- <LuminixCms
20
- theme={{
21
- palette: {
22
- primary: { main: '#3f51b5' },
23
- secondary: { main: '#f50057' },
24
- },
25
- typography: {
26
- fontFamily: 'Inter, sans-serif',
27
- },
28
- }}
29
- />
30
- ```
31
-
32
- O modo de cor padrão é `auto`: segue automaticamente a preferência do sistema operacional (`prefers-color-scheme: dark`).
33
-
34
- ### colorScheme
35
-
36
- Use a prop `colorScheme` para controlar o modo de cor:
37
-
38
- | Valor | Comportamento |
39
- |-------|--------------|
40
- | `'auto'` (padrão) | Segue a preferência do sistema operacional |
41
- | `'light'` | Sempre usa o tema claro |
42
- | `'dark'` | Sempre usa o tema escuro |
43
-
44
- ```tsx
45
- // sempre claro
46
- <LuminixCms colorScheme="light" />
47
-
48
- // sempre escuro
49
- <LuminixCms colorScheme="dark" />
50
-
51
- // automático (padrão — mantém o comportamento anterior)
52
- <LuminixCms colorScheme="auto" />
53
- ```
54
-
55
- ### darkTheme
56
-
57
- Quando `colorScheme="auto"`, use `darkTheme` para fornecer um objeto de tema distinto para o modo escuro. O `theme` continuará sendo o tema claro.
58
-
59
- ```tsx
60
- <LuminixCms
61
- colorScheme="auto"
62
- theme={{
63
- palette: {
64
- primary: { main: '#1d9798' },
65
- },
66
- }}
67
- darkTheme={{
68
- palette: {
69
- primary: { main: '#90caf9' },
70
- },
71
- }}
72
- />
73
- ```
74
-
75
- > **Nota:** `darkTheme` só tem efeito quando `colorScheme="auto"`. Para `colorScheme="dark"`, passe diretamente o tema desejado via `theme`.
76
-
77
- ### themeArgs
78
-
79
- Para argumentos adicionais do `createTheme` (ex.: variáveis de componentes):
80
-
81
- ```tsx
82
- <LuminixCms
83
- theme={{ palette: { primary: { main: '#1d9798' } } }}
84
- themeArgs={[{ components: { MuiButton: { defaultProps: { disableElevation: true } } } }]}
85
- />
86
- ```
87
-
88
- ---
89
-
90
- ## Layout
91
-
92
- O layout é configurado via chave `luminix.admin.layout` na configuração da aplicação (injetada pelo `luminix/frontend`). As opções disponíveis são definidas pelo tipo `CmsConfig`:
93
-
94
- ```ts
95
- type CmsConfig = {
96
- layout?: {
97
- breakpoint?: 'xs' | 'sm' | 'md' | 'lg' | 'xl'; // padrão: 'md'
98
- drawer?: {
99
- width?: number; // largura do Drawer em px
100
- };
101
- appBar?: {
102
- height?: number; // altura da AppBar em px
103
- color?: string; // cor de fundo da AppBar
104
- };
105
- };
106
- };
107
- ```
108
-
109
- No Laravel, publique e edite o arquivo de configuração do `luminix/admin` para definir esses valores.
110
-
111
- ---
112
-
113
- ## URL base do painel
114
-
115
- Por padrão, o painel é montado em `/admin`. Para alterar, configure `luminix.admin.url` no backend:
116
-
117
- ```php
118
- // config/luminix.php
119
- 'admin' => [
120
- 'url' => '/painel',
121
- ],
122
- ```
123
-
124
- O `CmsServiceProvider` lê esse valor e configura o `basename` do `react-router-dom` automaticamente.
125
-
126
- ---
127
-
128
- ## Operadores de filtro disponíveis
129
-
130
- Os operadores usados nos filtros da tabela também são configuráveis via `luminix.admin.filter.operators`. O conjunto padrão inclui:
131
-
132
- `equals`, `notEquals`, `contains`, `startsWith`, `endsWith`, `greaterThan`, `greaterThanOrEquals`, `lessThan`, `lessThanOrEquals`, `between`, `notBetween`, `null`, `notNull`, `relation`
133
-
134
- ---
135
-
136
- ## Providers customizados
137
-
138
- Para registrar providers adicionais na inicialização da aplicação, use a prop `providers` do `LuminixCms`:
139
-
140
- ```tsx
141
- import { LuminixCms } from '@luminix/mui-cms';
142
- import { ServiceProvider } from '@luminix/support';
143
-
144
- class MyProvider extends ServiceProvider {
145
- register() { /* ... */ }
146
- boot() { /* ... */ }
147
- }
148
-
149
- <LuminixCms providers={[MyProvider]} />
150
- ```
151
-
152
- Os providers `CmsServiceProvider` e `i18NextServiceProvider` são sempre incluídos automaticamente.
153
-
154
- ---
155
-
156
- ## Próximos passos
157
-
158
- - [Componentes](componentes.md) — `LuminixCms`, `Link` e providers de contexto
159
- - [Extensibilidade](extensibilidade.md) — customizações via redutores
160
- - [Volta ao índice](index.md)