@pajapaja/student 0.6.2

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 (49) hide show
  1. package/dist/cjs/index.js +1 -0
  2. package/dist/es/index.js +1 -0
  3. package/dist/umd/index.js +1 -0
  4. package/package.json +29 -0
  5. package/src/UserGQLModel/Components/CardCapsule.jsx +43 -0
  6. package/src/UserGQLModel/Components/Children.jsx +31 -0
  7. package/src/UserGQLModel/Components/ConfirmEdit.jsx +61 -0
  8. package/src/UserGQLModel/Components/Filter.jsx +14 -0
  9. package/src/UserGQLModel/Components/LargeCard.jsx +50 -0
  10. package/src/UserGQLModel/Components/Link.jsx +54 -0
  11. package/src/UserGQLModel/Components/LiveEdit.jsx +111 -0
  12. package/src/UserGQLModel/Components/MediumCard.jsx +39 -0
  13. package/src/UserGQLModel/Components/MediumContent.jsx +136 -0
  14. package/src/UserGQLModel/Components/MediumEditableContent.jsx +35 -0
  15. package/src/UserGQLModel/Components/Table.jsx +7 -0
  16. package/src/UserGQLModel/Components/index.js +13 -0
  17. package/src/UserGQLModel/Mutations/Create.jsx +202 -0
  18. package/src/UserGQLModel/Mutations/Delete.jsx +173 -0
  19. package/src/UserGQLModel/Mutations/InteractiveMutations.jsx +30 -0
  20. package/src/UserGQLModel/Mutations/Update.jsx +147 -0
  21. package/src/UserGQLModel/Mutations/helpers.jsx +7 -0
  22. package/src/UserGQLModel/Pages/PageBase.jsx +56 -0
  23. package/src/UserGQLModel/Pages/PageCreateItem.jsx +28 -0
  24. package/src/UserGQLModel/Pages/PageDeleteItem.jsx +16 -0
  25. package/src/UserGQLModel/Pages/PageNavbar.jsx +160 -0
  26. package/src/UserGQLModel/Pages/PageReadItem.jsx +11 -0
  27. package/src/UserGQLModel/Pages/PageReadItemEx.jsx +42 -0
  28. package/src/UserGQLModel/Pages/PageUpdateItem.jsx +14 -0
  29. package/src/UserGQLModel/Pages/PageVector.jsx +80 -0
  30. package/src/UserGQLModel/Pages/RouterSegment.jsx +72 -0
  31. package/src/UserGQLModel/Pages/index.js +2 -0
  32. package/src/UserGQLModel/Queries/DeleteAsyncAction.jsx +32 -0
  33. package/src/UserGQLModel/Queries/Fragments.jsx +88 -0
  34. package/src/UserGQLModel/Queries/InsertAsyncAction.jsx +40 -0
  35. package/src/UserGQLModel/Queries/ReadAsyncAction.jsx +44 -0
  36. package/src/UserGQLModel/Queries/ReadPageAsyncAction.jsx +13 -0
  37. package/src/UserGQLModel/Queries/SearchAsyncAction.jsx +16 -0
  38. package/src/UserGQLModel/Queries/UpdateAsyncAction.jsx +40 -0
  39. package/src/UserGQLModel/Queries/index.js +6 -0
  40. package/src/UserGQLModel/Scalars/ScalarAttribute.jsx +54 -0
  41. package/src/UserGQLModel/Scalars/TemplateScalarAttribute.jsx +88 -0
  42. package/src/UserGQLModel/Scalars/index.js +1 -0
  43. package/src/UserGQLModel/Vectors/TemplateVectorsAttribute.jsx +326 -0
  44. package/src/UserGQLModel/Vectors/VectorAttribute.jsx +56 -0
  45. package/src/UserGQLModel/Vectors/index.js +1 -0
  46. package/src/UserGQLModel/WhatToDo.md +44 -0
  47. package/src/UserGQLModel/index.js +71 -0
  48. package/src/index.js +0 -0
  49. package/src/uriroot.js +158 -0
