@simsustech/quasar-components 0.1.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 (301) hide show
  1. package/.eslintignore +2 -0
  2. package/.eslintrc.cjs +19 -0
  3. package/.prettierignore +2 -0
  4. package/.prettierrc.json +22 -0
  5. package/CHANGELOG.md +7 -0
  6. package/LICENSE +21 -0
  7. package/StandardComponent.vue +50 -0
  8. package/package.json +81 -0
  9. package/src/shims-vue.d.ts +6 -0
  10. package/src/ui/authentication/ConsentList.vue +89 -0
  11. package/src/ui/authentication/EmailChangeForm.vue +128 -0
  12. package/src/ui/authentication/EmailChangeStepper.vue +153 -0
  13. package/src/ui/authentication/LoginButton.vue +56 -0
  14. package/src/ui/authentication/LoginForm.vue +162 -0
  15. package/src/ui/authentication/OtpInput.vue +30 -0
  16. package/src/ui/authentication/PasswordChangeForm.vue +161 -0
  17. package/src/ui/authentication/PasswordChangeStepper.vue +153 -0
  18. package/src/ui/authentication/README.md +15 -0
  19. package/src/ui/authentication/RegisterForm.vue +218 -0
  20. package/src/ui/authentication/RequestOtpForm.vue +99 -0
  21. package/src/ui/authentication/UserMenuButton.vue +54 -0
  22. package/src/ui/authentication/VerificationSlider.vue +57 -0
  23. package/src/ui/authentication/index.ts +12 -0
  24. package/src/ui/authentication/lang/en-US.ts +94 -0
  25. package/src/ui/authentication/lang/index.ts +124 -0
  26. package/src/ui/authentication/lang/nl.ts +94 -0
  27. package/src/ui/flags/README.md +30 -0
  28. package/src/ui/flags/assets/en-US.svg +26 -0
  29. package/src/ui/flags/assets/nl.svg +8 -0
  30. package/src/ui/flags/index.ts +4 -0
  31. package/src/ui/flags/lang/en-US.ts +135 -0
  32. package/src/ui/flags/lang/index.ts +169 -0
  33. package/src/ui/flags/lang/nl.ts +135 -0
  34. package/src/ui/flags/vue-flags/ad.svg +12 -0
  35. package/src/ui/flags/vue-flags/ae.svg +9 -0
  36. package/src/ui/flags/vue-flags/af.svg +11 -0
  37. package/src/ui/flags/vue-flags/ag.svg +12 -0
  38. package/src/ui/flags/vue-flags/ai.svg +25 -0
  39. package/src/ui/flags/vue-flags/al.svg +7 -0
  40. package/src/ui/flags/vue-flags/am.svg +7 -0
  41. package/src/ui/flags/vue-flags/ao.svg +11 -0
  42. package/src/ui/flags/vue-flags/aq.svg +13 -0
  43. package/src/ui/flags/vue-flags/ar.svg +10 -0
  44. package/src/ui/flags/vue-flags/as.svg +9 -0
  45. package/src/ui/flags/vue-flags/at.svg +9 -0
  46. package/src/ui/flags/vue-flags/au.svg +28 -0
  47. package/src/ui/flags/vue-flags/aw.svg +11 -0
  48. package/src/ui/flags/vue-flags/ax.svg +7 -0
  49. package/src/ui/flags/vue-flags/az.svg +11 -0
  50. package/src/ui/flags/vue-flags/ba.svg +20 -0
  51. package/src/ui/flags/vue-flags/bb.svg +10 -0
  52. package/src/ui/flags/vue-flags/bd.svg +6 -0
  53. package/src/ui/flags/vue-flags/be.svg +7 -0
  54. package/src/ui/flags/vue-flags/bf.svg +8 -0
  55. package/src/ui/flags/vue-flags/bg.svg +8 -0
  56. package/src/ui/flags/vue-flags/bh.svg +6 -0
  57. package/src/ui/flags/vue-flags/bi.svg +20 -0
  58. package/src/ui/flags/vue-flags/bj.svg +7 -0
  59. package/src/ui/flags/vue-flags/bl.svg +14 -0
  60. package/src/ui/flags/vue-flags/bm.svg +43 -0
  61. package/src/ui/flags/vue-flags/bn.svg +16 -0
  62. package/src/ui/flags/vue-flags/bo.svg +7 -0
  63. package/src/ui/flags/vue-flags/bq.svg +9 -0
  64. package/src/ui/flags/vue-flags/br.svg +11 -0
  65. package/src/ui/flags/vue-flags/bs.svg +10 -0
  66. package/src/ui/flags/vue-flags/bt.svg +7 -0
  67. package/src/ui/flags/vue-flags/bv.svg +8 -0
  68. package/src/ui/flags/vue-flags/bw.svg +10 -0
  69. package/src/ui/flags/vue-flags/by.svg +17 -0
  70. package/src/ui/flags/vue-flags/bz.svg +14 -0
  71. package/src/ui/flags/vue-flags/ca.svg +11 -0
  72. package/src/ui/flags/vue-flags/cc.svg +46 -0
  73. package/src/ui/flags/vue-flags/cd.svg +9 -0
  74. package/src/ui/flags/vue-flags/cf.svg +19 -0
  75. package/src/ui/flags/vue-flags/cg.svg +8 -0
  76. package/src/ui/flags/vue-flags/ch.svg +7 -0
  77. package/src/ui/flags/vue-flags/ci.svg +8 -0
  78. package/src/ui/flags/vue-flags/ck.svg +27 -0
  79. package/src/ui/flags/vue-flags/cl.svg +9 -0
  80. package/src/ui/flags/vue-flags/cm.svg +11 -0
  81. package/src/ui/flags/vue-flags/cn.svg +13 -0
  82. package/src/ui/flags/vue-flags/co.svg +8 -0
  83. package/src/ui/flags/vue-flags/cr.svg +11 -0
  84. package/src/ui/flags/vue-flags/cu.svg +14 -0
  85. package/src/ui/flags/vue-flags/cv.svg +23 -0
  86. package/src/ui/flags/vue-flags/cw.svg +11 -0
  87. package/src/ui/flags/vue-flags/cx.svg +17 -0
  88. package/src/ui/flags/vue-flags/cy.svg +8 -0
  89. package/src/ui/flags/vue-flags/cz.svg +8 -0
  90. package/src/ui/flags/vue-flags/de.svg +8 -0
  91. package/src/ui/flags/vue-flags/dj.svg +9 -0
  92. package/src/ui/flags/vue-flags/dk.svg +7 -0
  93. package/src/ui/flags/vue-flags/dm.svg +26 -0
  94. package/src/ui/flags/vue-flags/do.svg +13 -0
  95. package/src/ui/flags/vue-flags/dz.svg +10 -0
  96. package/src/ui/flags/vue-flags/ec.svg +11 -0
  97. package/src/ui/flags/vue-flags/ee.svg +8 -0
  98. package/src/ui/flags/vue-flags/eg.svg +9 -0
  99. package/src/ui/flags/vue-flags/eh.svg +13 -0
  100. package/src/ui/flags/vue-flags/er.svg +9 -0
  101. package/src/ui/flags/vue-flags/es.svg +10 -0
  102. package/src/ui/flags/vue-flags/et.svg +13 -0
  103. package/src/ui/flags/vue-flags/fi.svg +7 -0
  104. package/src/ui/flags/vue-flags/fj.svg +18 -0
  105. package/src/ui/flags/vue-flags/fk.svg +26 -0
  106. package/src/ui/flags/vue-flags/fm.svg +12 -0
  107. package/src/ui/flags/vue-flags/fo.svg +8 -0
  108. package/src/ui/flags/vue-flags/fr.svg +8 -0
  109. package/src/ui/flags/vue-flags/ga.svg +8 -0
  110. package/src/ui/flags/vue-flags/gb.svg +31 -0
  111. package/src/ui/flags/vue-flags/gd.svg +26 -0
  112. package/src/ui/flags/vue-flags/ge.svg +13 -0
  113. package/src/ui/flags/vue-flags/gf.svg +8 -0
  114. package/src/ui/flags/vue-flags/gg.svg +8 -0
  115. package/src/ui/flags/vue-flags/gh.svg +9 -0
  116. package/src/ui/flags/vue-flags/gi.svg +11 -0
  117. package/src/ui/flags/vue-flags/gl.svg +11 -0
  118. package/src/ui/flags/vue-flags/gm.svg +9 -0
  119. package/src/ui/flags/vue-flags/gn.svg +8 -0
  120. package/src/ui/flags/vue-flags/gp.svg +8 -0
  121. package/src/ui/flags/vue-flags/gq.svg +12 -0
  122. package/src/ui/flags/vue-flags/gr.svg +17 -0
  123. package/src/ui/flags/vue-flags/gs.svg +159 -0
  124. package/src/ui/flags/vue-flags/gt.svg +12 -0
  125. package/src/ui/flags/vue-flags/gu.svg +13 -0
  126. package/src/ui/flags/vue-flags/gw.svg +9 -0
  127. package/src/ui/flags/vue-flags/gy.svg +14 -0
  128. package/src/ui/flags/vue-flags/hk.svg +13 -0
  129. package/src/ui/flags/vue-flags/hm.svg +28 -0
  130. package/src/ui/flags/vue-flags/hn.svg +15 -0
  131. package/src/ui/flags/vue-flags/hr.svg +31 -0
  132. package/src/ui/flags/vue-flags/ht.svg +13 -0
  133. package/src/ui/flags/vue-flags/hu.svg +8 -0
  134. package/src/ui/flags/vue-flags/id.svg +7 -0
  135. package/src/ui/flags/vue-flags/ie.svg +8 -0
  136. package/src/ui/flags/vue-flags/il.svg +11 -0
  137. package/src/ui/flags/vue-flags/im.svg +7 -0
  138. package/src/ui/flags/vue-flags/in.svg +11 -0
  139. package/src/ui/flags/vue-flags/io.svg +60 -0
  140. package/src/ui/flags/vue-flags/iq.svg +13 -0
  141. package/src/ui/flags/vue-flags/ir.svg +37 -0
  142. package/src/ui/flags/vue-flags/is.svg +8 -0
  143. package/src/ui/flags/vue-flags/it.svg +8 -0
  144. package/src/ui/flags/vue-flags/je.svg +12 -0
  145. package/src/ui/flags/vue-flags/jm.svg +10 -0
  146. package/src/ui/flags/vue-flags/jo.svg +10 -0
  147. package/src/ui/flags/vue-flags/jp.svg +7 -0
  148. package/src/ui/flags/vue-flags/ke.svg +19 -0
  149. package/src/ui/flags/vue-flags/kg.svg +17 -0
  150. package/src/ui/flags/vue-flags/kh.svg +11 -0
  151. package/src/ui/flags/vue-flags/ki.svg +21 -0
  152. package/src/ui/flags/vue-flags/km.svg +17 -0
  153. package/src/ui/flags/vue-flags/kn.svg +13 -0
  154. package/src/ui/flags/vue-flags/kp.svg +14 -0
  155. package/src/ui/flags/vue-flags/kr.svg +26 -0
  156. package/src/ui/flags/vue-flags/kw.svg +9 -0
  157. package/src/ui/flags/vue-flags/ky.svg +25 -0
  158. package/src/ui/flags/vue-flags/kz.svg +9 -0
  159. package/src/ui/flags/vue-flags/la.svg +11 -0
  160. package/src/ui/flags/vue-flags/lb.svg +11 -0
  161. package/src/ui/flags/vue-flags/lc.svg +9 -0
  162. package/src/ui/flags/vue-flags/li.svg +8 -0
  163. package/src/ui/flags/vue-flags/lk.svg +19 -0
  164. package/src/ui/flags/vue-flags/lr.svg +16 -0
  165. package/src/ui/flags/vue-flags/ls.svg +9 -0
  166. package/src/ui/flags/vue-flags/lt.svg +8 -0
  167. package/src/ui/flags/vue-flags/lu.svg +8 -0
  168. package/src/ui/flags/vue-flags/lv.svg +10 -0
  169. package/src/ui/flags/vue-flags/ly.svg +12 -0
  170. package/src/ui/flags/vue-flags/ma.svg +7 -0
  171. package/src/ui/flags/vue-flags/mc.svg +7 -0
  172. package/src/ui/flags/vue-flags/md.svg +11 -0
  173. package/src/ui/flags/vue-flags/me.svg +13 -0
  174. package/src/ui/flags/vue-flags/mf.svg +8 -0
  175. package/src/ui/flags/vue-flags/mg.svg +8 -0
  176. package/src/ui/flags/vue-flags/mh.svg +11 -0
  177. package/src/ui/flags/vue-flags/mk.svg +18 -0
  178. package/src/ui/flags/vue-flags/ml.svg +8 -0
  179. package/src/ui/flags/vue-flags/mm.svg +9 -0
  180. package/src/ui/flags/vue-flags/mn.svg +19 -0
  181. package/src/ui/flags/vue-flags/mo.svg +18 -0
  182. package/src/ui/flags/vue-flags/mp.svg +10 -0
  183. package/src/ui/flags/vue-flags/mq.svg +13 -0
  184. package/src/ui/flags/vue-flags/mr.svg +10 -0
  185. package/src/ui/flags/vue-flags/ms.svg +23 -0
  186. package/src/ui/flags/vue-flags/mt.svg +8 -0
  187. package/src/ui/flags/vue-flags/mu.svg +9 -0
  188. package/src/ui/flags/vue-flags/mv.svg +8 -0
  189. package/src/ui/flags/vue-flags/mw.svg +9 -0
  190. package/src/ui/flags/vue-flags/mx.svg +10 -0
  191. package/src/ui/flags/vue-flags/my.svg +17 -0
  192. package/src/ui/flags/vue-flags/mz.svg +13 -0
  193. package/src/ui/flags/vue-flags/na.svg +10 -0
  194. package/src/ui/flags/vue-flags/nc.svg +8 -0
  195. package/src/ui/flags/vue-flags/ne.svg +9 -0
  196. package/src/ui/flags/vue-flags/nf.svg +11 -0
  197. package/src/ui/flags/vue-flags/ng.svg +10 -0
  198. package/src/ui/flags/vue-flags/ni.svg +14 -0
  199. package/src/ui/flags/vue-flags/nl.svg +8 -0
  200. package/src/ui/flags/vue-flags/no.svg +8 -0
  201. package/src/ui/flags/vue-flags/np.svg +13 -0
  202. package/src/ui/flags/vue-flags/nr.svg +8 -0
  203. package/src/ui/flags/vue-flags/nu.svg +48 -0
  204. package/src/ui/flags/vue-flags/nz.svg +26 -0
  205. package/src/ui/flags/vue-flags/om.svg +14 -0
  206. package/src/ui/flags/vue-flags/pa.svg +10 -0
  207. package/src/ui/flags/vue-flags/pe.svg +10 -0
  208. package/src/ui/flags/vue-flags/pf.svg +17 -0
  209. package/src/ui/flags/vue-flags/pg.svg +15 -0
  210. package/src/ui/flags/vue-flags/ph.svg +16 -0
  211. package/src/ui/flags/vue-flags/pk.svg +14 -0
  212. package/src/ui/flags/vue-flags/pl.svg +10 -0
  213. package/src/ui/flags/vue-flags/pm.svg +8 -0
  214. package/src/ui/flags/vue-flags/pn.svg +24 -0
  215. package/src/ui/flags/vue-flags/pr.svg +13 -0
  216. package/src/ui/flags/vue-flags/ps.svg +9 -0
  217. package/src/ui/flags/vue-flags/pt.svg +10 -0
  218. package/src/ui/flags/vue-flags/pw.svg +7 -0
  219. package/src/ui/flags/vue-flags/py.svg +10 -0
  220. package/src/ui/flags/vue-flags/qa.svg +7 -0
  221. package/src/ui/flags/vue-flags/re.svg +8 -0
  222. package/src/ui/flags/vue-flags/ro.svg +8 -0
  223. package/src/ui/flags/vue-flags/rs.svg +14 -0
  224. package/src/ui/flags/vue-flags/ru.svg +9 -0
  225. package/src/ui/flags/vue-flags/rw.svg +9 -0
  226. package/src/ui/flags/vue-flags/sa.svg +14 -0
  227. package/src/ui/flags/vue-flags/sb.svg +15 -0
  228. package/src/ui/flags/vue-flags/sc.svg +10 -0
  229. package/src/ui/flags/vue-flags/sd.svg +9 -0
  230. package/src/ui/flags/vue-flags/se.svg +7 -0
  231. package/src/ui/flags/vue-flags/sg.svg +15 -0
  232. package/src/ui/flags/vue-flags/sh.svg +31 -0
  233. package/src/ui/flags/vue-flags/si.svg +11 -0
  234. package/src/ui/flags/vue-flags/sj.svg +8 -0
  235. package/src/ui/flags/vue-flags/sk.svg +12 -0
  236. package/src/ui/flags/vue-flags/sl.svg +8 -0
  237. package/src/ui/flags/vue-flags/sm.svg +12 -0
  238. package/src/ui/flags/vue-flags/sn.svg +11 -0
  239. package/src/ui/flags/vue-flags/so.svg +7 -0
  240. package/src/ui/flags/vue-flags/sr.svg +12 -0
  241. package/src/ui/flags/vue-flags/ss.svg +11 -0
  242. package/src/ui/flags/vue-flags/st.svg +13 -0
  243. package/src/ui/flags/vue-flags/sv.svg +13 -0
  244. package/src/ui/flags/vue-flags/sx.svg +15 -0
  245. package/src/ui/flags/vue-flags/sy.svg +12 -0
  246. package/src/ui/flags/vue-flags/sz.svg +27 -0
  247. package/src/ui/flags/vue-flags/tc.svg +25 -0
  248. package/src/ui/flags/vue-flags/td.svg +8 -0
  249. package/src/ui/flags/vue-flags/tf.svg +9 -0
  250. package/src/ui/flags/vue-flags/tg.svg +13 -0
  251. package/src/ui/flags/vue-flags/th.svg +11 -0
  252. package/src/ui/flags/vue-flags/tj.svg +18 -0
  253. package/src/ui/flags/vue-flags/tk.svg +16 -0
  254. package/src/ui/flags/vue-flags/tl.svg +9 -0
  255. package/src/ui/flags/vue-flags/tm.svg +35 -0
  256. package/src/ui/flags/vue-flags/tn.svg +11 -0
  257. package/src/ui/flags/vue-flags/to.svg +8 -0
  258. package/src/ui/flags/vue-flags/tr.svg +10 -0
  259. package/src/ui/flags/vue-flags/tt.svg +8 -0
  260. package/src/ui/flags/vue-flags/tv.svg +9 -0
  261. package/src/ui/flags/vue-flags/tw.svg +10 -0
  262. package/src/ui/flags/vue-flags/tz.svg +9 -0
  263. package/src/ui/flags/vue-flags/ua.svg +7 -0
  264. package/src/ui/flags/vue-flags/ug.svg +12 -0
  265. package/src/ui/flags/vue-flags/um.svg +26 -0
  266. package/src/ui/flags/vue-flags/unknown.svg +7 -0
  267. package/src/ui/flags/vue-flags/us.svg +26 -0
  268. package/src/ui/flags/vue-flags/uy.svg +14 -0
  269. package/src/ui/flags/vue-flags/uz.svg +27 -0
  270. package/src/ui/flags/vue-flags/va.svg +9 -0
  271. package/src/ui/flags/vue-flags/vc.svg +13 -0
  272. package/src/ui/flags/vue-flags/ve.svg +18 -0
  273. package/src/ui/flags/vue-flags/vg.svg +34 -0
  274. package/src/ui/flags/vue-flags/vi.svg +20 -0
  275. package/src/ui/flags/vue-flags/vn.svg +7 -0
  276. package/src/ui/flags/vue-flags/vu.svg +15 -0
  277. package/src/ui/flags/vue-flags/wf.svg +8 -0
  278. package/src/ui/flags/vue-flags/ws.svg +14 -0
  279. package/src/ui/flags/vue-flags/ye.svg +8 -0
  280. package/src/ui/flags/vue-flags/yt.svg +8 -0
  281. package/src/ui/flags/vue-flags/za.svg +11 -0
  282. package/src/ui/flags/vue-flags/zm.svg +10 -0
  283. package/src/ui/flags/vue-flags/zw.svg +20 -0
  284. package/src/ui/general/QStyledCard.vue +77 -0
  285. package/src/ui/general/QStyledLayout.vue +108 -0
  286. package/src/ui/general/QSubmitButton.vue +70 -0
  287. package/src/ui/general/index.ts +2 -0
  288. package/src/ui/general/lang/en-US.ts +10 -0
  289. package/src/ui/general/lang/index.ts +44 -0
  290. package/src/ui/general/lang/nl.ts +10 -0
  291. package/src/ui/icons/README.md +3 -0
  292. package/src/ui/icons/assets/microsoft.svg +10 -0
  293. package/src/ui/icons/icons.ts +5 -0
  294. package/src/ui/icons/index.ts +3 -0
  295. package/src/ui/index.ts +2 -0
  296. package/src/vite-plugin.ts +30 -0
  297. package/tsconfig.build.plugin.json +7 -0
  298. package/tsconfig.json +23 -0
  299. package/tsconfig.node.json +10 -0
  300. package/tsconfig.types.json +17 -0
  301. package/vite.config.ts +136 -0
