@blackcube/aurelia2-bleet 1.0.0

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.
Files changed (157) hide show
  1. package/blackcube-aurelia2-bleet-1.0.0.tgz +0 -0
  2. package/dist/index.es.js +4514 -0
  3. package/dist/index.es.js.map +1 -0
  4. package/dist/index.js +4549 -0
  5. package/dist/index.js.map +1 -0
  6. package/dist/types/attributes/ajaxify-trigger.d.ts +36 -0
  7. package/dist/types/attributes/ajaxify-trigger.d.ts.map +1 -0
  8. package/dist/types/attributes/alert.d.ts +15 -0
  9. package/dist/types/attributes/alert.d.ts.map +1 -0
  10. package/dist/types/attributes/badge.d.ts +13 -0
  11. package/dist/types/attributes/badge.d.ts.map +1 -0
  12. package/dist/types/attributes/burger.d.ts +11 -0
  13. package/dist/types/attributes/burger.d.ts.map +1 -0
  14. package/dist/types/attributes/drawer-trigger.d.ts +16 -0
  15. package/dist/types/attributes/drawer-trigger.d.ts.map +1 -0
  16. package/dist/types/attributes/dropdown.d.ts +38 -0
  17. package/dist/types/attributes/dropdown.d.ts.map +1 -0
  18. package/dist/types/attributes/index.d.ts +16 -0
  19. package/dist/types/attributes/index.d.ts.map +1 -0
  20. package/dist/types/attributes/menu.d.ts +32 -0
  21. package/dist/types/attributes/menu.d.ts.map +1 -0
  22. package/dist/types/attributes/modal-trigger.d.ts +16 -0
  23. package/dist/types/attributes/modal-trigger.d.ts.map +1 -0
  24. package/dist/types/attributes/pager.d.ts +13 -0
  25. package/dist/types/attributes/pager.d.ts.map +1 -0
  26. package/dist/types/attributes/password.d.ts +15 -0
  27. package/dist/types/attributes/password.d.ts.map +1 -0
  28. package/dist/types/attributes/profile.d.ts +24 -0
  29. package/dist/types/attributes/profile.d.ts.map +1 -0
  30. package/dist/types/attributes/select.d.ts +24 -0
  31. package/dist/types/attributes/select.d.ts.map +1 -0
  32. package/dist/types/attributes/tabs.d.ts +16 -0
  33. package/dist/types/attributes/tabs.d.ts.map +1 -0
  34. package/dist/types/attributes/toaster-trigger.d.ts +19 -0
  35. package/dist/types/attributes/toaster-trigger.d.ts.map +1 -0
  36. package/dist/types/attributes/upload.d.ts +57 -0
  37. package/dist/types/attributes/upload.d.ts.map +1 -0
  38. package/dist/types/codecs/ajaxify-codec.d.ts +5 -0
  39. package/dist/types/codecs/ajaxify-codec.d.ts.map +1 -0
  40. package/dist/types/codecs/csrf-codec.d.ts +7 -0
  41. package/dist/types/codecs/csrf-codec.d.ts.map +1 -0
  42. package/dist/types/codecs/request-codec.d.ts +5 -0
  43. package/dist/types/codecs/request-codec.d.ts.map +1 -0
  44. package/dist/types/components/bleet-ajaxify.d.ts +17 -0
  45. package/dist/types/components/bleet-ajaxify.d.ts.map +1 -0
  46. package/dist/types/components/bleet-ajaxify.html.d.ts +3 -0
  47. package/dist/types/components/bleet-ajaxify.html.d.ts.map +1 -0
  48. package/dist/types/components/bleet-drawer.d.ts +40 -0
  49. package/dist/types/components/bleet-drawer.d.ts.map +1 -0
  50. package/dist/types/components/bleet-drawer.html.d.ts +3 -0
  51. package/dist/types/components/bleet-drawer.html.d.ts.map +1 -0
  52. package/dist/types/components/bleet-modal.d.ts +46 -0
  53. package/dist/types/components/bleet-modal.d.ts.map +1 -0
  54. package/dist/types/components/bleet-modal.html.d.ts +3 -0
  55. package/dist/types/components/bleet-modal.html.d.ts.map +1 -0
  56. package/dist/types/components/bleet-overlay.d.ts +21 -0
  57. package/dist/types/components/bleet-overlay.d.ts.map +1 -0
  58. package/dist/types/components/bleet-quilljs.d.ts +19 -0
  59. package/dist/types/components/bleet-quilljs.d.ts.map +1 -0
  60. package/dist/types/components/bleet-quilljs.html.d.ts +3 -0
  61. package/dist/types/components/bleet-quilljs.html.d.ts.map +1 -0
  62. package/dist/types/components/bleet-toast.d.ts +26 -0
  63. package/dist/types/components/bleet-toast.d.ts.map +1 -0
  64. package/dist/types/components/bleet-toast.html.d.ts +3 -0
  65. package/dist/types/components/bleet-toast.html.d.ts.map +1 -0
  66. package/dist/types/components/bleet-toaster-trigger.d.ts +20 -0
  67. package/dist/types/components/bleet-toaster-trigger.d.ts.map +1 -0
  68. package/dist/types/components/bleet-toaster.d.ts +15 -0
  69. package/dist/types/components/bleet-toaster.d.ts.map +1 -0
  70. package/dist/types/components/bleet-toaster.html.d.ts +3 -0
  71. package/dist/types/components/bleet-toaster.html.d.ts.map +1 -0
  72. package/dist/types/components/index.d.ts +9 -0
  73. package/dist/types/components/index.d.ts.map +1 -0
  74. package/dist/types/configure.d.ts +35 -0
  75. package/dist/types/configure.d.ts.map +1 -0
  76. package/dist/types/enums/api.d.ts +11 -0
  77. package/dist/types/enums/api.d.ts.map +1 -0
  78. package/dist/types/enums/event-aggregator.d.ts +123 -0
  79. package/dist/types/enums/event-aggregator.d.ts.map +1 -0
  80. package/dist/types/index.d.ts +26 -0
  81. package/dist/types/index.d.ts.map +1 -0
  82. package/dist/types/interfaces/api.d.ts +56 -0
  83. package/dist/types/interfaces/api.d.ts.map +1 -0
  84. package/dist/types/interfaces/dialog.d.ts +18 -0
  85. package/dist/types/interfaces/dialog.d.ts.map +1 -0
  86. package/dist/types/interfaces/event-aggregator.d.ts +75 -0
  87. package/dist/types/interfaces/event-aggregator.d.ts.map +1 -0
  88. package/dist/types/services/api-service.d.ts +64 -0
  89. package/dist/types/services/api-service.d.ts.map +1 -0
  90. package/dist/types/services/http-service.d.ts +22 -0
  91. package/dist/types/services/http-service.d.ts.map +1 -0
  92. package/dist/types/services/socketio-service.d.ts +23 -0
  93. package/dist/types/services/socketio-service.d.ts.map +1 -0
  94. package/dist/types/services/storage-service.d.ts +13 -0
  95. package/dist/types/services/storage-service.d.ts.map +1 -0
  96. package/dist/types/services/svg-service.d.ts +17 -0
  97. package/dist/types/services/svg-service.d.ts.map +1 -0
  98. package/dist/types/services/transition-service.d.ts +13 -0
  99. package/dist/types/services/transition-service.d.ts.map +1 -0
  100. package/dist/types/services/trap-focus-service.d.ts +28 -0
  101. package/dist/types/services/trap-focus-service.d.ts.map +1 -0
  102. package/doc/bleet-api-reference.md +1333 -0
  103. package/doc/bleet-model-api-reference.md +379 -0
  104. package/doc/bleet-typescript-api-reference.md +1037 -0
  105. package/package.json +43 -0
  106. package/resource.d.ts +22 -0
  107. package/src/attributes/ajaxify-trigger.ts +218 -0
  108. package/src/attributes/alert.ts +55 -0
  109. package/src/attributes/badge.ts +39 -0
  110. package/src/attributes/burger.ts +36 -0
  111. package/src/attributes/drawer-trigger.ts +53 -0
  112. package/src/attributes/dropdown.ts +377 -0
  113. package/src/attributes/index.ts +15 -0
  114. package/src/attributes/menu.ts +179 -0
  115. package/src/attributes/modal-trigger.ts +53 -0
  116. package/src/attributes/pager.ts +43 -0
  117. package/src/attributes/password.ts +47 -0
  118. package/src/attributes/profile.ts +112 -0
  119. package/src/attributes/select.ts +214 -0
  120. package/src/attributes/tabs.ts +99 -0
  121. package/src/attributes/toaster-trigger.ts +54 -0
  122. package/src/attributes/upload.ts +380 -0
  123. package/src/codecs/ajaxify-codec.ts +16 -0
  124. package/src/codecs/csrf-codec.ts +41 -0
  125. package/src/codecs/request-codec.ts +16 -0
  126. package/src/components/bleet-ajaxify.html.ts +4 -0
  127. package/src/components/bleet-ajaxify.ts +62 -0
  128. package/src/components/bleet-drawer.html.ts +36 -0
  129. package/src/components/bleet-drawer.ts +236 -0
  130. package/src/components/bleet-modal.html.ts +30 -0
  131. package/src/components/bleet-modal.ts +274 -0
  132. package/src/components/bleet-overlay.ts +111 -0
  133. package/src/components/bleet-quilljs.html.ts +4 -0
  134. package/src/components/bleet-quilljs.ts +73 -0
  135. package/src/components/bleet-toast.html.ts +44 -0
  136. package/src/components/bleet-toast.ts +133 -0
  137. package/src/components/bleet-toaster-trigger.ts +66 -0
  138. package/src/components/bleet-toaster.html.ts +11 -0
  139. package/src/components/bleet-toaster.ts +72 -0
  140. package/src/components/index.ts +8 -0
  141. package/src/configure.ts +121 -0
  142. package/src/enums/api.ts +12 -0
  143. package/src/enums/event-aggregator.ts +131 -0
  144. package/src/index.ts +220 -0
  145. package/src/interfaces/api.ts +64 -0
  146. package/src/interfaces/dialog.ts +25 -0
  147. package/src/interfaces/event-aggregator.ts +88 -0
  148. package/src/services/api-service.ts +387 -0
  149. package/src/services/http-service.ts +166 -0
  150. package/src/services/socketio-service.ts +138 -0
  151. package/src/services/storage-service.ts +36 -0
  152. package/src/services/svg-service.ts +35 -0
  153. package/src/services/transition-service.ts +39 -0
  154. package/src/services/trap-focus-service.ts +213 -0
  155. package/src/types/css.d.ts +4 -0
  156. package/src/types/html.d.ts +12 -0
  157. package/src/types/svg.d.ts +4 -0
