@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.
- package/dist/cjs/index.js +1 -0
- package/dist/es/index.js +1 -0
- package/dist/umd/index.js +1 -0
- package/package.json +29 -0
- package/src/UserGQLModel/Components/CardCapsule.jsx +43 -0
- package/src/UserGQLModel/Components/Children.jsx +31 -0
- package/src/UserGQLModel/Components/ConfirmEdit.jsx +61 -0
- package/src/UserGQLModel/Components/Filter.jsx +14 -0
- package/src/UserGQLModel/Components/LargeCard.jsx +50 -0
- package/src/UserGQLModel/Components/Link.jsx +54 -0
- package/src/UserGQLModel/Components/LiveEdit.jsx +111 -0
- package/src/UserGQLModel/Components/MediumCard.jsx +39 -0
- package/src/UserGQLModel/Components/MediumContent.jsx +136 -0
- package/src/UserGQLModel/Components/MediumEditableContent.jsx +35 -0
- package/src/UserGQLModel/Components/Table.jsx +7 -0
- package/src/UserGQLModel/Components/index.js +13 -0
- package/src/UserGQLModel/Mutations/Create.jsx +202 -0
- package/src/UserGQLModel/Mutations/Delete.jsx +173 -0
- package/src/UserGQLModel/Mutations/InteractiveMutations.jsx +30 -0
- package/src/UserGQLModel/Mutations/Update.jsx +147 -0
- package/src/UserGQLModel/Mutations/helpers.jsx +7 -0
- package/src/UserGQLModel/Pages/PageBase.jsx +56 -0
- package/src/UserGQLModel/Pages/PageCreateItem.jsx +28 -0
- package/src/UserGQLModel/Pages/PageDeleteItem.jsx +16 -0
- package/src/UserGQLModel/Pages/PageNavbar.jsx +160 -0
- package/src/UserGQLModel/Pages/PageReadItem.jsx +11 -0
- package/src/UserGQLModel/Pages/PageReadItemEx.jsx +42 -0
- package/src/UserGQLModel/Pages/PageUpdateItem.jsx +14 -0
- package/src/UserGQLModel/Pages/PageVector.jsx +80 -0
- package/src/UserGQLModel/Pages/RouterSegment.jsx +72 -0
- package/src/UserGQLModel/Pages/index.js +2 -0
- package/src/UserGQLModel/Queries/DeleteAsyncAction.jsx +32 -0
- package/src/UserGQLModel/Queries/Fragments.jsx +88 -0
- package/src/UserGQLModel/Queries/InsertAsyncAction.jsx +40 -0
- package/src/UserGQLModel/Queries/ReadAsyncAction.jsx +44 -0
- package/src/UserGQLModel/Queries/ReadPageAsyncAction.jsx +13 -0
- package/src/UserGQLModel/Queries/SearchAsyncAction.jsx +16 -0
- package/src/UserGQLModel/Queries/UpdateAsyncAction.jsx +40 -0
- package/src/UserGQLModel/Queries/index.js +6 -0
- package/src/UserGQLModel/Scalars/ScalarAttribute.jsx +54 -0
- package/src/UserGQLModel/Scalars/TemplateScalarAttribute.jsx +88 -0
- package/src/UserGQLModel/Scalars/index.js +1 -0
- package/src/UserGQLModel/Vectors/TemplateVectorsAttribute.jsx +326 -0
- package/src/UserGQLModel/Vectors/VectorAttribute.jsx +56 -0
- package/src/UserGQLModel/Vectors/index.js +1 -0
- package/src/UserGQLModel/WhatToDo.md +44 -0
- package/src/UserGQLModel/index.js +71 -0
- package/src/index.js +0 -0
- 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 })
|