mirror of
https://github.com/ae-utbm/sith.git
synced 2025-07-13 21:39:23 +00:00
Compare commits
1 Commits
taiste
...
ia-explana
Author | SHA1 | Date | |
---|---|---|---|
c5193243a5 |
@ -4,13 +4,13 @@
|
|||||||
VERSION="$1"
|
VERSION="$1"
|
||||||
|
|
||||||
# Cleanup env vars for auto discovery mechanism
|
# Cleanup env vars for auto discovery mechanism
|
||||||
unset CPATH
|
export CPATH=
|
||||||
unset LIBRARY_PATH
|
export LIBRARY_PATH=
|
||||||
unset CFLAGS
|
export CFLAGS=
|
||||||
unset LDFLAGS
|
export LDFLAGS=
|
||||||
unset CCFLAGS
|
export CCFLAGS=
|
||||||
unset CXXFLAGS
|
export CXXFLAGS=
|
||||||
unset CPPFLAGS
|
export CPPFLAGS=
|
||||||
|
|
||||||
# prepare
|
# prepare
|
||||||
rm -rf "$VIRTUAL_ENV/packages"
|
rm -rf "$VIRTUAL_ENV/packages"
|
||||||
|
@ -1,38 +0,0 @@
|
|||||||
interface AlertParams {
|
|
||||||
success?: boolean;
|
|
||||||
duration?: number;
|
|
||||||
}
|
|
||||||
|
|
||||||
export class AlertMessage {
|
|
||||||
public open: boolean;
|
|
||||||
public success: boolean;
|
|
||||||
public content: string;
|
|
||||||
private timeoutId?: number;
|
|
||||||
private readonly defaultDuration: number;
|
|
||||||
|
|
||||||
constructor(params?: { defaultDuration: number }) {
|
|
||||||
this.open = false;
|
|
||||||
this.content = "";
|
|
||||||
this.timeoutId = null;
|
|
||||||
this.defaultDuration = params?.defaultDuration ?? 2000;
|
|
||||||
}
|
|
||||||
|
|
||||||
public display(message: string, params: AlertParams) {
|
|
||||||
this.clear();
|
|
||||||
this.open = true;
|
|
||||||
this.content = message;
|
|
||||||
this.success = params.success ?? true;
|
|
||||||
this.timeoutId = setTimeout(() => {
|
|
||||||
this.open = false;
|
|
||||||
this.timeoutId = null;
|
|
||||||
}, params.duration ?? this.defaultDuration);
|
|
||||||
}
|
|
||||||
|
|
||||||
public clear() {
|
|
||||||
if (this.timeoutId !== null) {
|
|
||||||
clearTimeout(this.timeoutId);
|
|
||||||
this.timeoutId = null;
|
|
||||||
}
|
|
||||||
this.open = false;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,5 +1,5 @@
|
|||||||
import type { Client, RequestResult, TDataShape } from "#openapi:client";
|
import type { Client, Options, RequestResult, TDataShape } from "@hey-api/client-fetch";
|
||||||
import { type Options, client } from "#openapi";
|
import { client } from "#openapi";
|
||||||
|
|
||||||
export interface PaginatedResponse<T> {
|
export interface PaginatedResponse<T> {
|
||||||
count: number;
|
count: number;
|
||||||
|
@ -2,10 +2,6 @@
|
|||||||
@import "devices";
|
@import "devices";
|
||||||
|
|
||||||
footer.bottom-links {
|
footer.bottom-links {
|
||||||
>section>a {
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (max-width: $small-devices) {
|
@media (max-width: $small-devices) {
|
||||||
margin-top: 0.6em;
|
margin-top: 0.6em;
|
||||||
padding: 1.25em;
|
padding: 1.25em;
|
||||||
|
@ -1,4 +1,3 @@
|
|||||||
import { AlertMessage } from "#core:utils/alert-message";
|
|
||||||
import { BasketItem } from "#counter:counter/basket";
|
import { BasketItem } from "#counter:counter/basket";
|
||||||
import type { CounterConfig, ErrorMessage } from "#counter:counter/types";
|
import type { CounterConfig, ErrorMessage } from "#counter:counter/types";
|
||||||
import type { CounterProductSelect } from "./components/counter-product-select-index.ts";
|
import type { CounterProductSelect } from "./components/counter-product-select-index.ts";
|
||||||
@ -6,9 +5,14 @@ import type { CounterProductSelect } from "./components/counter-product-select-i
|
|||||||
document.addEventListener("alpine:init", () => {
|
document.addEventListener("alpine:init", () => {
|
||||||
Alpine.data("counter", (config: CounterConfig) => ({
|
Alpine.data("counter", (config: CounterConfig) => ({
|
||||||
basket: {} as Record<string, BasketItem>,
|
basket: {} as Record<string, BasketItem>,
|
||||||
|
errors: [],
|
||||||
customerBalance: config.customerBalance,
|
customerBalance: config.customerBalance,
|
||||||
codeField: null as CounterProductSelect | null,
|
codeField: null as CounterProductSelect | null,
|
||||||
alertMessage: new AlertMessage({ defaultDuration: 2000 }),
|
alertMessage: {
|
||||||
|
content: "",
|
||||||
|
show: false,
|
||||||
|
timeout: null,
|
||||||
|
},
|
||||||
|
|
||||||
init() {
|
init() {
|
||||||
// Fill the basket with the initial data
|
// Fill the basket with the initial data
|
||||||
@ -73,10 +77,22 @@ document.addEventListener("alpine:init", () => {
|
|||||||
return total;
|
return total;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
showAlertMessage(message: string) {
|
||||||
|
if (this.alertMessage.timeout !== null) {
|
||||||
|
clearTimeout(this.alertMessage.timeout);
|
||||||
|
}
|
||||||
|
this.alertMessage.content = message;
|
||||||
|
this.alertMessage.show = true;
|
||||||
|
this.alertMessage.timeout = setTimeout(() => {
|
||||||
|
this.alertMessage.show = false;
|
||||||
|
this.alertMessage.timeout = null;
|
||||||
|
}, 2000);
|
||||||
|
},
|
||||||
|
|
||||||
addToBasketWithMessage(id: string, quantity: number) {
|
addToBasketWithMessage(id: string, quantity: number) {
|
||||||
const message = this.addToBasket(id, quantity);
|
const message = this.addToBasket(id, quantity);
|
||||||
if (message.length > 0) {
|
if (message.length > 0) {
|
||||||
this.alertMessage.display(message, { success: false });
|
this.showAlertMessage(message);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -93,9 +109,7 @@ document.addEventListener("alpine:init", () => {
|
|||||||
|
|
||||||
finish() {
|
finish() {
|
||||||
if (this.getBasketSize() === 0) {
|
if (this.getBasketSize() === 0) {
|
||||||
this.alertMessage.display(gettext("You can't send an empty basket."), {
|
this.showAlertMessage(gettext("You can't send an empty basket."));
|
||||||
success: false,
|
|
||||||
});
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
this.$refs.basketForm.submit();
|
this.$refs.basketForm.submit();
|
||||||
|
@ -167,7 +167,7 @@ document.addEventListener("alpine:init", () => {
|
|||||||
});
|
});
|
||||||
// if products to download are already in-memory, directly take them.
|
// if products to download are already in-memory, directly take them.
|
||||||
// If not, fetch them.
|
// If not, fetch them.
|
||||||
const products: ProductSchema[] =
|
const products =
|
||||||
this.nbPages > 1
|
this.nbPages > 1
|
||||||
? await paginated(productSearchProductsDetailed, this.getQueryParams())
|
? await paginated(productSearchProductsDetailed, this.getQueryParams())
|
||||||
: Object.values<ProductSchema[]>(this.products).flat();
|
: Object.values<ProductSchema[]>(this.products).flat();
|
||||||
|
@ -1,11 +1,15 @@
|
|||||||
import { AlertMessage } from "#core:utils/alert-message";
|
|
||||||
import Alpine from "alpinejs";
|
import Alpine from "alpinejs";
|
||||||
import { producttypeReorder } from "#openapi";
|
import { producttypeReorder } from "#openapi";
|
||||||
|
|
||||||
document.addEventListener("alpine:init", () => {
|
document.addEventListener("alpine:init", () => {
|
||||||
Alpine.data("productTypesList", () => ({
|
Alpine.data("productTypesList", () => ({
|
||||||
loading: false,
|
loading: false,
|
||||||
alertMessage: new AlertMessage({ defaultDuration: 2000 }),
|
alertMessage: {
|
||||||
|
open: false,
|
||||||
|
success: true,
|
||||||
|
content: "",
|
||||||
|
timeout: null,
|
||||||
|
},
|
||||||
|
|
||||||
async reorder(itemId: number, newPosition: number) {
|
async reorder(itemId: number, newPosition: number) {
|
||||||
// The sort plugin of Alpine doesn't manage dynamic lists with x-sort
|
// The sort plugin of Alpine doesn't manage dynamic lists with x-sort
|
||||||
@ -37,14 +41,23 @@ document.addEventListener("alpine:init", () => {
|
|||||||
},
|
},
|
||||||
|
|
||||||
openAlertMessage(response: Response) {
|
openAlertMessage(response: Response) {
|
||||||
const success = response.ok;
|
if (response.ok) {
|
||||||
const content = response.ok
|
this.alertMessage.success = true;
|
||||||
? gettext("Products types reordered!")
|
this.alertMessage.content = gettext("Products types reordered!");
|
||||||
: interpolate(
|
} else {
|
||||||
gettext("Product type reorganisation failed with status code : %d"),
|
this.alertMessage.success = false;
|
||||||
[response.status],
|
this.alertMessage.content = interpolate(
|
||||||
);
|
gettext("Product type reorganisation failed with status code : %d"),
|
||||||
this.alertMessage.display(content, { success: success });
|
[response.status],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
this.alertMessage.open = true;
|
||||||
|
if (this.alertMessage.timeout !== null) {
|
||||||
|
clearTimeout(this.alertMessage.timeout);
|
||||||
|
}
|
||||||
|
this.alertMessage.timeout = setTimeout(() => {
|
||||||
|
this.alertMessage.open = false;
|
||||||
|
}, 2000);
|
||||||
this.loading = false;
|
this.loading = false;
|
||||||
},
|
},
|
||||||
}));
|
}));
|
||||||
|
2
counter/static/bundled/counter/types.d.ts
vendored
2
counter/static/bundled/counter/types.d.ts
vendored
@ -1,4 +1,4 @@
|
|||||||
export type ErrorMessage = string;
|
type ErrorMessage = string;
|
||||||
|
|
||||||
export interface InitialFormData {
|
export interface InitialFormData {
|
||||||
/* Used to refill the form when the backend raises an error */
|
/* Used to refill the form when the backend raises an error */
|
||||||
|
108
docs/explanation/ia.md
Normal file
108
docs/explanation/ia.md
Normal file
@ -0,0 +1,108 @@
|
|||||||
|
Cette page expose la politique du Pôle informatique de l'AE
|
||||||
|
en ce qui concerne l'usage et l'implémentation de systèmes d'IA
|
||||||
|
dans le cadre de l'AE et du développement de ses outils.
|
||||||
|
|
||||||
|
## Cadre
|
||||||
|
|
||||||
|
En accord avec le règlement européen sur
|
||||||
|
l'intelligence artificielle du 13 juin 2024,
|
||||||
|
nous définissons comme IA :
|
||||||
|
|
||||||
|
> Un système basé sur une machine qui est
|
||||||
|
> conçu pour fonctionner avec différents niveaux d'autonomie
|
||||||
|
> et qui peut faire preuve d'adaptabilité après son déploiement,
|
||||||
|
> et qui, pour des objectifs explicites ou implicites, déduit,
|
||||||
|
> à partir des données qu'il reçoit,
|
||||||
|
> comment générer des résultats tels que des prédictions,
|
||||||
|
> du contenu, des recommandations ou des décisions
|
||||||
|
> qui peuvent influencer des environnements physiques ou virtuels.
|
||||||
|
|
||||||
|
Cette définition recouvre toutes les IAs génératives, ce qui inclut
|
||||||
|
ChatGPT, DeepSeek, Claude, Copilot, Llama et autres outils similaires.
|
||||||
|
|
||||||
|
## Utilisation dans le développement
|
||||||
|
|
||||||
|
!!!danger
|
||||||
|
La soumission de code généré par IA est strictement interdite.
|
||||||
|
|
||||||
|
Aucune contribution contenant du code généré par IA n'est acceptée.
|
||||||
|
Toute PR contenant en proportion significative du code duquel
|
||||||
|
on peut raisonnablement penser qu'il a été généré par IA
|
||||||
|
pourra être refusée sans aucun autre motif.
|
||||||
|
|
||||||
|
Bien que nous ne puissions pas l'interdire,
|
||||||
|
nous déconseillons également fortement l'usage de tout
|
||||||
|
recours à un système d'IA dans le processus de développement,
|
||||||
|
quel que soit son usage (debug, recherche d'information ou autres).
|
||||||
|
Référez-vous en priorité à la documentation du site,
|
||||||
|
à celle de Django et à l'aide des autres développeurs,
|
||||||
|
mais par pitié, ne faites jamais appel à l'IA.
|
||||||
|
|
||||||
|
## Intégration dans le site
|
||||||
|
|
||||||
|
L'intégration sur le site AE de systèmes d'IA
|
||||||
|
et de toute fonctionnalité basée sur des systèmes d'IA
|
||||||
|
est strictement prohibée, quel qu'en soit l'objectif.
|
||||||
|
|
||||||
|
Toute tâche de modération, de génération
|
||||||
|
ou de détection de contenu ne doit être accomplie
|
||||||
|
par des êtres humains ou par des algorithmes
|
||||||
|
déterministes, testés et compris.
|
||||||
|
|
||||||
|
L'usage des données du site a des fins d'entrainement d'IA,
|
||||||
|
ainsi que la transmission de ces données à un système d'IA
|
||||||
|
est strictement interdit.
|
||||||
|
Tout acte de cette nature sera considéré comme une violation
|
||||||
|
grave de la politique de gestion des données de l'AE.
|
||||||
|
|
||||||
|
## Motifs de cette politique
|
||||||
|
|
||||||
|
Le site AE est un programme écrit par des humains, pour des humains.
|
||||||
|
C'est un logiciel dont la complexité nécessite des connaissances
|
||||||
|
plus approfondies que ce qui est attendu de la part d'un
|
||||||
|
étudiant en TC ou en base branche.
|
||||||
|
À ce titre, l'interdiction de l'IA dans le cadre de son
|
||||||
|
développement est pensée avant tout dans une optique
|
||||||
|
de formation des développeurs, de stabilité de la base de code
|
||||||
|
et de transmission des connaissances.
|
||||||
|
|
||||||
|
Nous ferons ici abstraction de l'impact écologique néfaste de l'IA,
|
||||||
|
qui n'en reste pas moins préoccupant et qui renforce
|
||||||
|
les autres motifs ayant poussé à interdire l'IA dans le cadre de l'AE.
|
||||||
|
|
||||||
|
### Formation des développeurs
|
||||||
|
|
||||||
|
Travailler sur le site AE est possiblement le meilleur moyen de
|
||||||
|
monter en compétences en informatique pour un étudiant de l'UTBM.
|
||||||
|
Automatisation des tests, gestion des données et de la sécurité,
|
||||||
|
infrastructure, maintenance du code existant...
|
||||||
|
|
||||||
|
Le site AE est un logiciel complet, dont le développement
|
||||||
|
possède une dimension pédagogique réelle.
|
||||||
|
En utilisant l'IA, le développement n'est plus un moyen efficace
|
||||||
|
de se former.
|
||||||
|
|
||||||
|
### Stabilité de la base de code
|
||||||
|
|
||||||
|
Les développeurs du site AE sont pour la plupart en cours de formation,
|
||||||
|
sans compréhension globale de la base de code du site,
|
||||||
|
des outils logiciels sur lesquels il se base et des bonnes
|
||||||
|
pratiques permettant d'écrire du code viable.
|
||||||
|
|
||||||
|
En se reposant sur un système d'IA sans être capacité
|
||||||
|
de comprendre intégralement le code proposé ni de le mettre
|
||||||
|
en perspective avec le reste de la base de code,
|
||||||
|
c'est toute la maintenance de la base de code qui se retrouve compromise.
|
||||||
|
|
||||||
|
### Transmission des connaissances
|
||||||
|
|
||||||
|
L'équipe du pôle informatique se renouvelle très souvent.
|
||||||
|
À ce titre, les nouveaux développeurs se doivent d'hériter
|
||||||
|
d'une base de code viable.
|
||||||
|
Quant aux anciens développeurs, ils se doivent d'en avoir
|
||||||
|
compris le fonctionnement, afin d'être en mesure
|
||||||
|
de guider et d'aider leurs successeurs.
|
||||||
|
|
||||||
|
Comme développé dans les deux points précédents,
|
||||||
|
cet objectif est incompatible avec l'usage de systèmes d'IA.
|
||||||
|
|
@ -57,6 +57,7 @@ nav:
|
|||||||
- Accueil: explanation/index.md
|
- Accueil: explanation/index.md
|
||||||
- Technologies utilisées: explanation/technos.md
|
- Technologies utilisées: explanation/technos.md
|
||||||
- Conventions: explanation/conventions.md
|
- Conventions: explanation/conventions.md
|
||||||
|
- Politique IA: explanation/ia.md
|
||||||
- Archives: explanation/archives.md
|
- Archives: explanation/archives.md
|
||||||
- Tutoriels:
|
- Tutoriels:
|
||||||
- Installer le projet: tutorial/install.md
|
- Installer le projet: tutorial/install.md
|
||||||
|
8
package-lock.json
generated
8
package-lock.json
generated
@ -48,7 +48,6 @@
|
|||||||
"@types/cytoscape-cxtmenu": "^3.4.4",
|
"@types/cytoscape-cxtmenu": "^3.4.4",
|
||||||
"@types/cytoscape-klay": "^3.1.4",
|
"@types/cytoscape-klay": "^3.1.4",
|
||||||
"@types/jquery": "^3.5.31",
|
"@types/jquery": "^3.5.31",
|
||||||
"@types/js-cookie": "^3.0.6",
|
|
||||||
"typescript": "^5.8.3",
|
"typescript": "^5.8.3",
|
||||||
"vite": "^6.2.5",
|
"vite": "^6.2.5",
|
||||||
"vite-bundle-visualizer": "^1.2.1",
|
"vite-bundle-visualizer": "^1.2.1",
|
||||||
@ -2866,13 +2865,6 @@
|
|||||||
"@types/sizzle": "*"
|
"@types/sizzle": "*"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@types/js-cookie": {
|
|
||||||
"version": "3.0.6",
|
|
||||||
"resolved": "https://registry.npmjs.org/@types/js-cookie/-/js-cookie-3.0.6.tgz",
|
|
||||||
"integrity": "sha512-wkw9yd1kEXOPnvEeEV1Go1MmxtBJL0RR79aOTAApecWFVu7w0NNXNqhcWgvw2YgZDYadliXkl14pa3WXw5jlCQ==",
|
|
||||||
"dev": true,
|
|
||||||
"license": "MIT"
|
|
||||||
},
|
|
||||||
"node_modules/@types/json-schema": {
|
"node_modules/@types/json-schema": {
|
||||||
"version": "7.0.15",
|
"version": "7.0.15",
|
||||||
"resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
|
"resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
|
||||||
|
@ -10,7 +10,7 @@
|
|||||||
"openapi": "openapi-ts",
|
"openapi": "openapi-ts",
|
||||||
"analyse-dev": "vite-bundle-visualizer --mode development",
|
"analyse-dev": "vite-bundle-visualizer --mode development",
|
||||||
"analyse-prod": "vite-bundle-visualizer --mode production",
|
"analyse-prod": "vite-bundle-visualizer --mode production",
|
||||||
"check": "tsc && biome check --write"
|
"check": "biome check --write"
|
||||||
},
|
},
|
||||||
"keywords": [],
|
"keywords": [],
|
||||||
"author": "",
|
"author": "",
|
||||||
@ -30,10 +30,9 @@
|
|||||||
"@hey-api/openapi-ts": "^0.73.0",
|
"@hey-api/openapi-ts": "^0.73.0",
|
||||||
"@rollup/plugin-inject": "^5.0.5",
|
"@rollup/plugin-inject": "^5.0.5",
|
||||||
"@types/alpinejs": "^3.13.10",
|
"@types/alpinejs": "^3.13.10",
|
||||||
|
"@types/jquery": "^3.5.31",
|
||||||
"@types/cytoscape-cxtmenu": "^3.4.4",
|
"@types/cytoscape-cxtmenu": "^3.4.4",
|
||||||
"@types/cytoscape-klay": "^3.1.4",
|
"@types/cytoscape-klay": "^3.1.4",
|
||||||
"@types/jquery": "^3.5.31",
|
|
||||||
"@types/js-cookie": "^3.0.6",
|
|
||||||
"typescript": "^5.8.3",
|
"typescript": "^5.8.3",
|
||||||
"vite": "^6.2.5",
|
"vite": "^6.2.5",
|
||||||
"vite-bundle-visualizer": "^1.2.1",
|
"vite-bundle-visualizer": "^1.2.1",
|
||||||
|
@ -92,7 +92,7 @@ docs = [
|
|||||||
default-groups = ["dev", "tests", "docs"]
|
default-groups = ["dev", "tests", "docs"]
|
||||||
|
|
||||||
[tool.xapian]
|
[tool.xapian]
|
||||||
version = "1.4.29"
|
version = "1.4.25"
|
||||||
|
|
||||||
[tool.ruff]
|
[tool.ruff]
|
||||||
output-format = "concise" # makes ruff error logs easier to read
|
output-format = "concise" # makes ruff error logs easier to read
|
||||||
|
@ -83,6 +83,7 @@ document.addEventListener("alpine:init", () => {
|
|||||||
|
|
||||||
Alpine.data("pictureUpload", (albumId: number) => ({
|
Alpine.data("pictureUpload", (albumId: number) => ({
|
||||||
errors: [] as string[],
|
errors: [] as string[],
|
||||||
|
pictures: [],
|
||||||
sending: false,
|
sending: false,
|
||||||
progress: null as HTMLProgressElement,
|
progress: null as HTMLProgressElement,
|
||||||
|
|
||||||
|
@ -1,4 +1,3 @@
|
|||||||
import type { UserAjaxSelect } from "#core:core/components/ajax-select-index";
|
|
||||||
import { paginated } from "#core:utils/api";
|
import { paginated } from "#core:utils/api";
|
||||||
import { exportToHtml } from "#core:utils/globals";
|
import { exportToHtml } from "#core:utils/globals";
|
||||||
import { History } from "#core:utils/history";
|
import { History } from "#core:utils/history";
|
||||||
@ -131,7 +130,7 @@ exportToHtml("loadViewer", (config: ViewerConfig) => {
|
|||||||
currentPicture: {
|
currentPicture: {
|
||||||
// biome-ignore lint/style/useNamingConvention: api is in snake_case
|
// biome-ignore lint/style/useNamingConvention: api is in snake_case
|
||||||
is_moderated: true,
|
is_moderated: true,
|
||||||
id: null as number,
|
id: null,
|
||||||
name: "",
|
name: "",
|
||||||
// biome-ignore lint/style/useNamingConvention: api is in snake_case
|
// biome-ignore lint/style/useNamingConvention: api is in snake_case
|
||||||
display_name: "",
|
display_name: "",
|
||||||
@ -143,7 +142,7 @@ exportToHtml("loadViewer", (config: ViewerConfig) => {
|
|||||||
full_size_url: "",
|
full_size_url: "",
|
||||||
owner: "",
|
owner: "",
|
||||||
date: new Date(),
|
date: new Date(),
|
||||||
identifications: [] as IdentifiedUserSchema[],
|
identifications: [],
|
||||||
},
|
},
|
||||||
/**
|
/**
|
||||||
* The picture which will be displayed next if the user press the "next" button
|
* The picture which will be displayed next if the user press the "next" button
|
||||||
@ -156,7 +155,7 @@ exportToHtml("loadViewer", (config: ViewerConfig) => {
|
|||||||
/**
|
/**
|
||||||
* The select2 component used to identify users
|
* The select2 component used to identify users
|
||||||
**/
|
**/
|
||||||
selector: undefined as UserAjaxSelect,
|
selector: undefined,
|
||||||
/**
|
/**
|
||||||
* Error message when a moderation operation fails
|
* Error message when a moderation operation fails
|
||||||
**/
|
**/
|
||||||
|
@ -14,7 +14,6 @@
|
|||||||
"types": ["jquery", "alpinejs"],
|
"types": ["jquery", "alpinejs"],
|
||||||
"paths": {
|
"paths": {
|
||||||
"#openapi": ["./staticfiles/generated/openapi/client/index.ts"],
|
"#openapi": ["./staticfiles/generated/openapi/client/index.ts"],
|
||||||
"#openapi:*": ["./staticfiles/generated/openapi/client/*"],
|
|
||||||
"#core:*": ["./core/static/bundled/*"],
|
"#core:*": ["./core/static/bundled/*"],
|
||||||
"#pedagogy:*": ["./pedagogy/static/bundled/*"],
|
"#pedagogy:*": ["./pedagogy/static/bundled/*"],
|
||||||
"#counter:*": ["./counter/static/bundled/*"],
|
"#counter:*": ["./counter/static/bundled/*"],
|
||||||
|
Reference in New Issue
Block a user