innoboxrr-vue-datatable 3.1.0 → 3.1.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/README.md CHANGED
@@ -63,7 +63,7 @@ import 'innoboxrr-form-core/styles'
63
63
  | Prop | Por defecto | |
64
64
  |---|---|---|
65
65
  | `dataUrl`, `policyUrl` | — | Obligatorias. |
66
- | `dataMethod`, `policyMethod` | `'post'` | `get` manda `params`; `post`, `data`. |
66
+ | `dataMethod`, `policyMethod` | `'post'` | `get` manda `params`, sin el token CSRF; `post`, `data`, con `_token`. |
67
67
  | `model` | — | El contrato del modelo (abajo). |
68
68
  | `formFilters` | `{}` | Un cambio vuelve a la primera página. |
69
69
  | `externalFilters` | `{}` | Un cambio recarga sin cambiar de página. |
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "innoboxrr-vue-datatable",
3
- "version": "3.1.0",
3
+ "version": "3.1.1",
4
4
  "description": "Datatable para vue3",
5
5
  "main": "index.js",
6
6
  "scripts": {
package/src/table.js CHANGED
@@ -130,9 +130,13 @@ export const sortIcon = (column, orderBy, sort = {}) => {
130
130
  /**
131
131
  * Lo que espera el backend. Con orden interno, el del usuario gana a lo que
132
132
  * traigan los filtros externos; sin él, es al revés.
133
+ *
134
+ * El token CSRF no va aquí: no es un filtro, y lo que sale de aquí también lo
135
+ * recibe el modelo con `setFilters()`. Lo pone `requestConfig()`, que sabe por
136
+ * dónde viaja la petición.
133
137
  */
134
138
  export const requestFilters = ({ formFilters = {}, externalFilters = {}, orderBy, sort = {}, page, internalSort }) => {
135
- const params = { _token: csrfToken(), managed: true, except_view_any: true }
139
+ const params = { managed: true, except_view_any: true }
136
140
  const order = { orderBy, orderMode: sort[orderBy] }
137
141
 
138
142
  return internalSort
@@ -140,12 +144,35 @@ export const requestFilters = ({ formFilters = {}, externalFilters = {}, orderBy
140
144
  : { ...params, ...formFilters, ...order, ...externalFilters, page }
141
145
  }
142
146
 
143
- export const requestConfig = (method, url, payload) => ({
144
- method,
145
- url,
146
- data: method === 'post' ? payload : null,
147
- params: method === 'get' ? payload : null,
148
- })
147
+ /**
148
+ * Los métodos cuyo payload viaja en la query. En el piloto de la aplicación
149
+ * base la tabla pedía GET /api/app/product/index?_token=...: el token CSRF
150
+ * acababa en los registros de acceso, en los proxies y en el historial del
151
+ * navegador. Laravel no comprueba CSRF en ellos y axios ya manda X-XSRF-TOKEN
152
+ * desde la cookie, así que no hace falta.
153
+ */
154
+ const QUERY_METHODS = ['get', 'head']
155
+
156
+ const withCsrfToken = (method, payload) => {
157
+ if (QUERY_METHODS.includes(String(method ?? '').toLowerCase())) {
158
+ const { _token: omitted, ...rest } = payload ?? {}
159
+
160
+ return rest
161
+ }
162
+
163
+ return { _token: csrfToken(), ...payload }
164
+ }
165
+
166
+ export const requestConfig = (method, url, payload) => {
167
+ const body = withCsrfToken(method, payload)
168
+
169
+ return {
170
+ method,
171
+ url,
172
+ data: method === 'post' ? body : null,
173
+ params: method === 'get' ? body : null,
174
+ }
175
+ }
149
176
 
150
177
  /** El usuario canceló una confirmación: no es un error que haya que contar. */
151
178
  export const isCancelled = (error) => ['RequestCancelledError', 'CanceledError'].includes(error?.name)
@@ -205,10 +205,8 @@ export default function useDataTable(props, { navigate = null, labels = core.DEF
205
205
  }
206
206
 
207
207
  try {
208
- const response = await axios(core.requestConfig(props.policyMethod, props.policyUrl, {
209
- _token: core.csrfToken(),
210
- id,
211
- }))
208
+ // El token CSRF lo pone requestConfig, solo si no viaja en la query.
209
+ const response = await axios(core.requestConfig(props.policyMethod, props.policyUrl, { id }))
212
210
 
213
211
  allowed.value = { ...allowed.value, [key]: response.data ?? {} }
214
212
  } catch {