@hrbolek/uoisfrontend-template 0.6.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 (581) hide show
  1. package/index.html +104 -0
  2. package/package.json +24 -0
  3. package/src/Base/Components/Attribute.jsx +51 -0
  4. package/src/Base/Components/CardCapsule.jsx +353 -0
  5. package/src/Base/Components/Col.jsx +36 -0
  6. package/src/Base/Components/ConfirmEdit.jsx +61 -0
  7. package/src/Base/Components/CopyButton.jsx +33 -0
  8. package/src/Base/Components/LargeCard.jsx +22 -0
  9. package/src/Base/Components/Link.jsx +42 -0
  10. package/src/Base/Components/LiveEdit.jsx +64 -0
  11. package/src/Base/Components/MediumCard.jsx +30 -0
  12. package/src/Base/Components/MediumContent.jsx +74 -0
  13. package/src/Base/Components/MediumEditableContent.jsx +52 -0
  14. package/src/Base/Components/ProxyLink.jsx +132 -0
  15. package/src/Base/Components/Row.jsx +23 -0
  16. package/src/Base/Components/Table.jsx +275 -0
  17. package/src/Base/Components/index.js +14 -0
  18. package/src/Base/Components/style.js +278 -0
  19. package/src/Base/FormControls/Collapsible.jsx +46 -0
  20. package/src/Base/FormControls/Dialog.jsx +75 -0
  21. package/src/Base/FormControls/EntityLookup.jsx +175 -0
  22. package/src/Base/FormControls/Filter.jsx +834 -0
  23. package/src/Base/FormControls/Input.jsx +163 -0
  24. package/src/Base/FormControls/Label.jsx +40 -0
  25. package/src/Base/FormControls/Select.jsx +150 -0
  26. package/src/Base/FormControls/TextArea.jsx +86 -0
  27. package/src/Base/FormControls/index.js +8 -0
  28. package/src/Base/Helpers/AsyncStateIndicator.jsx +9 -0
  29. package/src/Base/Helpers/GQLEntityProvider.jsx +163 -0
  30. package/src/Base/Helpers/NavigationHistoryProvider.jsx +178 -0
  31. package/src/Base/Helpers/PlaceChild.jsx +13 -0
  32. package/src/Base/Helpers/generateQuery.js +508 -0
  33. package/src/Base/Helpers/index.js +5 -0
  34. package/src/Base/Mutations/Create.jsx +152 -0
  35. package/src/Base/Mutations/Delete.jsx +237 -0
  36. package/src/Base/Mutations/General.jsx +241 -0
  37. package/src/Base/Mutations/InteractiveMutations.jsx +32 -0
  38. package/src/Base/Mutations/Update.jsx +270 -0
  39. package/src/Base/Mutations/helpers.jsx +7 -0
  40. package/src/Base/Mutations/index.js +5 -0
  41. package/src/Base/Pages/Page.jsx +235 -0
  42. package/src/Base/Pages/PageCatch.jsx +235 -0
  43. package/src/Base/Pages/PageNavbar.jsx +70 -0
  44. package/src/Base/Pages/PageVector.jsx +229 -0
  45. package/src/Base/Pages/RouterSegment.jsx +66 -0
  46. package/src/Base/Pages/index.js +5 -0
  47. package/src/Base/Queries/DeleteAsyncAction.jsx +32 -0
  48. package/src/Base/Queries/Fragments.jsx +101 -0
  49. package/src/Base/Queries/InsertAsyncAction.jsx +40 -0
  50. package/src/Base/Queries/ReadAsyncAction.jsx +44 -0
  51. package/src/Base/Queries/ReadPageAsyncAction.jsx +16 -0
  52. package/src/Base/Queries/SearchAsyncAction.jsx +16 -0
  53. package/src/Base/Queries/UpdateAsyncAction.jsx +40 -0
  54. package/src/Base/Queries/index.js +6 -0
  55. package/src/Base/Scalars/ScalarAttribute.jsx +49 -0
  56. package/src/Base/Scalars/index.js +1 -0
  57. package/src/Base/Vectors/VectorAttribute.jsx +137 -0
  58. package/src/Base/Vectors/index.js +1 -0
  59. package/src/Base/index.js +32 -0
  60. package/src/GroupGQLModel/Components/CUDButton.jsx +128 -0
  61. package/src/GroupGQLModel/Components/CardCapsule.jsx +44 -0
  62. package/src/GroupGQLModel/Components/Children.jsx +31 -0
  63. package/src/GroupGQLModel/Components/ConfirmEdit.jsx +61 -0
  64. package/src/GroupGQLModel/Components/Filter.jsx +14 -0
  65. package/src/GroupGQLModel/Components/LargeCard.jsx +68 -0
  66. package/src/GroupGQLModel/Components/Link.jsx +54 -0
  67. package/src/GroupGQLModel/Components/LiveEdit.jsx +111 -0
  68. package/src/GroupGQLModel/Components/MediumCard.jsx +51 -0
  69. package/src/GroupGQLModel/Components/MediumContent.jsx +56 -0
  70. package/src/GroupGQLModel/Components/MediumEditableContent.jsx +52 -0
  71. package/src/GroupGQLModel/Components/Table.jsx +70 -0
  72. package/src/GroupGQLModel/Components/index.js +14 -0
  73. package/src/GroupGQLModel/Mutations/AddMembership.jsx +156 -0
  74. package/src/GroupGQLModel/Mutations/Create.jsx +67 -0
  75. package/src/GroupGQLModel/Mutations/Delete.jsx +81 -0
  76. package/src/GroupGQLModel/Mutations/InteractiveMutations.jsx +30 -0
  77. package/src/GroupGQLModel/Mutations/Update.jsx +74 -0
  78. package/src/GroupGQLModel/Pages/PageBase.jsx +56 -0
  79. package/src/GroupGQLModel/Pages/PageCreateItem.jsx +27 -0
  80. package/src/GroupGQLModel/Pages/PageDeleteItem.jsx +16 -0
  81. package/src/GroupGQLModel/Pages/PageNavbar.jsx +264 -0
  82. package/src/GroupGQLModel/Pages/PageReadItem.jsx +12 -0
  83. package/src/GroupGQLModel/Pages/PageReadItemEx.jsx +57 -0
  84. package/src/GroupGQLModel/Pages/PageUpdateItem.jsx +14 -0
  85. package/src/GroupGQLModel/Pages/PageVector.jsx +80 -0
  86. package/src/GroupGQLModel/Pages/RouterSegment.jsx +85 -0
  87. package/src/GroupGQLModel/Pages/index.js +2 -0
  88. package/src/GroupGQLModel/Queries/DeleteAsyncAction.jsx +22 -0
  89. package/src/GroupGQLModel/Queries/Fragments.jsx +129 -0
  90. package/src/GroupGQLModel/Queries/InsertAsyncAction.jsx +43 -0
  91. package/src/GroupGQLModel/Queries/ReadAsyncAction.jsx +44 -0
  92. package/src/GroupGQLModel/Queries/ReadPageAsyncAction.jsx +18 -0
  93. package/src/GroupGQLModel/Queries/SearchAsyncAction.jsx +15 -0
  94. package/src/GroupGQLModel/Queries/UpdateAsyncAction.jsx +56 -0
  95. package/src/GroupGQLModel/Queries/index.js +6 -0
  96. package/src/GroupGQLModel/Scalars/GroupRoles.jsx +69 -0
  97. package/src/GroupGQLModel/Scalars/MasterGroup.jsx +15 -0
  98. package/src/GroupGQLModel/Scalars/RBACObject.jsx +233 -0
  99. package/src/GroupGQLModel/Scalars/ScalarAttribute.jsx +54 -0
  100. package/src/GroupGQLModel/Scalars/TemplateScalarAttribute.jsx +88 -0
  101. package/src/GroupGQLModel/Scalars/index.js +1 -0
  102. package/src/GroupGQLModel/Vectors/GroupMemberships.jsx +115 -0
  103. package/src/GroupGQLModel/Vectors/GroupRoles.jsx +112 -0
  104. package/src/GroupGQLModel/Vectors/GroupRolesOn.jsx +113 -0
  105. package/src/GroupGQLModel/Vectors/GroupSubgroups.jsx +97 -0
  106. package/src/GroupGQLModel/Vectors/TemplateVectorsAttribute.jsx +326 -0
  107. package/src/GroupGQLModel/Vectors/VectorAttribute.jsx +56 -0
  108. package/src/GroupGQLModel/Vectors/index.js +1 -0
  109. package/src/GroupGQLModel/index.js +7 -0
  110. package/src/GroupTypeGQLModel/Components/CUDButton.jsx +128 -0
  111. package/src/GroupTypeGQLModel/Components/CardCapsule.jsx +43 -0
  112. package/src/GroupTypeGQLModel/Components/Children.jsx +31 -0
  113. package/src/GroupTypeGQLModel/Components/ConfirmEdit.jsx +61 -0
  114. package/src/GroupTypeGQLModel/Components/Filter.jsx +14 -0
  115. package/src/GroupTypeGQLModel/Components/LargeCard.jsx +49 -0
  116. package/src/GroupTypeGQLModel/Components/Link.jsx +53 -0
  117. package/src/GroupTypeGQLModel/Components/LiveEdit.jsx +111 -0
  118. package/src/GroupTypeGQLModel/Components/MediumCard.jsx +39 -0
  119. package/src/GroupTypeGQLModel/Components/MediumContent.jsx +97 -0
  120. package/src/GroupTypeGQLModel/Components/MediumEditableContent.jsx +35 -0
  121. package/src/GroupTypeGQLModel/Components/Table.jsx +7 -0
  122. package/src/GroupTypeGQLModel/Components/index.js +14 -0
  123. package/src/GroupTypeGQLModel/Mutations/Create.jsx +67 -0
  124. package/src/GroupTypeGQLModel/Mutations/Delete.jsx +80 -0
  125. package/src/GroupTypeGQLModel/Mutations/InteractiveMutations.jsx +30 -0
  126. package/src/GroupTypeGQLModel/Mutations/Update.jsx +74 -0
  127. package/src/GroupTypeGQLModel/Pages/Page.jsx +3 -0
  128. package/src/GroupTypeGQLModel/Pages/PageBase.jsx +26 -0
  129. package/src/GroupTypeGQLModel/Pages/PageCreateItem.jsx +21 -0
  130. package/src/GroupTypeGQLModel/Pages/PageDeleteItem.jsx +13 -0
  131. package/src/GroupTypeGQLModel/Pages/PageNavbar.jsx +148 -0
  132. package/src/GroupTypeGQLModel/Pages/PageReadItem.jsx +28 -0
  133. package/src/GroupTypeGQLModel/Pages/PageUpdateItem.jsx +25 -0
  134. package/src/GroupTypeGQLModel/Pages/PageVector.jsx +83 -0
  135. package/src/GroupTypeGQLModel/Pages/RouterSegment.jsx +68 -0
  136. package/src/GroupTypeGQLModel/Pages/index.js +10 -0
  137. package/src/GroupTypeGQLModel/Queries/DeleteAsyncAction.jsx +27 -0
  138. package/src/GroupTypeGQLModel/Queries/Fragments.jsx +96 -0
  139. package/src/GroupTypeGQLModel/Queries/InsertAsyncAction.jsx +41 -0
  140. package/src/GroupTypeGQLModel/Queries/ReadAsyncAction.jsx +45 -0
  141. package/src/GroupTypeGQLModel/Queries/ReadPageAsyncAction.jsx +14 -0
  142. package/src/GroupTypeGQLModel/Queries/SearchAsyncAction.jsx +16 -0
  143. package/src/GroupTypeGQLModel/Queries/UpdateAsyncAction.jsx +42 -0
  144. package/src/GroupTypeGQLModel/Queries/index.js +6 -0
  145. package/src/GroupTypeGQLModel/Scalars/ScalarAttribute.jsx +54 -0
  146. package/src/GroupTypeGQLModel/Scalars/TemplateScalarAttribute.jsx +88 -0
  147. package/src/GroupTypeGQLModel/Scalars/index.js +1 -0
  148. package/src/GroupTypeGQLModel/Vectors/TemplateVectorsAttribute.jsx +326 -0
  149. package/src/GroupTypeGQLModel/Vectors/VectorAttribute.jsx +56 -0
  150. package/src/GroupTypeGQLModel/Vectors/index.js +1 -0
  151. package/src/GroupTypeGQLModel/index.js +6 -0
  152. package/src/MembershipGQLModel/Components/CUDButton.jsx +128 -0
  153. package/src/MembershipGQLModel/Components/CardCapsule.jsx +43 -0
  154. package/src/MembershipGQLModel/Components/Children.jsx +31 -0
  155. package/src/MembershipGQLModel/Components/ConfirmEdit.jsx +61 -0
  156. package/src/MembershipGQLModel/Components/Filter.jsx +14 -0
  157. package/src/MembershipGQLModel/Components/LargeCard.jsx +49 -0
  158. package/src/MembershipGQLModel/Components/Link.jsx +54 -0
  159. package/src/MembershipGQLModel/Components/LiveEdit.jsx +111 -0
  160. package/src/MembershipGQLModel/Components/MediumCard.jsx +39 -0
  161. package/src/MembershipGQLModel/Components/MediumContent.jsx +97 -0
  162. package/src/MembershipGQLModel/Components/MediumEditableContent.jsx +35 -0
  163. package/src/MembershipGQLModel/Components/Table.jsx +7 -0
  164. package/src/MembershipGQLModel/Components/index.js +14 -0
  165. package/src/MembershipGQLModel/Mutations/Create.jsx +67 -0
  166. package/src/MembershipGQLModel/Mutations/Delete.jsx +80 -0
  167. package/src/MembershipGQLModel/Mutations/InteractiveMutations.jsx +31 -0
  168. package/src/MembershipGQLModel/Mutations/Update.jsx +74 -0
  169. package/src/MembershipGQLModel/Mutations/helpers.jsx +7 -0
  170. package/src/MembershipGQLModel/Pages/PageBase.jsx +57 -0
  171. package/src/MembershipGQLModel/Pages/PageCreateItem.jsx +28 -0
  172. package/src/MembershipGQLModel/Pages/PageDeleteItem.jsx +16 -0
  173. package/src/MembershipGQLModel/Pages/PageNavbar.jsx +110 -0
  174. package/src/MembershipGQLModel/Pages/PageReadItem.jsx +11 -0
  175. package/src/MembershipGQLModel/Pages/PageReadItemEx.jsx +42 -0
  176. package/src/MembershipGQLModel/Pages/PageUpdateItem.jsx +14 -0
  177. package/src/MembershipGQLModel/Pages/PageVector.jsx +80 -0
  178. package/src/MembershipGQLModel/Pages/RouterSegment.jsx +73 -0
  179. package/src/MembershipGQLModel/Pages/index.js +2 -0
  180. package/src/MembershipGQLModel/Queries/DeleteAsyncAction.jsx +32 -0
  181. package/src/MembershipGQLModel/Queries/Fragments.jsx +113 -0
  182. package/src/MembershipGQLModel/Queries/InsertAsyncAction.jsx +38 -0
  183. package/src/MembershipGQLModel/Queries/ReadAsyncAction.jsx +44 -0
  184. package/src/MembershipGQLModel/Queries/ReadPageAsyncAction.jsx +13 -0
  185. package/src/MembershipGQLModel/Queries/SearchAsyncAction.jsx +16 -0
  186. package/src/MembershipGQLModel/Queries/UpdateAsyncAction.jsx +40 -0
  187. package/src/MembershipGQLModel/Queries/index.js +6 -0
  188. package/src/MembershipGQLModel/Scalars/ScalarAttribute.jsx +54 -0
  189. package/src/MembershipGQLModel/Scalars/TemplateScalarAttribute.jsx +88 -0
  190. package/src/MembershipGQLModel/Scalars/index.js +1 -0
  191. package/src/MembershipGQLModel/Vectors/TemplateVectorsAttribute.jsx +326 -0
  192. package/src/MembershipGQLModel/Vectors/VectorAttribute.jsx +56 -0
  193. package/src/MembershipGQLModel/Vectors/index.js +1 -0
  194. package/src/MembershipGQLModel/WhatToDo.md +44 -0
  195. package/src/MembershipGQLModel/index.js +6 -0
  196. package/src/RBACGQLModel/Components/CardCapsule.jsx +43 -0
  197. package/src/RBACGQLModel/Components/Children.jsx +31 -0
  198. package/src/RBACGQLModel/Components/ConfirmEdit.jsx +61 -0
  199. package/src/RBACGQLModel/Components/Filter.jsx +14 -0
  200. package/src/RBACGQLModel/Components/LargeCard.jsx +50 -0
  201. package/src/RBACGQLModel/Components/Link.jsx +54 -0
  202. package/src/RBACGQLModel/Components/LiveEdit.jsx +111 -0
  203. package/src/RBACGQLModel/Components/MediumCard.jsx +39 -0
  204. package/src/RBACGQLModel/Components/MediumContent.jsx +96 -0
  205. package/src/RBACGQLModel/Components/MediumEditableContent.jsx +212 -0
  206. package/src/RBACGQLModel/Components/Table.jsx +7 -0
  207. package/src/RBACGQLModel/Components/index.js +13 -0
  208. package/src/RBACGQLModel/Mutations/Create.jsx +202 -0
  209. package/src/RBACGQLModel/Mutations/Delete.jsx +173 -0
  210. package/src/RBACGQLModel/Mutations/InteractiveMutations.jsx +30 -0
  211. package/src/RBACGQLModel/Mutations/Update.jsx +147 -0
  212. package/src/RBACGQLModel/Mutations/helpers.jsx +7 -0
  213. package/src/RBACGQLModel/Pages/PageBase.jsx +56 -0
  214. package/src/RBACGQLModel/Pages/PageCreateItem.jsx +28 -0
  215. package/src/RBACGQLModel/Pages/PageDeleteItem.jsx +16 -0
  216. package/src/RBACGQLModel/Pages/PageNavbar.jsx +160 -0
  217. package/src/RBACGQLModel/Pages/PageReadItem.jsx +11 -0
  218. package/src/RBACGQLModel/Pages/PageReadItemEx.jsx +42 -0
  219. package/src/RBACGQLModel/Pages/PageUpdateItem.jsx +14 -0
  220. package/src/RBACGQLModel/Pages/PageVector.jsx +80 -0
  221. package/src/RBACGQLModel/Pages/RouterSegment.jsx +72 -0
  222. package/src/RBACGQLModel/Pages/index.js +2 -0
  223. package/src/RBACGQLModel/Queries/DeleteAsyncAction.jsx +32 -0
  224. package/src/RBACGQLModel/Queries/Fragments.jsx +101 -0
  225. package/src/RBACGQLModel/Queries/InsertAsyncAction.jsx +40 -0
  226. package/src/RBACGQLModel/Queries/ReadAsyncAction.jsx +44 -0
  227. package/src/RBACGQLModel/Queries/ReadPageAsyncAction.jsx +13 -0
  228. package/src/RBACGQLModel/Queries/SearchAsyncAction.jsx +16 -0
  229. package/src/RBACGQLModel/Queries/UpdateAsyncAction.jsx +40 -0
  230. package/src/RBACGQLModel/Queries/index.js +6 -0
  231. package/src/RBACGQLModel/Scalars/ScalarAttribute.jsx +54 -0
  232. package/src/RBACGQLModel/Scalars/TemplateScalarAttribute.jsx +88 -0
  233. package/src/RBACGQLModel/Scalars/index.js +1 -0
  234. package/src/RBACGQLModel/Vectors/TemplateVectorsAttribute.jsx +326 -0
  235. package/src/RBACGQLModel/Vectors/VectorAttribute.jsx +56 -0
  236. package/src/RBACGQLModel/Vectors/index.js +1 -0
  237. package/src/RBACGQLModel/WhatToDo.md +44 -0
  238. package/src/RBACGQLModel/index.js +71 -0
  239. package/src/RoleGQLModel/Components/CUDButton.jsx +128 -0
  240. package/src/RoleGQLModel/Components/CardCapsule.jsx +43 -0
  241. package/src/RoleGQLModel/Components/Children.jsx +31 -0
  242. package/src/RoleGQLModel/Components/ConfirmEdit.jsx +61 -0
  243. package/src/RoleGQLModel/Components/Filter.jsx +14 -0
  244. package/src/RoleGQLModel/Components/LargeCard.jsx +49 -0
  245. package/src/RoleGQLModel/Components/Link.jsx +55 -0
  246. package/src/RoleGQLModel/Components/LiveEdit.jsx +111 -0
  247. package/src/RoleGQLModel/Components/MediumCard.jsx +39 -0
  248. package/src/RoleGQLModel/Components/MediumContent.jsx +97 -0
  249. package/src/RoleGQLModel/Components/MediumEditableContent.jsx +72 -0
  250. package/src/RoleGQLModel/Components/RBACObject.jsx +22 -0
  251. package/src/RoleGQLModel/Components/Table.jsx +82 -0
  252. package/src/RoleGQLModel/Components/index.js +14 -0
  253. package/src/RoleGQLModel/Mutations/AddRoleOnGroup.jsx +117 -0
  254. package/src/RoleGQLModel/Mutations/Create.jsx +67 -0
  255. package/src/RoleGQLModel/Mutations/Delete.jsx +80 -0
  256. package/src/RoleGQLModel/Mutations/InteractiveMutations.jsx +31 -0
  257. package/src/RoleGQLModel/Mutations/Update.jsx +74 -0
  258. package/src/RoleGQLModel/Pages/Page.jsx +3 -0
  259. package/src/RoleGQLModel/Pages/PageBase.jsx +26 -0
  260. package/src/RoleGQLModel/Pages/PageContent.jsx +31 -0
  261. package/src/RoleGQLModel/Pages/PageCreateItem.jsx +21 -0
  262. package/src/RoleGQLModel/Pages/PageDeleteItem.jsx +13 -0
  263. package/src/RoleGQLModel/Pages/PageNavbar.jsx +161 -0
  264. package/src/RoleGQLModel/Pages/PageReadItem.jsx +28 -0
  265. package/src/RoleGQLModel/Pages/PageUpdateItem.jsx +25 -0
  266. package/src/RoleGQLModel/Pages/PageVector.jsx +83 -0
  267. package/src/RoleGQLModel/Pages/RouterSegment.jsx +69 -0
  268. package/src/RoleGQLModel/Pages/index.js +10 -0
  269. package/src/RoleGQLModel/Queries/DeleteAsyncAction.jsx +22 -0
  270. package/src/RoleGQLModel/Queries/Fragments.jsx +123 -0
  271. package/src/RoleGQLModel/Queries/InsertAsyncAction.jsx +45 -0
  272. package/src/RoleGQLModel/Queries/ReadAsyncAction.jsx +45 -0
  273. package/src/RoleGQLModel/Queries/ReadPageAsyncAction.jsx +13 -0
  274. package/src/RoleGQLModel/Queries/UpdateAsyncAction.jsx +35 -0
  275. package/src/RoleGQLModel/Queries/index.js +6 -0
  276. package/src/RoleGQLModel/Scalars/ScalarAttribute.jsx +54 -0
  277. package/src/RoleGQLModel/Scalars/TemplateScalarAttribute.jsx +88 -0
  278. package/src/RoleGQLModel/Scalars/index.js +1 -0
  279. package/src/RoleGQLModel/Vectors/TemplateVectorsAttribute.jsx +326 -0
  280. package/src/RoleGQLModel/Vectors/VectorAttribute.jsx +56 -0
  281. package/src/RoleGQLModel/Vectors/index.js +1 -0
  282. package/src/RoleGQLModel/index.js +6 -0
  283. package/src/RoleTypeGQLModel/Components/CUDButton.jsx +128 -0
  284. package/src/RoleTypeGQLModel/Components/CardCapsule.jsx +43 -0
  285. package/src/RoleTypeGQLModel/Components/Children.jsx +31 -0
  286. package/src/RoleTypeGQLModel/Components/ConfirmEdit.jsx +61 -0
  287. package/src/RoleTypeGQLModel/Components/Filter.jsx +14 -0
  288. package/src/RoleTypeGQLModel/Components/LargeCard.jsx +49 -0
  289. package/src/RoleTypeGQLModel/Components/Link.jsx +55 -0
  290. package/src/RoleTypeGQLModel/Components/LiveEdit.jsx +111 -0
  291. package/src/RoleTypeGQLModel/Components/MediumCard.jsx +39 -0
  292. package/src/RoleTypeGQLModel/Components/MediumContent.jsx +97 -0
  293. package/src/RoleTypeGQLModel/Components/MediumEditableContent.jsx +35 -0
  294. package/src/RoleTypeGQLModel/Components/Table.jsx +7 -0
  295. package/src/RoleTypeGQLModel/Components/index.js +14 -0
  296. package/src/RoleTypeGQLModel/Mutations/Create.jsx +67 -0
  297. package/src/RoleTypeGQLModel/Mutations/Delete.jsx +80 -0
  298. package/src/RoleTypeGQLModel/Mutations/InteractiveMutations.jsx +30 -0
  299. package/src/RoleTypeGQLModel/Mutations/Update.jsx +74 -0
  300. package/src/RoleTypeGQLModel/Pages/Page.jsx +3 -0
  301. package/src/RoleTypeGQLModel/Pages/PageBase.jsx +56 -0
  302. package/src/RoleTypeGQLModel/Pages/PageCreateItem.jsx +27 -0
  303. package/src/RoleTypeGQLModel/Pages/PageDeleteItem.jsx +16 -0
  304. package/src/RoleTypeGQLModel/Pages/PageNavbar.jsx +148 -0
  305. package/src/RoleTypeGQLModel/Pages/PageReadItem.jsx +11 -0
  306. package/src/RoleTypeGQLModel/Pages/PageUpdateItem.jsx +14 -0
  307. package/src/RoleTypeGQLModel/Pages/PageVector.jsx +79 -0
  308. package/src/RoleTypeGQLModel/Pages/RouterSegment.jsx +69 -0
  309. package/src/RoleTypeGQLModel/Pages/index.js +10 -0
  310. package/src/RoleTypeGQLModel/Queries/DeleteAsyncAction.jsx +32 -0
  311. package/src/RoleTypeGQLModel/Queries/Fragments.jsx +103 -0
  312. package/src/RoleTypeGQLModel/Queries/InsertAsyncAction.jsx +40 -0
  313. package/src/RoleTypeGQLModel/Queries/ReadAsyncAction.jsx +44 -0
  314. package/src/RoleTypeGQLModel/Queries/ReadPageAsyncAction.jsx +13 -0
  315. package/src/RoleTypeGQLModel/Queries/SearchAsyncAction.jsx +29 -0
  316. package/src/RoleTypeGQLModel/Queries/UpdateAsyncAction.jsx +40 -0
  317. package/src/RoleTypeGQLModel/Queries/index.js +6 -0
  318. package/src/RoleTypeGQLModel/Scalars/ScalarAttribute.jsx +54 -0
  319. package/src/RoleTypeGQLModel/Scalars/TemplateScalarAttribute.jsx +88 -0
  320. package/src/RoleTypeGQLModel/Scalars/index.js +1 -0
  321. package/src/RoleTypeGQLModel/Vectors/TemplateVectorsAttribute.jsx +326 -0
  322. package/src/RoleTypeGQLModel/Vectors/VectorAttribute.jsx +56 -0
  323. package/src/RoleTypeGQLModel/Vectors/index.js +1 -0
  324. package/src/RoleTypeGQLModel/index.js +6 -0
  325. package/src/StateGQLModel/Components/CardCapsule.jsx +43 -0
  326. package/src/StateGQLModel/Components/Children.jsx +31 -0
  327. package/src/StateGQLModel/Components/ConfirmEdit.jsx +61 -0
  328. package/src/StateGQLModel/Components/Filter.jsx +14 -0
  329. package/src/StateGQLModel/Components/LargeCard.jsx +50 -0
  330. package/src/StateGQLModel/Components/Link.jsx +54 -0
  331. package/src/StateGQLModel/Components/LiveEdit.jsx +111 -0
  332. package/src/StateGQLModel/Components/MediumCard.jsx +39 -0
  333. package/src/StateGQLModel/Components/MediumContent.jsx +96 -0
  334. package/src/StateGQLModel/Components/MediumEditableContent.jsx +36 -0
  335. package/src/StateGQLModel/Components/Table.jsx +7 -0
  336. package/src/StateGQLModel/Components/index.js +13 -0
  337. package/src/StateGQLModel/Mutations/Create.jsx +79 -0
  338. package/src/StateGQLModel/Mutations/Delete.jsx +87 -0
  339. package/src/StateGQLModel/Mutations/InteractiveMutations.jsx +30 -0
  340. package/src/StateGQLModel/Mutations/Update.jsx +76 -0
  341. package/src/StateGQLModel/Mutations/helpers.jsx +7 -0
  342. package/src/StateGQLModel/Pages/PageBase.jsx +56 -0
  343. package/src/StateGQLModel/Pages/PageCreateItem.jsx +28 -0
  344. package/src/StateGQLModel/Pages/PageDeleteItem.jsx +16 -0
  345. package/src/StateGQLModel/Pages/PageNavbar.jsx +160 -0
  346. package/src/StateGQLModel/Pages/PageReadItem.jsx +11 -0
  347. package/src/StateGQLModel/Pages/PageReadItemEx.jsx +42 -0
  348. package/src/StateGQLModel/Pages/PageUpdateItem.jsx +14 -0
  349. package/src/StateGQLModel/Pages/PageVector.jsx +80 -0
  350. package/src/StateGQLModel/Pages/RouterSegment.jsx +72 -0
  351. package/src/StateGQLModel/Pages/index.js +2 -0
  352. package/src/StateGQLModel/Queries/DeleteAsyncAction.jsx +32 -0
  353. package/src/StateGQLModel/Queries/Fragments.jsx +109 -0
  354. package/src/StateGQLModel/Queries/InsertAsyncAction.jsx +104 -0
  355. package/src/StateGQLModel/Queries/ReadAsyncAction.jsx +48 -0
  356. package/src/StateGQLModel/Queries/ReadPageAsyncAction.jsx +23 -0
  357. package/src/StateGQLModel/Queries/SearchAsyncAction.jsx +16 -0
  358. package/src/StateGQLModel/Queries/UpdateAsyncAction.jsx +106 -0
  359. package/src/StateGQLModel/Queries/index.js +6 -0
  360. package/src/StateGQLModel/Scalars/ScalarAttribute.jsx +54 -0
  361. package/src/StateGQLModel/Scalars/TemplateScalarAttribute.jsx +88 -0
  362. package/src/StateGQLModel/Scalars/index.js +1 -0
  363. package/src/StateGQLModel/Vectors/TemplateVectorsAttribute.jsx +326 -0
  364. package/src/StateGQLModel/Vectors/VectorAttribute.jsx +56 -0
  365. package/src/StateGQLModel/Vectors/index.js +1 -0
  366. package/src/StateGQLModel/index.js +71 -0
  367. package/src/StateMachineGQLModel/Components/CardCapsule.jsx +43 -0
  368. package/src/StateMachineGQLModel/Components/Children.jsx +31 -0
  369. package/src/StateMachineGQLModel/Components/ConfirmEdit.jsx +61 -0
  370. package/src/StateMachineGQLModel/Components/Filter.jsx +14 -0
  371. package/src/StateMachineGQLModel/Components/LargeCard.jsx +50 -0
  372. package/src/StateMachineGQLModel/Components/Link.jsx +54 -0
  373. package/src/StateMachineGQLModel/Components/LiveEdit.jsx +111 -0
  374. package/src/StateMachineGQLModel/Components/MediumCard.jsx +39 -0
  375. package/src/StateMachineGQLModel/Components/MediumContent.jsx +96 -0
  376. package/src/StateMachineGQLModel/Components/MediumEditableContent.jsx +989 -0
  377. package/src/StateMachineGQLModel/Components/Table.jsx +7 -0
  378. package/src/StateMachineGQLModel/Components/index.js +13 -0
  379. package/src/StateMachineGQLModel/Mutations/Create.jsx +79 -0
  380. package/src/StateMachineGQLModel/Mutations/Delete.jsx +80 -0
  381. package/src/StateMachineGQLModel/Mutations/InteractiveMutations.jsx +30 -0
  382. package/src/StateMachineGQLModel/Mutations/Update.jsx +74 -0
  383. package/src/StateMachineGQLModel/Mutations/helpers.jsx +7 -0
  384. package/src/StateMachineGQLModel/Pages/PageBase.jsx +56 -0
  385. package/src/StateMachineGQLModel/Pages/PageCreateItem.jsx +28 -0
  386. package/src/StateMachineGQLModel/Pages/PageDeleteItem.jsx +16 -0
  387. package/src/StateMachineGQLModel/Pages/PageNavbar.jsx +160 -0
  388. package/src/StateMachineGQLModel/Pages/PageReadItem.jsx +11 -0
  389. package/src/StateMachineGQLModel/Pages/PageReadItemEx.jsx +42 -0
  390. package/src/StateMachineGQLModel/Pages/PageUpdateItem.jsx +14 -0
  391. package/src/StateMachineGQLModel/Pages/PageVector.jsx +80 -0
  392. package/src/StateMachineGQLModel/Pages/RouterSegment.jsx +72 -0
  393. package/src/StateMachineGQLModel/Pages/index.js +2 -0
  394. package/src/StateMachineGQLModel/Queries/DeleteAsyncAction.jsx +32 -0
  395. package/src/StateMachineGQLModel/Queries/Fragments.jsx +148 -0
  396. package/src/StateMachineGQLModel/Queries/InsertAsyncAction.jsx +44 -0
  397. package/src/StateMachineGQLModel/Queries/ReadAsyncAction.jsx +48 -0
  398. package/src/StateMachineGQLModel/Queries/ReadPageAsyncAction.jsx +23 -0
  399. package/src/StateMachineGQLModel/Queries/SearchAsyncAction.jsx +16 -0
  400. package/src/StateMachineGQLModel/Queries/UpdateAsyncAction.jsx +40 -0
  401. package/src/StateMachineGQLModel/Queries/index.js +6 -0
  402. package/src/StateMachineGQLModel/Scalars/ScalarAttribute.jsx +54 -0
  403. package/src/StateMachineGQLModel/Scalars/TemplateScalarAttribute.jsx +88 -0
  404. package/src/StateMachineGQLModel/Scalars/index.js +1 -0
  405. package/src/StateMachineGQLModel/Vectors/TemplateVectorsAttribute.jsx +326 -0
  406. package/src/StateMachineGQLModel/Vectors/VectorAttribute.jsx +56 -0
  407. package/src/StateMachineGQLModel/Vectors/index.js +1 -0
  408. package/src/StateMachineGQLModel/WhatToDo.md +44 -0
  409. package/src/StateMachineGQLModel/index.js +71 -0
  410. package/src/StateTransitionGQLModel/Components/CardCapsule.jsx +43 -0
  411. package/src/StateTransitionGQLModel/Components/Children.jsx +31 -0
  412. package/src/StateTransitionGQLModel/Components/ConfirmEdit.jsx +61 -0
  413. package/src/StateTransitionGQLModel/Components/Filter.jsx +14 -0
  414. package/src/StateTransitionGQLModel/Components/LargeCard.jsx +50 -0
  415. package/src/StateTransitionGQLModel/Components/Link.jsx +54 -0
  416. package/src/StateTransitionGQLModel/Components/LiveEdit.jsx +111 -0
  417. package/src/StateTransitionGQLModel/Components/MediumCard.jsx +39 -0
  418. package/src/StateTransitionGQLModel/Components/MediumContent.jsx +96 -0
  419. package/src/StateTransitionGQLModel/Components/MediumEditableContent.jsx +35 -0
  420. package/src/StateTransitionGQLModel/Components/Table.jsx +7 -0
  421. package/src/StateTransitionGQLModel/Components/index.js +13 -0
  422. package/src/StateTransitionGQLModel/Mutations/Create.jsx +79 -0
  423. package/src/StateTransitionGQLModel/Mutations/Delete.jsx +80 -0
  424. package/src/StateTransitionGQLModel/Mutations/InteractiveMutations.jsx +30 -0
  425. package/src/StateTransitionGQLModel/Mutations/Update.jsx +75 -0
  426. package/src/StateTransitionGQLModel/Mutations/helpers.jsx +7 -0
  427. package/src/StateTransitionGQLModel/Pages/PageBase.jsx +56 -0
  428. package/src/StateTransitionGQLModel/Pages/PageCreateItem.jsx +28 -0
  429. package/src/StateTransitionGQLModel/Pages/PageDeleteItem.jsx +16 -0
  430. package/src/StateTransitionGQLModel/Pages/PageNavbar.jsx +160 -0
  431. package/src/StateTransitionGQLModel/Pages/PageReadItem.jsx +11 -0
  432. package/src/StateTransitionGQLModel/Pages/PageReadItemEx.jsx +42 -0
  433. package/src/StateTransitionGQLModel/Pages/PageUpdateItem.jsx +14 -0
  434. package/src/StateTransitionGQLModel/Pages/PageVector.jsx +80 -0
  435. package/src/StateTransitionGQLModel/Pages/RouterSegment.jsx +72 -0
  436. package/src/StateTransitionGQLModel/Pages/index.js +2 -0
  437. package/src/StateTransitionGQLModel/Queries/DeleteAsyncAction.jsx +32 -0
  438. package/src/StateTransitionGQLModel/Queries/Fragments.jsx +150 -0
  439. package/src/StateTransitionGQLModel/Queries/InsertAsyncAction.jsx +107 -0
  440. package/src/StateTransitionGQLModel/Queries/ReadAsyncAction.jsx +48 -0
  441. package/src/StateTransitionGQLModel/Queries/ReadPageAsyncAction.jsx +23 -0
  442. package/src/StateTransitionGQLModel/Queries/SearchAsyncAction.jsx +16 -0
  443. package/src/StateTransitionGQLModel/Queries/UpdateAsyncAction.jsx +109 -0
  444. package/src/StateTransitionGQLModel/Queries/index.js +6 -0
  445. package/src/StateTransitionGQLModel/Scalars/ScalarAttribute.jsx +54 -0
  446. package/src/StateTransitionGQLModel/Scalars/TemplateScalarAttribute.jsx +88 -0
  447. package/src/StateTransitionGQLModel/Scalars/index.js +1 -0
  448. package/src/StateTransitionGQLModel/Vectors/TemplateVectorsAttribute.jsx +326 -0
  449. package/src/StateTransitionGQLModel/Vectors/VectorAttribute.jsx +56 -0
  450. package/src/StateTransitionGQLModel/Vectors/index.js +1 -0
  451. package/src/StateTransitionGQLModel/WhatToDo.md +44 -0
  452. package/src/StateTransitionGQLModel/index.js +71 -0
  453. package/src/Template/Attributes/TemplateTrivialAttribute.jsx +21 -0
  454. package/src/Template/Attributes/index.js +1 -0
  455. package/src/Template/Components/CUDButton.jsx +128 -0
  456. package/src/Template/Components/CardCapsule.jsx +43 -0
  457. package/src/Template/Components/Children.jsx +31 -0
  458. package/src/Template/Components/ConfirmEdit.jsx +61 -0
  459. package/src/Template/Components/LargeCard.jsx +48 -0
  460. package/src/Template/Components/Link.jsx +41 -0
  461. package/src/Template/Components/LiveEdit.jsx +111 -0
  462. package/src/Template/Components/MediumCard.jsx +39 -0
  463. package/src/Template/Components/MediumContent.jsx +97 -0
  464. package/src/Template/Components/MediumEditableContent.jsx +36 -0
  465. package/src/Template/Components/Table.jsx +7 -0
  466. package/src/Template/Components/index.js +14 -0
  467. package/src/Template/Pages/Page.jsx +28 -0
  468. package/src/Template/Pages/PageCapsule.jsx +13 -0
  469. package/src/Template/Pages/PageContent.jsx +34 -0
  470. package/src/Template/Pages/PageEdit.jsx +17 -0
  471. package/src/Template/Pages/PageNavbar.jsx +110 -0
  472. package/src/Template/Pages/RouterSegment.jsx +52 -0
  473. package/src/Template/Pages/VectorPage.jsx +133 -0
  474. package/src/Template/Pages/index.js +6 -0
  475. package/src/Template/Queries/DeleteAsyncAction.jsx +22 -0
  476. package/src/Template/Queries/Fragments.jsx +92 -0
  477. package/src/Template/Queries/InsertAsyncAction.jsx +22 -0
  478. package/src/Template/Queries/ReadAsyncAction.jsx +45 -0
  479. package/src/Template/Queries/ReadPageAsyncAction.jsx +13 -0
  480. package/src/Template/Queries/UpdateAsyncAction.jsx +76 -0
  481. package/src/Template/Queries/index.js +6 -0
  482. package/src/Template/Scalars/ScalarAttribute.jsx +54 -0
  483. package/src/Template/Scalars/TemplateScalarAttribute.jsx +88 -0
  484. package/src/Template/Scalars/index.js +1 -0
  485. package/src/Template/Vectors/TemplateVectorsAttribute.jsx +326 -0
  486. package/src/Template/Vectors/VectorAttribute.jsx +56 -0
  487. package/src/Template/Vectors/index.js +1 -0
  488. package/src/Template/index.js +71 -0
  489. package/src/UserGQLModel/Components/CUDButton.jsx +128 -0
  490. package/src/UserGQLModel/Components/CardCapsule.jsx +43 -0
  491. package/src/UserGQLModel/Components/ConfirmEdit.jsx +61 -0
  492. package/src/UserGQLModel/Components/Filter.jsx +15 -0
  493. package/src/UserGQLModel/Components/LargeCard.jsx +82 -0
  494. package/src/UserGQLModel/Components/Link.jsx +54 -0
  495. package/src/UserGQLModel/Components/LiveEdit.jsx +111 -0
  496. package/src/UserGQLModel/Components/MediumCard.jsx +40 -0
  497. package/src/UserGQLModel/Components/MediumContent.jsx +43 -0
  498. package/src/UserGQLModel/Components/MediumEditableContent.jsx +57 -0
  499. package/src/UserGQLModel/Components/Table.jsx +7 -0
  500. package/src/UserGQLModel/Components/index.js +13 -0
  501. package/src/UserGQLModel/Mutations/AddMembership.jsx +136 -0
  502. package/src/UserGQLModel/Mutations/Create.jsx +68 -0
  503. package/src/UserGQLModel/Mutations/Delete.jsx +81 -0
  504. package/src/UserGQLModel/Mutations/InteractiveMutations.jsx +30 -0
  505. package/src/UserGQLModel/Mutations/Update.jsx +68 -0
  506. package/src/UserGQLModel/Mutations/helpers.jsx +7 -0
  507. package/src/UserGQLModel/Pages/PageAddMembership.jsx +15 -0
  508. package/src/UserGQLModel/Pages/PageBase.jsx +56 -0
  509. package/src/UserGQLModel/Pages/PageCreateItem.jsx +27 -0
  510. package/src/UserGQLModel/Pages/PageDeleteItem.jsx +16 -0
  511. package/src/UserGQLModel/Pages/PageNavbar.jsx +146 -0
  512. package/src/UserGQLModel/Pages/PageReadItem.jsx +12 -0
  513. package/src/UserGQLModel/Pages/PageReadItemEx.jsx +62 -0
  514. package/src/UserGQLModel/Pages/PageUpdateItem.jsx +14 -0
  515. package/src/UserGQLModel/Pages/PageVector.jsx +78 -0
  516. package/src/UserGQLModel/Pages/RouterSegment.jsx +77 -0
  517. package/src/UserGQLModel/Pages/index.js +9 -0
  518. package/src/UserGQLModel/Queries/DeleteAsyncAction.jsx +22 -0
  519. package/src/UserGQLModel/Queries/Fragments.jsx +114 -0
  520. package/src/UserGQLModel/Queries/InsertAsyncAction.jsx +22 -0
  521. package/src/UserGQLModel/Queries/ReadAsyncAction.jsx +45 -0
  522. package/src/UserGQLModel/Queries/ReadPageAsyncAction.jsx +17 -0
  523. package/src/UserGQLModel/Queries/SearchAsyncAction.jsx +15 -0
  524. package/src/UserGQLModel/Queries/UpdateAsyncAction.jsx +76 -0
  525. package/src/UserGQLModel/Queries/index.js +6 -0
  526. package/src/UserGQLModel/Scalars/ScalarAttribute.jsx +54 -0
  527. package/src/UserGQLModel/Scalars/TemplateScalarAttribute.jsx +88 -0
  528. package/src/UserGQLModel/Scalars/index.js +1 -0
  529. package/src/UserGQLModel/Vectors/Roles.jsx +23 -0
  530. package/src/UserGQLModel/Vectors/TemplateVectorsAttribute.jsx +326 -0
  531. package/src/UserGQLModel/Vectors/UserMemberships.jsx +56 -0
  532. package/src/UserGQLModel/Vectors/UserRoles.jsx +81 -0
  533. package/src/UserGQLModel/Vectors/VectorAttribute.jsx +56 -0
  534. package/src/UserGQLModel/Vectors/index.js +1 -0
  535. package/src/UserGQLModel/index.js +6 -0
  536. package/src/_Template/Components/CardCapsule.jsx +43 -0
  537. package/src/_Template/Components/Children.jsx +31 -0
  538. package/src/_Template/Components/ConfirmEdit.jsx +61 -0
  539. package/src/_Template/Components/Filter.jsx +14 -0
  540. package/src/_Template/Components/LargeCard.jsx +50 -0
  541. package/src/_Template/Components/Link.jsx +54 -0
  542. package/src/_Template/Components/LiveEdit.jsx +111 -0
  543. package/src/_Template/Components/MediumCard.jsx +39 -0
  544. package/src/_Template/Components/MediumContent.jsx +96 -0
  545. package/src/_Template/Components/MediumEditableContent.jsx +35 -0
  546. package/src/_Template/Components/Table.jsx +7 -0
  547. package/src/_Template/Components/index.js +13 -0
  548. package/src/_Template/Mutations/Create.jsx +202 -0
  549. package/src/_Template/Mutations/Delete.jsx +173 -0
  550. package/src/_Template/Mutations/InteractiveMutations.jsx +30 -0
  551. package/src/_Template/Mutations/Update.jsx +147 -0
  552. package/src/_Template/Mutations/helpers.jsx +7 -0
  553. package/src/_Template/Pages/PageBase.jsx +56 -0
  554. package/src/_Template/Pages/PageCreateItem.jsx +28 -0
  555. package/src/_Template/Pages/PageDeleteItem.jsx +16 -0
  556. package/src/_Template/Pages/PageNavbar.jsx +160 -0
  557. package/src/_Template/Pages/PageReadItem.jsx +11 -0
  558. package/src/_Template/Pages/PageReadItemEx.jsx +42 -0
  559. package/src/_Template/Pages/PageUpdateItem.jsx +14 -0
  560. package/src/_Template/Pages/PageVector.jsx +80 -0
  561. package/src/_Template/Pages/RouterSegment.jsx +72 -0
  562. package/src/_Template/Pages/index.js +2 -0
  563. package/src/_Template/Queries/DeleteAsyncAction.jsx +32 -0
  564. package/src/_Template/Queries/Fragments.jsx +101 -0
  565. package/src/_Template/Queries/InsertAsyncAction.jsx +40 -0
  566. package/src/_Template/Queries/ReadAsyncAction.jsx +44 -0
  567. package/src/_Template/Queries/ReadPageAsyncAction.jsx +13 -0
  568. package/src/_Template/Queries/SearchAsyncAction.jsx +16 -0
  569. package/src/_Template/Queries/UpdateAsyncAction.jsx +40 -0
  570. package/src/_Template/Queries/index.js +6 -0
  571. package/src/_Template/Scalars/ScalarAttribute.jsx +54 -0
  572. package/src/_Template/Scalars/TemplateScalarAttribute.jsx +88 -0
  573. package/src/_Template/Scalars/index.js +1 -0
  574. package/src/_Template/Vectors/TemplateVectorsAttribute.jsx +326 -0
  575. package/src/_Template/Vectors/VectorAttribute.jsx +56 -0
  576. package/src/_Template/Vectors/index.js +1 -0
  577. package/src/_Template/WhatToDo.md +44 -0
  578. package/src/_Template/index.js +71 -0
  579. package/src/index.js +8 -0
  580. package/src/uriroot.js +158 -0
  581. package/vite.config.js +47 -0
