Cette documentation décrit le composant de formulaire dynamique utilisé dans les applications avec NestJS et Mongoose, en utilisant des composants du framework Quasar. Le formulaire est construit dynamiquement à partir d’une configuration JSON.
Ce fichier json est stocké dans la base de données et est récupéré par l’API pour construire le formulaire, tout est géré dans le module nestjs /tickets/form
title
string
"title": "Creation de ticket"
description
string
"description": "Veuillez remplir le formulaire ci-dessous pour créer un nouveau ticket."
type
number
"type": 1
defaultValues
object
"defaultValues": { "lifestep": 1 }
sections
object
label
: Nom de la section.type
: Type de la section (similaire au type de formulaire).description
: Description de la section.icon
: Icône représentant la section.fields
: Champs de la section."sections": {
"envelope": {
"label": "Enveloppe",
"type": 0,
"description": "Veuillez remplir les champs ci-dessous pour créer une nouvelle enveloppe.",
"icon": "mdi-email",
"fields": {
// Définition des champs ici...
}
}
}
Chaque champ dans fields est un objet avec les propriétés suivantes :
component
: Type de composant Quasar à utiliser (par exemple, autocomplete).label
: Étiquette du champ.model-value
: Chemin de liaison de données pour le champ.row et col
: Positionnement du champ dans une grille.attrsOnDefault
, attrsOnCreate
, attrsOnRead
, attrsOnUpdate
, attrsOnDelete
: Objets définissant les attributs et comportements du champ dans différents états. Pour connaître les attributs disponibles, consultez la documentation de Quasar Framework. Les composants disponibles sont les suivants :
"senders": {
"component": "autocomplete",
"label": "Appelant",
"model-value": "envelope.senders",
"attrsOnDefault": {
"filled": true,
"dense": true,
// Autres attributs...
},
"attrsOnCreate": {
// Autres attributs...
},
"attrsOnRead": {
"disable": true
// Autres attributs...
},
"attrsOnUpdate": {
// Autres attributs...
},
"attrsOnDelete": {
"disable": true
// Autres attributs...
},
"row": 1,
"col": 4
}
submitButtonText
: Texte du bouton de soumission.submitApiUrl
: URL à appeler lors de la soumission du formulaire.redirectUrl
: URL de redirection après la soumission, l’id de la nouvelle entrée est automatiquement ajoutée a la fin de l’url.{
"title": "Creation de ticket",
"description": "Veuillez remplir le formulaire ci-dessous pour créer un nouveau ticket.",
"type": 1,
"defaultValues": {
"lifestep": 1
},
"sections": {
"envelope": {
"label": "Enveloppe",
"type": 0,
"description": "Veuillez remplir les champs ci-dessous pour créer une nouvelle enveloppe.",
"icon": "mdi-email",
"fields": {
"senders": {
"component": "autocomplete",
"label": "Appelant",
"model-value": "envelope.senders",
"attrsOnDefault": {
"apiUrl": "/core/entities",
"optionLabel": "name",
"modelLabel": "name",
"searchField": "profile.commonName",
"dense": true,
"multiple": true,
"filled": true,
"transformKeys": {
"_id": "id",
"profile.commonName": "name",
"type": "type"
}
},
"row": 1,
"col": 4,
"attrsOnCreate": {
"disable": false
},
"attrsOnRead": {
"disable": true
},
"attrsOnUpdate": {
"disable": false
},
"attrsOnDelete": {
"disable": true
}
},
"observers": {
"component": "autocomplete",
"label": "Concernés",
"model-value": "envelope.observers",
"attrsOnDefault": {
"apiUrl": "/core/entities",
"optionLabel": "name",
"modelLabel": "name",
"searchField": "profile.commonName",
"dense": true,
"multiple": true,
"filled": true,
"transformKeys": {
"_id": "id",
"profile.commonName": "name",
"type": "type"
}
},
"row": 1,
"col": 4,
"attrsOnCreate": {},
"attrsOnRead": {
"disable": true
},
"attrsOnUpdate": {},
"attrsOnDelete": {
"disable": true
}
},
"assigned": {
"component": "autocomplete",
"label": "Assignés",
"model-value": "envelope.assigned",
"attrsOnDefault": {
"apiUrl": "/core/entities",
"optionLabel": "name",
"searchField": "profile.commonName",
"modelLabel": "name",
"dense": true,
"multiple": true,
"filled": true,
"additionalFilters": [
{
"field": "type",
"value": 2,
"operator": "<=#"
}
],
"transformKeys": {
"_id": "id",
"profile.commonName": "name",
"type": "type"
}
},
"row": 1,
"col": 4,
"attrsOnCreate": {},
"attrsOnRead": {
"disable": true
},
"attrsOnUpdate": {},
"attrsOnDelete": {
"disable": true
}
}
}
},
"infos": {
"label": "Informations",
"type": 0,
"description": "Veuillez remplir les champs ci-dessous pour renseigner les informations du ticket.",
"icon": "mdi-information",
"fields": {
"subject": {
"component": "input",
"label": "Sujet",
"model-value": "subject",
"row": 1,
"col": 12,
"attrsOnDefault": {
"dense": true,
"filled": true
},
"attrsOnCreate": {},
"attrsOnRead": {
"disable": true
},
"attrsOnUpdate": {},
"attrsOnDelete": {
"disable": true
}
},
"project": {
"component": "autocomplete",
"label": "Projet(s)",
"model-value": "project",
"row": 2,
"col": 6,
"attrsOnDefault": {
"apiUrl": "/core/project",
"optionLabel": "name",
"modelLabel": "name",
"searchField": "name",
"dense": true,
"multiple": true,
"filled": true,
"transformKeys": {
"_id": "id",
"name": "name"
}
},
"attrsOnCreate": {},
"attrsOnRead": {
"disable": true
},
"attrsOnUpdate": {},
"attrsOnDelete": {
"disable": true
}
},
"priority": {
"component": "select",
"label": "Priorité",
"model-value": "priority",
"row": 3,
"col": 6,
"attrsOnDefault": {
"options": [
{
"id": "612345678901234567890123",
"name": "Low"
},
{
"id": "712345678901234567890123",
"name": "Normal"
},
{
"id": "812345678901234567890123",
"name": "High"
},
{
"id": "912345678901234567890123",
"name": "Urgent"
}
],
"option-label": "name",
"dense": true,
"filled": true
},
"attrsOnCreate": {},
"attrsOnRead": {
"disable": true
},
"attrsOnUpdate": {},
"attrsOnDelete": {
"disable": true
}
},
"impact": {
"component": "select",
"label": "Impact",
"model-value": "impact",
"row": 3,
"col": 6,
"attrsOnDefault": {
"options": [
{
"id": "612345678901234567890123",
"name": "Low"
},
{
"id": "712345678901234567890123",
"name": "Medium"
},
{
"id": "812345678901234567890123",
"name": "High"
},
{
"id": "912345678901234567890123",
"name": "Critical"
}
],
"option-label": "name",
"dense": true,
"filled": true
},
"attrsOnCreate": {},
"attrsOnRead": {
"disable": true
},
"attrsOnUpdate": {},
"attrsOnDelete": {
"disable": true
}
},
"sla": {
"component": "autocomplete",
"label": "SLA",
"model-value": "sla",
"row": 2,
"col": 6,
"attrsOnDefault": {
"apiUrl": "/tickets/sla",
"optionLabel": "name",
"modelLabel": "name",
"searchField": "name",
"dense": true,
"multiple": true,
"filled": true,
"transformKeys": {
"_id": "id",
"name": "name"
}
},
"attrsOnCreate": {},
"attrsOnRead": {
"disable": true
},
"attrsOnUpdate": {},
"attrsOnDelete": {
"disable": true
}
},
"type": {
"component": "select",
"label": "Type",
"model-value": "type",
"row": 3,
"col": 6,
"attrsOnDefault": {
"options": [
{
"value": 1,
"name": "Incident"
},
{
"value": 2,
"name": "Demande"
}
],
"option-label": "name",
"emit-value": true,
"options-map": true,
"dense": true,
"filled": true
},
"attrsOnCreate": {},
"attrsOnRead": {
"disable": true
},
"attrsOnUpdate": {},
"attrsOnDelete": {
"disable": true
}
}
}
}
},
"submitButtonText": "Soumettre le formulaire",
"submitApiUrl": "/tickets/ticket",
"redirectUrl": "/ticket"
}
builder.vue
Le composant builder.vue
est un constructeur de formulaires dynamique utilisant les composants du Framework Quasar. Il est conçu pour les opérations CRUD (Créer, Lire, Mettre à jour, Supprimer) et prend en charge différents types de champs et de dispositions.
reset
, resetValidation
et submit
pour les interactions avec le formulaire.submit
avec les données du formulaire.tk-form-type.vue
Composant pour rendre différents types de dispositions de formulaire : base
, stepper
, tabs
.
type
.type
.tk-form-stepper
Un composant de type stepper pour naviguer à travers différentes sections de formulaire.
sections
.tk-form-tabs
Disposition de formulaire basée sur des onglets pour organiser les sections de formulaire.
tk-form-base
Disposition de formulaire de base avec un système de grille pour le placement des champs.
.row
pour organiser les champs en lignes.fields
.FormTypes
Définit différents types de dispositions de formulaire : Base, Étapes, Onglets. ‘BASE’ = 0, ‘STEPS’ = 1, ‘TABS’ = 2,
CRUDMode
Définit les opérations CRUD : Créer, Lire, Mettre à jour.
TicketFormField
et TicketFormSection
Types définissant la structure des champs de formulaire et des sections.