@cccsaurora/howler-ui 2.12.0-dev.38 → 2.12.0-dev.39

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.
@@ -0,0 +1,209 @@
1
+ # Documentation du client Howler
2
+
3
+ Cette documentation explique comment interagir avec l'API howler en utilisant le client howler dans les environnements de développement Java et Python. Nous décrirons le processus de base de la création d'un nouveau hit dans chaque environnement ainsi que la recherche dans howler des hits correspondant à votre requête.
4
+
5
+ ## Mise en route
6
+
7
+ ### Installation
8
+
9
+ Afin d'utiliser le client howler, vous devez le lister comme une dépendance dans votre projet.
10
+
11
+ #### **Python**
12
+
13
+ Il suffit de l'installer à l'aide de pip:
14
+
15
+ ```bash
16
+ pip install howler-client
17
+ ```
18
+
19
+ Vous pouvez également l'ajouter à votre requirements.txt, ou à tout autre système de gestion des dépendances que vous utilisez.
20
+
21
+ ### Authentification
22
+
23
+ Comme indiqué dans la [Documentation sur l'authentification](/help/auth), les utilisateurs peuvent s'authentifier de différentes manières. Pour interfacer avec le client howler, cependant, le flux suggéré est d'utiliser une clé API. Avant de commencer, générons une clé.
24
+
25
+ 1. Ouvrez l'interface utilisateur Howler avec laquelle vous souhaitez vous interfacer.
26
+ 2. Connectez-vous, puis cliquez sur votre profil en haut à droite.
27
+ 3. Dans le menu utilisateur, cliquez sur Paramètres.
28
+ 4. Sous Sécurité de l'utilisateur, appuyez sur l'icône (+) sur la ligne Clés API.
29
+ 5. Nommez votre clé et donnez-lui les autorisations nécessaires.
30
+ 6. Appuyez sur Create (Créer) et copiez la chaîne fournie dans un endroit sûr. \*\*Vous ne reverrez plus cette chaîne.
31
+
32
+ Cette clé API sera fournie à votre code par la suite.
33
+
34
+ ## Client Python
35
+
36
+ Pour se connecter à howler en utilisant le client python, il y a un processus assez simple à suivre:
37
+
38
+ ```python
39
+ from howler_client import get_client
40
+
41
+ USERNAME = 'user' # Obtenez-le à partir de la page des paramètres de l'utilisateur de l'interface utilisateur de Howler.
42
+ APIKEY = 'apikey_name:apikey_data'
43
+
44
+ apikey = (USERNAME, APIKEY)
45
+
46
+ howler = get_client("$CURRENT_URL", apikey=apikey)
47
+ ```
48
+
49
+ Voilà, c'est fait ! Vous pouvez maintenant utiliser l'objet `howler` pour interagir avec le serveur. A quoi cela ressemble-t-il en réalité?
50
+
51
+ ### Créer des hits en Python
52
+
53
+ Pour le client python, vous pouvez créer des hits en utilisant les fonctions `howler.hit.create` ou `howler.hit.create_from_map`.
54
+
55
+ #### `create`
56
+
57
+ Cette fonction prend un seul argument - soit un hit unique, soit une liste de hits, conforme au [Howler Schema] (/help/hit?tab=schema). Voici un exemple simple :
58
+
59
+ ```python
60
+ # Quelques données bidons au format Howler Schema
61
+ exemple_hit = {
62
+ "howler" : {
63
+ "analytic" : "exemple",
64
+ "score" : 10.0
65
+ },
66
+ "event" : {
67
+ "reason" : "Exemple hit"
68
+ }
69
+ }
70
+
71
+ howler.hit.create(example_hit)
72
+ ```
73
+
74
+ Vous pouvez également ingérer des données dans un format plat :
75
+
76
+ ```python
77
+ example_hit = {
78
+ "howler.analytic": "example",
79
+ "howler.score": 10.0,
80
+ "event.reason": "Example hit"
81
+ }
82
+
83
+ howler.hit.create(example_hit)
84
+ ```
85
+
86
+ #### `create_from_map`
87
+
88
+ This function takes in three arguments:
89
+
90
+ - `tool name`: Le nom de l'outil d'analyse qui crée le hit
91
+ - `map`: Une correspondance entre les données brutes que vous avez et le schéma howler
92
+ - Le format est un dictionnaire où les clés sont le chemin aplati des données brutes, et les valeurs sont une liste de chemins aplatis pour les champs de Howler dans lesquels les données seront copiées.
93
+ - `documents`: Les données brutes que vous voulez ajouter à Howler.
94
+
95
+ Voici un exemple simple:
96
+
97
+ ```python
98
+ # La correspondance entre nos données et le schéma de Howler
99
+ hwl_map = {
100
+ "file.sha256": ["file.hash.sha256", "howler.hash"],
101
+ "file.name": ["file.name"],
102
+ "src_ip": ["source.ip", "related.ip"],
103
+ "dest_ip": ["destination.ip", "related.ip"],
104
+ "time.created": ["event.start"],
105
+ }
106
+
107
+ # Quelques fausses données dans un format personnalisé que nous voulons ajouter à howler
108
+ example_hit = {
109
+ "src_ip": "0.0.0.0",
110
+ "dest_ip": "8.8.8.8",
111
+ "file": {
112
+ "name": "hello.exe",
113
+ "sha256": sha256(str("hello.exe").encode()).hexdigest()
114
+ },
115
+ "time": {
116
+ "created": datetime.now().isoformat()
117
+ },
118
+ }
119
+
120
+ # Notez que le troisième argument est de type liste!
121
+ howler.hit.create_from_map("example_ingestor", hwl_map, [example_hit])
122
+ ```
123
+
124
+ ### Interroger les hits en Python
125
+
126
+ L'interrogation des hits avec le client python howler se fait en utilisant la fonction `howler.search.hit`. Elle possède un certain nombre d'arguments obligatoires et optionnels:
127
+
128
+ - Obligatoire:
129
+ - `query`: requête lucene (chaîne)
130
+ - Facultatif: `filters`: requête lucene (chaîne):
131
+ - `filters`: Requêtes lucene additionnelles utilisées pour filtrer les données (liste de chaînes)
132
+ - `fl`: Liste des champs à retourner (chaîne de champs séparés par des virgules)
133
+ - `offset`: Offset auquel les éléments de la requête doivent commencer (entier)
134
+ - `rows`: Nombre d'enregistrements à retourner (entier)
135
+ - `sort`: Champ utilisé pour le tri avec direction (chaîne: ex. 'id desc')
136
+ - `timeout`: Nombre maximum de millisecondes d'exécution de la requête (entier)
137
+ - `use_archive`: Interroge également l'archive
138
+ - `track_total_hits`: Nombre de hits à suivre (par défaut: 10k)
139
+
140
+ Voici quelques exemples de requêtes:
141
+
142
+ ```python
143
+ # Rechercher tous les hits créés par assemblyline, afficher les 50 premiers et ne renvoyer que leurs identifiants.
144
+ howler.search.hit("howler.analytic:assemblyline", fl="howler.id", rows=50)
145
+
146
+ # Recherche de toutes les occurrences résolues créées au cours des cinq derniers jours, avec indication de leur identifiant et de l'analyste qui les a créées. N'en afficher que dix, décalés de 40
147
+ howler.search.hit("howler.status:resolved", filters=['event.created:[now-5d TO now]'] fl="howler.id,howler.analytic", rows=10, offset=40)
148
+
149
+ # Recherche de tous les résultats, délai d'attente si la requête prend plus de 100 ms
150
+ howler.search.hit("howler.id:*", track_total_hits=100000000, timeout=100, use_archive=True)
151
+ ```
152
+
153
+ ### Mise à jour des résultats
154
+
155
+ Afin de mettre à jour les hits, il existe un certain nombre de fonctions supportées :
156
+
157
+ - `howler.hit.update(...)`
158
+ - `howler.hit.update_by_query(...)`
159
+ - `howler.hit.overwrite(...)`
160
+
161
+ #### `update()`
162
+
163
+ Si vous souhaitez mettre à jour un hit de manière transactionnelle, vous pouvez utiliser le code suivant:
164
+
165
+ ```python
166
+ hit_to_update = client.search.hit("howler.id:*", rows=1, sort="event.created desc")["items"][0]
167
+
168
+ result = client.hit.update(hit_to_update["howler"]["id"], [(UPDATE_SET, "howler.score", hit_to_update["howler"]["score"] + 100)])
169
+ ```
170
+
171
+ Les opérations suivantes peuvent être exécutées pour mettre à jour un résultat.
172
+
173
+ **Opérations de liste:**
174
+
175
+ - `UPDATE_APPEND` : Utilisé pour ajouter une valeur à une liste donnée
176
+ - `UPDATE_APPEND_IF_MISSING` : Utilisé pour ajouter une valeur à une liste donnée si la valeur n'est pas déjà dans la liste.
177
+ - `UPDATE_REMOVE` : Supprime une valeur donnée d'une liste
178
+
179
+ **Opérations numériques:**
180
+
181
+ - `UPDATE_DEC` : Diminue une valeur numérique de la quantité spécifiée.
182
+ - `UPDATE_INC` : Incrémente une valeur numérique de la quantité spécifiée.
183
+ - `UPDATE_MAX` : Fixe une valeur numérique au maximum de la valeur existante et de la valeur spécifiée.
184
+ - `UPDATE_MIN` : Fixe une valeur numérique au minimum de la valeur existante et de la valeur spécifiée.
185
+
186
+ **Opérations polyvalentes:**
187
+
188
+ - `UPDATE_SET` : Fixe la valeur d'un champ à la valeur donnée.
189
+ - `UPDATE_DELETE` : Supprime la valeur d'un champ donné
190
+
191
+ #### `update_by_query()`
192
+
193
+ Cette fonction vous permet de mettre à jour un grand nombre d'occurrences à l'aide d'une requête :
194
+
195
+ ```python
196
+ client.hit.update_by_query(f'howler.analytic : "Exemple d\'analytic"', [(UPDATE_INC, "howler.score", 100)])
197
+ ```
198
+
199
+ Les mêmes opérations que dans `update()` peuvent être utilisées.
200
+
201
+ ### `overwrite()`
202
+
203
+ Cette fonction vous permet d'écraser directement un hit avec un objet hit partiel. C'est la plus facile à utiliser, mais elle perd une partie de la validation et du traitement supplémentaire des fonctions de mise à jour.
204
+
205
+ ```python
206
+ hit_to_update = client.search.hit("howler.id:*", rows=1, sort="event.created desc")["items"][0]
207
+
208
+ result = client.hit.overwrite(hit_to_update["howler"]["id"], {"source.ip" : "127.0.0.1", “destination.ip” : "8.8.8.8"})
209
+ ```
@@ -0,0 +1,37 @@
1
+ # Liens du hit
2
+
3
+ Afin de faciliter l'ajout d'outils supplémentaires que l'on peut utiliser pour suivre un hit, Howler permet aux utilisateurs de spécifier un ensemble de liens, ainsi qu'un titre et une icône à afficher. Cette documentation vous expliquera comment utiliser ces liens.
4
+
5
+ ## Specification
6
+
7
+ Afin d'ajouter des liens, vous pouvez utiliser le champ `howler.links`. Ce champ contient une liste d'objets avec trois clés :
8
+
9
+ ```python
10
+ hit = {
11
+ "howler.links": [
12
+ {
13
+ "title": "Titre du lien avec image interne",
14
+ "href": "https://example.com",
15
+ # Notez qu'il s'agit d'une autre application, et non d'un lien vers une image.
16
+ "icon": "superset",
17
+ },
18
+ {
19
+ "title": "Titre du lien avec image externe",
20
+ "href": "https://www.britannica.com/animal/goose-bird",
21
+ # Notez qu'il s'agit d'un lien vers une image. Nous ne fournissons pas d'hébergement, vous devrez donc l'héberger ailleurs !
22
+ "icon": "https://cdn.britannica.com/76/76076-050-39DDCBA1/goose-Canada-North-America.jpg",
23
+ },
24
+ ]
25
+ }
26
+ ```
27
+
28
+ Notez que l'icône peut être soit :
29
+
30
+ 1. Un nom identifiant une application liée (à partir du sélecteur d'applications), afin d'utiliser son icône.
31
+ 2. Une URL externe
32
+
33
+ Si vous souhaitez utiliser une application liée, les valeurs suivantes sont actuellement prises en charge :
34
+
35
+ $APP_LIST
36
+
37
+ L'utilisation de l'une de ces valeurs entraîne automatiquement l'utilisation de l'icône correspondante. Inutile d'héberger la vôtre !
@@ -0,0 +1,157 @@
1
+ # Intégration de carnets
2
+
3
+ Howler offre la possibilité d'ajouter des carnets aux analyses afin de faciliter le triage des hits et des alertes. Il permet aux utilisateurs de créer rapidement un carnet dans un environnement Jupyter avec des informations analytiques et/ou des informations sur les hits.
4
+
5
+ Howler cherchera des variables à remplacer dans la première cellule de code d'un notebook, ce qui permettra de fournir un contexte dans les premières cellules à l'aide de markdown.
6
+
7
+ Voici un exemple de la façon dont Howler remplacera les variables dans votre carnet :
8
+
9
+ ```notebook tab="Modèle"
10
+ {
11
+ "cells": [
12
+ {
13
+ "cell_type": "code",
14
+ "id": "fe6f810f-2459-4ad7-92ac-1e925ce892d4",
15
+ "outputs": [],
16
+ "source": [
17
+ "HowlerHitId = \"{{hit.howler.id}}\"\n",
18
+ "HowlerAnalyticId = \"{{analytic.analytic_id}}\""
19
+ ]
20
+ },
21
+ {
22
+ "cell_type": "code",
23
+ "id": "586470ef-c8e6-45b1-bd17-17ccd083eef1",
24
+ "outputs": [],
25
+ "source": [
26
+ "from howler_client import get_client\n\n",
27
+ "howler = get_client(\"$CURRENT_URL\")\n",
28
+ "hit = howler.hit(howlerHitId)"
29
+ ]
30
+ }
31
+ ],
32
+ "nbformat": 4,
33
+ "nbformat_minor": 5
34
+ }
35
+ ```
36
+
37
+ ```notebook tab="Traité"
38
+ {
39
+ "cells": [
40
+ {
41
+ "cell_type": "code",
42
+ "id": "fe6f810f-2459-4ad7-92ac-1e925ce892d4",
43
+ "outputs": [],
44
+ "source": [
45
+ "HowlerHitId = \"7dxHCat0Y2Sj48qyU7ZkVV\"\n",
46
+ "HowlerAnalyticId = \"2SXKl6Cq4rOxWLps2SFHyB\""
47
+ ]
48
+ },
49
+ {
50
+ "cell_type": "code",
51
+ "id": "586470ef-c8e6-45b1-bd17-17ccd083eef1",
52
+ "outputs": [],
53
+ "source": [
54
+ "from howler_client import get_client\n\n",
55
+ "howler = get_client(\"$CURRENT_URL\")\n",
56
+ "hit = howler.hit(howlerHitId)"
57
+ ]
58
+ }
59
+ ],
60
+ "nbformat": 4,
61
+ "nbformat_minor": 5
62
+ }
63
+ ```
64
+
65
+ ou avec du markdown dans la première cellule :
66
+
67
+ ```notebook tab="Modèle"
68
+ {
69
+ "cells": [
70
+ {
71
+ "cell_type": "markdown",
72
+ "id": "e17cbaa8-9849-462f-9bd2-bf30943f76b3",
73
+ "source": [
74
+ "### Exemple de carnet"
75
+ ]
76
+ },
77
+ {
78
+ "cell_type": "code",
79
+ "id": "fe6f810f-2459-4ad7-92ac-1e925ce892d4",
80
+ "outputs": [],
81
+ "source": [
82
+ "HowlerHitId = \"{{hit.howler.id}}\"\n",
83
+ "HowlerAnalyticId = \"{{analytic.analytic_id}}\""
84
+ ]
85
+ },
86
+ {
87
+ "cell_type": "code",
88
+ "id": "586470ef-c8e6-45b1-bd17-17ccd083eef1",
89
+ "outputs": [],
90
+ "source": [
91
+ "from howler_client import get_client\n\n",
92
+ "howler = get_client(\"$CURRENT_URL\")\n",
93
+ "hit = howler.hit(howlerHitId)"
94
+ ]
95
+ }
96
+ ],
97
+ "nbformat": 4,
98
+ "nbformat_minor": 5
99
+ }
100
+ ```
101
+
102
+ ```notebook tab="Traité"
103
+ {
104
+ "cells": [
105
+ {
106
+ "cell_type": "markdown",
107
+ "id": "e17cbaa8-9849-462f-9bd2-bf30943f76b3",
108
+ "source": [
109
+ "### Exemple de carnet"
110
+ ]
111
+ },
112
+ {
113
+ "cell_type": "code",
114
+ "id": "fe6f810f-2459-4ad7-92ac-1e925ce892d4",
115
+ "outputs": [],
116
+ "source": [
117
+ "HowlerHitId = \"7dxHCat0Y2Sj48qyU7ZkVV\"\n",
118
+ "HowlerAnalyticId = \"2SXKl6Cq4rOxWLps2SFHyB\""
119
+ ]
120
+ },
121
+ {
122
+ "cell_type": "code",
123
+ "id": "586470ef-c8e6-45b1-bd17-17ccd083eef1",
124
+ "outputs": [],
125
+ "source": [
126
+ "from howler_client import get_client\n\n",
127
+ "howler = get_client(\"$CURRENT_URL\")\n",
128
+ "hit = howler.hit(howlerHitId)"
129
+ ]
130
+ }
131
+ ],
132
+ "nbformat": 4,
133
+ "nbformat_minor": 5
134
+ }
135
+ ```
136
+
137
+ Présentement, Howler n'essaiera de remplacer que les objets de hit et d'analytic.
138
+
139
+ # Conditions requises pour que l'intégration de carnets fonctionne
140
+
141
+ - Une configuration NBGallery fonctionnelle est nécessaire.
142
+ - Si l'utilisateur peut envoyer un carnet depuis NBGallery vers son environnement Jupyter, il fonctionnera aussi en utilisant le bouton open in jupyhub sur Howler.
143
+ - Comme pour NBGallery, l'utilisateur doit s'assurer que son environnement Jupyter est en cours d'exécution, sinon Howler ne parviendra pas à envoyer le carnet.
144
+
145
+ Howler ajoutera l'identifiant du Hit/Alert lorsqu'il enverra un carnet à Jupyter, ce qui facilitera son suivi pour l'analyse. Il est possible d'ouvrir un carnet à partir d'une page analytique. Dans ce cas, aucun identifiant de résultat ne sera ajouté au nom de fichier du carnet et Howler ne sera pas en mesure de remplacer les informations de hit dans le carnet modèle puisqu'aucun hit n'a été fourni.
146
+
147
+ # Ajout d'un carnet à une analyse
148
+
149
+ Pour ajouter un carnet à une analyse, il suffit de fournir le lien NBGallery du carnet. Le lien ressemblera à l'exemple ci-dessous. Le carnet ne doit pas être privé, sinon seul l'utilisateur qui l'a ajouté pourra l'utiliser sur Howler.
150
+
151
+ ```
152
+ $NBGALLERY_URL/notebooks/5-example
153
+ ```
154
+
155
+ ```alert
156
+ Il est conseillé d'effacer toutes les sorties d'un carnet avant de l'ajouter sur NBGallery afin d'éviter la fuite de données sensibles.
157
+ ```
@@ -0,0 +1,15 @@
1
+ # Rétention dans Howler
2
+
3
+ Afin de se conformer au règlement, Howler est configuré pour purger les alertes périmées après une période de temps spécifique. Dans cette instance, cette durée est `duration`.
4
+
5
+ Howler calcule s'il est temps de supprimer une alerte en fonction de la date `event.created` - une fois que celle-ci dépasse la date limite configurée, un travail automatisé nocturne supprimera l'alerte.
6
+
7
+ Afin de communiquer cela à l'utilisateur, voir l'exemple d'alerte ci-dessous :
8
+
9
+ `alert`
10
+
11
+ En haut à droite, le survol de l'horodatage indique le temps dont dispose l'utilisateur avant que l'alerte ne soit supprimée. Afin de se conformer au règlement, assurez-vous que `event.created` correspond à la date à laquelle les données sous-jacentes ont été collectées, ce qui permet à howler de s'assurer que les données sont purgées à temps.
12
+
13
+ ```alert
14
+ Cela va bientôt changer - il y aura un champ dédié à définir qui remplacera cette approche.
15
+ ```
@@ -0,0 +1,21 @@
1
+ # Schéma du hit
2
+
3
+ Un hit howler peut contenir un grand nombre de champs uniques, chacun avec une définition particulière, afin de rendre les hits mutuellement intelligibles d'une analyse à l'autre. Vous trouverez ci-dessous un tableau contenant tous les champs de résultats donnés, ainsi que leur type et une brève description de leur utilisation. Alors que la grande majorité des champs sont basés sur le schéma commun Elastic (voir [ici](https://www.elastic.co/guide/en/ecs/8.5/index.html) pour la documentation), il existe également des champs personnalisés pour Howler, et aussi des champs supplémentaires configurés par divers plugins Howler.
4
+
5
+ ## Champs Howler - Bonnes pratiques
6
+
7
+ Afin d'assurer une certaine cohérence entre les différents analytiques, il existe un certain nombre de champs dont le style est recommandé (mais pas obligatoire). Il s'agit notamment des champs suivants:
8
+
9
+ - `howler.analytic` : Indique l'analyse globale qui a généré le résultat. Par exemple, si le nom de votre analyse est Bad Guy Finder, vous pouvez définir ce champ à Bad Guy Finder. Exemples d'utilisation :
10
+
11
+ - Bad Guy Finder (correct)
12
+ - BadGuyFinder (acceptable, mais les espaces sont préférables)
13
+ - bad.guy.finder (incorrect, ne pas utiliser de points)
14
+ - bad_guy_finder (incorrect, n'utilisez pas de caractères de soulignement)
15
+ - en général, vous pouvez utiliser [cette regex](https://regexr.com/7ikco) pour valider le nom analytique que vous proposez
16
+
17
+ - `howler.detection` : Indique l'algorithme spécifique ou la partie de l'analyse qui a généré le hit. Par exemple, si votre analyse a trois façons de détecter les hits qui devraient être examinés (Voyage impossible, Informations de connexion incorrectes, Détection d'attaque XSS), alors la façon dont le hit que vous créez a été détecté devrait être définie. Exemples d'utilisation :
18
+ - Impossible Travel (correct)
19
+ - ImpossibleTravel (acceptable, mais les espaces sont préférables)
20
+ - impossible.travel (incorrect, ne pas utiliser de points)
21
+ - impossible_travel (incorrect, ne pas utiliser de caractères de soulignement)
@@ -0,0 +1,23 @@
1
+ # Modèles de Howler
2
+
3
+ Howler est, fondamentalement, une application qui permet aux analystes de trier les hits et les alertes. Afin de s'assurer que les analystes puissent le faire aussi efficacement que possible, nous voulons avoir la possibilité de présenter les données pertinentes pour une alerte donnée aux analystes d'une manière facile et compréhensible.
4
+
5
+ À cette fin, Howler permet aux analystes et aux ingénieurs de détection de créer des **modèles**, qui permettent à diverses analyses et à leurs détections de présenter des champs et des données pertinents pour le triage des alertes générées par cette analyse/détection. Par exemple, considérons deux alertes différentes, générées par deux détections différentes :
6
+
7
+ ```json
8
+ $ALERT_1
9
+ ```
10
+
11
+ ```json
12
+ $ALERT_2
13
+ ```
14
+
15
+ Notez que si les deux cartes partagent des champs similaires, elles diffèrent également. Nous voulons que chacune de ces cartes d'alerte présente des données différentes - pour cela, nous pouvons utiliser des modèles. Cela nous permet d'afficher les deux occurrences dans la même liste, mais avec des champs différents :
16
+
17
+ ===SPLIT===
18
+
19
+ Comme nous pouvons le voir, en spécifiant un modèle pour chacune des détections, des données différentes seront présentées à l'analyste.Pour ce faire, vous pouvez utiliser le créateur de modèles [ici]($CURRENT_URL/templates/view?type=personal).
20
+
21
+ ```alert
22
+ Notez que vous devez avoir ingéré des hits pour la paire analyse/détection donnée pour qu'elle apparaisse en tant qu'option dans l'interface utilisateur de création de modèle !
23
+ ```
@@ -0,0 +1,11 @@
1
+ # Vues
2
+
3
+ Les vues sont une fonctionnalité de Howler qui permet aux utilisateurs de créer des requêtes personnalisées par défaut à travers lesquelles ils peuvent organiser et trier les hits. Dans ce document, nous décrirons comment créer et interagir avec des vues.
4
+
5
+ ## Utilisation d'une vue
6
+
7
+ Vous pouvez utiliser les vues en accédant au gestionnaire de vues sous [Manage > Views](/views). En cliquant sur une vue, vous l'ouvrirez dans la page de recherche. Vous pouvez également utiliser l'icône `recherche` pour ouvrir la vue dans la page de recherche. Vous pouvez également modifier les vues qui vous appartiennent et les marquer comme favorites. Cela les affichera dans le menu déroulant `t(route.views.saved)` dans la barre latérale. En haut à droite, vous pouvez également choisir votre `t(route.views.manager.default)`, qui sera sélectionné par défaut lors de l'ouverture de la page d'alertes.
8
+
9
+ ## Créer des vues
10
+
11
+ Pour créer une vue, vous pouvez utiliser la page de création de vue, située [ici](/views/create). Cette page vous permet de modifier votre vue, de spécifier un `t(hit.search.sort.fields)` et un `t(hit.search.span)`, et de sauvegarder la vue avec un nom particulier. Vous pouvez marquer une vue comme globale ou personnelle, en fonction des personnes que vous souhaitez voir et utiliser.
package/package.json CHANGED
@@ -96,13 +96,13 @@
96
96
  "internal-slot": "1.0.7"
97
97
  },
98
98
  "type": "module",
99
- "version": "2.12.0-dev.38",
99
+ "version": "2.12.0-dev.39",
100
100
  "exports": {
101
101
  "./i18n": "./i18n.js",
102
102
  "./index.css": "./index.css",
103
103
  "./plugins/*": "./plugins/*.js",
104
104
  "./components/*": "./components/*.js",
105
- "./locales/*": "./locales/*.js",
105
+ "./locales/*": "./locales/*.json",
106
106
  "./api/*": "./api/*.js",
107
107
  "./api": "./api/index.js",
108
108
  "./rest/*": "./rest/*.js",
@@ -110,7 +110,10 @@
110
110
  "./models/*": "./models/*.js",
111
111
  "./commons/*": "./commons/*.js",
112
112
  "./branding/*": "./branding/*.js",
113
- "./utils/*": "./utils/*.js",
113
+ "./utils/*": [
114
+ "./utils/*.js",
115
+ "./utils/*.json"
116
+ ],
114
117
  "./components/logins/*": "./components/logins/*.js",
115
118
  "./components/app/*": "./components/app/*.js",
116
119
  "./components/routes/*": "./components/routes/*.js",
@@ -135,9 +138,9 @@
135
138
  "./components/routes/admin/*": "./components/routes/admin/*.js",
136
139
  "./components/routes/dossiers/*": "./components/routes/dossiers/*.js",
137
140
  "./components/routes/help/components/*": "./components/routes/help/components/*.js",
138
- "./components/routes/help/markdown/*": "./components/routes/help/markdown/*.js",
139
- "./components/routes/help/markdown/en/*": "./components/routes/help/markdown/en/*.js",
140
- "./components/routes/help/markdown/fr/*": "./components/routes/help/markdown/fr/*.js",
141
+ "./components/routes/help/markdown/*": "./components/routes/help/markdown/*.md",
142
+ "./components/routes/help/markdown/en/*": "./components/routes/help/markdown/en/*.md",
143
+ "./components/routes/help/markdown/fr/*": "./components/routes/help/markdown/fr/*.md",
141
144
  "./components/routes/action/view/*": "./components/routes/action/view/*.js",
142
145
  "./components/routes/action/shared/*": "./components/routes/action/shared/*.js",
143
146
  "./components/routes/action/edit/*": "./components/routes/action/edit/*.js",
@@ -154,7 +157,7 @@
154
157
  "./components/elements/display/modals/*": "./components/elements/display/modals/*.js",
155
158
  "./components/elements/display/features/*": "./components/elements/display/features/*.js",
156
159
  "./components/elements/display/handlebars/*": "./components/elements/display/handlebars/*.js",
157
- "./components/elements/display/markdownPlugins/*": "./components/elements/display/markdownPlugins/*.js",
160
+ "./components/elements/display/markdownPlugins/*": "./components/elements/display/markdownPlugins/*.md",
158
161
  "./components/elements/display/icons/*": "./components/elements/display/icons/*.js",
159
162
  "./components/elements/display/json/*": "./components/elements/display/json/*.js",
160
163
  "./components/elements/display/icons/svg/*": "./components/elements/display/icons/svg/*.js",
@@ -178,10 +181,10 @@
178
181
  "./components/elements/hit/outlines/*": "./components/elements/hit/outlines/*.js",
179
182
  "./components/elements/hit/actions/*": "./components/elements/hit/actions/*.js",
180
183
  "./components/elements/hit/outlines/al/*": "./components/elements/hit/outlines/al/*.js",
181
- "./locales/en/*": "./locales/en/*.js",
182
- "./locales/fr/*": "./locales/fr/*.js",
183
- "./locales/en/help/*": "./locales/en/help/*.js",
184
- "./locales/fr/help/*": "./locales/fr/help/*.js",
184
+ "./locales/en/*": "./locales/en/*.json",
185
+ "./locales/fr/*": "./locales/fr/*.json",
186
+ "./locales/en/help/*": "./locales/en/help/*.json",
187
+ "./locales/fr/help/*": "./locales/fr/help/*.json",
185
188
  "./api/analytic/*": "./api/analytic/*.js",
186
189
  "./api/analytic": "./api/analytic/index.js",
187
190
  "./api/auth/*": "./api/auth/*.js",