@@ -0,0 +1,162 @@
1
+ <template>
2
+ <q-form ref="formRef" class="q-gutter-md" v-bind="form">
3
+ <q-input
4
+ v-if="!useUsername"
5
+ v-bind="input"
6
+ id="email"
7
+ v-model="email"
8
+ name="email"
9
+ :label="lang.login.fields.email"
10
+ bottom-slots
11
+ :rules="validations['email']"
12
+ lazy-rules
13
+ />
14
+ <q-input
15
+ v-if="useUsername"
16
+ v-bind="input"
17
+ id="username"
18
+ v-model="username"
19
+ name="username"
20
+ :label="lang.login.fields.username"
21
+ bottom-slots
22
+ :rules="validations['username']"
23
+ lazy-rules
24
+ />
25
+ <q-input
26
+ id="password"
27
+ v-model="password"
28
+ class="q-pt-none"
29
+ v-bind="input"
30
+ name="password"
31
+ :type="showPassword ? 'text' : 'password'"
32
+ :label="lang.login.fields.password"
33
+ :rules="validations['password']"
34
+ lazy-rules
35
+ bottom-slots
36
+ >
37
+ <template #append>
38
+ <q-icon
39
+ :name="showPassword ? 'visibility' : 'visibility_off'"
40
+ class="cursor-pointer"
41
+ @click="showPassword = !showPassword"
42
+ />
43
+ </template>
44
+ </q-input>
45
+ <q-btn
46
+ v-if="passwordForgotUrl"
47
+ class="q-pt-none"
48
+ :label="lang.login.forgotPassword"
49
+ size="sm"
50
+ flat
51
+ :to="passwordForgotUrl"
52
+ ></q-btn>
53
+ <slot name="default" :submit="submit" />
54
+ </q-form>
55
+ </template>
56
+
57
+ <script lang="ts">
58
+ export default {
59
+ name: 'LoginForm'
60
+ }
61
+ </script>
62
+
63
+ <script setup lang="ts">
64
+ import { ref, computed, watch } from 'vue'
65
+ import { useQuasar, QFormProps, QForm, QInputProps } from 'quasar'
66
+ import { useLang, loadLang } from './lang'
67
+ import isEmail from 'validator/es/lib/isEmail'
68
+
69
+ import QSubmitButton from '../general/QSubmitButton.vue'
70
+
71
+ export interface Props {
72
+ useUsername?: boolean
73
+ passwordForgotUrl?: string
74
+ form?: QFormProps & HTMLFormElement
75
+ input?: Omit<
76
+ QInputProps,
77
+ | 'id'
78
+ | 'name'
79
+ | 'modelValue'
80
+ | 'label'
81
+ | 'rules'
82
+ | 'type'
83
+ | 'lazy-rules'
84
+ | 'autofocus'
85
+ | ('label' & { style?: Partial<CSSStyleDeclaration> })
86
+ >
87
+ }
88
+ defineProps<Props>()
89
+ // const attrs = useAttrs();
90
+ const emit = defineEmits<{
91
+ (
92
+ e: 'submit',
93
+ {
94
+ email,
95
+ password,
96
+ username,
97
+ done
98
+ }: {
99
+ email?: string
100
+ password: string
101
+ username?: string
102
+ done: () => void
103
+ }
104
+ ): void
105
+ }>()
106
+ const $q = useQuasar()
107
+ const lang = useLang()
108
+ if (lang.value.isoName !== $q.lang.isoName) loadLang($q.lang.isoName)
109
+ watch($q.lang, (val) => {
110
+ loadLang($q.lang.isoName)
111
+ })
112
+
113
+ const email = ref('')
114
+ const password = ref('')
115
+ const username = ref('')
116
+ const showPassword = ref(false)
117
+ const header = computed(() => lang.value.login.login)
118
+ const createAccount = computed(() => lang.value.login.createAccount)
119
+ const invalidCredentials = computed(() => lang.value.login.invalidCredentials)
120
+ const unprocessableRequest = computed(() => lang.value.unprocessableRequest)
121
+
122
+ const formRef = ref<QForm>()
123
+ const validations = computed<
124
+ Record<string, ((val: string) => boolean | string)[]>
125
+ >(() => ({
126
+ email: [
127
+ (val) => !!val || lang.value.login.validations.fieldRequired,
128
+ (val) => isEmail(val) || lang.value.login.validations.invalidEmail
129
+ ],
130
+ username: [(val) => !!val || lang.value.login.validations.fieldRequired],
131
+ password: [(val) => !!val || lang.value.login.validations.fieldRequired]
132
+ }))
133
+
134
+ const submit: InstanceType<typeof QSubmitButton>['$props']['onSubmit'] = (
135
+ evt
136
+ ) => {
137
+ formRef.value?.validate().then((success) => {
138
+ if (success) {
139
+ emit('submit', {
140
+ email: email.value,
141
+ password: password.value,
142
+ username: username.value,
143
+ done: evt.done
144
+ })
145
+ } else evt.done()
146
+ })
147
+ }
148
+
149
+ const variables = ref({
150
+ header,
151
+ createAccount,
152
+ invalidCredentials,
153
+ unprocessableRequest
154
+ })
155
+ const functions = ref({
156
+ submit
157
+ })
158
+ defineExpose({
159
+ variables,
160
+ functions
161
+ })
162
+ </script>
@@ -0,0 +1,30 @@
1
+ <template>
2
+ <q-input
3
+ id="otp"
4
+ name="otp"
5
+ :model-value="modelValue"
6
+ bottom-slots
7
+ lazy-rules
8
+ :label="lang.otp.verificationCode"
9
+ :rules="validations['otp']"
10
+ @update:model-value="$emit('update:modelValue', $event)"
11
+ />
12
+ </template>
13
+
14
+ <script setup lang="ts">
15
+ import { QInput } from 'quasar'
16
+ import { computed } from 'vue'
17
+ import { useLang } from './lang'
18
+
19
+ defineProps<{
20
+ modelValue: string
21
+ }>()
22
+ defineEmits(['update:modelValue'])
23
+
24
+ const lang = useLang()
25
+ const validations = computed<
26
+ Record<string, ((val: string) => boolean | string)[]>
27
+ >(() => ({
28
+ otp: [(val) => !!val || lang.value.otp.validations.fieldRequired]
29
+ }))
30
+ </script>
@@ -0,0 +1,161 @@
1
+ <template>
2
+ <q-form ref="formRef" class="q-gutter-md" v-bind="form">
3
+ <otp-input v-bind="input" v-model="otp" />
4
+ <q-input
5
+ v-bind="input"
6
+ id="newPassword"
7
+ v-model="newPassword"
8
+ name="newPassword"
9
+ :type="showPassword ? 'text' : 'password'"
10
+ :label="lang.password.fields.password"
11
+ bottom-slots
12
+ :rules="validations['newPassword']"
13
+ lazy-rules
14
+ >
15
+ <template #append>
16
+ <q-icon
17
+ :name="showPassword ? 'visibility' : 'visibility_off'"
18
+ class="cursor-pointer"
19
+ @click="showPassword = !showPassword"
20
+ />
21
+ </template>
22
+ </q-input>
23
+ <q-input
24
+ v-bind="input"
25
+ id="repeatNewPassword"
26
+ v-model="repeatNewPassword"
27
+ name="repeatNewPassword"
28
+ :type="showRepeatPassword ? 'text' : 'password'"
29
+ :label="lang.password.fields.repeatPassword"
30
+ bottom-slots
31
+ :rules="validations['repeatNewPassword']"
32
+ lazy-rules
33
+ >
34
+ <template #append>
35
+ <q-icon
36
+ :name="showRepeatPassword ? 'visibility' : 'visibility_off'"
37
+ class="cursor-pointer"
38
+ @click="showRepeatPassword = !showRepeatPassword"
39
+ />
40
+ </template>
41
+ </q-input>
42
+ <slot name="default" :submit="submit" />
43
+ </q-form>
44
+ </template>
45
+
46
+ <script lang="ts">
47
+ export default {
48
+ name: 'PasswordChangeForm'
49
+ }
50
+ </script>
51
+
52
+ <script setup lang="ts">
53
+ import { ref, computed, watch, toRef, withDefaults } from 'vue'
54
+ import { useQuasar, QFormProps, QForm, QInputProps } from 'quasar'
55
+ import { useLang, loadLang } from './lang'
56
+ import equals from 'validator/es/lib/equals.js'
57
+
58
+ import QSubmitButton from '../general/QSubmitButton.vue'
59
+ import OtpInput from './OtpInput.vue'
60
+
61
+ export interface Props {
62
+ email: string
63
+ minimumPasswordLength?: number
64
+ form?: QFormProps & HTMLFormElement
65
+ input?: Omit<
66
+ QInputProps,
67
+ | 'id'
68
+ | 'name'
69
+ | 'modelValue'
70
+ | 'label'
71
+ | 'rules'
72
+ | 'type'
73
+ | 'lazy-rules'
74
+ | 'autofocus'
75
+ | ('label' & { style?: Partial<CSSStyleDeclaration> })
76
+ >
77
+ }
78
+ const props = withDefaults(defineProps<Props>(), {
79
+ minimumPasswordLength: 8,
80
+ form: undefined,
81
+ input: undefined
82
+ })
83
+ // const attrs = useAttrs();
84
+ const emit = defineEmits<{
85
+ (
86
+ e: 'submit',
87
+ {
88
+ email,
89
+ newPassword,
90
+ otp,
91
+ done
92
+ }: {
93
+ email: string
94
+ newPassword: string
95
+ otp: string
96
+ done: () => void
97
+ }
98
+ ): void
99
+ }>()
100
+ const $q = useQuasar()
101
+ const lang = useLang()
102
+ if (lang.value.isoName !== $q.lang.isoName) loadLang($q.lang.isoName)
103
+ watch($q.lang, (val) => {
104
+ loadLang($q.lang.isoName)
105
+ })
106
+
107
+ const email = toRef(props, 'email')
108
+ const minimumPasswordLength = toRef(props, 'minimumPasswordLength')
109
+ const otp = ref('')
110
+ const newPassword = ref('')
111
+ const repeatNewPassword = ref('')
112
+ const showPassword = ref(false)
113
+ const showRepeatPassword = ref(false)
114
+ const header = computed(() => lang.value.password.changePassword)
115
+
116
+ const formRef = ref<QForm>()
117
+ const validations = computed<
118
+ Record<string, ((val: string) => boolean | string)[]>
119
+ >(() => ({
120
+ password: [
121
+ (val) => !!val || lang.value.password.validations.fieldRequired,
122
+ (val) =>
123
+ val.length >= minimumPasswordLength.value ||
124
+ lang.value.password.validations.minimumPasswordLength(
125
+ minimumPasswordLength.value
126
+ )
127
+ ],
128
+ repeatPassword: [
129
+ (val) => !!val || lang.value.password.validations.fieldRequired,
130
+ (val) =>
131
+ equals(val, newPassword.value) ||
132
+ lang.value.password.validations.passwordsDoNotMatch
133
+ ]
134
+ }))
135
+
136
+ const submit: InstanceType<typeof QSubmitButton>['$props']['onSubmit'] = (
137
+ evt
138
+ ) => {
139
+ formRef.value?.validate().then((success) => {
140
+ if (success) {
141
+ emit('submit', {
142
+ email: email.value,
143
+ newPassword: newPassword.value,
144
+ otp: otp.value,
145
+ done: evt.done
146
+ })
147
+ } else evt.done()
148
+ })
149
+ }
150
+
151
+ const variables = ref({
152
+ header
153
+ })
154
+ const functions = ref({
155
+ submit
156
+ })
157
+ defineExpose({
158
+ variables,
159
+ functions
160
+ })
161
+ </script>
@@ -0,0 +1,153 @@
1
+ <template>
2
+ <q-stepper v-model="step">
3
+ <q-step name="requestOtp" :title="requestOtpHeader">
4
+ <request-otp-form
5
+ ref="requestOtpFormRef"
6
+ :input="input"
7
+ @submit="requestOtp"
8
+ ></request-otp-form>
9
+ </q-step>
10
+
11
+ <q-step name="changePassword" :title="passwordChangeHeader">
12
+ <password-change-form
13
+ ref="passwordChangeFormRef"
14
+ :email="email"
15
+ :input="input"
16
+ @submit="changePassword"
17
+ >
18
+ </password-change-form>
19
+ </q-step>
20
+ <template #navigation>
21
+ <q-stepper-navigation class="text-right">
22
+ <q-submit-button
23
+ v-if="step === 'requestOtp'"
24
+ is-next-button
25
+ @submit="requestOtpFormRef?.functions.submit"
26
+ ></q-submit-button>
27
+ <q-submit-button
28
+ v-if="step === 'changePassword'"
29
+ @submit="passwordChangeFormRef?.functions.submit"
30
+ ></q-submit-button>
31
+ </q-stepper-navigation>
32
+ </template>
33
+ </q-stepper>
34
+ </template>
35
+
36
+ <script lang="ts">
37
+ export default {
38
+ name: 'PasswordChangeStepper'
39
+ }
40
+ </script>
41
+
42
+ <script setup lang="ts">
43
+ import { ref, computed, watch } from 'vue'
44
+ import { useQuasar, QInputProps } from 'quasar'
45
+ import { useLang, loadLang } from './lang'
46
+ import QSubmitButton from '../general/QSubmitButton.vue'
47
+ import RequestOtpForm from './RequestOtpForm.vue'
48
+ import PasswordChangeForm from './PasswordChangeForm.vue'
49
+ export interface Props {
50
+ input?: Omit<
51
+ QInputProps,
52
+ | 'id'
53
+ | 'name'
54
+ | 'modelValue'
55
+ | 'label'
56
+ | 'rules'
57
+ | 'type'
58
+ | 'lazy-rules'
59
+ | 'autofocus'
60
+ | ('label' & { style?: Partial<CSSStyleDeclaration> })
61
+ >
62
+ }
63
+ defineProps<Props>()
64
+ // const attrs = useAttrs();
65
+ const emit = defineEmits<{
66
+ (
67
+ e: 'requestOtp',
68
+ {
69
+ email,
70
+ done
71
+ }: {
72
+ email: string
73
+ done: () => void
74
+ }
75
+ ): void
76
+ (
77
+ e: 'changePassword',
78
+ {
79
+ email,
80
+ newPassword,
81
+ otp,
82
+ done
83
+ }: {
84
+ email: string
85
+ newPassword: string
86
+ otp: string
87
+ done: () => void
88
+ }
89
+ ): void
90
+ }>()
91
+ const $q = useQuasar()
92
+ const lang = useLang()
93
+ if (lang.value.isoName !== $q.lang.isoName) loadLang($q.lang.isoName)
94
+ watch($q.lang, (val) => {
95
+ loadLang($q.lang.isoName)
96
+ })
97
+
98
+ const steps = ['requestOtp', 'changePassword'] as const
99
+ const step = ref<typeof steps[number]>('requestOtp')
100
+ const email = ref('')
101
+ const header = computed(() => lang.value.password.changePassword)
102
+ const passwordChanged = computed(() => lang.value.password.passwordChanged)
103
+ const unprocessableRequest = computed(() => lang.value.unprocessableRequest)
104
+ const checkEmail = computed(() => lang.value.otp.checkEmail)
105
+
106
+ const requestOtpFormRef = ref<typeof RequestOtpForm>()
107
+ const passwordChangeFormRef = ref<typeof PasswordChangeForm>()
108
+
109
+ const requestOtpHeader = computed(
110
+ () => requestOtpFormRef.value?.variables.header || ''
111
+ )
112
+ const passwordChangeHeader = computed(
113
+ () => passwordChangeFormRef.value?.variables.header || ''
114
+ )
115
+ const requestOtp: InstanceType<typeof RequestOtpForm>['$props']['onSubmit'] = ({
116
+ email: emittedEmail,
117
+ done
118
+ }) => {
119
+ emit('requestOtp', {
120
+ email: emittedEmail,
121
+ done: () => {
122
+ email.value = emittedEmail
123
+ done()
124
+ }
125
+ })
126
+ }
127
+
128
+ const changePassword: InstanceType<
129
+ typeof PasswordChangeForm
130
+ >['$props']['onSubmit'] = ({ email, newPassword, otp, done }) => {
131
+ emit('changePassword', {
132
+ email,
133
+ newPassword,
134
+ otp,
135
+ done
136
+ })
137
+ }
138
+
139
+ const variables = ref({
140
+ header,
141
+ passwordChanged,
142
+ unprocessableRequest,
143
+ checkEmail,
144
+ steps
145
+ })
146
+ const functions = ref({
147
+ goToStep: (newStep: typeof steps[number]) => (step.value = newStep)
148
+ })
149
+ defineExpose({
150
+ variables,
151
+ functions
152
+ })
153
+ </script>
@@ -0,0 +1,15 @@
1
+ # Authentication
2
+
3
+ > Authentication related components for Quasar Framework
4
+
5
+ # Usage
6
+
7
+ ```html
8
+ <template>
9
+ <login-form />
10
+ </template>
11
+
12
+ <script setup lang="ts">
13
+ import { LoginForm } from '@simsustech/quasar-components/authentication'
14
+ </script>
15
+ ```