# Aides pour les données : QUERIFY, STRINGIFY, ENCRYPT, FN, CL, TRANSLATE, UNAUTHORIZED et Thelpers

> Construisez des chaînes de requête, écrivez du JSON sans ce que vous ne voulez pas, encodez une valeur avec une clé, compilez une expression, chargez des listes de valeurs, traduisez des textes, vérifiez des permissions et ajoutez des aides aux modèles.

Framework: jcomponent20
Product: jComponent 20 (jcomponent@20)
Language: fr
Content-SHA256: fc721ec69e3cc4338cf9fb55a49ea5bb0701eabdb19dfd1e791a10ab4b224051
Snapshot: c0700e321579725c5cf4f5ace1ad7d2866d1b4f93c24a63c0b41b6b7998e976c
Sources: jcomponent20@3fedd009a277f50fddc608b97afbec553b67c51b
Review: not-recorded

- `QUERIFY([url], object)` construit une chaîne de requête : les valeurs `null` sont ignorées, les tableaux sont joints par des virgules, les dates deviennent des textes ISO et tout est encodé. Avec une url, elle y est ajoutée (`?` ou `&`), aussi après une méthode comme dans `'POST /api/x'`.
- `STRINGIFY(object, [compress], [fields])` est `JSON.stringify()` avec deux options : `compress: true` omet les textes vides, `null` et `false`, et rogne les textes ; `fields` est une liste des noms conservés, une fonction `(key, value)` qui décide, ou un objet où `name: false` omet un champ.
- `ENCRYPT(value, [key], [type])` transforme un texte ou un objet en texte hexadécimal qui se termine par une vérification de la clé, et `DECRYPT(text, [key], [type])` rend la valeur, ou `undefined` quand la clé ou le type ne sont pas les mêmes. **C'est une obfuscation pour le navigateur, pas de la sécurité :** n'importe qui peut le lire sans la clé.
- `FN('n => n * 2')` compile une expression en fonction et la mémorise ; sans `=>` le texte est le corps et l'argument s'appelle `value`.
- `NOOP`, `EMPTYARRAY` et `EMPTYOBJECT` (gelés : on ne peut pas les modifier par erreur), `MONTHS` et `DAYS` (les noms en anglais) et `NOW` (un `Date` que jComponent tient à jour).
- **Listes de codes :** `CLINIT(name, function(next) {}, [expire], [init])` enregistre une liste que `function` charge (elle appelle `next(value)` ; avec un texte au lieu d'une fonction, une adresse comme `GET /api/countries/`). `CL('a,b', callback)` charge les listes qui ne le sont pas et stocke chacune dans `DEF.cl.<name>` (et dans l'état à ce chemin) ; `CLRELOAD(name, callback)` les recharge.
- **Traduction :** `LOCALIZE(text)` charge un dictionnaire au format des fichiers de ressources de Total.js (`key : translation`, un par ligne, `//` pour les commentaires) et `TRANSLATE(text)` remplace chaque `@(text)` par sa traduction (le même texte s'il n'y en a pas). La clé est `T` plus le `HASH()` du texte en base 36.
- `UNAUTHORIZED(...names)` renvoie `false` quand `window.user` a l'une des permissions (`user.permissions` ou `user.roles`, une liste ou un objet) ou est `sa` / `su`, et `true` sinon (aussi quand il n'y a pas d'utilisateur).
- `Thelpers` (le même objet que `Tangular.helpers`, et `Ta` est `Tangular`) contient les aides des modèles : ajoutez-en une avec `Thelpers.name = function(value, ...arguments)`, où `this` est le modèle, et utilisez-la comme `{{ value | name(argument) }}`.

```html public/index.html
<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8" />
	<title>jComponent</title>
	<link rel="stylesheet" href="//cdn.componentator.com/spa.min@20.css" />
	<script src="//cdn.componentator.com/spa.min@20.js"></script>
</head>
<body>
	<p class="out"></p>
</body>
</html>
```
