# Helper per i dati: QUERIFY, STRINGIFY, ENCRYPT, FN, CL, TRANSLATE, UNAUTHORIZED e Thelpers

> Costruisci stringhe di query, scrivi JSON senza ciò che non vuoi, codifica un valore con una chiave, compila un'espressione, carica liste di valori, traduci testi, controlla permessi e aggiungi helper ai template.

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

- `QUERIFY([url], object)` costruisce una stringa di query: i valori `null` sono saltati, gli array sono uniti con virgole, le date diventano testi ISO e tutto è codificato. Con un url viene aggiunta ad esso (`?` o `&`), anche dopo un metodo come in `'POST /api/x'`.
- `STRINGIFY(object, [compress], [fields])` è `JSON.stringify()` con due opzioni: `compress: true` omette testi vuoti, `null` e `false`, e rifila i testi; `fields` è una lista dei nomi che si mantengono, una funzione `(key, value)` che decide, o un oggetto dove `name: false` omette un campo.
- `ENCRYPT(value, [key], [type])` trasforma un testo o un oggetto in un testo esadecimale che termina con un controllo della chiave, e `DECRYPT(text, [key], [type])` restituisce il valore, o `undefined` quando la chiave o il tipo non coincidono. **È un'offuscazione per il browser, non sicurezza:** chiunque può leggerlo senza la chiave.
- `FN('n => n * 2')` compila un'espressione in una funzione e la ricorda; senza `=>` il testo è il corpo e l'argomento si chiama `value`.
- `NOOP`, `EMPTYARRAY` e `EMPTYOBJECT` (congelati: non si possono cambiare per errore), `MONTHS` e `DAYS` (i nomi in inglese) e `NOW` (un `Date` che jComponent tiene aggiornato).
- **Liste di codici:** `CLINIT(name, function(next) {}, [expire], [init])` registra una lista che `function` carica (chiama `next(value)`; con un testo al posto di una funzione, un indirizzo come `GET /api/countries/`). `CL('a,b', callback)` carica le liste non caricate e memorizza ciascuna in `DEF.cl.<name>` (e nello stato a quel percorso); `CLRELOAD(name, callback)` le ricarica.
- **Traduzione:** `LOCALIZE(text)` carica un dizionario nel formato dei file di risorse di Total.js (`key : translation`, uno per riga, `//` per i commenti) e `TRANSLATE(text)` sostituisce ogni `@(text)` con la sua traduzione (lo stesso testo se non ce n'è). La chiave è `T` più l'`HASH()` del testo in base 36.
- `UNAUTHORIZED(...names)` restituisce `false` quando `window.user` ha uno dei permessi (`user.permissions` o `user.roles`, una lista o un oggetto) o è `sa` / `su`, e `true` altrimenti (anche quando non c'è utente).
- `Thelpers` (lo stesso oggetto di `Tangular.helpers`, e `Ta` è `Tangular`) contiene gli helper dei template: aggiungine uno con `Thelpers.name = function(value, ...arguments)`, dove `this` è il modello, e usalo come `{{ 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>
```