@@ -0,0 +1,834 @@
1
+ import { useCallback } from "react";
2
+ import { useMemo } from "react";
3
+ import { useState } from "react";
4
+ import { Row } from "../Components/Row";
5
+ import { Col } from "../Components/Col";
6
+ import { SimpleCardCapsule } from "../Components/CardCapsule";
7
+ import { Input } from "./Input";
8
+ import { createContext } from "react";
9
+ import { useContext } from "react";
10
+ import { useEffect } from "react";
11
+ import { useSearchParams } from "react-router";
12
+
13
+ const FilterDesignerContext = createContext(null);
14
+
15
+ export const useFilterDesigner = () => useContext(FilterDesignerContext);
16
+
17
+ function isPlainJoinObject(expr, join) {
18
+ if (!expr || typeof expr !== "object" || Array.isArray(expr)) return false;
19
+ const keys = Object.keys(expr);
20
+ return keys.length === 1 && keys[0] === join && Array.isArray(expr[join]);
21
+ }
22
+
23
+ function combine(join, items = []) {
24
+ const cleaned = items.filter(Boolean).filter((x) => Object.keys(x).length > 0);
25
+
26
+ // flatten stejného joinu: _and v _and, _or v _or
27
+ const flattened = [];
28
+ for (const expr of cleaned) {
29
+ if (isPlainJoinObject(expr, join)) flattened.push(...expr[join]);
30
+ else flattened.push(expr);
31
+ }
32
+
33
+ if (flattened.length === 0) return {};
34
+ if (flattened.length === 1) return flattened[0];
35
+ return { [join]: flattened };
36
+ }
37
+
38
+ export const Filter = ({
39
+ id, // relation key nebo undefined pro root
40
+ label,
41
+ resetKey,
42
+ join: joinProp = "_and",
43
+ onChange = () => null,
44
+ children,
45
+ }) => {
46
+ const parent = useFilterDesigner();
47
+
48
+ // childId -> expr[] | null
49
+ const [currentFilter, setCurrentFilter] = useState({});
50
+ const [join, setJoin] = useState(joinProp);
51
+
52
+ const handleChange = useCallback((e) => {
53
+ const { id: childId, value } = e.target;
54
+ // value: expr[] | null
55
+ setCurrentFilter((prev) => ({ ...prev, [childId]: value }));
56
+ }, []);
57
+
58
+ // místo flatten všech child arrays do jedné items[]:
59
+ const terms = useMemo(() => {
60
+ const arrays = Object.values(currentFilter).filter(Boolean); // (expr[])[]
61
+ return arrays
62
+ .map((arr) => {
63
+ if (!Array.isArray(arr) || arr.length === 0) return null;
64
+ if (arr.length === 1) return arr[0];
65
+ // důležité: mezi termami je OR/AND, uvnitř termy je AND
66
+ return { _and: arr };
67
+ })
68
+ .filter(Boolean);
69
+ }, [currentFilter]);
70
+
71
+ const showAndOr = terms.length > 1;
72
+
73
+ // tady vzniká "lokální" výraz pro tento Filter
74
+ const localExpr = useMemo(() => combine(join, terms), [join, terms]);
75
+
76
+ // a tady se případně zabalí do relation name
77
+ const wrappedExpr = useMemo(() => (id ? { [id]: localExpr } : localExpr), [id, localExpr]);
78
+
79
+ // 1) posílej ven pro consumer
80
+ useEffect(() => {
81
+ onChange({ where: wrappedExpr });
82
+ }, [wrappedExpr, onChange]);
83
+
84
+ // 2) posílej parentu jako expr[] | null (vždy pole!)
85
+ useEffect(() => {
86
+ if (!parent?.handleChange) return;
87
+
88
+ const isEmpty = !wrappedExpr || (typeof wrappedExpr === "object" && Object.keys(wrappedExpr).length === 0);
89
+ parent.handleChange({
90
+ target: {
91
+ id: id ?? "__root__", // parent potřebuje nějaký klíč; pokud root bez id, použij stabilní
92
+ value: isEmpty ? null : [wrappedExpr],
93
+ },
94
+ });
95
+
96
+ return () => {
97
+ parent.handleChange({
98
+ target: {
99
+ id: id ?? "__root__",
100
+ value: null,
101
+ },
102
+ });
103
+ };
104
+ }, [parent, wrappedExpr, id]);
105
+
106
+ const handleJoinChange = useCallback((e) => {
107
+ setJoin(e.target.value); // "_and" | "_or"
108
+ }, []);
109
+
110
+ const readFilter = useCallback(() => wrappedExpr, [wrappedExpr])
111
+ const [resetToken, setResetToken] = useState(0);
112
+ const resetFilter = useCallback(() => {
113
+ setCurrentFilter({});
114
+ setJoin(joinProp);
115
+ setResetToken(t => t + 1); // <-- vynutí remount children
116
+ }, [joinProp]);
117
+
118
+ return (
119
+ <FilterDesignerContext.Provider value={{ handleChange, readFilter, resetFilter }}>
120
+
121
+ <SimpleCardCapsule title={label || id || "where"}>
122
+ {showAndOr && (
123
+ <Row>
124
+ <Col>
125
+ <label>
126
+ <input
127
+ type="radio"
128
+ name={`join-${id ?? "root"}`}
129
+ value="_and"
130
+ checked={join === "_and"}
131
+ onChange={handleJoinChange}
132
+ />
133
+ _and
134
+ </label>
135
+ </Col>
136
+ <Col>
137
+ <label>
138
+ <input
139
+ type="radio"
140
+ name={`join-${id ?? "root"}`}
141
+ value="_or"
142
+ checked={join === "_or"}
143
+ onChange={handleJoinChange}
144
+ />
145
+ _or
146
+ </label>
147
+ </Col>
148
+ </Row>
149
+ )}
150
+ <div key={resetKey ?? resetToken}>
151
+ {children}
152
+ </div>
153
+ </SimpleCardCapsule>
154
+ </FilterDesignerContext.Provider>
155
+ );
156
+ };
157
+
158
+ function isEmptyWhere(where) {
159
+ if (!where) return true;
160
+ if (typeof where !== "object") return true;
161
+ if (Array.isArray(where)) return where.length === 0;
162
+ return Object.keys(where).length === 0;
163
+ }
164
+
165
+ function encodeWhere(where) {
166
+ return JSON.stringify(where);
167
+ }
168
+
169
+ export const ResetFilterButton = ({onClick,
170
+ paramName = "where",
171
+ replace = true,
172
+ ...props
173
+ }) => {
174
+ const filterContext = useFilterDesigner();
175
+ const [searchParams, setSearchParams] = useSearchParams();
176
+
177
+ const handleClick = useCallback(() => {
178
+ if (!filterContext?.readFilter) {
179
+ throw Error("<FilterButton /> must be placed inside <Filter />");
180
+ }
181
+
182
+ const next = new URLSearchParams(searchParams);
183
+ next.delete(paramName);
184
+
185
+ if (onClick) onClick({ where: {} });
186
+ if (filterContext.resetFilter) filterContext.resetFilter();
187
+ setSearchParams(next, { replace });
188
+ }, [filterContext, onClick, searchParams, setSearchParams, paramName, replace]);
189
+
190
+ return <button {...props} onClick={handleClick} />;
191
+ };
192
+
193
+ export const FilterButton = ({
194
+ onClick,
195
+ paramName = "where",
196
+ replace = true,
197
+ ...props
198
+ }) => {
199
+ const filterContext = useFilterDesigner();
200
+ const [searchParams, setSearchParams] = useSearchParams();
201
+
202
+ const handleClick = useCallback(() => {
203
+ if (!filterContext?.readFilter) {
204
+ throw Error("<FilterButton /> must be placed inside <Filter />");
205
+ }
206
+
207
+ const where = filterContext.readFilter(); // HOTOVÉ where
208
+ const extendedWhere = {where}
209
+ if (onClick) return onClick(extendedWhere);
210
+
211
+ const next = new URLSearchParams(searchParams);
212
+
213
+ if (isEmptyWhere(where)) {
214
+ next.delete(paramName);
215
+ } else {
216
+ next.set(paramName, encodeWhere(where));
217
+ }
218
+
219
+ setSearchParams(next, { replace });
220
+ }, [filterContext, onClick, searchParams, setSearchParams, paramName, replace]);
221
+
222
+ return <button {...props} onClick={handleClick} />;
223
+ };
224
+
225
+ export const StringFilter = ({
226
+ id,
227
+ label,
228
+ initialValue = "",
229
+ initialOp = "_ilike",
230
+ }) => {
231
+ const filterContext = useFilterDesigner();
232
+ if (!filterContext) throw Error("<StringFilter /> must be placed inside <Filter />");
233
+ //TODO when filter loads or resets this must accept the values also
234
+ const [op, setOp] = useState(initialOp);
235
+
236
+ // single
237
+ const [text, setText] = useState(initialValue);
238
+
239
+ // between
240
+ const [from, setFrom] = useState("");
241
+ const [to, setTo] = useState("");
242
+
243
+ const emitArrayOrNull = useCallback(
244
+ (arrOrNull) => {
245
+ filterContext.handleChange({ target: { id, value: arrOrNull } });
246
+ },
247
+ [filterContext, id]
248
+ );
249
+
250
+ const buildSingle = useCallback(
251
+ (nextOp, nextText) => {
252
+ if (!nextText) return null;
253
+
254
+ let v = nextText;
255
+ if (nextOp === "_ilike") v = nextText.includes("%") ? nextText : `%${nextText}%`;
256
+
257
+ return [
258
+ {
259
+ [id]: {
260
+ [nextOp]: v,
261
+ },
262
+ },
263
+ ];
264
+ },
265
+ [id]
266
+ );
267
+
268
+ const buildBetween = useCallback(
269
+ (nextFrom, nextTo) => {
270
+ const out = [];
271
+ if (nextFrom) {
272
+ out.push({
273
+ [id]: {
274
+ _gt: nextFrom, // nebo _gte pokud chceš
275
+ },
276
+ });
277
+ }
278
+ if (nextTo) {
279
+ out.push({
280
+ [id]: {
281
+ _lt: nextTo, // nebo _lte pokud chceš
282
+ },
283
+ });
284
+ }
285
+ return out.length ? out : null;
286
+ },
287
+ [id]
288
+ );
289
+
290
+ const emit = useCallback(
291
+ ({ nextOp = op, nextText = text, nextFrom = from, nextTo = to }) => {
292
+ if (nextOp === "_between") {
293
+ emitArrayOrNull(buildBetween(nextFrom, nextTo));
294
+ } else {
295
+ emitArrayOrNull(buildSingle(nextOp, nextText));
296
+ }
297
+ },
298
+ [op, text, from, to, emitArrayOrNull, buildSingle, buildBetween]
299
+ );
300
+
301
+ const handleChangeOp = useCallback(
302
+ (e) => {
303
+ const next = e.target.value;
304
+ if (next === op) return;
305
+ setOp(next);
306
+
307
+ // při přepnutí režimu přepočti emit
308
+ if (next === "_between") {
309
+ // můžeš si rozhodnout, jestli chceš single text přenést do from apod.; teď nic
310
+ emit({ nextOp: next });
311
+ } else {
312
+ emit({ nextOp: next });
313
+ }
314
+ },
315
+ [op, emit]
316
+ );
317
+
318
+ const handleChangeText = useCallback(
319
+ (e) => {
320
+ const next = e.target.value;
321
+ if (next === text) return;
322
+ setText(next);
323
+ if (op !== "_between") emit({ nextText: next });
324
+ },
325
+ [op, text, emit]
326
+ );
327
+
328
+ const handleChangeFrom = useCallback(
329
+ (e) => {
330
+ const next = e.target.value;
331
+ if (next === from) return;
332
+ setFrom(next);
333
+ if (op === "_between") emit({ nextFrom: next });
334
+ },
335
+ [op, from, emit]
336
+ );
337
+
338
+ const handleChangeTo = useCallback(
339
+ (e) => {
340
+ const next = e.target.value;
341
+ if (next === to) return;
342
+ setTo(next);
343
+ if (op === "_between") emit({ nextTo: next });
344
+ },
345
+ [op, to, emit]
346
+ );
347
+
348
+ const showBetween = op === "_between";
349
+
350
+ return (
351
+ <SimpleCardCapsule title={label || id}>
352
+ <Row>
353
+ <Col>
354
+ <select className="form-control" value={op} onChange={handleChangeOp}>
355
+ <option value="Obsahuje">_ilike</option>
356
+ <option value="Začíná na">_startswith</option>
357
+ <option value="Končí na">_endswith</option>
358
+ <option value="Je rovno">_eq</option>
359
+ <option value="Je větší než">_gt</option>
360
+ <option value="Je menší než">_lt</option>
361
+ <option value="Mezi">_between</option>
362
+ </select>
363
+ </Col>
364
+
365
+ {!showBetween ? (
366
+ <Col>
367
+ <Input className="form-control" value={text} onChange={handleChangeText} />
368
+ </Col>
369
+ ) : (
370
+ <>
371
+ <Col>
372
+ <Input
373
+ className="form-control"
374
+ value={from}
375
+ onChange={handleChangeFrom}
376
+ placeholder="from…"
377
+ />
378
+ </Col>
379
+ <Col>
380
+ {(op === "_between") && <Input
381
+ className="form-control"
382
+ value={to}
383
+ onChange={handleChangeTo}
384
+ placeholder="to…"
385
+ />
386
+ }
387
+ </Col>
388
+ </>
389
+ )}
390
+ </Row>
391
+ </SimpleCardCapsule>
392
+ );
393
+ };
394
+
395
+ function toUtcIsoFromDatetimeLocal(value) {
396
+ // value: "YYYY-MM-DDTHH:mm" (nebo s vteřinami)
397
+ const d = new Date(value); // bere jako lokální čas
398
+ if (Number.isNaN(d.getTime())) return null;
399
+ return d.toISOString();
400
+ }
401
+
402
+ export const DateTimeFilter = ({
403
+ id,
404
+ label,
405
+ initialOp = "_gte",
406
+ initialValue = "", // "2025-12-23T10:30"
407
+ emitUtcIso = true, // true => ISO se Z
408
+ }) => {
409
+ const filterContext = useFilterDesigner();
410
+ if (!filterContext) throw Error("<DateTimeFilter /> must be placed inside <Filter />");
411
+
412
+ const [op, setOp] = useState(initialOp);
413
+
414
+ // single
415
+ const [text, setText] = useState(initialValue);
416
+
417
+ // between
418
+ const [from, setFrom] = useState("");
419
+ const [to, setTo] = useState("");
420
+
421
+ const normalize = useCallback(
422
+ (raw) => {
423
+ if (!raw) return null;
424
+ return emitUtcIso ? toUtcIsoFromDatetimeLocal(raw) : raw;
425
+ },
426
+ [emitUtcIso]
427
+ );
428
+
429
+ const emitArrayOrNull = useCallback(
430
+ (arrOrNull) => {
431
+ filterContext.handleChange({ target: { id, value: arrOrNull } });
432
+ },
433
+ [filterContext, id]
434
+ );
435
+
436
+ const buildSingle = useCallback(
437
+ (nextOp, nextText) => {
438
+ const v = normalize(nextText);
439
+ if (!v) return null;
440
+
441
+ return [
442
+ {
443
+ [id]: {
444
+ [nextOp]: v,
445
+ },
446
+ },
447
+ ];
448
+ },
449
+ [id, normalize]
450
+ );
451
+
452
+ const buildBetween = useCallback(
453
+ (nextFrom, nextTo) => {
454
+ const out = [];
455
+
456
+ const vf = normalize(nextFrom);
457
+ const vt = normalize(nextTo);
458
+
459
+ // stejné chování jako u StringFilter: když je vyplněna jen jedna strana, vrátí se 1 prvek
460
+ if (vf) {
461
+ out.push({
462
+ [id]: { _gt: vf }, // nebo _gte, pokud chceš inclusive
463
+ });
464
+ }
465
+ if (vt) {
466
+ out.push({
467
+ [id]: { _lt: vt }, // nebo _lte
468
+ });
469
+ }
470
+
471
+ return out.length ? out : null;
472
+ },
473
+ [id, normalize]
474
+ );
475
+
476
+ const emit = useCallback(
477
+ ({ nextOp = op, nextText = text, nextFrom = from, nextTo = to }) => {
478
+ if (nextOp === "_between") emitArrayOrNull(buildBetween(nextFrom, nextTo));
479
+ else emitArrayOrNull(buildSingle(nextOp, nextText));
480
+ },
481
+ [op, text, from, to, emitArrayOrNull, buildSingle, buildBetween]
482
+ );
483
+
484
+ const handleChangeOp = useCallback(
485
+ (e) => {
486
+ const next = e.target.value;
487
+ if (next === op) return;
488
+ setOp(next);
489
+ emit({ nextOp: next });
490
+ },
491
+ [op, emit]
492
+ );
493
+
494
+ const handleChangeText = useCallback(
495
+ (e) => {
496
+ const next = e.target.value;
497
+ if (next === text) return;
498
+ setText(next);
499
+ if (op !== "_between") emit({ nextText: next });
500
+ },
501
+ [op, text, emit]
502
+ );
503
+
504
+ const handleChangeFrom = useCallback(
505
+ (e) => {
506
+ const next = e.target.value;
507
+ if (next === from) return;
508
+ setFrom(next);
509
+ if (op === "_between") emit({ nextFrom: next });
510
+ },
511
+ [op, from, emit]
512
+ );
513
+
514
+ const handleChangeTo = useCallback(
515
+ (e) => {
516
+ const next = e.target.value;
517
+ if (next === to) return;
518
+ setTo(next);
519
+ if (op === "_between") emit({ nextTo: next });
520
+ },
521
+ [op, to, emit]
522
+ );
523
+
524
+ const showBetween = op === "_between";
525
+
526
+ return (
527
+ <SimpleCardCapsule title={label || id}>
528
+ <Row>
529
+ <Col>
530
+ <select className="form-control" value={op} onChange={handleChangeOp}>
531
+ <option value="_eq">_eq</option>
532
+ <option value="_gt">_gt</option>
533
+ <option value="_gte">_gte</option>
534
+ <option value="_lt">_lt</option>
535
+ <option value="_lte">_lte</option>
536
+ <option value="_between">_between</option>
537
+ </select>
538
+ </Col>
539
+
540
+ {!showBetween ? (
541
+ <Col>
542
+ <Input
543
+ className="form-control"
544
+ type="datetime-local"
545
+ value={text}
546
+ onChange={handleChangeText}
547
+ />
548
+ </Col>
549
+ ) : (
550
+ <>
551
+ <Col>
552
+ <Input
553
+ className="form-control"
554
+ type="datetime-local"
555
+ value={from}
556
+ onChange={handleChangeFrom}
557
+ placeholder="from…"
558
+ />
559
+ </Col>
560
+ <Col>
561
+ <Input
562
+ className="form-control"
563
+ type="datetime-local"
564
+ value={to}
565
+ onChange={handleChangeTo}
566
+ placeholder="to…"
567
+ />
568
+ </Col>
569
+ </>
570
+ )}
571
+ </Row>
572
+ </SimpleCardCapsule>
573
+ );
574
+ };
575
+
576
+ function parseFloatOrNull(raw) {
577
+ if (raw == null) return null;
578
+ const s = String(raw).trim();
579
+ if (!s) return null;
580
+
581
+ // podporuj i desetinnou čárku
582
+ const normalized = s.replace(",", ".");
583
+ const n = Number(normalized);
584
+ return Number.isFinite(n) ? n : null;
585
+ }
586
+
587
+ export const FloatFilter = ({
588
+ id,
589
+ label,
590
+ initialOp = "_gte",
591
+ initialValue = "",
592
+ }) => {
593
+ const filterContext = useFilterDesigner();
594
+ if (!filterContext) throw Error("<FloatFilter /> must be placed inside <Filter />");
595
+
596
+ const [op, setOp] = useState(initialOp);
597
+
598
+ // single
599
+ const [text, setText] = useState(initialValue);
600
+
601
+ // between
602
+ const [from, setFrom] = useState("");
603
+ const [to, setTo] = useState("");
604
+
605
+ const emitArrayOrNull = useCallback(
606
+ (arrOrNull) => {
607
+ filterContext.handleChange({ target: { id, value: arrOrNull } });
608
+ },
609
+ [filterContext, id]
610
+ );
611
+
612
+ const buildSingle = useCallback(
613
+ (nextOp, nextText) => {
614
+ const v = parseFloatOrNull(nextText);
615
+ if (v == null) return null;
616
+
617
+ return [
618
+ {
619
+ [id]: {
620
+ [nextOp]: v,
621
+ },
622
+ },
623
+ ];
624
+ },
625
+ [id]
626
+ );
627
+
628
+ const buildBetween = useCallback(
629
+ (nextFrom, nextTo) => {
630
+ const out = [];
631
+ const vf = parseFloatOrNull(nextFrom);
632
+ const vt = parseFloatOrNull(nextTo);
633
+
634
+ if (vf != null) {
635
+ out.push({
636
+ [id]: { _gt: vf }, // nebo _gte
637
+ });
638
+ }
639
+ if (vt != null) {
640
+ out.push({
641
+ [id]: { _lt: vt }, // nebo _lte
642
+ });
643
+ }
644
+ return out.length ? out : null;
645
+ },
646
+ [id]
647
+ );
648
+
649
+ const emit = useCallback(
650
+ ({ nextOp = op, nextText = text, nextFrom = from, nextTo = to }) => {
651
+ if (nextOp === "_between") emitArrayOrNull(buildBetween(nextFrom, nextTo));
652
+ else emitArrayOrNull(buildSingle(nextOp, nextText));
653
+ },
654
+ [op, text, from, to, emitArrayOrNull, buildSingle, buildBetween]
655
+ );
656
+
657
+ const handleChangeOp = useCallback(
658
+ (e) => {
659
+ const next = e.target.value;
660
+ if (next === op) return;
661
+ setOp(next);
662
+ emit({ nextOp: next });
663
+ },
664
+ [op, emit]
665
+ );
666
+
667
+ const handleChangeText = useCallback(
668
+ (e) => {
669
+ const next = e.target.value;
670
+ if (next === text) return;
671
+ setText(next);
672
+ if (op !== "_between") emit({ nextText: next });
673
+ },
674
+ [op, text, emit]
675
+ );
676
+
677
+ const handleChangeFrom = useCallback(
678
+ (e) => {
679
+ const next = e.target.value;
680
+ if (next === from) return;
681
+ setFrom(next);
682
+ if (op === "_between") emit({ nextFrom: next });
683
+ },
684
+ [op, from, emit]
685
+ );
686
+
687
+ const handleChangeTo = useCallback(
688
+ (e) => {
689
+ const next = e.target.value;
690
+ if (next === to) return;
691
+ setTo(next);
692
+ if (op === "_between") emit({ nextTo: next });
693
+ },
694
+ [op, to, emit]
695
+ );
696
+
697
+ const showBetween = op === "_between";
698
+
699
+ return (
700
+ <SimpleCardCapsule title={label || id}>
701
+ <Row>
702
+ <Col>
703
+ <select className="form-control" value={op} onChange={handleChangeOp}>
704
+ <option value="_eq">_eq</option>
705
+ <option value="_gt">_gt</option>
706
+ <option value="_gte">_gte</option>
707
+ <option value="_lt">_lt</option>
708
+ <option value="_lte">_lte</option>
709
+ <option value="_between">_between</option>
710
+ </select>
711
+ </Col>
712
+
713
+ {!showBetween ? (
714
+ <Col>
715
+ <Input
716
+ className="form-control"
717
+ type="number"
718
+ inputMode="decimal"
719
+ value={text}
720
+ onChange={handleChangeText}
721
+ placeholder="0.0"
722
+ />
723
+ </Col>
724
+ ) : (
725
+ <>
726
+ <Col>
727
+ <Input
728
+ className="form-control"
729
+ type="number"
730
+ inputMode="decimal"
731
+ value={from}
732
+ onChange={handleChangeFrom}
733
+ placeholder="from…"
734
+ />
735
+ </Col>
736
+ <Col>
737
+ <Input
738
+ className="form-control"
739
+ type="number"
740
+ inputMode="decimal"
741
+ value={to}
742
+ onChange={handleChangeTo}
743
+ placeholder="to…"
744
+ />
745
+ </Col>
746
+ </>
747
+ )}
748
+ </Row>
749
+ </SimpleCardCapsule>
750
+ );
751
+ };
752
+
753
+ const UUID_RE =
754
+ /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
755
+
756
+ export const UUIDFilter = ({
757
+ id,
758
+ label,
759
+ initialValue = "",
760
+ }) => {
761
+ const filterContext = useFilterDesigner();
762
+ if (!filterContext) throw Error("<UUIDFilter /> must be placed inside <Filter />");
763
+
764
+ const [text, setText] = useState(initialValue);
765
+ const trimmed = useMemo(() => (text ?? "").trim(), [text]);
766
+
767
+ const isEmpty = trimmed.length === 0;
768
+ const isValid = isEmpty ? true : UUID_RE.test(trimmed);
769
+
770
+ const emitArrayOrNull = useCallback(
771
+ (arrOrNull) => {
772
+ filterContext.handleChange({ target: { id, value: arrOrNull } });
773
+ },
774
+ [filterContext, id]
775
+ );
776
+
777
+ const emit = useCallback(
778
+ (nextText) => {
779
+ const v = (nextText ?? "").trim();
780
+
781
+ // prázdné = vypnout filtr
782
+ if (!v) {
783
+ emitArrayOrNull(null);
784
+ return;
785
+ }
786
+
787
+ // nevalidní = také vypnout filtr (a UI ukáže chybu)
788
+ if (!UUID_RE.test(v)) {
789
+ emitArrayOrNull(null);
790
+ return;
791
+ }
792
+
793
+ emitArrayOrNull([
794
+ {
795
+ [id]: { _eq: v },
796
+ },
797
+ ]);
798
+ },
799
+ [id, emitArrayOrNull]
800
+ );
801
+
802
+ const handleChangeText = useCallback(
803
+ (e) => {
804
+ const next = e.target.value;
805
+ if (next === text) return;
806
+ setText(next);
807
+ emit(next);
808
+ },
809
+ [text, emit]
810
+ );
811
+
812
+ return (
813
+ <SimpleCardCapsule title={label || id}>
814
+ <Row>
815
+ <Col style={{ minWidth: 80 }}>
816
+ <span style={{ opacity: 0.7 }}>(_eq)</span>
817
+ </Col>
818
+ <Col>
819
+ <Input
820
+ className={`form-control ${!isValid ? "is-invalid" : ""}`}
821
+ value={text}
822
+ onChange={handleChangeText}
823
+ placeholder="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
824
+ />
825
+ {!isValid && (
826
+ <div className="invalid-feedback" style={{ display: "block" }}>
827
+ Neplatné UUID. Očekávám formát 8-4-4-4-12 hex (např. 550e8400-e29b-41d4-a716-446655440000).
828
+ </div>
829
+ )}
830
+ </Col>
831
+ </Row>
832
+ </SimpleCardCapsule>
833
+ );
834
+ };