Files
Classeo/frontend/eslint.config.js
Mathias STRASSER 76e16db0d8 feat: Pagination et recherche des sections admin
Les listes admin (utilisateurs, classes, matières, affectations) chargeaient
toutes les données d'un coup, ce qui dégradait l'expérience avec un volume
croissant. La pagination côté serveur existait dans la config API Platform
mais aucun Provider ne l'exploitait.

Cette implémentation ajoute la pagination serveur (30 items/page, max 100)
avec recherche textuelle sur toutes les sections, des composants frontend
réutilisables (Pagination + SearchInput avec debounce), et la synchronisation
URL pour le partage de liens filtrés.

Les Query valident leurs paramètres (clamp page/limit, trim search) pour
éviter les abus. Les affectations utilisent des lookup maps pour résoudre
les noms sans N+1 queries. Les pages admin gèrent les race conditions
via AbortController.
2026-02-15 13:54:51 +01:00

110 lines
2.2 KiB
JavaScript

import js from '@eslint/js';
import tseslint from 'typescript-eslint';
import sveltePlugin from 'eslint-plugin-svelte';
import svelteParser from 'svelte-eslint-parser';
import prettier from 'eslint-config-prettier';
export default tseslint.config(
// Base JavaScript recommended rules
js.configs.recommended,
// TypeScript recommended rules
...tseslint.configs.recommended,
// Global ignores
{
ignores: [
'.svelte-kit/**',
'build/**',
'dist/**',
'node_modules/**',
'*.config.js',
'*.config.ts'
]
},
// TypeScript files
{
files: ['**/*.ts'],
languageOptions: {
parserOptions: {
sourceType: 'module',
ecmaVersion: 2020
},
globals: {
window: 'readonly',
document: 'readonly',
console: 'readonly',
process: 'readonly',
__dirname: 'readonly',
__filename: 'readonly',
Promise: 'readonly',
Set: 'readonly',
Map: 'readonly'
}
},
rules: {
'@typescript-eslint/no-unused-vars': [
'error',
{
argsIgnorePattern: '^_',
varsIgnorePattern: '^_'
}
],
'no-console': ['warn', { allow: ['warn', 'error'] }]
}
},
// Svelte files
{
files: ['**/*.svelte'],
languageOptions: {
parser: svelteParser,
parserOptions: {
parser: tseslint.parser,
sourceType: 'module',
ecmaVersion: 2020,
extraFileExtensions: ['.svelte']
},
globals: {
window: 'readonly',
document: 'readonly',
console: 'readonly',
process: 'readonly',
Promise: 'readonly',
Set: 'readonly',
Map: 'readonly',
Event: 'readonly',
SubmitEvent: 'readonly',
fetch: 'readonly',
HTMLDivElement: 'readonly',
setInterval: 'readonly',
clearInterval: 'readonly',
URLSearchParams: 'readonly',
HTMLInputElement: 'readonly',
KeyboardEvent: 'readonly',
AbortController: 'readonly',
DOMException: 'readonly',
setTimeout: 'readonly',
clearTimeout: 'readonly'
}
},
plugins: {
svelte: sveltePlugin
},
rules: {
...sveltePlugin.configs.recommended.rules,
'@typescript-eslint/no-unused-vars': [
'error',
{
argsIgnorePattern: '^_',
varsIgnorePattern: '^_'
}
]
}
},
// Prettier (disable conflicting rules)
prettier
);