package/src/uriroot.js ADDED
@@ -0,0 +1,158 @@
1
+ /**
2
+ * Očistí segment URL/URI od přebytečných lomítek na začátku a na konci.
3
+ *
4
+ * Používá se pro segmenty `app`, `model`, `action` tak, aby výsledná cesta
5
+ * nevznikala jako `//app//model/...` a aby se dalo bezpečně skládat i z hodnot,
6
+ * které už obsahují `/`.
7
+ *
8
+ * @private
9
+ * @param {any} s
10
+ * Hodnota segmentu (typicky string); `null/undefined` se převede na prázdný string.
11
+ * @returns {string}
12
+ * Segment bez úvodních a koncových `/`.
13
+ */
14
+ const clean = (s) => String(s ?? "").replace(/^\/+|\/+$/g, "");
15
+
16
+ /**
17
+ * Vytvoří "stringovatelný" objekt reprezentující kanonickou aplikací definovanou URI cestu
18
+ * ve tvaru:
19
+ *
20
+ * - bez `:id`: `/{app}/{model}/{action}`
21
+ * - s `:id`: `/{app}/{model}/{action}/{:id}`
22
+ *
23
+ * Objekt je určený pro postupné skládání a odvozování cest napříč aplikací:
24
+ * - sdílení společného základu (např. `app` nebo `app+model`)
25
+ * - tvorbu odvozenin přes `.change(...)` bez mutace původního objektu
26
+ * - pohodlné použití v routeru, linkách a šablonách díky "stringovatelnosti"
27
+ *
28
+ * ### Stringovatelnost
29
+ * Vrácený objekt se chová jako string:
30
+ * - `String(obj)` vrátí finální cestu
31
+ * - template literal: `` `${obj}` `` vrátí finální cestu
32
+ * - `obj.path` obsahuje totéž explicitně
33
+ *
34
+ * ### Odvozování bez mutace (immutable styl)
35
+ * Metoda `.change(patch)` vrací NOVÝ URI objekt s aplikovanými změnami.
36
+ * Původní objekt zůstává nedotčen, takže je bezpečné ho sdílet napříč moduly.
37
+ *
38
+ * ### Zkratky
39
+ * Kromě `.change(...)` poskytuje i zkratky:
40
+ * - `.app("...")`
41
+ * - `.model("...")`
42
+ * - `.action("...")`
43
+ * - `.id(true|false)` (alias pro `withId`)
44
+ * - `.idParam(":id")` (změna názvu parametru id)
45
+ *
46
+ * @example
47
+ * // Základ pro konkrétní model:
48
+ * const GroupView = uri({ app: "app", model: "group", action: "view" });
49
+ *
50
+ * String(GroupView) // "/app/group/view"
51
+ * String(GroupView.id()) // "/app/group/view/:id"
52
+ *
53
+ * @example
54
+ * // Odvozené akce nad stejným modelem:
55
+ * const Group = uri({ app: "app", model: "group", action: "view" });
56
+ * const GroupEdit = Group.action("edit").id(true);
57
+ * const GroupDelete = Group.action("delete").id(true);
58
+ *
59
+ * String(GroupEdit) // "/app/group/edit/:id"
60
+ * String(GroupDelete) // "/app/group/delete/:id"
61
+ *
62
+ * @example
63
+ * // Přepnutí id parametru:
64
+ * const UserView = uri({ app: "app", model: "user", action: "view" }).id(true).idParam(":userId");
65
+ * String(UserView) // "/app/user/view/:userId"
66
+ *
67
+ * @function uri
68
+ * @param {object} [options]
69
+ * @param {string} [options.app]
70
+ * První segment cesty (např. "app"). Přebytečné "/" na začátku/konci se odstraní.
71
+ * @param {string} [options.model]
72
+ * Druhý segment cesty (např. "group", "roleType"...).
73
+ * @param {string} [options.action]
74
+ * Třetí segment cesty (např. "view", "create", "edit", "delete", "rolesOn"...).
75
+ * @param {boolean} [options.withId=false]
76
+ * Pokud `true`, připojí se na konec ještě segment s parametrem id (`/:idParam`).
77
+ * @param {string} [options.idParam=":id"]
78
+ * Název parametru pro identifikátor entity. Můžeš zadat `":id"` nebo `"id"` – v obou
79
+ * případech bude interně normalizováno na formát s dvojtečkou (např. `":id"`).
80
+ *
81
+ * @returns {UriBuilder}
82
+ * "Stringovatelný" objekt s výslednou cestou, segmenty a metodami pro odvozování.
83
+ *
84
+ * @typedef {object} UriBuilder
85
+ * @property {string} path
86
+ * Finální cesta (např. `"/app/group/view"` nebo `"/app/group/view/:id"`).
87
+ * @property {{app:string, model:string, action:string, withId:boolean, idParam:string}} segments
88
+ * Normalizované segmenty, ze kterých byla cesta složena.
89
+ * Pozn.: pokud `segments` budeš ručně měnit, `path` se tím nezmění (je spočítaný).
90
+ * Doporučení: segmenty používej jen pro čtení.
91
+ *
92
+ * @property {() => string} toString
93
+ * Vrací `path`. Umožňuje použití v template literal a při `String(obj)`.
94
+ * @property {() => string} valueOf
95
+ * Vrací `path`. Doplňková string/primitive konverze.
96
+ * @property {(hint: "number"|"string"|"default") => string} [Symbol.toPrimitive]
97
+ * Vrací `path` pro implicitní konverzi (např. `` `${obj}` ``).
98
+ *
99
+ * @property {(patch?: Partial<UriPatch>) => UriBuilder} change
100
+ * Vytvoří nový `UriBuilder` s aplikovaným patchem (libovolná část URI může být změněna).
101
+ *
102
+ * @property {(app: string) => UriBuilder} app
103
+ * Zkratka pro `change({ app })`.
104
+ * @property {(model: string) => UriBuilder} model
105
+ * Zkratka pro `change({ model })`.
106
+ * @property {(action: string) => UriBuilder} action
107
+ * Zkratka pro `change({ action })`.
108
+ * @property {(on?: boolean) => UriBuilder} id
109
+ * Zkratka pro `change({ withId: on })`. Default `true`.
110
+ * @property {(p?: string) => UriBuilder} idParam
111
+ * Zkratka pro `change({ idParam: p })`. Default `":id"`.
112
+ *
113
+ * @typedef {object} UriPatch
114
+ * @property {string} [app]
115
+ * @property {string} [model]
116
+ * @property {string} [action]
117
+ * @property {boolean} [withId]
118
+ * @property {string} [idParam]
119
+ */
120
+ export const uri = ({ app = "_", model = "_", action = "view", withId = false, idParam = ":id" } = {}) => {
121
+ const seg = {
122
+ app: clean(app),
123
+ model: clean(model),
124
+ action: clean(action),
125
+ withId: Boolean(withId),
126
+ idParam: String(idParam).startsWith(":") ? String(idParam) : `:${String(idParam)}`,
127
+ };
128
+
129
+ const base = `/${seg.app}/${seg.model}/${seg.action}`.replace(/\/+/g, "/");
130
+ const path = seg.withId ? `${base}/${seg.idParam}` : base;
131
+
132
+ const obj = {
133
+ path,
134
+ segments: seg,
135
+
136
+ // stringovatelnost
137
+ toString() { return path; },
138
+ valueOf() { return path; },
139
+ [Symbol.toPrimitive]() { return path; },
140
+
141
+ // "immutable" změna: vrátí nový objekt
142
+ change(patch = {}) {
143
+ return uri({ ...seg, ...patch });
144
+ },
145
+
146
+ // volitelné zkratky
147
+ app(app) { return obj.change({ app }); },
148
+ model(model) { return obj.change({ model }); },
149
+ action(action) { return obj.change({ action }); },
150
+ id(on = true) { return obj.change({ withId: on }); },
151
+ idParam(p = ":id") { return obj.change({ idParam: p }); },
152
+ };
153
+
154
+ return obj;
155
+ };
156
+
157
+ export const URIRoot = "/student"
158
+ export const URIRootObj = uri({ app: URIRoot })