@@ -0,0 +1,379 @@
1
+ # BleetModel & ElasticModel API Reference
2
+
3
+ Documentation des classes de modèle formulaire Bleet pour Yii3.
4
+
5
+ ## Architecture
6
+
7
+ ```
8
+ FormModel (Yiisoft)
9
+ └── BleetModel
10
+ └── ElasticModel
11
+ ```
12
+
13
+ ---
14
+
15
+ ## BleetModel
16
+
17
+ Modèle formulaire abstrait avec support scénarios et intégration Elastic optionnelle.
18
+
19
+ ```php
20
+ namespace Blackcube\Bleet\Model;
21
+
22
+ abstract class BleetModel extends FormModel implements RulesProviderInterface
23
+ ```
24
+
25
+ ### Constantes
26
+
27
+ ```php
28
+ BleetModel::ALL_REGULAR_FIELDS // Inclut toutes les propriétés publiques
29
+ BleetModel::NO_REGULAR_FIELDS // Exclut toutes les propriétés publiques
30
+ ```
31
+
32
+ ### API Publique
33
+
34
+ ```php
35
+ // Form name (support formulaires imbriqués/tabulaires)
36
+ ->setFormName(string $formName): static
37
+ ->getFormName(): string
38
+
39
+ // Scénarios
40
+ ->setScenario(string $scenario): static
41
+ ->getScenario(): ?string
42
+
43
+ // Chargement données
44
+ ->load(mixed $data, ?string $scope = null): bool
45
+ static::loadMultiple(array $models, array $data, ?string $formName = null): bool
46
+
47
+ // Validation
48
+ ->validate(): bool
49
+ ->getRules(): iterable
50
+ ```
51
+
52
+ ### Méthodes à surcharger
53
+
54
+ ```php
55
+ // Définir les scénarios (retourner [] = pas de filtrage)
56
+ public function scenarios(): array
57
+ {
58
+ return [
59
+ 'create' => ['name', 'email', 'password'],
60
+ 'update' => ['name', 'email'],
61
+ 'admin' => [self::ALL_REGULAR_FIELDS],
62
+ ];
63
+ }
64
+
65
+ // Définir les règles de validation
66
+ protected function rules(): iterable
67
+ {
68
+ return [
69
+ 'email' => [new Required(), new Email()],
70
+ 'name' => [new Required(), new Length(min: 2, max: 100)],
71
+ ];
72
+ }
73
+ ```
74
+
75
+ ### Comportement scénarios
76
+
77
+ | Scénario | Comportement |
78
+ |----------|--------------|
79
+ | `null` (non défini) | Pas de filtrage, tous les champs actifs |
80
+ | `[]` (scenarios() vide) | Pas de filtrage, tous les champs actifs |
81
+ | Scénario inexistant | `InvalidArgumentException` |
82
+ | Scénario défini | Seuls les champs listés sont chargés/validés |
83
+
84
+ ### Exemple usage
85
+
86
+ ```php
87
+ class UserForm extends BleetModel
88
+ {
89
+ public string $name = '';
90
+ public string $email = '';
91
+ public string $password = '';
92
+
93
+ public function scenarios(): array
94
+ {
95
+ return [
96
+ 'register' => ['name', 'email', 'password'],
97
+ 'profile' => ['name', 'email'],
98
+ ];
99
+ }
100
+
101
+ protected function rules(): iterable
102
+ {
103
+ return [
104
+ 'name' => [new Required()],
105
+ 'email' => [new Required(), new Email()],
106
+ 'password' => [new Required(), new Length(min: 8)],
107
+ ];
108
+ }
109
+ }
110
+
111
+ // Usage
112
+ $form = new UserForm();
113
+ $form->setScenario('profile');
114
+ $form->load($request->getParsedBody()); // password ignoré
115
+ $form->validate(); // password non validé
116
+ ```
117
+
118
+ ### Formulaires tabulaires
119
+
120
+ ```php
121
+ // Données POST : UserForm[0][name], UserForm[1][name], etc.
122
+ $models = [new UserForm(), new UserForm()];
123
+ BleetModel::loadMultiple($models, $_POST);
124
+
125
+ // Formulaires imbriqués
126
+ $form->setFormName('ParentForm[children][0]');
127
+ ```
128
+
129
+ ### Intégration Elastic automatique
130
+
131
+ Si la classe porte l'attribut `#[Elastic]`, les règles JSON Schema sont automatiquement fusionnées avec `rules()`. Les règles PHP ont priorité.
132
+
133
+ ---
134
+
135
+ ## ElasticModel
136
+
137
+ Extension de BleetModel pour les AR avec ElasticTrait. Gère les propriétés fixes (réflexion) + propriétés élastiques (JSON Schema).
138
+
139
+ ```php
140
+ namespace Blackcube\Bleet\Model;
141
+
142
+ #[Elastic]
143
+ abstract class ElasticModel extends BleetModel implements DataSetInterface
144
+ ```
145
+
146
+ ### Constantes additionnelles
147
+
148
+ ```php
149
+ ElasticModel::ALL_ELASTIC_FIELDS // Inclut toutes les propriétés élastiques
150
+ ElasticModel::NO_ELASTIC_FIELDS // Exclut toutes les propriétés élastiques
151
+ ```
152
+
153
+ ### API Publique
154
+
155
+ ```php
156
+ // Hérité de BleetModel
157
+ ->setFormName(string): static
158
+ ->getFormName(): string
159
+ ->setScenario(string): static
160
+ ->getScenario(): ?string
161
+ ->load(mixed $data, ?string $scope = null): bool
162
+ ->validate(): bool
163
+ ->getRules(): iterable
164
+
165
+ // Spécifique ElasticModel
166
+ ->getSchema(): ?Schema // JSON Schema Swaggest
167
+ ->getElasticValues(): array // Valeurs propriétés élastiques
168
+ ->getElasticPropertyMeta(): array // Métadonnées champs élastiques
169
+ ->getPropertyValue(string $property): mixed // Accès unifié fixe+élastique
170
+ ->getData(): array // Toutes les données (DataSetInterface)
171
+ ->hasProperty(string $property): bool // Existence propriété
172
+ ->populateActiveRecord(object $ar, bool $isNew = false): void
173
+
174
+ // Magic methods (accès transparent propriétés élastiques)
175
+ ->__get(string $name): mixed
176
+ ->__set(string $name, mixed $value): void
177
+ ->__isset(string $name): bool
178
+ ```
179
+
180
+ ### Méthodes protégées (pour sous-classes)
181
+
182
+ ```php
183
+ // Initialisation depuis AR
184
+ protected function initFromAr(object $ar): void
185
+ protected function initElasticFromAr(object $ar): void
186
+
187
+ // Population vers AR
188
+ protected function populateToAr(object $ar, bool $isNew = false): void
189
+ protected function populateElasticToAr(object $ar): void
190
+
191
+ // Exclusions
192
+ protected static function excludedProperties(): array // À surcharger si besoin
193
+
194
+ // Helpers
195
+ protected function isElasticProperty(string $name): bool
196
+ protected function getActiveFields(): ?array
197
+ protected function getRegularFieldNames(): array
198
+ protected function getFormProperties(): array
199
+ ```
200
+
201
+ ### Métadonnées élastiques
202
+
203
+ `getElasticPropertyMeta()` retourne pour chaque propriété :
204
+
205
+ ```php
206
+ [
207
+ 'propertyName' => [
208
+ 'field' => 'text|textarea|wysiwyg|email|date|datetime-local|number|checkbox|radio|radiolist|dropdownlist|file|files',
209
+ 'label' => 'Label affiché',
210
+ 'fileType' => 'image|document|...', // si file/files
211
+ 'imageWidth' => 800, // si image
212
+ 'imageHeight' => 600, // si image
213
+ 'options' => [...], // options wysiwyg, etc.
214
+ 'items' => [ // radiolist/dropdownlist
215
+ ['title' => 'Option 1', 'value' => '1', 'description' => '...'],
216
+ ],
217
+ ],
218
+ ]
219
+ ```
220
+
221
+ ### Exemple complet
222
+
223
+ ```php
224
+ class ArticleForm extends ElasticModel
225
+ {
226
+ public string $title = '';
227
+ public string $slug = '';
228
+ public bool $active = true;
229
+ // + propriétés élastiques depuis JSON Schema AR
230
+
231
+ protected static function excludedProperties(): array
232
+ {
233
+ return ['id', 'dateCreate', 'dateUpdate'];
234
+ }
235
+
236
+ public function scenarios(): array
237
+ {
238
+ return [
239
+ 'create' => [
240
+ self::ALL_REGULAR_FIELDS,
241
+ self::ALL_ELASTIC_FIELDS,
242
+ ],
243
+ 'update' => [
244
+ 'title', 'active',
245
+ self::ALL_ELASTIC_FIELDS,
246
+ ],
247
+ 'publish' => [
248
+ 'active',
249
+ self::NO_ELASTIC_FIELDS,
250
+ ],
251
+ ];
252
+ }
253
+
254
+ protected function rules(): iterable
255
+ {
256
+ return [
257
+ 'title' => [new Required(), new Length(max: 255)],
258
+ 'slug' => [new Required(), new Regex('/^[a-z0-9-]+$/')],
259
+ ];
260
+ }
261
+
262
+ public static function fromActiveRecord(Article $ar): static
263
+ {
264
+ $form = new static();
265
+ $form->initFromAr($ar);
266
+ return $form;
267
+ }
268
+
269
+ public function populateActiveRecord(Article $ar, bool $isNew = false): void
270
+ {
271
+ parent::populateActiveRecord($ar, $isNew);
272
+ // Logique supplémentaire si besoin
273
+ }
274
+ }
275
+
276
+ // Usage
277
+ $article = Article::findOne($id);
278
+ $form = ArticleForm::fromActiveRecord($article);
279
+ $form->setScenario('update');
280
+
281
+ if ($form->load($request->getParsedBody()) && $form->validate()) {
282
+ $form->populateActiveRecord($article);
283
+ $article->save();
284
+ }
285
+ ```
286
+
287
+ ### Accès propriétés élastiques
288
+
289
+ ```php
290
+ // Via magic methods (transparent)
291
+ $form->elasticPropertyName = 'value';
292
+ $value = $form->elasticPropertyName;
293
+
294
+ // Via getPropertyValue (unifié)
295
+ $value = $form->getPropertyValue('anyProperty');
296
+
297
+ // Via getElasticValues (toutes les élastiques)
298
+ $elasticData = $form->getElasticValues();
299
+
300
+ // Via getData (tout, pour validation)
301
+ $allData = $form->getData();
302
+ ```
303
+
304
+ ### Comportement scénarios ElasticModel
305
+
306
+ | Constante | Effet |
307
+ |-----------|-------|
308
+ | `ALL_REGULAR_FIELDS` | Toutes les propriétés publiques PHP |
309
+ | `NO_REGULAR_FIELDS` | Aucune propriété publique PHP |
310
+ | `ALL_ELASTIC_FIELDS` | Toutes les propriétés JSON Schema |
311
+ | `NO_ELASTIC_FIELDS` | Aucune propriété JSON Schema |
312
+
313
+ Les champs explicites sont auto-détectés (regular vs elastic) :
314
+
315
+ ```php
316
+ 'scenario' => [
317
+ 'title', // → regular (propriété PHP)
318
+ 'elasticDescription', // → elastic (propriété JSON Schema)
319
+ self::ALL_ELASTIC_FIELDS, // → toutes les élastiques
320
+ ]
321
+ ```
322
+
323
+ ---
324
+
325
+ ## Normalisation automatique
326
+
327
+ BleetModel normalise automatiquement les valeurs vides pour les types nullable :
328
+
329
+ | Type propriété | Valeur `''` | Résultat |
330
+ |----------------|-------------|----------|
331
+ | `string` | `''` | `''` (inchangé) |
332
+ | `?string` | `''` | `''` (inchangé) |
333
+ | `?int` | `''` | `null` |
334
+ | `?float` | `''` | `null` |
335
+ | `?bool` | `''` | `null` |
336
+
337
+ Évite le cast PHP `'' → 0` pour les entiers nullable.
338
+
339
+ ---
340
+
341
+ ## Fusion règles Elastic
342
+
343
+ Quand `#[Elastic]` est présent, les règles sont fusionnées :
344
+
345
+ 1. Règles PHP (`rules()`) ont priorité
346
+ 2. Règles Elastic ajoutées si propriété absente de PHP
347
+ 3. Pas de doublon de type (ex: pas 2× `Required`)
348
+
349
+ ```php
350
+ // PHP rules
351
+ protected function rules(): iterable
352
+ {
353
+ return [
354
+ 'title' => [new Required(), new Length(max: 100)],
355
+ ];
356
+ }
357
+
358
+ // JSON Schema définit : title (required, maxLength: 255), description (required)
359
+ // Résultat fusionné :
360
+ // - title: Required (PHP), Length(100) (PHP) — Elastic ignoré
361
+ // - description: Required (Elastic)
362
+ ```
363
+
364
+ ---
365
+
366
+ ## Interfaces implémentées
367
+
368
+ ### BleetModel
369
+
370
+ ```php
371
+ RulesProviderInterface // Yiisoft\Validator
372
+ ```
373
+
374
+ ### ElasticModel
375
+
376
+ ```php
377
+ RulesProviderInterface // Yiisoft\Validator
378
+ DataSetInterface // Yiisoft\Validator (getData(), hasProperty())
379
+ ```