From 418050c72b2c9afbec2e351cbfadcea3c9e39e10 Mon Sep 17 00:00:00 2001
From: Stefan Dirix
Date: Thu, 5 Aug 2021 15:46:24 +0200
Subject: [PATCH 001/185] Initial JSON Forms Vuetify Renderers setup
This ia a monorepo consisting of the JSON Forms Vue 2 Vuetify renderer
set and an example application. Vuetify is not yet integrated.
---
packages/example/.browserslistrc | 3 +
packages/example/.eslintignore | 3 +
packages/example/.eslintrc.js | 20 +++
packages/example/.gitignore | 23 +++
packages/example/.prettierrc.js | 4 +
packages/example/README.md | 10 ++
packages/example/babel.config.js | 3 +
packages/example/package.json | 35 +++++
packages/example/public/favicon.ico | Bin 0 -> 4286 bytes
packages/example/public/index.html | 17 +++
packages/example/src/App.vue | 29 ++++
packages/example/src/assets/logo.png | Bin 0 -> 6849 bytes
.../example/src/components/JsonFormsDemo.vue | 135 ++++++++++++++++++
packages/example/src/main.ts | 11 ++
packages/example/src/shims-tsx.d.ts | 13 ++
packages/example/src/shims-vue.d.ts | 4 +
packages/example/tsconfig.json | 39 +++++
packages/vue2-vuetify/.eslintrc.js | 21 +++
packages/vue2-vuetify/.prettierrc.js | 4 +
packages/vue2-vuetify/README.md | 74 ++++++++++
packages/vue2-vuetify/babel.config.js | 3 +
packages/vue2-vuetify/package.json | 67 +++++++++
packages/vue2-vuetify/rollup.config.js | 49 +++++++
packages/vue2-vuetify/shims-vue.d.ts | 5 +
.../src/controls/ControlRenderer.vue | 43 ++++++
packages/vue2-vuetify/src/controls/index.ts | 4 +
packages/vue2-vuetify/src/index.ts | 1 +
.../src/layouts/LayoutRenderer.vue | 51 +++++++
packages/vue2-vuetify/src/layouts/index.ts | 5 +
packages/vue2-vuetify/src/renderers.ts | 7 +
packages/vue2-vuetify/tsconfig.json | 20 +++
31 files changed, 703 insertions(+)
create mode 100644 packages/example/.browserslistrc
create mode 100644 packages/example/.eslintignore
create mode 100644 packages/example/.eslintrc.js
create mode 100644 packages/example/.gitignore
create mode 100644 packages/example/.prettierrc.js
create mode 100644 packages/example/README.md
create mode 100644 packages/example/babel.config.js
create mode 100644 packages/example/package.json
create mode 100644 packages/example/public/favicon.ico
create mode 100644 packages/example/public/index.html
create mode 100644 packages/example/src/App.vue
create mode 100644 packages/example/src/assets/logo.png
create mode 100644 packages/example/src/components/JsonFormsDemo.vue
create mode 100644 packages/example/src/main.ts
create mode 100644 packages/example/src/shims-tsx.d.ts
create mode 100644 packages/example/src/shims-vue.d.ts
create mode 100644 packages/example/tsconfig.json
create mode 100644 packages/vue2-vuetify/.eslintrc.js
create mode 100644 packages/vue2-vuetify/.prettierrc.js
create mode 100644 packages/vue2-vuetify/README.md
create mode 100644 packages/vue2-vuetify/babel.config.js
create mode 100644 packages/vue2-vuetify/package.json
create mode 100644 packages/vue2-vuetify/rollup.config.js
create mode 100644 packages/vue2-vuetify/shims-vue.d.ts
create mode 100644 packages/vue2-vuetify/src/controls/ControlRenderer.vue
create mode 100644 packages/vue2-vuetify/src/controls/index.ts
create mode 100644 packages/vue2-vuetify/src/index.ts
create mode 100644 packages/vue2-vuetify/src/layouts/LayoutRenderer.vue
create mode 100644 packages/vue2-vuetify/src/layouts/index.ts
create mode 100644 packages/vue2-vuetify/src/renderers.ts
create mode 100644 packages/vue2-vuetify/tsconfig.json
diff --git a/packages/example/.browserslistrc b/packages/example/.browserslistrc
new file mode 100644
index 0000000000..214388fe43
--- /dev/null
+++ b/packages/example/.browserslistrc
@@ -0,0 +1,3 @@
+> 1%
+last 2 versions
+not dead
diff --git a/packages/example/.eslintignore b/packages/example/.eslintignore
new file mode 100644
index 0000000000..5cfc5c5119
--- /dev/null
+++ b/packages/example/.eslintignore
@@ -0,0 +1,3 @@
+# Make sure eslint does not check the output files of our renderer set
+../*
+!/*
diff --git a/packages/example/.eslintrc.js b/packages/example/.eslintrc.js
new file mode 100644
index 0000000000..95800e3cd9
--- /dev/null
+++ b/packages/example/.eslintrc.js
@@ -0,0 +1,20 @@
+module.exports = {
+ root: true,
+ env: {
+ node: true,
+ },
+ extends: [
+ "plugin:vue/essential",
+ "eslint:recommended",
+ "@vue/typescript/recommended",
+ "@vue/prettier",
+ "@vue/prettier/@typescript-eslint",
+ ],
+ parserOptions: {
+ ecmaVersion: 2020,
+ },
+ rules: {
+ "no-console": process.env.NODE_ENV === "production" ? "warn" : "off",
+ "no-debugger": process.env.NODE_ENV === "production" ? "warn" : "off",
+ },
+};
diff --git a/packages/example/.gitignore b/packages/example/.gitignore
new file mode 100644
index 0000000000..403adbc1e5
--- /dev/null
+++ b/packages/example/.gitignore
@@ -0,0 +1,23 @@
+.DS_Store
+node_modules
+/dist
+
+
+# local env files
+.env.local
+.env.*.local
+
+# Log files
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+
+# Editor directories and files
+.idea
+.vscode
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
diff --git a/packages/example/.prettierrc.js b/packages/example/.prettierrc.js
new file mode 100644
index 0000000000..59c570866f
--- /dev/null
+++ b/packages/example/.prettierrc.js
@@ -0,0 +1,4 @@
+module.exports = {
+ jsxSingleQuote: true,
+ singleQuote: true,
+}
diff --git a/packages/example/README.md b/packages/example/README.md
new file mode 100644
index 0000000000..768282fb9b
--- /dev/null
+++ b/packages/example/README.md
@@ -0,0 +1,10 @@
+# JSON Forms Vuetify renderer set example app
+
+## Prerequsites
+
+- Build the JSON Forms Vuetify renderer set
+
+## Scripts
+
+- `npm run serve` to start the application
+- `npm run build` to build the application
diff --git a/packages/example/babel.config.js b/packages/example/babel.config.js
new file mode 100644
index 0000000000..078c0056ff
--- /dev/null
+++ b/packages/example/babel.config.js
@@ -0,0 +1,3 @@
+module.exports = {
+ presets: ['@vue/cli-plugin-babel/preset'],
+};
diff --git a/packages/example/package.json b/packages/example/package.json
new file mode 100644
index 0000000000..170641033b
--- /dev/null
+++ b/packages/example/package.json
@@ -0,0 +1,35 @@
+{
+ "name": "example",
+ "version": "0.1.0",
+ "private": true,
+ "scripts": {
+ "build": "vue-cli-service build",
+ "serve": "vue-cli-service serve",
+ "clean": "rimraf dist"
+ },
+ "dependencies": {
+ "core-js": "^3.6.5",
+ "vue": "^2.6.14",
+ "@vue/composition-api": "^1.0.0-rc.3",
+ "@jsonforms/core": "3.0.0-alpha.1",
+ "@jsonforms/vue2": "3.0.0-alpha.1",
+ "@jsonforms/vue2-vuetify": "3.0.0-alpha.1"
+ },
+ "devDependencies": {
+ "@typescript-eslint/eslint-plugin": "^4.18.0",
+ "@typescript-eslint/parser": "^4.18.0",
+ "@vue/cli-plugin-babel": "~4.5.0",
+ "@vue/cli-plugin-eslint": "~4.5.0",
+ "@vue/cli-plugin-typescript": "~4.5.0",
+ "@vue/cli-service": "~4.5.0",
+ "@vue/eslint-config-prettier": "^6.0.0",
+ "@vue/eslint-config-typescript": "^7.0.0",
+ "eslint": "^6.7.2",
+ "eslint-plugin-prettier": "^3.3.1",
+ "eslint-plugin-vue": "^6.2.2",
+ "prettier": "^2.2.1",
+ "rimraf": "^3.0.2",
+ "typescript": "~4.1.5",
+ "vue-template-compiler": "^2.6.14"
+ }
+}
diff --git a/packages/example/public/favicon.ico b/packages/example/public/favicon.ico
new file mode 100644
index 0000000000000000000000000000000000000000..df36fcfb72584e00488330b560ebcf34a41c64c2
GIT binary patch
literal 4286
zcmds*O-Phc6o&64GDVCEQHxsW(p4>LW*W<827=Unuo8sGpRux(DN@jWP-e29Wl%wj
zY84_aq9}^Am9-cWTD5GGEo#+5Fi2wX_P*bo+xO!)p*7B;iKlbFd(U~_d(U?#hLj56
zPhFkj-|A6~Qk#@g^#D^U0XT1cu=c-vu1+SElX9NR;kzAUV(q0|dl0|%h|dI$%VICy
zJnu2^L*Te9JrJMGh%-P79CL0}dq92RGU6gI{v2~|)p}sG5x0U*z<8U;Ij*hB9z?ei
z@g6Xq-pDoPl=MANPiR7%172VA%r)kevtV-_5H*QJKFmd;8yA$98zCxBZYXTNZ#QFk2(TX0;Y2dt&WitL#$96|gJY=3xX
zpCoi|YNzgO3R`f@IiEeSmKrPSf#h#Qd<$%Ej^RIeeYfsxhPMOG`S`Pz8q``=511zm
zAm)MX5AV^5xIWPyEu7u>qYs?pn$I4nL9J!=K=SGlKLXpE<5x+2cDTXq?brj?n6sp=
zphe9;_JHf40^9~}9i08r{XM$7HB!`{Ys~TK0kx<}ZQng`UPvH*11|q7&l9?@FQz;8
zx!=3<4seY*%=OlbCbcae?5^V_}*K>Uo6ZWV8mTyE^B=DKy7-sdLYkR5Z?paTgK-zyIkKjIcpyO
z{+uIt&YSa_$QnN_@t~L014dyK(fOOo+W*MIxbA6Ndgr=Y!f#Tokqv}n<7-9qfHkc3
z=>a|HWqcX8fzQCT=dqVbogRq!-S>H%yA{1w#2Pn;=e>JiEj7Hl;zdt-2f+j2%DeVD
zsW0Ab)ZK@0cIW%W7z}H{&~yGhn~D;aiP4=;m-HCo`BEI+Kd6
z={Xwx{T%b6i9IjI)Ls)S{-*mq<@~R{?$}ZKjf;^k75i_}(2MXt}^SEBVg7AI@28
zo_uPg2V)_e-`2Ois=PYoe%9u*n9({PFR)OnHJPi{dNx>KxD#iCLfl2vQGDitKtN>z|-AdCN|$jTFDg0m3O`WLD4_s#$S
literal 0
HcmV?d00001
diff --git a/packages/example/public/index.html b/packages/example/public/index.html
new file mode 100644
index 0000000000..a541d886f5
--- /dev/null
+++ b/packages/example/public/index.html
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+ JSON Forms Vue 2 Vuetify example
+
+
+
+ We're sorry but the JSON Forms Vue 2 Vuetify example doesn't work properly without JavaScript enabled. Please enable it to continue.
+
+
+
+
+
diff --git a/packages/example/src/App.vue b/packages/example/src/App.vue
new file mode 100644
index 0000000000..21fe655a20
--- /dev/null
+++ b/packages/example/src/App.vue
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/example/src/assets/logo.png b/packages/example/src/assets/logo.png
new file mode 100644
index 0000000000000000000000000000000000000000..f3d2503fc2a44b5053b0837ebea6e87a2d339a43
GIT binary patch
literal 6849
zcmaKRcUV(fvo}bjDT-7nLI_nlK}sT_69H+`qzVWDA|yaU?}j417wLi^B1KB1SLsC&
zL0ag7$U(XW5YR7p&Ux?sP$d4lvMt8C^+TcQu4F
zQqv!UF!I+kw)c0jhd6+g6oCr9P?7)?!qX1ui*iL{p}sKCAGuJ{{W)0z1pLF|=>h}&
zt(2Lr0Z`2ig8<5i%Zk}cO5Fm=LByqGWaS`oqChZdEFmc`0hSb#gg|Aap^{+WKOYcj
zHjINK)KDG%&s?Mt4CL(T=?;~U@bU2x_mLKN!#GJuK_CzbNw5SMEJorG!}_5;?R>@1
zSl)jns3WlU7^J%=(hUtfmuUCU&C3%8B5C^f5>W2Cy8jW3#{Od{lF1}|?c61##3dzA
zsPlFG;l_FzBK}8>|H_Ru_H#!_7$UH4UKo3lKOA}g1(R&|e@}GINYVzX?q=_WLZCgh
z)L|eJMce`D0EIwgRaNETDsr+?vQknSGAi=7H00r`QnI%oQnFxm`G2umXso9l+8*&Q
z7WqF|$p49js$mdzo^BXpH#gURy=UO;=IMrYc5?@+sR4y_?d*~0^YP7d+y0{}0)zBM
zIKVM(DBvICK#~7N0a+PY6)7;u=dutmNqK3AlsrUU9U`d;msiucB_|8|2kY=(7XA;G
zwDA8AR)VCA#JOkxm#6oHNS^YVuOU;8p$N)2{`;oF|rQ?B~K$%rHDxXs+_G
zF5|-uqHZvSzq}L;5Kcy_P+x0${33}Ofb6+TX&=y;;PkEOpz%+_bCw_{<&~
zeLV|!bP%l1qxywfVr9Z9JI+++EO^x>ZuCK);=$VIG1`kxK8F2M8AdC$iOe3cj1fo(ce4l-9
z7*zKy3={MixvUk=enQE;ED~7tv%qh&3lR<0m??@w{ILF|e#QOyPkFYK!&Up7xWNtL
zOW%1QMC<3o;G9_S1;NkPB6bqbCOjeztEc6TsBM<(q9((JKiH{01+Ud=uw9B@{;(JJ
z-DxI2*{pMq`q1RQc;V8@gYAY44Z!%#W~M9pRxI(R?SJ7sy7em=Z5DbuDlr@*q|25V)($-f}9c#?D%dU^RS<(wz?{P
zFFHtCab*!rl(~j@0(Nadvwg8q|4!}L^>d?0al6}Rrv9$0M#^&@zjbfJy_n!%mVHK4
z6pLRIQ^Uq~dnyy$`ay51Us6WaP%&O;@49m&{G3z7xV3dLtt1VTOMYl3UW~Rm{Eq4m
zF?Zl_v;?7EFx1_+#WFUXxcK78IV)FO>42@cm@}2I%pVbZqQ}3;p;sDIm&knay03a^
zn$5}Q$G!@fTwD$e(x-~aWP0h+4NRz$KlnO_H2c<
z(XX#lPuW_%H#Q+c&(nRyX1-IadKR-%$4FYC0fsCmL9ky3
zKpxyjd^JFR+vg2!=HWf}2Z?@Td`0EG`kU?{8zKrvtsm)|7>pPk9nu@2^z96aU2<#`
z2QhvH5w&V;wER?mopu+nqu*n8p~(%QkwSs&*0eJwa
zMXR05`OSFpfyRb!Y_+H@O%Y
z0=K^y6B8Gcbl?SA)qMP3Z+=C(?8zL@=74R=EVnE?vY!1BQy2@q*RUgRx4yJ$k}MnL
zs!?74QciNb-LcG*&o<9=DSL>1n}ZNd)w1z3-0Pd^4ED1{qd=9|!!N?xnXjM!EuylY
z5=!H>&hSofh8V?Jofyd!h`xDI1fYAuV(sZwwN~{$a}MX^=+0TH*SFp$vyxmUv7C*W
zv^3Gl0+eTFgBi3FVD;$nhcp)ka*4gSskYIqQ&+M}xP9yLAkWzBI^I%zR^l1e?bW_6
zIn{mo{dD=)9@V?s^fa55jh78rP*Ze<3`tRCN4*mpO$@7a^*2B*7N_|A(Ve2VB|)_o
z$=#_=aBkhe(ifX}MLT()@5?OV+~7cXC3r!%{QJxriXo9I%*3q4KT4Xxzyd{
z9;_%=W%q!Vw$Z7F3lUnY+1HZ*lO;4;VR2+i4+D(m#01OYq|L_fbnT;KN<^dkkCwtd
zF7n+O7KvAw8c`JUh6LmeIrk4`F3o|AagKSMK3))_5Cv~y2Bb2!Ibg9BO7Vkz?pAYX
zoI=B}+$R22&IL`NCYUYjrdhwjnMx_v=-Qcx-jmtN>!Zqf|n1^SWrHy
zK|MwJ?Z#^>)rfT5YSY{qjZ&`Fjd;^vv&gF-Yj6$9-Dy$<6zeP4s+78gS2|t%Z309b
z0^fp~ue_}i`U9j!<|qF92_3oB09NqgAoehQ`)<)dSfKoJl_A6Ec#*Mx9Cpd-p#$Ez
z={AM*r-bQs6*z$!*VA4|QE7bf@-4vb?Q+pPKLkY2{yKsw{&udv_2v8{Dbd
zm~8VAv!G~s)`O3|Q6vFUV%8%+?ZSVUa(;fhPNg#vab@J*9XE4#D%)$UU-T5`fwjz!
z6&gA^`OGu6aUk{l*h9eB?opVdrHK>Q@U>&JQ_2pR%}TyOXGq_6s56_`U(WoOaAb+K
zXQr#6H}>a-GYs9^bGP2Y&hSP5gEtW+GVC4=wy0wQk=~%CSXj=GH6q
z-T#s!BV`xZVxm{~jr_ezYRpqqIcXC=Oq`b{lu`Rt(IYr4B91hhVC?yg{ol4WUr3v9
zOAk2LG>CIECZ-WIs0$N}F#eoIUEtZudc7DPYIjzGqDLWk_A4#(LgacooD
z2K4IWs@N`Bddm-{%oy}!k0^i6Yh)uJ1S*90>|bm3TOZxcV|ywHUb(+CeX-o1|LTZM
zwU>dY3R&U)T(}5#Neh?-CWT~@{6Ke@sI)uSuzoah8COy)w)B)aslJmp`WUcjdia-0
zl2Y}&L~XfA`uYQboAJ1;J{XLhYjH){cObH3FDva+^8ioOQy%Z=xyjGLmWMrzfFoH;
zEi3AG`_v+%)&lDJE;iJWJDI@-X9K5O)LD~j*PBe(wu+|%ar~C+LK1+-+lK=t#
z+Xc+J7qp~5q=B~rD!x78)?1+KUIbYr^5rcl&tB-cTtj+e%{gpZZ4G~6r15+d|J(ky
zjg@@UzMW0k9@S#W(1H{u;Nq(7llJbq;;4t$awM;l&(2s+$l!Ay9^Ge|34CVhr7|BG
z?dAR83smef^frq9V(OH+a+ki#q&-7TkWfFM=5bsGbU(8mC;>QTCWL5ydz9s6k@?+V
zcjiH`VI=59P-(-DWXZ~5DH>B^_H~;4$)KUhnmGo*G!Tq8^LjfUDO)lASN*=#AY_yS
zqW9UX(VOCO&p@kHdUUgsBO0KhXxn1sprK5h8}+>IhX(nSXZKwlNsjk^M|RAaqmCZB
zHBolOHYBas@&{PT=R+?d8pZu
zUHfyucQ`(umXSW7o?HQ3H21M`ZJal+%*)SH1B1j6rxTlG3hx1IGJN^M7{$j(9V;MZ
zRKybgVuxKo#XVM+?*yTy{W+XHaU5Jbt-UG33x{u(N-2wmw;zzPH&4DE103HV@ER86
z|FZEmQb|&1s5#`$4!Cm}&`^{(4V}OP$bk`}v6q6rm;P!H)W|2i^e{7lTk2W@jo_9q
z*aw|U7#+g59Fv(5qI`#O-qPj#@_P>PC#I(GSp3DLv7x-dmYK=C7lPF8a)bxb=@)B1
zUZ`EqpXV2dR}B&r`uM}N(TS99ZT0UB%IN|0H%DcVO#T%L_chrgn#m6%x4KE*IMfjX
zJ%4veCEqbXZ`H`F_+fELMC@wuy_ch%t*+Z+1I}wN#C+dRrf2X{1C8=yZ_%Pt6wL_~
zZ2NN-hXOT4P4n$QFO7yYHS-4wF1Xfr-meG9Pn;uK51?hfel`d38k{W)F*|gJLT2#T
z<~>spMu4(mul-8Q3*pf=N4DcI)zzjqAgbE2eOT7~&f1W3VsdD44Ffe;3mJp-V@8UC
z)|qnPc12o~$X-+U@L_lWqv-RtvB~%hLF($%Ew5w>^NR82qC_0FB
z)=hP1-OEx?lLi#jnLzH}a;Nvr@JDO-zQWd}#k^an$Kwml;MrD&)sC5b`s0ZkVyPkb
zt}-jOq^%_9>YZe7Y}PhW{a)c39G`kg(P4@kxjcYfgB4XOOcmezdUI7j-!gs7oAo2o
zx(Ph{G+YZ`a%~kzK!HTAA5NXE-7vOFRr5oqY$rH>WI6SFvWmahFav!CfRMM3%8J&c
z*p+%|-fNS_@QrFr(at!JY9jCg9F-%5{nb5Bo~z@Y9m&SHYV`49GAJjA5h~h4(G!Se
zZmK{Bo7ivCfvl}@A-ptkFGcWXAzj3xfl{evi-OG(TaCn1FAHxRc{}B|x+Ua1D=I6M
z!C^ZIvK6aS_c&(=OQDZfm>O`Nxsw{ta&yiYPA~@e#c%N>>#rq)k6Aru-qD4(D^v)y
z*>Rs;YUbD1S8^D(ps6Jbj0K3wJw>L4m)0e(6Pee3Y?gy9i0^bZO?$*sv+xKV?WBlh
zAp*;v6w!a8;A7sLB*g-^<$Z4L7|5jXxxP1}hQZ<55f9<^KJ>^mKlWSGaLcO0=$jem
zWyZkRwe~u{{tU63DlCaS9$Y4CP4f?+wwa(&1ou)b>72ydrFvm`Rj-0`kBJgK@nd(*Eh!(NC{F-@=FnF&Y!q`7){YsLLHf0_B6aHc#
z>WIuHTyJwIH{BJ4)2RtEauC7Yq7Cytc|S)4^*t8Va3HR
zg=~sN^tp9re@w=GTx$;zOWMjcg-7X3Wk^N$n;&Kf1RgVG2}2L-(0o)54C509C&77i
zrjSi{X*WV=%C17((N^6R4Ya*4#6s_L99RtQ>m(%#nQ#wrRC8Y%yxkH;d!MdY+Tw@r
zjpSnK`;C-U{ATcgaxoEpP0Gf+tx);buOMlK=01D|J+ROu37qc*rD(w`#O=3*O*w9?biwNoq3WN1`&Wp8TvKj3C
z3HR9ssH7a&Vr<6waJrU
zdLg!ieYz%U^bmpn%;(V%%ugMk92&?_XX1K@mwnVSE6!&%P%Wdi7_h`CpScvspMx?N
zQUR>oadnG17#hNc$pkTp+9lW+MBKHRZ~74XWUryd)4yd
zj98$%XmIL4(9OnoeO5Fnyn&fpQ9b0h4e6EHHw*l68j;>(ya`g^S&y2{O8U>1*>4zR
zq*WSI_2o$CHQ?x0!wl9bpx|Cm2+kFMR)oMud1%n2=qn5nE&t@Fgr#=Zv2?}wtEz^T
z9rrj=?IH*qI5{G@Rn&}^Z{+TW}mQeb9=8b<_a`&Cm#n%n~
zU47MvCBsdXFB1+adOO)03+nczfWa#vwk#r{o{dF)QWya9v2nv43Zp3%Ps}($lA02*_g25t;|T{A5snSY?3A
zrRQ~(Ygh_ebltHo1VCbJb*eOAr;4cnlXLvI>*$-#AVsGg6B1r7@;g^L
zFlJ_th0vxO7;-opU@WAFe;<}?!2q?RBrFK5U{*ai@NLKZ^};Ul}beukveh?TQn;$%9=R+DX07m82gP$=}Uo_%&ngV`}Hyv8g{u
z3SWzTGV|cwQuFIs7ZDOqO_fGf8Q`8MwL}eUp>q?4eqCmOTcwQuXtQckPy|4F1on8l
zP*h>d+cH#XQf|+6c|S{7SF(Lg>bR~l(0uY?O{OEVlaxa5@e%T&xju=o1`=OD#qc16
zSvyH*my(dcp6~VqR;o(#@m44Lug@~_qw+HA=mS#Z^4reBy8iV?H~I;{LQWk3aKK8$bLRyt$g?-
+
+
+
{{ JSON.stringify(data, null, 2) }}
+
+
+
+
+
+
+
diff --git a/packages/example/src/main.ts b/packages/example/src/main.ts
new file mode 100644
index 0000000000..bf94285665
--- /dev/null
+++ b/packages/example/src/main.ts
@@ -0,0 +1,11 @@
+import Vue from 'vue';
+import App from './App.vue';
+
+import VueCompositionAPI from '@vue/composition-api';
+Vue.use(VueCompositionAPI);
+
+Vue.config.productionTip = false;
+
+new Vue({
+ render: (h) => h(App),
+}).$mount('#app');
diff --git a/packages/example/src/shims-tsx.d.ts b/packages/example/src/shims-tsx.d.ts
new file mode 100644
index 0000000000..2bcdf9fbcb
--- /dev/null
+++ b/packages/example/src/shims-tsx.d.ts
@@ -0,0 +1,13 @@
+import Vue, { VNode } from "vue";
+
+declare global {
+ namespace JSX {
+ // tslint:disable no-empty-interface
+ interface Element extends VNode {}
+ // tslint:disable no-empty-interface
+ interface ElementClass extends Vue {}
+ interface IntrinsicElements {
+ [elem: string]: any;
+ }
+ }
+}
diff --git a/packages/example/src/shims-vue.d.ts b/packages/example/src/shims-vue.d.ts
new file mode 100644
index 0000000000..0660bd67a5
--- /dev/null
+++ b/packages/example/src/shims-vue.d.ts
@@ -0,0 +1,4 @@
+declare module "*.vue" {
+ import Vue from "vue";
+ export default Vue;
+}
diff --git a/packages/example/tsconfig.json b/packages/example/tsconfig.json
new file mode 100644
index 0000000000..e621cbc365
--- /dev/null
+++ b/packages/example/tsconfig.json
@@ -0,0 +1,39 @@
+{
+ "compilerOptions": {
+ "target": "esnext",
+ "module": "esnext",
+ "strict": true,
+ "jsx": "preserve",
+ "importHelpers": true,
+ "moduleResolution": "node",
+ "skipLibCheck": true,
+ "esModuleInterop": true,
+ "allowSyntheticDefaultImports": true,
+ "sourceMap": true,
+ "baseUrl": ".",
+ "types": [
+ "webpack-env"
+ ],
+ "paths": {
+ "@/*": [
+ "src/*"
+ ]
+ },
+ "lib": [
+ "esnext",
+ "dom",
+ "dom.iterable",
+ "scripthost"
+ ]
+ },
+ "include": [
+ "src/**/*.ts",
+ "src/**/*.tsx",
+ "src/**/*.vue",
+ "tests/**/*.ts",
+ "tests/**/*.tsx"
+ ],
+ "exclude": [
+ "node_modules"
+ ]
+}
diff --git a/packages/vue2-vuetify/.eslintrc.js b/packages/vue2-vuetify/.eslintrc.js
new file mode 100644
index 0000000000..87fa7ce65e
--- /dev/null
+++ b/packages/vue2-vuetify/.eslintrc.js
@@ -0,0 +1,21 @@
+module.exports = {
+ root: true,
+ env: {
+ node: true,
+ },
+ extends: [
+ 'plugin:vue/essential',
+ 'eslint:recommended',
+ '@vue/typescript/recommended',
+ '@vue/prettier',
+ '@vue/prettier/@typescript-eslint',
+ ],
+ parserOptions: {
+ ecmaVersion: 2020,
+ },
+ rules: {
+ 'no-console': 'warn',
+ 'no-debugger': 'warn',
+ '@typescript-eslint/no-explicit-any': 'off',
+ },
+};
diff --git a/packages/vue2-vuetify/.prettierrc.js b/packages/vue2-vuetify/.prettierrc.js
new file mode 100644
index 0000000000..59c570866f
--- /dev/null
+++ b/packages/vue2-vuetify/.prettierrc.js
@@ -0,0 +1,4 @@
+module.exports = {
+ jsxSingleQuote: true,
+ singleQuote: true,
+}
diff --git a/packages/vue2-vuetify/README.md b/packages/vue2-vuetify/README.md
new file mode 100644
index 0000000000..749773422f
--- /dev/null
+++ b/packages/vue2-vuetify/README.md
@@ -0,0 +1,74 @@
+# JSON Forms - More Forms. Less Code
+
+_Complex Forms in the blink of an eye_
+
+JSON Forms eliminates the tedious task of writing fully-featured forms by hand by leveraging the capabilities of JSON, JSON Schema and Javascript.
+
+## Vue 2 Vuetify Renderers
+
+This is the JSON Forms Vue 2 Vuetify renderers package which provides a Vuetify based renderer set for [JSON Forms Vue 2](https://github.com/eclipsesource/jsonforms/blob/master/packages/vue2/vue2).
+
+### Quick start
+
+Install JSON Forms Core, Vue 2 and Vue 2 Vuetify Renderers.
+
+```bash
+npm i --save @jsonforms/core @jsonforms/vue2 @jsonforms/vue2-vuetify
+```
+
+Use the `json-forms` component for each form you want to render and hand over the renderer set.
+
+```vue
+
+
+
+
+```
+
+As JSON Forms uses the Vue 3 composition API you need to add the `@vue/composition-api` plugin to your Vue 2 app.
+
+```ts
+import VueCompositionAPI from '@vue/composition-api';
+
+Vue.use(VueCompositionAPI);
+```
+
+For more information on how JSON Forms can be configured, please see the [README of `@jsonforms/vue2`](https://github.com/eclipsesource/jsonforms/blob/master/packages/vue2/vue2/README.md).
+
+## License
+
+The JSONForms project is licensed under the MIT License. See the [LICENSE file](https://github.com/eclipsesource/jsonforms/blob/master/LICENSE) for more information.
diff --git a/packages/vue2-vuetify/babel.config.js b/packages/vue2-vuetify/babel.config.js
new file mode 100644
index 0000000000..27db1891d4
--- /dev/null
+++ b/packages/vue2-vuetify/babel.config.js
@@ -0,0 +1,3 @@
+module.exports = {
+ presets: ['@babel/preset-env', '@babel/preset-typescript'],
+};
diff --git a/packages/vue2-vuetify/package.json b/packages/vue2-vuetify/package.json
new file mode 100644
index 0000000000..6c053865b1
--- /dev/null
+++ b/packages/vue2-vuetify/package.json
@@ -0,0 +1,67 @@
+{
+ "name": "@jsonforms/vue2-vuetify",
+ "version": "3.0.0-alpha.1",
+ "description": "Vue 2 Vuetify renderers for JSON Forms",
+ "repository": "https://github.com/eclipsesource/jsonforms-vuetify-renderers",
+ "bugs": "https://github.com/eclipsesource/jsonforms/issues",
+ "homepage": "http://jsonforms.io/",
+ "license": "MIT",
+ "keywords": [
+ "vue",
+ "vue2",
+ "vue 2",
+ "vuetify",
+ "form",
+ "forms",
+ "json",
+ "jsonforms",
+ "frontend",
+ "generator",
+ "input",
+ "renderengine",
+ "jsonschema",
+ "schema",
+ "uischema",
+ "layout",
+ "customization"
+ ],
+ "main": "lib/jsonforms-vue2-vuetify.cjs.js",
+ "typings": "lib/index.d.ts",
+ "scripts": {
+ "prebuild": "rimraf lib",
+ "build": "rollup --config rollup.config.js",
+ "watch": "rollup --watch --config rollup.config.js"
+ },
+ "peerDependencies": {
+ "vue": "^2.6.11",
+ "@vue/composition-api": "^1.0.0-rc.3",
+ "@jsonforms/core": "^3.0.0-alpha.1",
+ "@jsonforms/vue2": "^3.0.0-alpha.1"
+ },
+ "devDependencies": {
+ "@babel/core": "^7.14.6",
+ "@babel/preset-env": "^7.14.7",
+ "@babel/preset-typescript": "^7.14.5",
+ "@jsonforms/core": "3.0.0-alpha.1",
+ "@jsonforms/vue2": "3.0.0-alpha.1",
+ "@typescript-eslint/eslint-plugin": "^4.18.0",
+ "@typescript-eslint/parser": "^4.18.0",
+ "@vue/eslint-config-prettier": "^6.0.0",
+ "@vue/eslint-config-typescript": "^7.0.0",
+ "@vue/composition-api": "^1.0.0-rc.3",
+ "rimraf": "^3.0.2",
+ "rollup": "^2.52.8",
+ "@rollup/plugin-commonjs": "^14.0.0",
+ "@rollup/plugin-babel": "^5.3.0",
+ "rollup-plugin-typescript2": "^0.30.0",
+ "rollup-plugin-vue": "^5.1.9",
+ "@rollup/plugin-node-resolve": "^9.0.0",
+ "eslint": "^6.7.2",
+ "eslint-plugin-prettier": "^3.3.1",
+ "eslint-plugin-vue": "^6.2.2",
+ "prettier": "^2.2.1",
+ "typescript": "~4.1.5",
+ "vue": "^2.6.14",
+ "vue-template-compiler": "^2.6.14"
+ }
+}
diff --git a/packages/vue2-vuetify/rollup.config.js b/packages/vue2-vuetify/rollup.config.js
new file mode 100644
index 0000000000..403a557037
--- /dev/null
+++ b/packages/vue2-vuetify/rollup.config.js
@@ -0,0 +1,49 @@
+import vue from 'rollup-plugin-vue';
+import babel from '@rollup/plugin-babel';
+import typescript from 'rollup-plugin-typescript2';
+import resolve from '@rollup/plugin-node-resolve';
+
+import packageJson from './package.json';
+
+const buildFormats = [
+ {
+ input: 'src/index.ts',
+ output: {
+ file: packageJson.main,
+ format: 'cjs',
+ exports: 'named',
+ sourcemap: true,
+ },
+ external: [
+ 'vue',
+ '@vue/composition-api',
+ '@jsonforms/core',
+ '@jsonforms/vue2',
+ 'lodash/*',
+ ],
+ plugins: [
+ resolve({
+ extensions: ['.js', '.jsx', '.ts', '.tsx', '.vue'],
+ }),
+ vue({
+ css: true,
+ template: {
+ isProduction: true,
+ },
+ // rollup-plugin-vue can't handle Vue source maps in watch mode
+ // https://github.com/vuejs/rollup-plugin-vue/issues/238
+ needMap: !process.env.ROLLUP_WATCH,
+ }),
+ typescript({
+ emitDeclarationOnly: true,
+ }),
+ babel({
+ exclude: 'node_modules/**',
+ extensions: ['.js', '.jsx', '.ts', '.tsx', '.vue'],
+ babelHelpers: 'bundled',
+ }),
+ ],
+ },
+];
+
+export default buildFormats;
diff --git a/packages/vue2-vuetify/shims-vue.d.ts b/packages/vue2-vuetify/shims-vue.d.ts
new file mode 100644
index 0000000000..0f6bf2520c
--- /dev/null
+++ b/packages/vue2-vuetify/shims-vue.d.ts
@@ -0,0 +1,5 @@
+declare module '*.vue' {
+ import Vue from 'vue';
+ export default Vue;
+ export const entry;
+}
diff --git a/packages/vue2-vuetify/src/controls/ControlRenderer.vue b/packages/vue2-vuetify/src/controls/ControlRenderer.vue
new file mode 100644
index 0000000000..a02066ad9a
--- /dev/null
+++ b/packages/vue2-vuetify/src/controls/ControlRenderer.vue
@@ -0,0 +1,43 @@
+
+
+ {{ control.label }}
+
+
+
+
+
diff --git a/packages/vue2-vuetify/src/controls/index.ts b/packages/vue2-vuetify/src/controls/index.ts
new file mode 100644
index 0000000000..605d109b27
--- /dev/null
+++ b/packages/vue2-vuetify/src/controls/index.ts
@@ -0,0 +1,4 @@
+export { default as ControlRenderer } from './ControlRenderer.vue';
+import { entry as controlRendererEntry } from './ControlRenderer.vue';
+
+export const controlRenderers = [controlRendererEntry];
diff --git a/packages/vue2-vuetify/src/index.ts b/packages/vue2-vuetify/src/index.ts
new file mode 100644
index 0000000000..59ce1d2b66
--- /dev/null
+++ b/packages/vue2-vuetify/src/index.ts
@@ -0,0 +1 @@
+export * from './renderers';
diff --git a/packages/vue2-vuetify/src/layouts/LayoutRenderer.vue b/packages/vue2-vuetify/src/layouts/LayoutRenderer.vue
new file mode 100644
index 0000000000..bb81e0aa31
--- /dev/null
+++ b/packages/vue2-vuetify/src/layouts/LayoutRenderer.vue
@@ -0,0 +1,51 @@
+
+
+
+
+
diff --git a/packages/vue2-vuetify/src/layouts/index.ts b/packages/vue2-vuetify/src/layouts/index.ts
new file mode 100644
index 0000000000..e56dba0e5c
--- /dev/null
+++ b/packages/vue2-vuetify/src/layouts/index.ts
@@ -0,0 +1,5 @@
+export { default as LayoutRenderer } from './LayoutRenderer.vue';
+
+import { entry as layoutRendererEntry } from './LayoutRenderer.vue';
+
+export const layoutRenderers = [layoutRendererEntry];
diff --git a/packages/vue2-vuetify/src/renderers.ts b/packages/vue2-vuetify/src/renderers.ts
new file mode 100644
index 0000000000..6c161fd39c
--- /dev/null
+++ b/packages/vue2-vuetify/src/renderers.ts
@@ -0,0 +1,7 @@
+export * from './controls';
+export * from './layouts';
+
+import { controlRenderers } from './controls';
+import { layoutRenderers } from './layouts';
+
+export const vuetifyRenderers = [...controlRenderers, ...layoutRenderers];
diff --git a/packages/vue2-vuetify/tsconfig.json b/packages/vue2-vuetify/tsconfig.json
new file mode 100644
index 0000000000..2659c43e59
--- /dev/null
+++ b/packages/vue2-vuetify/tsconfig.json
@@ -0,0 +1,20 @@
+{
+ "compilerOptions": {
+ "target": "esnext",
+ "module": "esnext",
+ "skipLibCheck": true,
+ "strict": true,
+ "declaration": true,
+ "noUnusedLocals": true,
+ "noUnusedParameters": true,
+ "importHelpers": true,
+ "moduleResolution": "node",
+ "esModuleInterop": true,
+ "allowSyntheticDefaultImports": true,
+ "sourceMap": true,
+ "outDir": "./lib",
+ "types": ["node", "vue"],
+ "lib": ["esnext", "dom", "dom.iterable", "scripthost"]
+ },
+ "exclude": ["node_modules", "lib"]
+}
From ab42f4c74d5cd0144b4df0ed200cd4346a378c30 Mon Sep 17 00:00:00 2001
From: Stefan Dirix
Date: Wed, 8 Sep 2021 12:26:27 +0200
Subject: [PATCH 002/185] Integrate Vuetify
Integrates Vuetify into the Vuetify renderer set as well as the
example app. The example control and layout renderers are now
implemented using Vuetify components.
---
packages/example/package.json | 15 ++++--
packages/example/public/index.html | 4 +-
packages/example/src/App.vue | 50 +++++++++++++------
packages/example/src/assets/logo.svg | 1 +
.../example/src/components/JsonFormsDemo.vue | 34 +++++--------
packages/example/src/main.ts | 4 +-
packages/example/src/plugins/vuetify.ts | 6 +++
packages/example/src/shims-tsx.d.ts | 2 +-
packages/example/src/shims-vue.d.ts | 4 +-
packages/example/src/shims-vuetify.d.ts | 4 ++
packages/example/vue.config.js | 3 ++
packages/vue2-vuetify/README.md | 2 +
packages/vue2-vuetify/package.json | 4 +-
packages/vue2-vuetify/rollup.config.js | 1 +
.../src/controls/ControlRenderer.vue | 19 ++++---
.../src/layouts/LayoutRenderer.vue | 13 +++--
packages/vue2-vuetify/tsconfig.json | 2 +-
17 files changed, 109 insertions(+), 59 deletions(-)
create mode 100644 packages/example/src/assets/logo.svg
create mode 100644 packages/example/src/plugins/vuetify.ts
create mode 100644 packages/example/src/shims-vuetify.d.ts
create mode 100644 packages/example/vue.config.js
diff --git a/packages/example/package.json b/packages/example/package.json
index 170641033b..514ceff8de 100644
--- a/packages/example/package.json
+++ b/packages/example/package.json
@@ -8,12 +8,13 @@
"clean": "rimraf dist"
},
"dependencies": {
- "core-js": "^3.6.5",
- "vue": "^2.6.14",
- "@vue/composition-api": "^1.0.0-rc.3",
"@jsonforms/core": "3.0.0-alpha.1",
"@jsonforms/vue2": "3.0.0-alpha.1",
- "@jsonforms/vue2-vuetify": "3.0.0-alpha.1"
+ "@jsonforms/vue2-vuetify": "3.0.0-alpha.1",
+ "@vue/composition-api": "^1.0.0-rc.3",
+ "core-js": "^3.6.5",
+ "vue": "^2.6.14",
+ "vuetify": "^2.4.0"
},
"devDependencies": {
"@typescript-eslint/eslint-plugin": "^4.18.0",
@@ -29,7 +30,11 @@
"eslint-plugin-vue": "^6.2.2",
"prettier": "^2.2.1",
"rimraf": "^3.0.2",
+ "sass": "~1.32.0",
+ "sass-loader": "^10.0.0",
"typescript": "~4.1.5",
- "vue-template-compiler": "^2.6.14"
+ "vue-cli-plugin-vuetify": "~2.4.2",
+ "vue-template-compiler": "^2.6.14",
+ "vuetify-loader": "^1.7.0"
}
}
diff --git a/packages/example/public/index.html b/packages/example/public/index.html
index a541d886f5..283a5dd993 100644
--- a/packages/example/public/index.html
+++ b/packages/example/public/index.html
@@ -1,11 +1,13 @@
-
+
JSON Forms Vue 2 Vuetify example
+
+
diff --git a/packages/example/src/App.vue b/packages/example/src/App.vue
index 21fe655a20..9f10912092 100644
--- a/packages/example/src/App.vue
+++ b/packages/example/src/App.vue
@@ -1,8 +1,39 @@
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+ Welcome to JSON Forms Vue 2 Vuetify
+
+
+
+ For help and collaboration with other JSON Forms developers,
+ please join our online
+ Discourse Community
+
+
+
+
+
+
+
+
+
+
+
-
-
diff --git a/packages/example/src/assets/logo.svg b/packages/example/src/assets/logo.svg
new file mode 100644
index 0000000000..145b6d1308
--- /dev/null
+++ b/packages/example/src/assets/logo.svg
@@ -0,0 +1 @@
+Artboard 46
diff --git a/packages/example/src/components/JsonFormsDemo.vue b/packages/example/src/components/JsonFormsDemo.vue
index b69fe14d19..672247e9b2 100644
--- a/packages/example/src/components/JsonFormsDemo.vue
+++ b/packages/example/src/components/JsonFormsDemo.vue
@@ -1,13 +1,17 @@
-
-
-
{{ JSON.stringify(data, null, 2) }}
-
+
+
+
+
+
+ {{ JSON.stringify(data, null, 2) }}
+
+
-
-
-
diff --git a/packages/example/src/main.ts b/packages/example/src/main.ts
index bf94285665..893a0fb45f 100644
--- a/packages/example/src/main.ts
+++ b/packages/example/src/main.ts
@@ -2,10 +2,12 @@ import Vue from 'vue';
import App from './App.vue';
import VueCompositionAPI from '@vue/composition-api';
-Vue.use(VueCompositionAPI);
+import vuetify from './plugins/vuetify';
+Vue.use(VueCompositionAPI);
Vue.config.productionTip = false;
new Vue({
+ vuetify,
render: (h) => h(App),
}).$mount('#app');
diff --git a/packages/example/src/plugins/vuetify.ts b/packages/example/src/plugins/vuetify.ts
new file mode 100644
index 0000000000..1448f4b669
--- /dev/null
+++ b/packages/example/src/plugins/vuetify.ts
@@ -0,0 +1,6 @@
+import Vue from 'vue';
+import Vuetify from 'vuetify/lib/framework';
+
+Vue.use(Vuetify);
+
+export default new Vuetify({});
diff --git a/packages/example/src/shims-tsx.d.ts b/packages/example/src/shims-tsx.d.ts
index 2bcdf9fbcb..3b88b58292 100644
--- a/packages/example/src/shims-tsx.d.ts
+++ b/packages/example/src/shims-tsx.d.ts
@@ -1,4 +1,4 @@
-import Vue, { VNode } from "vue";
+import Vue, { VNode } from 'vue';
declare global {
namespace JSX {
diff --git a/packages/example/src/shims-vue.d.ts b/packages/example/src/shims-vue.d.ts
index 0660bd67a5..8f6f410263 100644
--- a/packages/example/src/shims-vue.d.ts
+++ b/packages/example/src/shims-vue.d.ts
@@ -1,4 +1,4 @@
-declare module "*.vue" {
- import Vue from "vue";
+declare module '*.vue' {
+ import Vue from 'vue';
export default Vue;
}
diff --git a/packages/example/src/shims-vuetify.d.ts b/packages/example/src/shims-vuetify.d.ts
new file mode 100644
index 0000000000..d46f853907
--- /dev/null
+++ b/packages/example/src/shims-vuetify.d.ts
@@ -0,0 +1,4 @@
+declare module 'vuetify/lib/framework' {
+ import Vuetify from 'vuetify';
+ export default Vuetify;
+}
diff --git a/packages/example/vue.config.js b/packages/example/vue.config.js
new file mode 100644
index 0000000000..86974699a4
--- /dev/null
+++ b/packages/example/vue.config.js
@@ -0,0 +1,3 @@
+module.exports = {
+ transpileDependencies: ['vuetify'],
+};
diff --git a/packages/vue2-vuetify/README.md b/packages/vue2-vuetify/README.md
index 749773422f..f368ee63d4 100644
--- a/packages/vue2-vuetify/README.md
+++ b/packages/vue2-vuetify/README.md
@@ -67,6 +67,8 @@ import VueCompositionAPI from '@vue/composition-api';
Vue.use(VueCompositionAPI);
```
+If note done yet, please [install Vuetify for Vue 2](https://vuetifyjs.com/en/getting-started/installation/).
+
For more information on how JSON Forms can be configured, please see the [README of `@jsonforms/vue2`](https://github.com/eclipsesource/jsonforms/blob/master/packages/vue2/vue2/README.md).
## License
diff --git a/packages/vue2-vuetify/package.json b/packages/vue2-vuetify/package.json
index 6c053865b1..d83b0d3527 100644
--- a/packages/vue2-vuetify/package.json
+++ b/packages/vue2-vuetify/package.json
@@ -35,6 +35,7 @@
"peerDependencies": {
"vue": "^2.6.11",
"@vue/composition-api": "^1.0.0-rc.3",
+ "vuetify": "^2.4.0",
"@jsonforms/core": "^3.0.0-alpha.1",
"@jsonforms/vue2": "^3.0.0-alpha.1"
},
@@ -62,6 +63,7 @@
"prettier": "^2.2.1",
"typescript": "~4.1.5",
"vue": "^2.6.14",
- "vue-template-compiler": "^2.6.14"
+ "vue-template-compiler": "^2.6.14",
+ "vuetify": "^2.4.0"
}
}
diff --git a/packages/vue2-vuetify/rollup.config.js b/packages/vue2-vuetify/rollup.config.js
index 403a557037..c31e853a1f 100644
--- a/packages/vue2-vuetify/rollup.config.js
+++ b/packages/vue2-vuetify/rollup.config.js
@@ -20,6 +20,7 @@ const buildFormats = [
'@jsonforms/core',
'@jsonforms/vue2',
'lodash/*',
+ 'vuetify/lib',
],
plugins: [
resolve({
diff --git a/packages/vue2-vuetify/src/controls/ControlRenderer.vue b/packages/vue2-vuetify/src/controls/ControlRenderer.vue
index a02066ad9a..aeee47a521 100644
--- a/packages/vue2-vuetify/src/controls/ControlRenderer.vue
+++ b/packages/vue2-vuetify/src/controls/ControlRenderer.vue
@@ -1,8 +1,11 @@
-
- {{ control.label }}
-
-
+
+
diff --git a/packages/vue2-vuetify/src/controls/index.ts b/packages/vue2-vuetify/src/controls/index.ts
index 605d109b27..4b0c08978b 100644
--- a/packages/vue2-vuetify/src/controls/index.ts
+++ b/packages/vue2-vuetify/src/controls/index.ts
@@ -1,4 +1,10 @@
export { default as ControlRenderer } from './ControlRenderer.vue';
import { entry as controlRendererEntry } from './ControlRenderer.vue';
-export const controlRenderers = [controlRendererEntry];
+export { default as EnumControlRenderer } from './EnumControlRenderer.vue';
+import { entry as enumControlRendererEntry } from './EnumControlRenderer.vue';
+
+export const controlRenderers = [
+ controlRendererEntry,
+ enumControlRendererEntry,
+];
From 5afeb201e08992fd4253736f55555e1c50f2e3a7 Mon Sep 17 00:00:00 2001
From: Patrick Vale
Date: Thu, 16 Sep 2021 16:55:23 +0100
Subject: [PATCH 004/185] Add OneOfEnum control renderer
Adds OneOfEnumControlRenderer and an example oneOf enum property
in schema of the example app
---
.../example/src/components/JsonFormsDemo.vue | 16 ++++++
.../src/controls/OneOfEnumControlRenderer.vue | 54 +++++++++++++++++++
packages/vue2-vuetify/src/controls/index.ts | 4 ++
3 files changed, 74 insertions(+)
create mode 100644 packages/vue2-vuetify/src/controls/OneOfEnumControlRenderer.vue
diff --git a/packages/example/src/components/JsonFormsDemo.vue b/packages/example/src/components/JsonFormsDemo.vue
index 672247e9b2..967c8fc033 100644
--- a/packages/example/src/components/JsonFormsDemo.vue
+++ b/packages/example/src/components/JsonFormsDemo.vue
@@ -21,6 +21,22 @@ import { vuetifyRenderers } from '@jsonforms/vue2-vuetify';
const schema = {
properties: {
+ gender: {
+ oneOf: [
+ {
+ const: 'male',
+ title: 'Male',
+ },
+ {
+ const: 'female',
+ title: 'Female',
+ },
+ {
+ const: 'other',
+ title: 'Diverse',
+ },
+ ],
+ },
name: {
type: 'string',
minLength: 1,
diff --git a/packages/vue2-vuetify/src/controls/OneOfEnumControlRenderer.vue b/packages/vue2-vuetify/src/controls/OneOfEnumControlRenderer.vue
new file mode 100644
index 0000000000..77cf1c88c2
--- /dev/null
+++ b/packages/vue2-vuetify/src/controls/OneOfEnumControlRenderer.vue
@@ -0,0 +1,54 @@
+
+
+
+
+
+
diff --git a/packages/vue2-vuetify/src/controls/index.ts b/packages/vue2-vuetify/src/controls/index.ts
index 4b0c08978b..45e407fac0 100644
--- a/packages/vue2-vuetify/src/controls/index.ts
+++ b/packages/vue2-vuetify/src/controls/index.ts
@@ -4,7 +4,11 @@ import { entry as controlRendererEntry } from './ControlRenderer.vue';
export { default as EnumControlRenderer } from './EnumControlRenderer.vue';
import { entry as enumControlRendererEntry } from './EnumControlRenderer.vue';
+export { default as OneOfEnumControlRenderer } from './OneOfEnumControlRenderer.vue';
+import { entry as oneOfEnumControlRendererEntry } from './OneOfEnumControlRenderer.vue';
+
export const controlRenderers = [
controlRendererEntry,
enumControlRendererEntry,
+ oneOfEnumControlRendererEntry,
];
From 576682ecfc0cd9221523a1e1e86e164c3c6b8a32 Mon Sep 17 00:00:00 2001
From: kchobantonov
Date: Wed, 22 Sep 2021 02:48:26 -0400
Subject: [PATCH 005/185] Add complete Vuetify based renderer set
Full implementation of a Vuetify 2 based renderer set covering most
use cases of all existing JSON Forms renderer sets.
Also integrates a demo application including a full set of examples.
---
packages/example/package.json | 6 +-
packages/example/src/App.vue | 424 +++++++-
packages/example/src/assets/jsonforms.svg | 17 +
packages/example/src/assets/vuetify.svg | 10 +
.../example/src/components/JsonFormsDemo.vue | 143 ---
.../example/src/components/MonacoEditor.vue | 195 ++++
packages/example/src/components/Settings.vue | 222 ++++
.../example/src/components/ThemeChanger.vue | 197 ++++
.../src/components/examples/allOf/data.json | 7 +
.../src/components/examples/allOf/index.ts | 10 +
.../src/components/examples/allOf/schema.json | 53 +
.../components/examples/allOf/uischema.json | 10 +
.../examples/anyOf-simple/data.json | 3 +
.../components/examples/anyOf-simple/index.ts | 10 +
.../examples/anyOf-simple/schema.json | 18 +
.../src/components/examples/anyOf/data.json | 7 +
.../src/components/examples/anyOf/index.ts | 10 +
.../src/components/examples/anyOf/schema.json | 53 +
.../components/examples/anyOf/uischema.json | 10 +
.../examples/array-restrict/data.json | 12 +
.../examples/array-restrict/index.ts | 10 +
.../examples/array-restrict/schema.json | 30 +
.../examples/array-restrict/uischema.json | 12 +
.../examples/array-with-reorder/data.json | 14 +
.../examples/array-with-reorder/index.ts | 10 +
.../examples/array-with-reorder/schema.json | 28 +
.../examples/array-with-reorder/uischema.json | 12 +
.../src/components/examples/array/data.json | 12 +
.../src/components/examples/array/index.ts | 10 +
.../src/components/examples/array/schema.json | 28 +
.../components/examples/array/uischema.json | 9 +
.../src/components/examples/basic/data.json | 9 +
.../src/components/examples/basic/index.ts | 10 +
.../src/components/examples/basic/schema.json | 61 ++
.../components/examples/basic/uischema.json | 55 +
.../categorization-stepper-nav/data.json | 4 +
.../categorization-stepper-nav/index.ts | 10 +
.../categorization-stepper-nav/schema.json | 77 ++
.../categorization-stepper-nav/uischema.json | 126 +++
.../examples/categorization-stepper/data.json | 4 +
.../examples/categorization-stepper/index.ts | 10 +
.../categorization-stepper/schema.json | 77 ++
.../categorization-stepper/uischema.json | 125 +++
.../examples/categorization/data.json | 4 +
.../examples/categorization/index.ts | 10 +
.../examples/categorization/schema.json | 77 ++
.../examples/categorization/uischema.json | 122 +++
.../examples/control-options/data.json | 7 +
.../examples/control-options/index.ts | 10 +
.../examples/control-options/schema.json | 41 +
.../examples/control-options/uischema.json | 55 +
.../src/components/examples/control/data.json | 10 +
.../src/components/examples/control/index.ts | 10 +
.../components/examples/control/schema.json | 37 +
.../components/examples/control/uischema.json | 37 +
.../examples/enum-in-array/data.json | 1 +
.../examples/enum-in-array/index.ts | 10 +
.../examples/enum-in-array/schema.json | 32 +
.../examples/enum-in-array/uischema.json | 9 +
.../src/components/examples/enum/data.json | 4 +
.../src/components/examples/enum/index.ts | 10 +
.../src/components/examples/enum/schema.json | 53 +
.../components/examples/enum/uischema.json | 61 ++
.../examples/group-layout/data.json | 9 +
.../components/examples/group-layout/index.ts | 10 +
.../examples/group-layout/schema.json | 61 ++
.../examples/group-layout/uischema.json | 16 +
.../examples/horizontal-layout/data.json | 9 +
.../examples/horizontal-layout/index.ts | 10 +
.../examples/horizontal-layout/schema.json | 61 ++
.../examples/horizontal-layout/uischema.json | 15 +
.../src/components/examples/huge/data.json | 180 ++++
.../src/components/examples/huge/index.ts | 10 +
.../src/components/examples/huge/schema.json | 966 ++++++++++++++++++
.../components/examples/huge/uischema.json | 58 ++
.../examples/if-then-else/data.json | 2 +
.../components/examples/if-then-else/index.ts | 10 +
.../examples/if-then-else/schema.json | 26 +
.../example/src/components/examples/index.ts | 196 ++++
.../list-with-details-and-reorder/data.json | 16 +
.../list-with-details-and-reorder/index.ts | 10 +
.../list-with-details-and-reorder/schema.json | 31 +
.../uischema.json | 37 +
.../list-with-details-restrict/data.json | 16 +
.../list-with-details-restrict/index.ts | 10 +
.../list-with-details-restrict/schema.json | 33 +
.../list-with-details-restrict/uischema.json | 37 +
.../examples/list-with-details/data.json | 16 +
.../examples/list-with-details/index.ts | 10 +
.../examples/list-with-details/schema.json | 31 +
.../examples/list-with-details/uischema.json | 36 +
.../src/components/examples/login/data.json | 3 +
.../src/components/examples/login/index.ts | 10 +
.../src/components/examples/login/schema.json | 18 +
.../components/examples/login/uischema.json | 22 +
.../src/components/examples/main/data.json | 4 +
.../src/components/examples/main/index.ts | 10 +
.../src/components/examples/main/schema.json | 61 ++
.../components/examples/main/uischema.json | 89 ++
.../components/examples/multi-enum/data.json | 8 +
.../components/examples/multi-enum/index.ts | 10 +
.../examples/multi-enum/schema.json | 37 +
.../examples/multi-enum/uischema.json | 13 +
.../examples/nested-array-restrict/data.json | 8 +
.../examples/nested-array-restrict/index.ts | 10 +
.../nested-array-restrict/schema.json | 24 +
.../nested-array-restrict/uischema.json | 16 +
.../nested-array-with-reorder/data.json | 8 +
.../nested-array-with-reorder/index.ts | 10 +
.../nested-array-with-reorder/schema.json | 24 +
.../nested-array-with-reorder/uischema.json | 16 +
.../examples/nested-array/data.json | 8 +
.../components/examples/nested-array/index.ts | 10 +
.../examples/nested-array/schema.json | 22 +
.../examples/nested-array/uischema.json | 13 +
.../examples/nested-layout/data.json | 9 +
.../examples/nested-layout/index.ts | 10 +
.../examples/nested-layout/schema.json | 61 ++
.../examples/nested-layout/uischema.json | 41 +
.../components/examples/no-schemas/data.json | 9 +
.../components/examples/no-schemas/index.ts | 10 +
.../examples/no-ui-schema/data.json | 9 +
.../components/examples/no-ui-schema/index.ts | 10 +
.../examples/no-ui-schema/schema.json | 37 +
.../src/components/examples/object/data.json | 7 +
.../src/components/examples/object/index.ts | 10 +
.../components/examples/object/schema.json | 40 +
.../components/examples/object/uischema.json | 21 +
.../examples/oneOf-recursive/data.json | 2 +
.../examples/oneOf-recursive/index.ts | 10 +
.../examples/oneOf-recursive/schema.json | 49 +
.../examples/oneOf-recursive/uischema.json | 4 +
.../src/components/examples/oneOf/data.json | 3 +
.../src/components/examples/oneOf/index.ts | 10 +
.../src/components/examples/oneOf/schema.json | 53 +
.../components/examples/oneOf/uischema.json | 10 +
.../components/examples/radio-group/data.json | 1 +
.../components/examples/radio-group/index.ts | 10 +
.../examples/radio-group/schema.json | 30 +
.../examples/radio-group/uischema.json | 31 +
.../src/components/examples/radio/data.json | 1 +
.../src/components/examples/radio/index.ts | 10 +
.../src/components/examples/radio/schema.json | 13 +
.../components/examples/radio/uischema.json | 7 +
.../components/examples/root-object/data.json | 7 +
.../components/examples/root-object/index.ts | 10 +
.../examples/root-object/schema.json | 40 +
.../examples/root-object/uischema.json | 4 +
.../src/components/examples/rule/data.json | 5 +
.../src/components/examples/rule/index.ts | 10 +
.../src/components/examples/rule/schema.json | 30 +
.../components/examples/rule/uischema.json | 58 ++
.../examples/vertical-layout/data.json | 9 +
.../examples/vertical-layout/index.ts | 10 +
.../examples/vertical-layout/schema.json | 61 ++
.../examples/vertical-layout/uischema.json | 15 +
.../example/src/core/jsonSchemaValidation.ts | 122 +++
packages/example/src/core/jsonschema/index.ts | 18 +
.../core/jsonschema/specification/rule.json | 97 ++
.../core/jsonschema/specification/schema.json | 167 +++
.../jsonschema/specification/uischema.json | 314 ++++++
packages/example/src/plugins/vuetify.ts | 47 +-
packages/example/vue.config.js | 21 +
packages/vue2-vuetify/package.json | 9 +-
packages/vue2-vuetify/rollup.config.js | 20 +-
.../src/additional/LabelRenderer.vue | 51 +
.../src/additional/ListWithDetailRenderer.vue | 345 +++++++
packages/vue2-vuetify/src/additional/index.ts | 10 +
packages/vue2-vuetify/src/array/index.ts | 13 +
.../src/complex/AllOfRenderer.vue | 95 ++
.../src/complex/AnyOfRenderer.vue | 108 ++
.../src/complex/ArrayControlRenderer.vue | 335 ++++++
.../src/complex/EnumArrayRenderer.vue | 126 +++
.../src/complex/ObjectRenderer.vue | 75 ++
.../src/complex/OneOfRenderer.vue | 235 +++++
.../components/CombinatorProperties.vue | 67 ++
.../src/complex/components/index.ts | 1 +
packages/vue2-vuetify/src/complex/index.ts | 22 +
.../AnyOfStringOrEnumControlRenderer.vue | 119 +++
.../src/controls/BooleanControlRenderer.vue | 65 ++
.../controls/BooleanToggleControlRenderer.vue | 66 ++
.../src/controls/ControlRenderer.vue | 50 -
.../src/controls/ControlWrapper.vue | 82 ++
.../src/controls/DateControlRenderer.vue | 65 ++
.../src/controls/DateTimeControlRenderer.vue | 90 ++
.../src/controls/EnumControlRenderer.vue | 71 +-
.../src/controls/IntegerControlRenderer.vue | 81 ++
.../controls/MultiStringControlRenderer.vue | 87 ++
.../src/controls/NumberControlRenderer.vue | 75 ++
.../src/controls/OneOfEnumControlRenderer.vue | 71 +-
.../OneOfRadioGroupControlRenderer.vue | 76 ++
.../src/controls/PasswordControlRenderer.vue | 85 ++
.../controls/RadioGroupControlRenderer.vue | 76 ++
.../src/controls/SliderControlRenderer.vue | 70 ++
.../src/controls/StringControlRenderer.vue | 133 +++
.../src/controls/TimeControlRenderer.vue | 65 ++
.../controls/components/ValidationBadge.vue | 119 +++
.../controls/components/ValidationIcon.vue | 26 +
.../src/controls/components/index.ts | 2 +
.../controls/directives/DisabledIconFocus.ts | 9 +
.../src/controls/directives/index.ts | 1 +
packages/vue2-vuetify/src/controls/index.ts | 51 +-
.../AutocompleteEnumControlRenderer.vue | 103 ++
.../AutocompleteOneOfEnumControlRenderer.vue | 103 ++
packages/vue2-vuetify/src/extended/index.ts | 10 +
packages/vue2-vuetify/src/index.ts | 8 +
.../src/layouts/ArrayLayoutRenderer.vue | 317 ++++++
.../src/layouts/CategorizationRenderer.vue | 106 ++
.../layouts/CategorizationStepperRenderer.vue | 163 +++
.../src/layouts/GroupRenderer.vue | 77 ++
.../src/layouts/HorizontalLayoutRenderer.vue | 70 ++
.../src/layouts/LayoutRenderer.vue | 54 -
.../src/layouts/VerticalLayoutRenderer.vue | 71 ++
packages/vue2-vuetify/src/layouts/index.ts | 37 +-
packages/vue2-vuetify/src/renderers.ts | 20 +-
.../vue2-vuetify/src/styles/defaultStyles.ts | 38 +
packages/vue2-vuetify/src/styles/index.ts | 3 +
packages/vue2-vuetify/src/styles/styles.ts | 67 ++
packages/vue2-vuetify/src/styles/util.ts | 36 +
packages/vue2-vuetify/src/util/composition.ts | 149 +++
packages/vue2-vuetify/src/util/datejs.ts | 23 +
packages/vue2-vuetify/src/util/index.ts | 4 +
packages/vue2-vuetify/src/util/options.ts | 6 +
packages/vue2-vuetify/src/util/validator.ts | 9 +
packages/vue2-vuetify/src/vue.ts | 19 +
225 files changed, 11015 insertions(+), 324 deletions(-)
create mode 100644 packages/example/src/assets/jsonforms.svg
create mode 100644 packages/example/src/assets/vuetify.svg
delete mode 100644 packages/example/src/components/JsonFormsDemo.vue
create mode 100644 packages/example/src/components/MonacoEditor.vue
create mode 100644 packages/example/src/components/Settings.vue
create mode 100644 packages/example/src/components/ThemeChanger.vue
create mode 100644 packages/example/src/components/examples/allOf/data.json
create mode 100644 packages/example/src/components/examples/allOf/index.ts
create mode 100644 packages/example/src/components/examples/allOf/schema.json
create mode 100644 packages/example/src/components/examples/allOf/uischema.json
create mode 100644 packages/example/src/components/examples/anyOf-simple/data.json
create mode 100644 packages/example/src/components/examples/anyOf-simple/index.ts
create mode 100644 packages/example/src/components/examples/anyOf-simple/schema.json
create mode 100644 packages/example/src/components/examples/anyOf/data.json
create mode 100644 packages/example/src/components/examples/anyOf/index.ts
create mode 100644 packages/example/src/components/examples/anyOf/schema.json
create mode 100644 packages/example/src/components/examples/anyOf/uischema.json
create mode 100644 packages/example/src/components/examples/array-restrict/data.json
create mode 100644 packages/example/src/components/examples/array-restrict/index.ts
create mode 100644 packages/example/src/components/examples/array-restrict/schema.json
create mode 100644 packages/example/src/components/examples/array-restrict/uischema.json
create mode 100644 packages/example/src/components/examples/array-with-reorder/data.json
create mode 100644 packages/example/src/components/examples/array-with-reorder/index.ts
create mode 100644 packages/example/src/components/examples/array-with-reorder/schema.json
create mode 100644 packages/example/src/components/examples/array-with-reorder/uischema.json
create mode 100644 packages/example/src/components/examples/array/data.json
create mode 100644 packages/example/src/components/examples/array/index.ts
create mode 100644 packages/example/src/components/examples/array/schema.json
create mode 100644 packages/example/src/components/examples/array/uischema.json
create mode 100644 packages/example/src/components/examples/basic/data.json
create mode 100644 packages/example/src/components/examples/basic/index.ts
create mode 100644 packages/example/src/components/examples/basic/schema.json
create mode 100644 packages/example/src/components/examples/basic/uischema.json
create mode 100644 packages/example/src/components/examples/categorization-stepper-nav/data.json
create mode 100644 packages/example/src/components/examples/categorization-stepper-nav/index.ts
create mode 100644 packages/example/src/components/examples/categorization-stepper-nav/schema.json
create mode 100644 packages/example/src/components/examples/categorization-stepper-nav/uischema.json
create mode 100644 packages/example/src/components/examples/categorization-stepper/data.json
create mode 100644 packages/example/src/components/examples/categorization-stepper/index.ts
create mode 100644 packages/example/src/components/examples/categorization-stepper/schema.json
create mode 100644 packages/example/src/components/examples/categorization-stepper/uischema.json
create mode 100644 packages/example/src/components/examples/categorization/data.json
create mode 100644 packages/example/src/components/examples/categorization/index.ts
create mode 100644 packages/example/src/components/examples/categorization/schema.json
create mode 100644 packages/example/src/components/examples/categorization/uischema.json
create mode 100644 packages/example/src/components/examples/control-options/data.json
create mode 100644 packages/example/src/components/examples/control-options/index.ts
create mode 100644 packages/example/src/components/examples/control-options/schema.json
create mode 100644 packages/example/src/components/examples/control-options/uischema.json
create mode 100644 packages/example/src/components/examples/control/data.json
create mode 100644 packages/example/src/components/examples/control/index.ts
create mode 100644 packages/example/src/components/examples/control/schema.json
create mode 100644 packages/example/src/components/examples/control/uischema.json
create mode 100644 packages/example/src/components/examples/enum-in-array/data.json
create mode 100644 packages/example/src/components/examples/enum-in-array/index.ts
create mode 100644 packages/example/src/components/examples/enum-in-array/schema.json
create mode 100644 packages/example/src/components/examples/enum-in-array/uischema.json
create mode 100644 packages/example/src/components/examples/enum/data.json
create mode 100644 packages/example/src/components/examples/enum/index.ts
create mode 100644 packages/example/src/components/examples/enum/schema.json
create mode 100644 packages/example/src/components/examples/enum/uischema.json
create mode 100644 packages/example/src/components/examples/group-layout/data.json
create mode 100644 packages/example/src/components/examples/group-layout/index.ts
create mode 100644 packages/example/src/components/examples/group-layout/schema.json
create mode 100644 packages/example/src/components/examples/group-layout/uischema.json
create mode 100644 packages/example/src/components/examples/horizontal-layout/data.json
create mode 100644 packages/example/src/components/examples/horizontal-layout/index.ts
create mode 100644 packages/example/src/components/examples/horizontal-layout/schema.json
create mode 100644 packages/example/src/components/examples/horizontal-layout/uischema.json
create mode 100644 packages/example/src/components/examples/huge/data.json
create mode 100644 packages/example/src/components/examples/huge/index.ts
create mode 100644 packages/example/src/components/examples/huge/schema.json
create mode 100644 packages/example/src/components/examples/huge/uischema.json
create mode 100644 packages/example/src/components/examples/if-then-else/data.json
create mode 100644 packages/example/src/components/examples/if-then-else/index.ts
create mode 100644 packages/example/src/components/examples/if-then-else/schema.json
create mode 100644 packages/example/src/components/examples/index.ts
create mode 100644 packages/example/src/components/examples/list-with-details-and-reorder/data.json
create mode 100644 packages/example/src/components/examples/list-with-details-and-reorder/index.ts
create mode 100644 packages/example/src/components/examples/list-with-details-and-reorder/schema.json
create mode 100644 packages/example/src/components/examples/list-with-details-and-reorder/uischema.json
create mode 100644 packages/example/src/components/examples/list-with-details-restrict/data.json
create mode 100644 packages/example/src/components/examples/list-with-details-restrict/index.ts
create mode 100644 packages/example/src/components/examples/list-with-details-restrict/schema.json
create mode 100644 packages/example/src/components/examples/list-with-details-restrict/uischema.json
create mode 100644 packages/example/src/components/examples/list-with-details/data.json
create mode 100644 packages/example/src/components/examples/list-with-details/index.ts
create mode 100644 packages/example/src/components/examples/list-with-details/schema.json
create mode 100644 packages/example/src/components/examples/list-with-details/uischema.json
create mode 100644 packages/example/src/components/examples/login/data.json
create mode 100644 packages/example/src/components/examples/login/index.ts
create mode 100644 packages/example/src/components/examples/login/schema.json
create mode 100644 packages/example/src/components/examples/login/uischema.json
create mode 100644 packages/example/src/components/examples/main/data.json
create mode 100644 packages/example/src/components/examples/main/index.ts
create mode 100644 packages/example/src/components/examples/main/schema.json
create mode 100644 packages/example/src/components/examples/main/uischema.json
create mode 100644 packages/example/src/components/examples/multi-enum/data.json
create mode 100644 packages/example/src/components/examples/multi-enum/index.ts
create mode 100644 packages/example/src/components/examples/multi-enum/schema.json
create mode 100644 packages/example/src/components/examples/multi-enum/uischema.json
create mode 100644 packages/example/src/components/examples/nested-array-restrict/data.json
create mode 100644 packages/example/src/components/examples/nested-array-restrict/index.ts
create mode 100644 packages/example/src/components/examples/nested-array-restrict/schema.json
create mode 100644 packages/example/src/components/examples/nested-array-restrict/uischema.json
create mode 100644 packages/example/src/components/examples/nested-array-with-reorder/data.json
create mode 100644 packages/example/src/components/examples/nested-array-with-reorder/index.ts
create mode 100644 packages/example/src/components/examples/nested-array-with-reorder/schema.json
create mode 100644 packages/example/src/components/examples/nested-array-with-reorder/uischema.json
create mode 100644 packages/example/src/components/examples/nested-array/data.json
create mode 100644 packages/example/src/components/examples/nested-array/index.ts
create mode 100644 packages/example/src/components/examples/nested-array/schema.json
create mode 100644 packages/example/src/components/examples/nested-array/uischema.json
create mode 100644 packages/example/src/components/examples/nested-layout/data.json
create mode 100644 packages/example/src/components/examples/nested-layout/index.ts
create mode 100644 packages/example/src/components/examples/nested-layout/schema.json
create mode 100644 packages/example/src/components/examples/nested-layout/uischema.json
create mode 100644 packages/example/src/components/examples/no-schemas/data.json
create mode 100644 packages/example/src/components/examples/no-schemas/index.ts
create mode 100644 packages/example/src/components/examples/no-ui-schema/data.json
create mode 100644 packages/example/src/components/examples/no-ui-schema/index.ts
create mode 100644 packages/example/src/components/examples/no-ui-schema/schema.json
create mode 100644 packages/example/src/components/examples/object/data.json
create mode 100644 packages/example/src/components/examples/object/index.ts
create mode 100644 packages/example/src/components/examples/object/schema.json
create mode 100644 packages/example/src/components/examples/object/uischema.json
create mode 100644 packages/example/src/components/examples/oneOf-recursive/data.json
create mode 100644 packages/example/src/components/examples/oneOf-recursive/index.ts
create mode 100644 packages/example/src/components/examples/oneOf-recursive/schema.json
create mode 100644 packages/example/src/components/examples/oneOf-recursive/uischema.json
create mode 100644 packages/example/src/components/examples/oneOf/data.json
create mode 100644 packages/example/src/components/examples/oneOf/index.ts
create mode 100644 packages/example/src/components/examples/oneOf/schema.json
create mode 100644 packages/example/src/components/examples/oneOf/uischema.json
create mode 100644 packages/example/src/components/examples/radio-group/data.json
create mode 100644 packages/example/src/components/examples/radio-group/index.ts
create mode 100644 packages/example/src/components/examples/radio-group/schema.json
create mode 100644 packages/example/src/components/examples/radio-group/uischema.json
create mode 100644 packages/example/src/components/examples/radio/data.json
create mode 100644 packages/example/src/components/examples/radio/index.ts
create mode 100644 packages/example/src/components/examples/radio/schema.json
create mode 100644 packages/example/src/components/examples/radio/uischema.json
create mode 100644 packages/example/src/components/examples/root-object/data.json
create mode 100644 packages/example/src/components/examples/root-object/index.ts
create mode 100644 packages/example/src/components/examples/root-object/schema.json
create mode 100644 packages/example/src/components/examples/root-object/uischema.json
create mode 100644 packages/example/src/components/examples/rule/data.json
create mode 100644 packages/example/src/components/examples/rule/index.ts
create mode 100644 packages/example/src/components/examples/rule/schema.json
create mode 100644 packages/example/src/components/examples/rule/uischema.json
create mode 100644 packages/example/src/components/examples/vertical-layout/data.json
create mode 100644 packages/example/src/components/examples/vertical-layout/index.ts
create mode 100644 packages/example/src/components/examples/vertical-layout/schema.json
create mode 100644 packages/example/src/components/examples/vertical-layout/uischema.json
create mode 100644 packages/example/src/core/jsonSchemaValidation.ts
create mode 100644 packages/example/src/core/jsonschema/index.ts
create mode 100644 packages/example/src/core/jsonschema/specification/rule.json
create mode 100644 packages/example/src/core/jsonschema/specification/schema.json
create mode 100644 packages/example/src/core/jsonschema/specification/uischema.json
create mode 100644 packages/vue2-vuetify/src/additional/LabelRenderer.vue
create mode 100644 packages/vue2-vuetify/src/additional/ListWithDetailRenderer.vue
create mode 100644 packages/vue2-vuetify/src/additional/index.ts
create mode 100644 packages/vue2-vuetify/src/array/index.ts
create mode 100644 packages/vue2-vuetify/src/complex/AllOfRenderer.vue
create mode 100644 packages/vue2-vuetify/src/complex/AnyOfRenderer.vue
create mode 100644 packages/vue2-vuetify/src/complex/ArrayControlRenderer.vue
create mode 100644 packages/vue2-vuetify/src/complex/EnumArrayRenderer.vue
create mode 100644 packages/vue2-vuetify/src/complex/ObjectRenderer.vue
create mode 100644 packages/vue2-vuetify/src/complex/OneOfRenderer.vue
create mode 100644 packages/vue2-vuetify/src/complex/components/CombinatorProperties.vue
create mode 100644 packages/vue2-vuetify/src/complex/components/index.ts
create mode 100644 packages/vue2-vuetify/src/complex/index.ts
create mode 100644 packages/vue2-vuetify/src/controls/AnyOfStringOrEnumControlRenderer.vue
create mode 100644 packages/vue2-vuetify/src/controls/BooleanControlRenderer.vue
create mode 100644 packages/vue2-vuetify/src/controls/BooleanToggleControlRenderer.vue
delete mode 100644 packages/vue2-vuetify/src/controls/ControlRenderer.vue
create mode 100644 packages/vue2-vuetify/src/controls/ControlWrapper.vue
create mode 100644 packages/vue2-vuetify/src/controls/DateControlRenderer.vue
create mode 100644 packages/vue2-vuetify/src/controls/DateTimeControlRenderer.vue
create mode 100644 packages/vue2-vuetify/src/controls/IntegerControlRenderer.vue
create mode 100644 packages/vue2-vuetify/src/controls/MultiStringControlRenderer.vue
create mode 100644 packages/vue2-vuetify/src/controls/NumberControlRenderer.vue
create mode 100644 packages/vue2-vuetify/src/controls/OneOfRadioGroupControlRenderer.vue
create mode 100644 packages/vue2-vuetify/src/controls/PasswordControlRenderer.vue
create mode 100644 packages/vue2-vuetify/src/controls/RadioGroupControlRenderer.vue
create mode 100644 packages/vue2-vuetify/src/controls/SliderControlRenderer.vue
create mode 100644 packages/vue2-vuetify/src/controls/StringControlRenderer.vue
create mode 100644 packages/vue2-vuetify/src/controls/TimeControlRenderer.vue
create mode 100644 packages/vue2-vuetify/src/controls/components/ValidationBadge.vue
create mode 100644 packages/vue2-vuetify/src/controls/components/ValidationIcon.vue
create mode 100644 packages/vue2-vuetify/src/controls/components/index.ts
create mode 100644 packages/vue2-vuetify/src/controls/directives/DisabledIconFocus.ts
create mode 100644 packages/vue2-vuetify/src/controls/directives/index.ts
create mode 100644 packages/vue2-vuetify/src/extended/AutocompleteEnumControlRenderer.vue
create mode 100644 packages/vue2-vuetify/src/extended/AutocompleteOneOfEnumControlRenderer.vue
create mode 100644 packages/vue2-vuetify/src/extended/index.ts
create mode 100644 packages/vue2-vuetify/src/layouts/ArrayLayoutRenderer.vue
create mode 100644 packages/vue2-vuetify/src/layouts/CategorizationRenderer.vue
create mode 100644 packages/vue2-vuetify/src/layouts/CategorizationStepperRenderer.vue
create mode 100644 packages/vue2-vuetify/src/layouts/GroupRenderer.vue
create mode 100644 packages/vue2-vuetify/src/layouts/HorizontalLayoutRenderer.vue
delete mode 100644 packages/vue2-vuetify/src/layouts/LayoutRenderer.vue
create mode 100644 packages/vue2-vuetify/src/layouts/VerticalLayoutRenderer.vue
create mode 100644 packages/vue2-vuetify/src/styles/defaultStyles.ts
create mode 100644 packages/vue2-vuetify/src/styles/index.ts
create mode 100644 packages/vue2-vuetify/src/styles/styles.ts
create mode 100644 packages/vue2-vuetify/src/styles/util.ts
create mode 100644 packages/vue2-vuetify/src/util/composition.ts
create mode 100644 packages/vue2-vuetify/src/util/datejs.ts
create mode 100644 packages/vue2-vuetify/src/util/index.ts
create mode 100644 packages/vue2-vuetify/src/util/options.ts
create mode 100644 packages/vue2-vuetify/src/util/validator.ts
create mode 100644 packages/vue2-vuetify/src/vue.ts
diff --git a/packages/example/package.json b/packages/example/package.json
index 514ceff8de..5b94eb55fe 100644
--- a/packages/example/package.json
+++ b/packages/example/package.json
@@ -14,7 +14,8 @@
"@vue/composition-api": "^1.0.0-rc.3",
"core-js": "^3.6.5",
"vue": "^2.6.14",
- "vuetify": "^2.4.0"
+ "vuetify": "^2.4.0",
+ "monaco-editor": "^0.26.0"
},
"devDependencies": {
"@typescript-eslint/eslint-plugin": "^4.18.0",
@@ -35,6 +36,7 @@
"typescript": "~4.1.5",
"vue-cli-plugin-vuetify": "~2.4.2",
"vue-template-compiler": "^2.6.14",
- "vuetify-loader": "^1.7.0"
+ "vuetify-loader": "^1.7.0",
+ "monaco-editor-webpack-plugin": "^4.1.1"
}
}
diff --git a/packages/example/src/App.vue b/packages/example/src/App.vue
index 9f10912092..973ee2a305 100644
--- a/packages/example/src/App.vue
+++ b/packages/example/src/App.vue
@@ -1,7 +1,92 @@
+
+
+
+
+
+
+ Examples
+ Vuetify Renderers
+
+
+
+
+
+
+
+
+ {{ example.title }}
+
+
+
+
+
+
+
+
+
+
+
+ JSON Forms
+
+
+
+
+
+
+ (this.validationMode = validation)
+ "
+ @hide-required-asterisk-changed="
+ (value) => (this.config.hideRequiredAsterisk = value)
+ "
+ @show-unfocused-description-changed="
+ (value) => (this.config.showUnfocusedDescription = value)
+ "
+ @readonly-changed="(value) => (this.readonly = value)"
+ @restrict-changed="(value) => (this.config.restrict = value)"
+ />
+
+
+
+
+
+
+
+
-
+
+
-
-
-
-
-
+
+
+
+ {{ example.title }}
+
+
+ Demo
+
+ Schema
+ UI Schema
+ Data
+
+
+
+
+
+
+ Schema
+
+
+
+
+
+
+ UI Schema
+
+
+
+
+
+
+ Data
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/example/src/assets/jsonforms.svg b/packages/example/src/assets/jsonforms.svg
new file mode 100644
index 0000000000..774d78bc5f
--- /dev/null
+++ b/packages/example/src/assets/jsonforms.svg
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/packages/example/src/assets/vuetify.svg b/packages/example/src/assets/vuetify.svg
new file mode 100644
index 0000000000..9096175280
--- /dev/null
+++ b/packages/example/src/assets/vuetify.svg
@@ -0,0 +1,10 @@
+
+
+
+
+ Artboard 46
+
+
+
+
+
\ No newline at end of file
diff --git a/packages/example/src/components/JsonFormsDemo.vue b/packages/example/src/components/JsonFormsDemo.vue
deleted file mode 100644
index 967c8fc033..0000000000
--- a/packages/example/src/components/JsonFormsDemo.vue
+++ /dev/null
@@ -1,143 +0,0 @@
-
-
-
-
-
-
- {{ JSON.stringify(data, null, 2) }}
-
-
-
-
-
diff --git a/packages/example/src/components/MonacoEditor.vue b/packages/example/src/components/MonacoEditor.vue
new file mode 100644
index 0000000000..98b11dd073
--- /dev/null
+++ b/packages/example/src/components/MonacoEditor.vue
@@ -0,0 +1,195 @@
+
+
+
+
+
diff --git a/packages/example/src/components/Settings.vue b/packages/example/src/components/Settings.vue
new file mode 100644
index 0000000000..171575b4fa
--- /dev/null
+++ b/packages/example/src/components/Settings.vue
@@ -0,0 +1,222 @@
+
+
+
+
+
+ mdi-cog
+
+
+ Settings
+
+
+
+ Settings
+
+
+
+ $close
+
+
+
+
+
+
+
+ Theme
+
+
+
+
+ Light
+
+ mdi-weather-sunny
+
+
+
+ Dark
+
+ mdi-weather-night
+
+
+
+
+
+
+
+
+
+ Direction
+
+
+
+
+ LTR
+
+ mdi-format-textdirection-l-to-r
+
+
+
+ RTL
+
+ mdi-format-textdirection-r-to-l
+
+
+
+
+
+
+
+
+
+ Validation
+
+
+
+
+
+
+
+
+
+
+ Options
+
+
+
+
+
+
+ If asterisks in labels for required fields should be hidden
+
+
+
+
+
+
+
+
+
+ If input descriptions should hide when not focused
+
+
+
+
+
+
+
+
+
+ Whether to restrict the number of characters to maxLength, if
+ specified in the JSON schema
+
+
+
+
+
+
+
+
+
+ If true, sets all controls to read-only
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/example/src/components/ThemeChanger.vue b/packages/example/src/components/ThemeChanger.vue
new file mode 100644
index 0000000000..cb843d3820
--- /dev/null
+++ b/packages/example/src/components/ThemeChanger.vue
@@ -0,0 +1,197 @@
+
+
+
+
+
+
+ mdi-palette
+
+
+ Theme Colors
+
+
+
+ Theme Colors
+
+
+
+ $close
+
+
+
+
+
+
+
+
+
+
+
+ {{ theme.name }}
+
+
+
+ mdi-check
+
+
+
+
+
+ {{ key }}
+
+
+
+ {{ key }}
+
+
+
+
+
+
+
+
+
diff --git a/packages/example/src/components/examples/allOf/data.json b/packages/example/src/components/examples/allOf/data.json
new file mode 100644
index 0000000000..5bd1d45b5b
--- /dev/null
+++ b/packages/example/src/components/examples/allOf/data.json
@@ -0,0 +1,7 @@
+{
+ "addressOrUser": {
+ "street_address": "1600 Pennsylvania Avenue NW",
+ "city": "Washington",
+ "state": "DC"
+ }
+}
\ No newline at end of file
diff --git a/packages/example/src/components/examples/allOf/index.ts b/packages/example/src/components/examples/allOf/index.ts
new file mode 100644
index 0000000000..8f5e656657
--- /dev/null
+++ b/packages/example/src/components/examples/allOf/index.ts
@@ -0,0 +1,10 @@
+import schema from './schema.json';
+import uischema from './uischema.json';
+import data from './data.json';
+import { UISchemaElement, JsonSchema } from '@jsonforms/core';
+
+export const input: {
+ schema: JsonSchema;
+ uischema: UISchemaElement;
+ data: any;
+} = { schema, uischema, data };
diff --git a/packages/example/src/components/examples/allOf/schema.json b/packages/example/src/components/examples/allOf/schema.json
new file mode 100644
index 0000000000..c128998f52
--- /dev/null
+++ b/packages/example/src/components/examples/allOf/schema.json
@@ -0,0 +1,53 @@
+{
+ "definitions": {
+ "address": {
+ "type": "object",
+ "title": "Address",
+ "properties": {
+ "street_address": {
+ "type": "string"
+ },
+ "city": {
+ "type": "string"
+ },
+ "state": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "street_address",
+ "city",
+ "state"
+ ]
+ },
+ "user": {
+ "type": "object",
+ "title": "User",
+ "properties": {
+ "name": {
+ "type": "string"
+ },
+ "mail": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "name",
+ "mail"
+ ]
+ }
+ },
+ "type": "object",
+ "properties": {
+ "addressOrUser": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/address"
+ },
+ {
+ "$ref": "#/definitions/user"
+ }
+ ]
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/example/src/components/examples/allOf/uischema.json b/packages/example/src/components/examples/allOf/uischema.json
new file mode 100644
index 0000000000..8120bed021
--- /dev/null
+++ b/packages/example/src/components/examples/allOf/uischema.json
@@ -0,0 +1,10 @@
+{
+ "type": "VerticalLayout",
+ "elements": [
+ {
+ "type": "Control",
+ "label": "Basic Information",
+ "scope": "#/properties/addressOrUser"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/packages/example/src/components/examples/anyOf-simple/data.json b/packages/example/src/components/examples/anyOf-simple/data.json
new file mode 100644
index 0000000000..abdd5202bd
--- /dev/null
+++ b/packages/example/src/components/examples/anyOf-simple/data.json
@@ -0,0 +1,3 @@
+{
+ "foo": "foo"
+}
diff --git a/packages/example/src/components/examples/anyOf-simple/index.ts b/packages/example/src/components/examples/anyOf-simple/index.ts
new file mode 100644
index 0000000000..190d6b2aef
--- /dev/null
+++ b/packages/example/src/components/examples/anyOf-simple/index.ts
@@ -0,0 +1,10 @@
+import schema from './schema.json';
+import data from './data.json';
+import { UISchemaElement, JsonSchema } from '@jsonforms/core';
+
+const uischema = undefined;
+export const input: {
+ schema: JsonSchema;
+ uischema: UISchemaElement | undefined;
+ data: any;
+} = { schema, uischema, data };
diff --git a/packages/example/src/components/examples/anyOf-simple/schema.json b/packages/example/src/components/examples/anyOf-simple/schema.json
new file mode 100644
index 0000000000..0b7020ff9b
--- /dev/null
+++ b/packages/example/src/components/examples/anyOf-simple/schema.json
@@ -0,0 +1,18 @@
+{
+ "type": "object",
+ "properties": {
+ "foo": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "enum": [
+ "foo",
+ "bar"
+ ]
+ }
+ ]
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/example/src/components/examples/anyOf/data.json b/packages/example/src/components/examples/anyOf/data.json
new file mode 100644
index 0000000000..5bd1d45b5b
--- /dev/null
+++ b/packages/example/src/components/examples/anyOf/data.json
@@ -0,0 +1,7 @@
+{
+ "addressOrUser": {
+ "street_address": "1600 Pennsylvania Avenue NW",
+ "city": "Washington",
+ "state": "DC"
+ }
+}
\ No newline at end of file
diff --git a/packages/example/src/components/examples/anyOf/index.ts b/packages/example/src/components/examples/anyOf/index.ts
new file mode 100644
index 0000000000..8f5e656657
--- /dev/null
+++ b/packages/example/src/components/examples/anyOf/index.ts
@@ -0,0 +1,10 @@
+import schema from './schema.json';
+import uischema from './uischema.json';
+import data from './data.json';
+import { UISchemaElement, JsonSchema } from '@jsonforms/core';
+
+export const input: {
+ schema: JsonSchema;
+ uischema: UISchemaElement;
+ data: any;
+} = { schema, uischema, data };
diff --git a/packages/example/src/components/examples/anyOf/schema.json b/packages/example/src/components/examples/anyOf/schema.json
new file mode 100644
index 0000000000..58c1d49a93
--- /dev/null
+++ b/packages/example/src/components/examples/anyOf/schema.json
@@ -0,0 +1,53 @@
+{
+ "definitions": {
+ "address": {
+ "type": "object",
+ "title": "Address",
+ "properties": {
+ "street_address": {
+ "type": "string"
+ },
+ "city": {
+ "type": "string"
+ },
+ "state": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "street_address",
+ "city",
+ "state"
+ ]
+ },
+ "user": {
+ "type": "object",
+ "title": "User",
+ "properties": {
+ "name": {
+ "type": "string"
+ },
+ "mail": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "name",
+ "mail"
+ ]
+ }
+ },
+ "type": "object",
+ "properties": {
+ "addressOrUser": {
+ "anyOf": [
+ {
+ "$ref": "#/definitions/address"
+ },
+ {
+ "$ref": "#/definitions/user"
+ }
+ ]
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/example/src/components/examples/anyOf/uischema.json b/packages/example/src/components/examples/anyOf/uischema.json
new file mode 100644
index 0000000000..8120bed021
--- /dev/null
+++ b/packages/example/src/components/examples/anyOf/uischema.json
@@ -0,0 +1,10 @@
+{
+ "type": "VerticalLayout",
+ "elements": [
+ {
+ "type": "Control",
+ "label": "Basic Information",
+ "scope": "#/properties/addressOrUser"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/packages/example/src/components/examples/array-restrict/data.json b/packages/example/src/components/examples/array-restrict/data.json
new file mode 100644
index 0000000000..e5bbc2be94
--- /dev/null
+++ b/packages/example/src/components/examples/array-restrict/data.json
@@ -0,0 +1,12 @@
+{
+ "comments": [
+ {
+ "date": "2001-09-11",
+ "message": "This is an example message"
+ },
+ {
+ "date": "2021-08-13",
+ "message": "Get ready for booohay"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/packages/example/src/components/examples/array-restrict/index.ts b/packages/example/src/components/examples/array-restrict/index.ts
new file mode 100644
index 0000000000..8f5e656657
--- /dev/null
+++ b/packages/example/src/components/examples/array-restrict/index.ts
@@ -0,0 +1,10 @@
+import schema from './schema.json';
+import uischema from './uischema.json';
+import data from './data.json';
+import { UISchemaElement, JsonSchema } from '@jsonforms/core';
+
+export const input: {
+ schema: JsonSchema;
+ uischema: UISchemaElement;
+ data: any;
+} = { schema, uischema, data };
diff --git a/packages/example/src/components/examples/array-restrict/schema.json b/packages/example/src/components/examples/array-restrict/schema.json
new file mode 100644
index 0000000000..d6f69d1e6e
--- /dev/null
+++ b/packages/example/src/components/examples/array-restrict/schema.json
@@ -0,0 +1,30 @@
+{
+ "type": "object",
+ "properties": {
+ "comments": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "date": {
+ "type": "string",
+ "format": "date"
+ },
+ "message": {
+ "type": "string",
+ "maxLength": 5
+ },
+ "enum": {
+ "type": "string",
+ "enum": [
+ "foo",
+ "bar"
+ ]
+ }
+ }
+ },
+ "minItems": 1,
+ "maxItems": 5
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/example/src/components/examples/array-restrict/uischema.json b/packages/example/src/components/examples/array-restrict/uischema.json
new file mode 100644
index 0000000000..de35615924
--- /dev/null
+++ b/packages/example/src/components/examples/array-restrict/uischema.json
@@ -0,0 +1,12 @@
+{
+ "type": "VerticalLayout",
+ "elements": [
+ {
+ "type": "Control",
+ "scope": "#/properties/comments",
+ "options": {
+ "restrict": true
+ }
+ }
+ ]
+}
\ No newline at end of file
diff --git a/packages/example/src/components/examples/array-with-reorder/data.json b/packages/example/src/components/examples/array-with-reorder/data.json
new file mode 100644
index 0000000000..56c748e10a
--- /dev/null
+++ b/packages/example/src/components/examples/array-with-reorder/data.json
@@ -0,0 +1,14 @@
+{
+ "comments": [
+ {
+ "date": "2001-09-11",
+ "message": "This is an example message",
+ "enum": "foo"
+ },
+ {
+ "date": "2021-08-13",
+ "message": "Get ready for booohay",
+ "enum": "bar"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/packages/example/src/components/examples/array-with-reorder/index.ts b/packages/example/src/components/examples/array-with-reorder/index.ts
new file mode 100644
index 0000000000..8f5e656657
--- /dev/null
+++ b/packages/example/src/components/examples/array-with-reorder/index.ts
@@ -0,0 +1,10 @@
+import schema from './schema.json';
+import uischema from './uischema.json';
+import data from './data.json';
+import { UISchemaElement, JsonSchema } from '@jsonforms/core';
+
+export const input: {
+ schema: JsonSchema;
+ uischema: UISchemaElement;
+ data: any;
+} = { schema, uischema, data };
diff --git a/packages/example/src/components/examples/array-with-reorder/schema.json b/packages/example/src/components/examples/array-with-reorder/schema.json
new file mode 100644
index 0000000000..b2ac7ce43b
--- /dev/null
+++ b/packages/example/src/components/examples/array-with-reorder/schema.json
@@ -0,0 +1,28 @@
+{
+ "type": "object",
+ "properties": {
+ "comments": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "date": {
+ "type": "string",
+ "format": "date"
+ },
+ "message": {
+ "type": "string",
+ "maxLength": 5
+ },
+ "enum": {
+ "type": "string",
+ "enum": [
+ "foo",
+ "bar"
+ ]
+ }
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/example/src/components/examples/array-with-reorder/uischema.json b/packages/example/src/components/examples/array-with-reorder/uischema.json
new file mode 100644
index 0000000000..2cda531b49
--- /dev/null
+++ b/packages/example/src/components/examples/array-with-reorder/uischema.json
@@ -0,0 +1,12 @@
+{
+ "type": "VerticalLayout",
+ "elements": [
+ {
+ "type": "Control",
+ "scope": "#/properties/comments",
+ "options": {
+ "showSortButtons": true
+ }
+ }
+ ]
+}
\ No newline at end of file
diff --git a/packages/example/src/components/examples/array/data.json b/packages/example/src/components/examples/array/data.json
new file mode 100644
index 0000000000..e5bbc2be94
--- /dev/null
+++ b/packages/example/src/components/examples/array/data.json
@@ -0,0 +1,12 @@
+{
+ "comments": [
+ {
+ "date": "2001-09-11",
+ "message": "This is an example message"
+ },
+ {
+ "date": "2021-08-13",
+ "message": "Get ready for booohay"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/packages/example/src/components/examples/array/index.ts b/packages/example/src/components/examples/array/index.ts
new file mode 100644
index 0000000000..8f5e656657
--- /dev/null
+++ b/packages/example/src/components/examples/array/index.ts
@@ -0,0 +1,10 @@
+import schema from './schema.json';
+import uischema from './uischema.json';
+import data from './data.json';
+import { UISchemaElement, JsonSchema } from '@jsonforms/core';
+
+export const input: {
+ schema: JsonSchema;
+ uischema: UISchemaElement;
+ data: any;
+} = { schema, uischema, data };
diff --git a/packages/example/src/components/examples/array/schema.json b/packages/example/src/components/examples/array/schema.json
new file mode 100644
index 0000000000..b2ac7ce43b
--- /dev/null
+++ b/packages/example/src/components/examples/array/schema.json
@@ -0,0 +1,28 @@
+{
+ "type": "object",
+ "properties": {
+ "comments": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "date": {
+ "type": "string",
+ "format": "date"
+ },
+ "message": {
+ "type": "string",
+ "maxLength": 5
+ },
+ "enum": {
+ "type": "string",
+ "enum": [
+ "foo",
+ "bar"
+ ]
+ }
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/example/src/components/examples/array/uischema.json b/packages/example/src/components/examples/array/uischema.json
new file mode 100644
index 0000000000..4e78aae2bc
--- /dev/null
+++ b/packages/example/src/components/examples/array/uischema.json
@@ -0,0 +1,9 @@
+{
+ "type": "VerticalLayout",
+ "elements": [
+ {
+ "type": "Control",
+ "scope": "#/properties/comments"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/packages/example/src/components/examples/basic/data.json b/packages/example/src/components/examples/basic/data.json
new file mode 100644
index 0000000000..59a6d43787
--- /dev/null
+++ b/packages/example/src/components/examples/basic/data.json
@@ -0,0 +1,9 @@
+{
+ "name": "John Doe",
+ "vegetarian": false,
+ "birthDate": "1985-06-02",
+ "personalData": {
+ "age": 34
+ },
+ "postalCode": "12345"
+}
\ No newline at end of file
diff --git a/packages/example/src/components/examples/basic/index.ts b/packages/example/src/components/examples/basic/index.ts
new file mode 100644
index 0000000000..8f5e656657
--- /dev/null
+++ b/packages/example/src/components/examples/basic/index.ts
@@ -0,0 +1,10 @@
+import schema from './schema.json';
+import uischema from './uischema.json';
+import data from './data.json';
+import { UISchemaElement, JsonSchema } from '@jsonforms/core';
+
+export const input: {
+ schema: JsonSchema;
+ uischema: UISchemaElement;
+ data: any;
+} = { schema, uischema, data };
diff --git a/packages/example/src/components/examples/basic/schema.json b/packages/example/src/components/examples/basic/schema.json
new file mode 100644
index 0000000000..215f8fd803
--- /dev/null
+++ b/packages/example/src/components/examples/basic/schema.json
@@ -0,0 +1,61 @@
+{
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 3,
+ "description": "Please enter your name"
+ },
+ "vegetarian": {
+ "type": "boolean"
+ },
+ "birthDate": {
+ "type": "string",
+ "format": "date"
+ },
+ "nationality": {
+ "type": "string",
+ "enum": [
+ "DE",
+ "IT",
+ "JP",
+ "US",
+ "RU",
+ "Other"
+ ]
+ },
+ "personalData": {
+ "type": "object",
+ "properties": {
+ "age": {
+ "type": "integer",
+ "description": "Please enter your age."
+ },
+ "height": {
+ "type": "number"
+ },
+ "drivingSkill": {
+ "type": "number",
+ "maximum": 10,
+ "minimum": 1,
+ "default": 7
+ }
+ },
+ "required": [
+ "age",
+ "height"
+ ]
+ },
+ "occupation": {
+ "type": "string"
+ },
+ "postalCode": {
+ "type": "string",
+ "maxLength": 5
+ }
+ },
+ "required": [
+ "occupation",
+ "nationality"
+ ]
+}
\ No newline at end of file
diff --git a/packages/example/src/components/examples/basic/uischema.json b/packages/example/src/components/examples/basic/uischema.json
new file mode 100644
index 0000000000..5112fe3532
--- /dev/null
+++ b/packages/example/src/components/examples/basic/uischema.json
@@ -0,0 +1,55 @@
+{
+ "type": "VerticalLayout",
+ "elements": [
+ {
+ "type": "HorizontalLayout",
+ "elements": [
+ {
+ "type": "Control",
+ "scope": "#/properties/name"
+ },
+ {
+ "type": "Control",
+ "scope": "#/properties/personalData/properties/age"
+ },
+ {
+ "type": "Control",
+ "scope": "#/properties/birthDate"
+ }
+ ]
+ },
+ {
+ "type": "Label",
+ "text": "Additional Information"
+ },
+ {
+ "type": "HorizontalLayout",
+ "elements": [
+ {
+ "type": "Control",
+ "scope": "#/properties/personalData/properties/height"
+ },
+ {
+ "type": "Control",
+ "scope": "#/properties/nationality"
+ },
+ {
+ "type": "Control",
+ "scope": "#/properties/occupation",
+ "options": {
+ "suggestion": [
+ "Accountant",
+ "Engineer",
+ "Freelancer",
+ "Journalism",
+ "Physician",
+ "Student",
+ "Teacher",
+ "Other"
+ ]
+ }
+ }
+ ]
+ }
+ ]
+}
diff --git a/packages/example/src/components/examples/categorization-stepper-nav/data.json b/packages/example/src/components/examples/categorization-stepper-nav/data.json
new file mode 100644
index 0000000000..e62c2f35d5
--- /dev/null
+++ b/packages/example/src/components/examples/categorization-stepper-nav/data.json
@@ -0,0 +1,4 @@
+{
+ "provideAddress": true,
+ "vegetarian": false
+}
\ No newline at end of file
diff --git a/packages/example/src/components/examples/categorization-stepper-nav/index.ts b/packages/example/src/components/examples/categorization-stepper-nav/index.ts
new file mode 100644
index 0000000000..8f5e656657
--- /dev/null
+++ b/packages/example/src/components/examples/categorization-stepper-nav/index.ts
@@ -0,0 +1,10 @@
+import schema from './schema.json';
+import uischema from './uischema.json';
+import data from './data.json';
+import { UISchemaElement, JsonSchema } from '@jsonforms/core';
+
+export const input: {
+ schema: JsonSchema;
+ uischema: UISchemaElement;
+ data: any;
+} = { schema, uischema, data };
diff --git a/packages/example/src/components/examples/categorization-stepper-nav/schema.json b/packages/example/src/components/examples/categorization-stepper-nav/schema.json
new file mode 100644
index 0000000000..dbb0480dff
--- /dev/null
+++ b/packages/example/src/components/examples/categorization-stepper-nav/schema.json
@@ -0,0 +1,77 @@
+{
+ "type": "object",
+ "properties": {
+ "firstName": {
+ "type": "string",
+ "minLength": 3,
+ "description": "Please enter your first name"
+ },
+ "secondName": {
+ "type": "string",
+ "minLength": 3,
+ "description": "Please enter your second name"
+ },
+ "vegetarian": {
+ "type": "boolean"
+ },
+ "birthDate": {
+ "type": "string",
+ "format": "date",
+ "description": "Please enter your birth date."
+ },
+ "nationality": {
+ "type": "string",
+ "enum": [
+ "DE",
+ "IT",
+ "JP",
+ "US",
+ "RU",
+ "Other"
+ ]
+ },
+ "provideAddress": {
+ "type": "boolean"
+ },
+ "address": {
+ "type": "object",
+ "properties": {
+ "street": {
+ "type": "string"
+ },
+ "streetNumber": {
+ "type": "string"
+ },
+ "city": {
+ "type": "string"
+ },
+ "postalCode": {
+ "type": "string",
+ "maxLength": 5
+ }
+ }
+ },
+ "vegetarianOptions": {
+ "type": "object",
+ "properties": {
+ "vegan": {
+ "type": "boolean"
+ },
+ "favoriteVegetable": {
+ "type": "string",
+ "enum": [
+ "Tomato",
+ "Potato",
+ "Salad",
+ "Aubergine",
+ "Cucumber",
+ "Other"
+ ]
+ },
+ "otherFavoriteVegetable": {
+ "type": "string"
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/example/src/components/examples/categorization-stepper-nav/uischema.json b/packages/example/src/components/examples/categorization-stepper-nav/uischema.json
new file mode 100644
index 0000000000..1509ace578
--- /dev/null
+++ b/packages/example/src/components/examples/categorization-stepper-nav/uischema.json
@@ -0,0 +1,126 @@
+{
+ "type": "Categorization",
+ "elements": [
+ {
+ "type": "Category",
+ "label": "Basic Information",
+ "elements": [
+ {
+ "type": "HorizontalLayout",
+ "elements": [
+ {
+ "type": "Control",
+ "scope": "#/properties/firstName"
+ },
+ {
+ "type": "Control",
+ "scope": "#/properties/secondName"
+ }
+ ]
+ },
+ {
+ "type": "HorizontalLayout",
+ "elements": [
+ {
+ "type": "Control",
+ "scope": "#/properties/birthDate"
+ },
+ {
+ "type": "Control",
+ "scope": "#/properties/nationality"
+ }
+ ]
+ },
+ {
+ "type": "Control",
+ "scope": "#/properties/provideAddress"
+ },
+ {
+ "type": "Control",
+ "scope": "#/properties/vegetarian"
+ }
+ ]
+ },
+ {
+ "type": "Category",
+ "label": "Address",
+ "elements": [
+ {
+ "type": "HorizontalLayout",
+ "elements": [
+ {
+ "type": "Control",
+ "scope": "#/properties/address/properties/street"
+ },
+ {
+ "type": "Control",
+ "scope": "#/properties/address/properties/streetNumber"
+ }
+ ]
+ },
+ {
+ "type": "HorizontalLayout",
+ "elements": [
+ {
+ "type": "Control",
+ "scope": "#/properties/address/properties/city"
+ },
+ {
+ "type": "Control",
+ "scope": "#/properties/address/properties/postalCode"
+ }
+ ]
+ }
+ ],
+ "rule": {
+ "effect": "SHOW",
+ "condition": {
+ "scope": "#/properties/provideAddress",
+ "schema": {
+ "const": true
+ }
+ }
+ }
+ },
+ {
+ "type": "Category",
+ "label": "Additional",
+ "elements": [
+ {
+ "type": "Control",
+ "scope": "#/properties/vegetarianOptions/properties/vegan"
+ },
+ {
+ "type": "Control",
+ "scope": "#/properties/vegetarianOptions/properties/favoriteVegetable"
+ },
+ {
+ "type": "Control",
+ "scope": "#/properties/vegetarianOptions/properties/otherFavoriteVegetable",
+ "rule": {
+ "effect": "SHOW",
+ "condition": {
+ "scope": "#/properties/vegetarianOptions/properties/favoriteVegetable",
+ "schema": {
+ "const": "Other"
+ }
+ }
+ }
+ }
+ ],
+ "rule": {
+ "effect": "SHOW",
+ "condition": {
+ "scope": "#/properties/vegetarian",
+ "schema": {
+ "const": true
+ }
+ }
+ }
+ }
+ ],
+ "options": {
+ "variant": "stepper",
+ "showNavButtons": true
+ }
+}
\ No newline at end of file
diff --git a/packages/example/src/components/examples/categorization-stepper/data.json b/packages/example/src/components/examples/categorization-stepper/data.json
new file mode 100644
index 0000000000..e62c2f35d5
--- /dev/null
+++ b/packages/example/src/components/examples/categorization-stepper/data.json
@@ -0,0 +1,4 @@
+{
+ "provideAddress": true,
+ "vegetarian": false
+}
\ No newline at end of file
diff --git a/packages/example/src/components/examples/categorization-stepper/index.ts b/packages/example/src/components/examples/categorization-stepper/index.ts
new file mode 100644
index 0000000000..8f5e656657
--- /dev/null
+++ b/packages/example/src/components/examples/categorization-stepper/index.ts
@@ -0,0 +1,10 @@
+import schema from './schema.json';
+import uischema from './uischema.json';
+import data from './data.json';
+import { UISchemaElement, JsonSchema } from '@jsonforms/core';
+
+export const input: {
+ schema: JsonSchema;
+ uischema: UISchemaElement;
+ data: any;
+} = { schema, uischema, data };
diff --git a/packages/example/src/components/examples/categorization-stepper/schema.json b/packages/example/src/components/examples/categorization-stepper/schema.json
new file mode 100644
index 0000000000..dbb0480dff
--- /dev/null
+++ b/packages/example/src/components/examples/categorization-stepper/schema.json
@@ -0,0 +1,77 @@
+{
+ "type": "object",
+ "properties": {
+ "firstName": {
+ "type": "string",
+ "minLength": 3,
+ "description": "Please enter your first name"
+ },
+ "secondName": {
+ "type": "string",
+ "minLength": 3,
+ "description": "Please enter your second name"
+ },
+ "vegetarian": {
+ "type": "boolean"
+ },
+ "birthDate": {
+ "type": "string",
+ "format": "date",
+ "description": "Please enter your birth date."
+ },
+ "nationality": {
+ "type": "string",
+ "enum": [
+ "DE",
+ "IT",
+ "JP",
+ "US",
+ "RU",
+ "Other"
+ ]
+ },
+ "provideAddress": {
+ "type": "boolean"
+ },
+ "address": {
+ "type": "object",
+ "properties": {
+ "street": {
+ "type": "string"
+ },
+ "streetNumber": {
+ "type": "string"
+ },
+ "city": {
+ "type": "string"
+ },
+ "postalCode": {
+ "type": "string",
+ "maxLength": 5
+ }
+ }
+ },
+ "vegetarianOptions": {
+ "type": "object",
+ "properties": {
+ "vegan": {
+ "type": "boolean"
+ },
+ "favoriteVegetable": {
+ "type": "string",
+ "enum": [
+ "Tomato",
+ "Potato",
+ "Salad",
+ "Aubergine",
+ "Cucumber",
+ "Other"
+ ]
+ },
+ "otherFavoriteVegetable": {
+ "type": "string"
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/example/src/components/examples/categorization-stepper/uischema.json b/packages/example/src/components/examples/categorization-stepper/uischema.json
new file mode 100644
index 0000000000..ba7bd947d2
--- /dev/null
+++ b/packages/example/src/components/examples/categorization-stepper/uischema.json
@@ -0,0 +1,125 @@
+{
+ "type": "Categorization",
+ "elements": [
+ {
+ "type": "Category",
+ "label": "Basic Information",
+ "elements": [
+ {
+ "type": "HorizontalLayout",
+ "elements": [
+ {
+ "type": "Control",
+ "scope": "#/properties/firstName"
+ },
+ {
+ "type": "Control",
+ "scope": "#/properties/secondName"
+ }
+ ]
+ },
+ {
+ "type": "HorizontalLayout",
+ "elements": [
+ {
+ "type": "Control",
+ "scope": "#/properties/birthDate"
+ },
+ {
+ "type": "Control",
+ "scope": "#/properties/nationality"
+ }
+ ]
+ },
+ {
+ "type": "Control",
+ "scope": "#/properties/provideAddress"
+ },
+ {
+ "type": "Control",
+ "scope": "#/properties/vegetarian"
+ }
+ ]
+ },
+ {
+ "type": "Category",
+ "label": "Address",
+ "elements": [
+ {
+ "type": "HorizontalLayout",
+ "elements": [
+ {
+ "type": "Control",
+ "scope": "#/properties/address/properties/street"
+ },
+ {
+ "type": "Control",
+ "scope": "#/properties/address/properties/streetNumber"
+ }
+ ]
+ },
+ {
+ "type": "HorizontalLayout",
+ "elements": [
+ {
+ "type": "Control",
+ "scope": "#/properties/address/properties/city"
+ },
+ {
+ "type": "Control",
+ "scope": "#/properties/address/properties/postalCode"
+ }
+ ]
+ }
+ ],
+ "rule": {
+ "effect": "SHOW",
+ "condition": {
+ "scope": "#/properties/provideAddress",
+ "schema": {
+ "const": true
+ }
+ }
+ }
+ },
+ {
+ "type": "Category",
+ "label": "Additional",
+ "elements": [
+ {
+ "type": "Control",
+ "scope": "#/properties/vegetarianOptions/properties/vegan"
+ },
+ {
+ "type": "Control",
+ "scope": "#/properties/vegetarianOptions/properties/favoriteVegetable"
+ },
+ {
+ "type": "Control",
+ "scope": "#/properties/vegetarianOptions/properties/otherFavoriteVegetable",
+ "rule": {
+ "effect": "SHOW",
+ "condition": {
+ "scope": "#/properties/vegetarianOptions/properties/favoriteVegetable",
+ "schema": {
+ "const": "Other"
+ }
+ }
+ }
+ }
+ ],
+ "rule": {
+ "effect": "SHOW",
+ "condition": {
+ "scope": "#/properties/vegetarian",
+ "schema": {
+ "const": true
+ }
+ }
+ }
+ }
+ ],
+ "options": {
+ "variant": "stepper"
+ }
+}
\ No newline at end of file
diff --git a/packages/example/src/components/examples/categorization/data.json b/packages/example/src/components/examples/categorization/data.json
new file mode 100644
index 0000000000..e62c2f35d5
--- /dev/null
+++ b/packages/example/src/components/examples/categorization/data.json
@@ -0,0 +1,4 @@
+{
+ "provideAddress": true,
+ "vegetarian": false
+}
\ No newline at end of file
diff --git a/packages/example/src/components/examples/categorization/index.ts b/packages/example/src/components/examples/categorization/index.ts
new file mode 100644
index 0000000000..8f5e656657
--- /dev/null
+++ b/packages/example/src/components/examples/categorization/index.ts
@@ -0,0 +1,10 @@
+import schema from './schema.json';
+import uischema from './uischema.json';
+import data from './data.json';
+import { UISchemaElement, JsonSchema } from '@jsonforms/core';
+
+export const input: {
+ schema: JsonSchema;
+ uischema: UISchemaElement;
+ data: any;
+} = { schema, uischema, data };
diff --git a/packages/example/src/components/examples/categorization/schema.json b/packages/example/src/components/examples/categorization/schema.json
new file mode 100644
index 0000000000..dbb0480dff
--- /dev/null
+++ b/packages/example/src/components/examples/categorization/schema.json
@@ -0,0 +1,77 @@
+{
+ "type": "object",
+ "properties": {
+ "firstName": {
+ "type": "string",
+ "minLength": 3,
+ "description": "Please enter your first name"
+ },
+ "secondName": {
+ "type": "string",
+ "minLength": 3,
+ "description": "Please enter your second name"
+ },
+ "vegetarian": {
+ "type": "boolean"
+ },
+ "birthDate": {
+ "type": "string",
+ "format": "date",
+ "description": "Please enter your birth date."
+ },
+ "nationality": {
+ "type": "string",
+ "enum": [
+ "DE",
+ "IT",
+ "JP",
+ "US",
+ "RU",
+ "Other"
+ ]
+ },
+ "provideAddress": {
+ "type": "boolean"
+ },
+ "address": {
+ "type": "object",
+ "properties": {
+ "street": {
+ "type": "string"
+ },
+ "streetNumber": {
+ "type": "string"
+ },
+ "city": {
+ "type": "string"
+ },
+ "postalCode": {
+ "type": "string",
+ "maxLength": 5
+ }
+ }
+ },
+ "vegetarianOptions": {
+ "type": "object",
+ "properties": {
+ "vegan": {
+ "type": "boolean"
+ },
+ "favoriteVegetable": {
+ "type": "string",
+ "enum": [
+ "Tomato",
+ "Potato",
+ "Salad",
+ "Aubergine",
+ "Cucumber",
+ "Other"
+ ]
+ },
+ "otherFavoriteVegetable": {
+ "type": "string"
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/example/src/components/examples/categorization/uischema.json b/packages/example/src/components/examples/categorization/uischema.json
new file mode 100644
index 0000000000..17eaeeb48b
--- /dev/null
+++ b/packages/example/src/components/examples/categorization/uischema.json
@@ -0,0 +1,122 @@
+{
+ "type": "Categorization",
+ "elements": [
+ {
+ "type": "Category",
+ "label": "Basic Information",
+ "elements": [
+ {
+ "type": "HorizontalLayout",
+ "elements": [
+ {
+ "type": "Control",
+ "scope": "#/properties/firstName"
+ },
+ {
+ "type": "Control",
+ "scope": "#/properties/secondName"
+ }
+ ]
+ },
+ {
+ "type": "HorizontalLayout",
+ "elements": [
+ {
+ "type": "Control",
+ "scope": "#/properties/birthDate"
+ },
+ {
+ "type": "Control",
+ "scope": "#/properties/nationality"
+ }
+ ]
+ },
+ {
+ "type": "Control",
+ "scope": "#/properties/provideAddress"
+ },
+ {
+ "type": "Control",
+ "scope": "#/properties/vegetarian"
+ }
+ ]
+ },
+ {
+ "type": "Category",
+ "label": "Address",
+ "elements": [
+ {
+ "type": "HorizontalLayout",
+ "elements": [
+ {
+ "type": "Control",
+ "scope": "#/properties/address/properties/street"
+ },
+ {
+ "type": "Control",
+ "scope": "#/properties/address/properties/streetNumber"
+ }
+ ]
+ },
+ {
+ "type": "HorizontalLayout",
+ "elements": [
+ {
+ "type": "Control",
+ "scope": "#/properties/address/properties/city"
+ },
+ {
+ "type": "Control",
+ "scope": "#/properties/address/properties/postalCode"
+ }
+ ]
+ }
+ ],
+ "rule": {
+ "effect": "SHOW",
+ "condition": {
+ "scope": "#/properties/provideAddress",
+ "schema": {
+ "const": true
+ }
+ }
+ }
+ },
+ {
+ "type": "Category",
+ "label": "Additional",
+ "elements": [
+ {
+ "type": "Control",
+ "scope": "#/properties/vegetarianOptions/properties/vegan"
+ },
+ {
+ "type": "Control",
+ "scope": "#/properties/vegetarianOptions/properties/favoriteVegetable"
+ },
+ {
+ "type": "Control",
+ "scope": "#/properties/vegetarianOptions/properties/otherFavoriteVegetable",
+ "rule": {
+ "effect": "SHOW",
+ "condition": {
+ "scope": "#/properties/vegetarianOptions/properties/favoriteVegetable",
+ "schema": {
+ "const": "Other"
+ }
+ }
+ }
+ }
+ ],
+ "rule": {
+ "effect": "SHOW",
+ "condition": {
+ "scope": "#/properties/vegetarian",
+ "schema": {
+ "const": true
+ }
+ }
+ }
+ }
+ ]
+}
\ No newline at end of file
diff --git a/packages/example/src/components/examples/control-options/data.json b/packages/example/src/components/examples/control-options/data.json
new file mode 100644
index 0000000000..33d610fb2e
--- /dev/null
+++ b/packages/example/src/components/examples/control-options/data.json
@@ -0,0 +1,7 @@
+{
+ "multilineString": "Multi-\nline\nexample",
+ "slider": 4,
+ "trimText": "abcdefg",
+ "restrictText": "abcde",
+ "toggle": false
+}
\ No newline at end of file
diff --git a/packages/example/src/components/examples/control-options/index.ts b/packages/example/src/components/examples/control-options/index.ts
new file mode 100644
index 0000000000..8f5e656657
--- /dev/null
+++ b/packages/example/src/components/examples/control-options/index.ts
@@ -0,0 +1,10 @@
+import schema from './schema.json';
+import uischema from './uischema.json';
+import data from './data.json';
+import { UISchemaElement, JsonSchema } from '@jsonforms/core';
+
+export const input: {
+ schema: JsonSchema;
+ uischema: UISchemaElement;
+ data: any;
+} = { schema, uischema, data };
diff --git a/packages/example/src/components/examples/control-options/schema.json b/packages/example/src/components/examples/control-options/schema.json
new file mode 100644
index 0000000000..cbbc462e9f
--- /dev/null
+++ b/packages/example/src/components/examples/control-options/schema.json
@@ -0,0 +1,41 @@
+{
+ "type": "object",
+ "properties": {
+ "multilineString": {
+ "type": "string",
+ "description": "Multiline Example"
+ },
+ "slider": {
+ "type": "number",
+ "minimum": 1,
+ "maximum": 5,
+ "default": 2,
+ "description": "Slider Example"
+ },
+ "trimText": {
+ "type": "string",
+ "description": "Trim indicates whether the control shall grab the full width available"
+ },
+ "restrictText": {
+ "type": "string",
+ "maxLength": 5,
+ "description": "Restricts the input length to the set value (in this case: 5)"
+ },
+ "unfocusedDescription": {
+ "type": "string",
+ "description": "This description is shown even when the control is not focused"
+ },
+ "hideRequiredAsterisk": {
+ "type": "string",
+ "description": "Hides the \"*\" symbol, when the field is required"
+ },
+ "toggle": {
+ "type": "boolean",
+ "description": "The \"toggle\" option renders boolean values as a toggle."
+ }
+ },
+ "required": [
+ "hideRequiredAsterisk",
+ "restrictText"
+ ]
+}
\ No newline at end of file
diff --git a/packages/example/src/components/examples/control-options/uischema.json b/packages/example/src/components/examples/control-options/uischema.json
new file mode 100644
index 0000000000..81f7a85a01
--- /dev/null
+++ b/packages/example/src/components/examples/control-options/uischema.json
@@ -0,0 +1,55 @@
+{
+ "type": "VerticalLayout",
+ "elements": [
+ {
+ "type": "Control",
+ "scope": "#/properties/multilineString",
+ "options": {
+ "multi": true
+ }
+ },
+ {
+ "type": "Control",
+ "scope": "#/properties/slider",
+ "options": {
+ "slider": true
+ }
+ },
+ {
+ "type": "Control",
+ "scope": "#/properties/trimText",
+ "options": {
+ "trim": true
+ }
+ },
+ {
+ "type": "Control",
+ "scope": "#/properties/restrictText",
+ "options": {
+ "restrict": true
+ }
+ },
+ {
+ "type": "Control",
+ "scope": "#/properties/unfocusedDescription",
+ "options": {
+ "showUnfocusedDescription": true
+ }
+ },
+ {
+ "type": "Control",
+ "scope": "#/properties/hideRequiredAsterisk",
+ "options": {
+ "hideRequiredAsterisk": true
+ }
+ },
+ {
+ "type": "Control",
+ "scope": "#/properties/toggle",
+ "label": "Boolean as Toggle",
+ "options": {
+ "toggle": true
+ }
+ }
+ ]
+}
\ No newline at end of file
diff --git a/packages/example/src/components/examples/control/data.json b/packages/example/src/components/examples/control/data.json
new file mode 100644
index 0000000000..6418a74dc6
--- /dev/null
+++ b/packages/example/src/components/examples/control/data.json
@@ -0,0 +1,10 @@
+{
+ "string": "This is a string",
+ "boolean": true,
+ "number": 50.5,
+ "integer": 50,
+ "date": "2020-06-25",
+ "time": "23:08",
+ "dateTime": "2020-06-25T23:08:42+02:00",
+ "enum": "Two"
+}
\ No newline at end of file
diff --git a/packages/example/src/components/examples/control/index.ts b/packages/example/src/components/examples/control/index.ts
new file mode 100644
index 0000000000..8f5e656657
--- /dev/null
+++ b/packages/example/src/components/examples/control/index.ts
@@ -0,0 +1,10 @@
+import schema from './schema.json';
+import uischema from './uischema.json';
+import data from './data.json';
+import { UISchemaElement, JsonSchema } from '@jsonforms/core';
+
+export const input: {
+ schema: JsonSchema;
+ uischema: UISchemaElement;
+ data: any;
+} = { schema, uischema, data };
diff --git a/packages/example/src/components/examples/control/schema.json b/packages/example/src/components/examples/control/schema.json
new file mode 100644
index 0000000000..278b7758ce
--- /dev/null
+++ b/packages/example/src/components/examples/control/schema.json
@@ -0,0 +1,37 @@
+{
+ "type": "object",
+ "properties": {
+ "string": {
+ "type": "string"
+ },
+ "boolean": {
+ "type": "boolean"
+ },
+ "number": {
+ "type": "number"
+ },
+ "integer": {
+ "type": "integer"
+ },
+ "date": {
+ "type": "string",
+ "format": "date"
+ },
+ "time": {
+ "type": "string",
+ "format": "time"
+ },
+ "dateTime": {
+ "type": "string",
+ "format": "date-time"
+ },
+ "enum": {
+ "type": "string",
+ "enum": [
+ "One",
+ "Two",
+ "Three"
+ ]
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/example/src/components/examples/control/uischema.json b/packages/example/src/components/examples/control/uischema.json
new file mode 100644
index 0000000000..9fdfa07549
--- /dev/null
+++ b/packages/example/src/components/examples/control/uischema.json
@@ -0,0 +1,37 @@
+{
+ "type": "VerticalLayout",
+ "elements": [
+ {
+ "type": "Control",
+ "scope": "#/properties/string"
+ },
+ {
+ "type": "Control",
+ "scope": "#/properties/boolean"
+ },
+ {
+ "type": "Control",
+ "scope": "#/properties/number"
+ },
+ {
+ "type": "Control",
+ "scope": "#/properties/integer"
+ },
+ {
+ "type": "Control",
+ "scope": "#/properties/date"
+ },
+ {
+ "type": "Control",
+ "scope": "#/properties/time"
+ },
+ {
+ "type": "Control",
+ "scope": "#/properties/dateTime"
+ },
+ {
+ "type": "Control",
+ "scope": "#/properties/enum"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/packages/example/src/components/examples/enum-in-array/data.json b/packages/example/src/components/examples/enum-in-array/data.json
new file mode 100644
index 0000000000..0637a088a0
--- /dev/null
+++ b/packages/example/src/components/examples/enum-in-array/data.json
@@ -0,0 +1 @@
+[]
\ No newline at end of file
diff --git a/packages/example/src/components/examples/enum-in-array/index.ts b/packages/example/src/components/examples/enum-in-array/index.ts
new file mode 100644
index 0000000000..8f5e656657
--- /dev/null
+++ b/packages/example/src/components/examples/enum-in-array/index.ts
@@ -0,0 +1,10 @@
+import schema from './schema.json';
+import uischema from './uischema.json';
+import data from './data.json';
+import { UISchemaElement, JsonSchema } from '@jsonforms/core';
+
+export const input: {
+ schema: JsonSchema;
+ uischema: UISchemaElement;
+ data: any;
+} = { schema, uischema, data };
diff --git a/packages/example/src/components/examples/enum-in-array/schema.json b/packages/example/src/components/examples/enum-in-array/schema.json
new file mode 100644
index 0000000000..3da1e05bcd
--- /dev/null
+++ b/packages/example/src/components/examples/enum-in-array/schema.json
@@ -0,0 +1,32 @@
+{
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "plainEnum": {
+ "type": "string",
+ "enum": [
+ "foo",
+ "bar"
+ ]
+ },
+ "oneOfEnum": {
+ "type": "string",
+ "oneOf": [
+ {
+ "const": "foo",
+ "title": "Foo"
+ },
+ {
+ "const": "bar",
+ "title": "Bar"
+ },
+ {
+ "const": "foobar",
+ "title": "FooBar"
+ }
+ ]
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/example/src/components/examples/enum-in-array/uischema.json b/packages/example/src/components/examples/enum-in-array/uischema.json
new file mode 100644
index 0000000000..a4035a463d
--- /dev/null
+++ b/packages/example/src/components/examples/enum-in-array/uischema.json
@@ -0,0 +1,9 @@
+{
+ "type": "VerticalLayout",
+ "elements": [
+ {
+ "type": "Control",
+ "scope": "#"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/packages/example/src/components/examples/enum/data.json b/packages/example/src/components/examples/enum/data.json
new file mode 100644
index 0000000000..bbd2c90b94
--- /dev/null
+++ b/packages/example/src/components/examples/enum/data.json
@@ -0,0 +1,4 @@
+{
+ "plainEnumSet": "foo",
+ "oneOfEnumSet": "bar"
+}
\ No newline at end of file
diff --git a/packages/example/src/components/examples/enum/index.ts b/packages/example/src/components/examples/enum/index.ts
new file mode 100644
index 0000000000..8f5e656657
--- /dev/null
+++ b/packages/example/src/components/examples/enum/index.ts
@@ -0,0 +1,10 @@
+import schema from './schema.json';
+import uischema from './uischema.json';
+import data from './data.json';
+import { UISchemaElement, JsonSchema } from '@jsonforms/core';
+
+export const input: {
+ schema: JsonSchema;
+ uischema: UISchemaElement;
+ data: any;
+} = { schema, uischema, data };
diff --git a/packages/example/src/components/examples/enum/schema.json b/packages/example/src/components/examples/enum/schema.json
new file mode 100644
index 0000000000..b21d8d7201
--- /dev/null
+++ b/packages/example/src/components/examples/enum/schema.json
@@ -0,0 +1,53 @@
+{
+ "type": "object",
+ "properties": {
+ "plainEnum": {
+ "type": "string",
+ "enum": [
+ "foo",
+ "bar"
+ ]
+ },
+ "plainEnumSet": {
+ "type": "string",
+ "enum": [
+ "foo",
+ "bar"
+ ]
+ },
+ "oneOfEnum": {
+ "type": "string",
+ "oneOf": [
+ {
+ "const": "foo",
+ "title": "Foo"
+ },
+ {
+ "const": "bar",
+ "title": "Bar"
+ },
+ {
+ "const": "foobar",
+ "title": "FooBar"
+ }
+ ]
+ },
+ "oneOfEnumSet": {
+ "type": "string",
+ "oneOf": [
+ {
+ "const": "foo",
+ "title": "Foo"
+ },
+ {
+ "const": "bar",
+ "title": "Bar"
+ },
+ {
+ "const": "foobar",
+ "title": "FooBar"
+ }
+ ]
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/example/src/components/examples/enum/uischema.json b/packages/example/src/components/examples/enum/uischema.json
new file mode 100644
index 0000000000..4bce4f9608
--- /dev/null
+++ b/packages/example/src/components/examples/enum/uischema.json
@@ -0,0 +1,61 @@
+{
+ "type": "VerticalLayout",
+ "elements": [
+ {
+ "type": "Group",
+ "label": "Enums",
+ "elements": [
+ {
+ "type": "Control",
+ "scope": "#/properties/plainEnum"
+ },
+ {
+ "type": "Control",
+ "scope": "#/properties/plainEnumSet"
+ },
+ {
+ "type": "Control",
+ "scope": "#/properties/plainEnum",
+ "options": {
+ "autocomplete": false
+ }
+ },
+ {
+ "type": "Control",
+ "scope": "#/properties/plainEnumSet",
+ "options": {
+ "autocomplete": false
+ }
+ }
+ ]
+ },
+ {
+ "type": "Group",
+ "label": "One of Enums",
+ "elements": [
+ {
+ "type": "Control",
+ "scope": "#/properties/oneOfEnum"
+ },
+ {
+ "type": "Control",
+ "scope": "#/properties/oneOfEnumSet"
+ },
+ {
+ "type": "Control",
+ "scope": "#/properties/oneOfEnum",
+ "options": {
+ "autocomplete": false
+ }
+ },
+ {
+ "type": "Control",
+ "scope": "#/properties/oneOfEnumSet",
+ "options": {
+ "autocomplete": false
+ }
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/packages/example/src/components/examples/group-layout/data.json b/packages/example/src/components/examples/group-layout/data.json
new file mode 100644
index 0000000000..59a6d43787
--- /dev/null
+++ b/packages/example/src/components/examples/group-layout/data.json
@@ -0,0 +1,9 @@
+{
+ "name": "John Doe",
+ "vegetarian": false,
+ "birthDate": "1985-06-02",
+ "personalData": {
+ "age": 34
+ },
+ "postalCode": "12345"
+}
\ No newline at end of file
diff --git a/packages/example/src/components/examples/group-layout/index.ts b/packages/example/src/components/examples/group-layout/index.ts
new file mode 100644
index 0000000000..8f5e656657
--- /dev/null
+++ b/packages/example/src/components/examples/group-layout/index.ts
@@ -0,0 +1,10 @@
+import schema from './schema.json';
+import uischema from './uischema.json';
+import data from './data.json';
+import { UISchemaElement, JsonSchema } from '@jsonforms/core';
+
+export const input: {
+ schema: JsonSchema;
+ uischema: UISchemaElement;
+ data: any;
+} = { schema, uischema, data };
diff --git a/packages/example/src/components/examples/group-layout/schema.json b/packages/example/src/components/examples/group-layout/schema.json
new file mode 100644
index 0000000000..215f8fd803
--- /dev/null
+++ b/packages/example/src/components/examples/group-layout/schema.json
@@ -0,0 +1,61 @@
+{
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 3,
+ "description": "Please enter your name"
+ },
+ "vegetarian": {
+ "type": "boolean"
+ },
+ "birthDate": {
+ "type": "string",
+ "format": "date"
+ },
+ "nationality": {
+ "type": "string",
+ "enum": [
+ "DE",
+ "IT",
+ "JP",
+ "US",
+ "RU",
+ "Other"
+ ]
+ },
+ "personalData": {
+ "type": "object",
+ "properties": {
+ "age": {
+ "type": "integer",
+ "description": "Please enter your age."
+ },
+ "height": {
+ "type": "number"
+ },
+ "drivingSkill": {
+ "type": "number",
+ "maximum": 10,
+ "minimum": 1,
+ "default": 7
+ }
+ },
+ "required": [
+ "age",
+ "height"
+ ]
+ },
+ "occupation": {
+ "type": "string"
+ },
+ "postalCode": {
+ "type": "string",
+ "maxLength": 5
+ }
+ },
+ "required": [
+ "occupation",
+ "nationality"
+ ]
+}
\ No newline at end of file
diff --git a/packages/example/src/components/examples/group-layout/uischema.json b/packages/example/src/components/examples/group-layout/uischema.json
new file mode 100644
index 0000000000..9d0da84ecd
--- /dev/null
+++ b/packages/example/src/components/examples/group-layout/uischema.json
@@ -0,0 +1,16 @@
+{
+ "type": "Group",
+ "label": "My Group",
+ "elements": [
+ {
+ "type": "Control",
+ "label": "Name",
+ "scope": "#/properties/name"
+ },
+ {
+ "type": "Control",
+ "label": "Birth Date",
+ "scope": "#/properties/birthDate"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/packages/example/src/components/examples/horizontal-layout/data.json b/packages/example/src/components/examples/horizontal-layout/data.json
new file mode 100644
index 0000000000..59a6d43787
--- /dev/null
+++ b/packages/example/src/components/examples/horizontal-layout/data.json
@@ -0,0 +1,9 @@
+{
+ "name": "John Doe",
+ "vegetarian": false,
+ "birthDate": "1985-06-02",
+ "personalData": {
+ "age": 34
+ },
+ "postalCode": "12345"
+}
\ No newline at end of file
diff --git a/packages/example/src/components/examples/horizontal-layout/index.ts b/packages/example/src/components/examples/horizontal-layout/index.ts
new file mode 100644
index 0000000000..8f5e656657
--- /dev/null
+++ b/packages/example/src/components/examples/horizontal-layout/index.ts
@@ -0,0 +1,10 @@
+import schema from './schema.json';
+import uischema from './uischema.json';
+import data from './data.json';
+import { UISchemaElement, JsonSchema } from '@jsonforms/core';
+
+export const input: {
+ schema: JsonSchema;
+ uischema: UISchemaElement;
+ data: any;
+} = { schema, uischema, data };
diff --git a/packages/example/src/components/examples/horizontal-layout/schema.json b/packages/example/src/components/examples/horizontal-layout/schema.json
new file mode 100644
index 0000000000..215f8fd803
--- /dev/null
+++ b/packages/example/src/components/examples/horizontal-layout/schema.json
@@ -0,0 +1,61 @@
+{
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 3,
+ "description": "Please enter your name"
+ },
+ "vegetarian": {
+ "type": "boolean"
+ },
+ "birthDate": {
+ "type": "string",
+ "format": "date"
+ },
+ "nationality": {
+ "type": "string",
+ "enum": [
+ "DE",
+ "IT",
+ "JP",
+ "US",
+ "RU",
+ "Other"
+ ]
+ },
+ "personalData": {
+ "type": "object",
+ "properties": {
+ "age": {
+ "type": "integer",
+ "description": "Please enter your age."
+ },
+ "height": {
+ "type": "number"
+ },
+ "drivingSkill": {
+ "type": "number",
+ "maximum": 10,
+ "minimum": 1,
+ "default": 7
+ }
+ },
+ "required": [
+ "age",
+ "height"
+ ]
+ },
+ "occupation": {
+ "type": "string"
+ },
+ "postalCode": {
+ "type": "string",
+ "maxLength": 5
+ }
+ },
+ "required": [
+ "occupation",
+ "nationality"
+ ]
+}
\ No newline at end of file
diff --git a/packages/example/src/components/examples/horizontal-layout/uischema.json b/packages/example/src/components/examples/horizontal-layout/uischema.json
new file mode 100644
index 0000000000..47ee154148
--- /dev/null
+++ b/packages/example/src/components/examples/horizontal-layout/uischema.json
@@ -0,0 +1,15 @@
+{
+ "type": "HorizontalLayout",
+ "elements": [
+ {
+ "type": "Control",
+ "label": "Name",
+ "scope": "#/properties/name"
+ },
+ {
+ "type": "Control",
+ "label": "Birth Date",
+ "scope": "#/properties/birthDate"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/packages/example/src/components/examples/huge/data.json b/packages/example/src/components/examples/huge/data.json
new file mode 100644
index 0000000000..07a79772d0
--- /dev/null
+++ b/packages/example/src/components/examples/huge/data.json
@@ -0,0 +1,180 @@
+{
+ "attribution": {
+ "contributor": { "resource": "#A-1" },
+ "modified": 1398405600000
+ },
+ "persons": [
+ {
+ "names": [{ "nameForms": [{ "fullText": "Samuel Ham" }] }],
+ "gender": { "type": "http://gedcomx.org/Male" },
+ "facts": [
+ {
+ "type": "http://gedcomx.org/Residence",
+ "date": { "original": "3 November 1828", "formal": "+1828-11-03" },
+ "place": { "original": "parish of Honiton, Devon, England" }
+ }
+ ],
+ "extracted": true,
+ "sources": [{ "description": "#S-2" }],
+ "id": "P-1"
+ },
+ {
+ "names": [{ "nameForms": [{ "fullText": "Elizabeth Spiller" }] }],
+ "gender": { "type": "http://gedcomx.org/Female" },
+ "facts": [
+ {
+ "type": "http://gedcomx.org/Residence",
+ "date": { "original": "3 November 1828", "formal": "+1828-11-03" },
+ "place": { "original": "parish of Wilton, Somerset, England" }
+ }
+ ],
+ "extracted": true,
+ "sources": [{ "description": "#S-2" }],
+ "id": "P-2"
+ },
+ {
+ "names": [{ "nameForms": [{ "fullText": "Jno. Pain" }] }],
+ "extracted": true,
+ "sources": [{ "description": "#S-2" }],
+ "id": "P-3"
+ },
+ {
+ "names": [{ "nameForms": [{ "fullText": "R.G. Halls" }] }],
+ "extracted": true,
+ "sources": [{ "description": "#S-2" }],
+ "id": "P-4"
+ },
+ {
+ "names": [{ "nameForms": [{ "fullText": "Peggy Hammet" }] }],
+ "extracted": true,
+ "sources": [{ "description": "#S-2" }],
+ "id": "P-5"
+ },
+ {
+ "names": [{ "nameForms": [{ "fullText": "David Smith Stone" }] }],
+ "extracted": true,
+ "sources": [{ "description": "#S-2" }],
+ "id": "P-6"
+ },
+ {
+ "evidence": [{ "resource": "#P-1" }],
+ "analysis": { "resource": "#D-2" },
+ "id": "C-1"
+ }
+ ],
+ "relationships": [
+ {
+ "type": "http://gedcomx.org/Couple",
+ "extracted": true,
+ "facts": [
+ {
+ "type": "http://gedcomx.org/Marriage",
+ "date": { "original": "3 November 1828", "formal": "+1828-11-03" },
+ "place": { "original": "Wilton St George, Wilton, Somerset, England" }
+ }
+ ],
+ "person1": { "resource": "#P-1" },
+ "person2": { "resource": "#P-2" }
+ }
+ ],
+ "sourceDescriptions": [
+ {
+ "description": [
+ {
+ "value": "Marriage entry for Samuel Ham and Elizabeth in a copy of the registers of the baptisms, marriages, and burials at the church of St. George in the parish of Wilton : adjoining Taunton, in the county of Somerset from A.D. 1558 to A.D. 1837."
+ }
+ ],
+ "resourceType": "http://gedcomx.org/PhysicalArtifact",
+ "citations": [
+ {
+ "value": "Joseph Houghton Spencer, transcriber, Church of England, Parish Church of Wilton (Somerset). A copy of the registers of the baptisms, marriages, and burials at the church of St. George in the parish of Wilton : adjoining Taunton, in the county of Somerset from A.D. 1558 to A.D. 1837; Marriage entry for Samuel Ham and Elizabeth Spiller (3 November 1828), (Taunton: Barnicott, 1890), p. 224, No. 86."
+ }
+ ],
+ "titles": [
+ {
+ "value": "Marriage entry for Samuel Ham and Elizabeth Spiller, Parish Register, Wilton, Somerset, England"
+ }
+ ],
+ "repository": { "resource": "#A-2" },
+ "id": "S-1"
+ },
+ {
+ "description": [
+ {
+ "value": "Transcription of marriage entry for Samuel Ham and Elizabeth in a copy of the registers of the baptisms, marriages, and burials at the church of St. George in the parish of Wilton : adjoining Taunton, in the county of Somerset from A.D. 1558 to A.D. 1837."
+ }
+ ],
+ "sources": [{ "description": "#S-1" }],
+ "resourceType": "http://gedcomx.org/DigitalArtifact",
+ "citations": [
+ {
+ "value": "Joseph Houghton Spencer, transcriber, Church of England, Parish Church of Wilton (Somerset). A copy of the registers of the baptisms, marriages, and burials at the church of St. George in the parish of Wilton : adjoining Taunton, in the county of Somerset from A.D. 1558 to A.D. 1837; Marriage entry for Samuel Ham and Elizabeth Spiller (3 November 1828), (Taunton: Barnicott, 1890), p. 224, No. 86."
+ }
+ ],
+ "about": "#D-1",
+ "titles": [
+ {
+ "value": "Transcription of marriage entry for Samuel Ham and Elizabeth Spiller, Parish Register, Wilton, Somerset, England"
+ }
+ ],
+ "id": "S-2"
+ }
+ ],
+ "agents": [
+ {
+ "names": [{ "value": "Jane Doe" }],
+ "emails": [{ "resource": "mailto:example@example.org" }],
+ "id": "A-1"
+ },
+ {
+ "names": [{ "value": "Family History Library" }],
+ "addresses": [{ "city": "Salt Lake City", "stateOrProvince": "Utah" }],
+ "id": "A-2"
+ }
+ ],
+ "events": [
+ {
+ "type": "http://gedcomx.org/Marriage",
+ "date": { "original": "3 November 1828", "formal": "+1828-11-03" },
+ "place": { "original": "Wilton St George, Wilton, Somerset, England" },
+ "roles": [
+ {
+ "type": "http://gedcomx.org/Principal",
+ "person": { "resource": "#P-1" }
+ },
+ {
+ "type": "http://gedcomx.org/Principal",
+ "person": { "resource": "#P-2" }
+ },
+ {
+ "type": "http://gedcomx.org/Witness",
+ "person": { "resource": "#P-3" }
+ },
+ {
+ "type": "http://gedcomx.org/Witness",
+ "person": { "resource": "#P-4" }
+ },
+ {
+ "type": "http://gedcomx.org/Witness",
+ "person": { "resource": "#P-5" }
+ },
+ {
+ "type": "http://gedcomx.org/Official",
+ "person": { "resource": "#P-6" }
+ }
+ ],
+ "extracted": true,
+ "id": "E-1"
+ }
+ ],
+ "documents": [
+ {
+ "type": "http://gedcomx.org/Transcription",
+ "text": "Samuel Ham of the parish of Honiton and Elizabeth Spiller\nwere married this 3rd day of November 1828 by David Smith\nStone, Pl Curate,\nIn the Presence of\nJno Pain.\nR.G. Halls. Peggy Hammet.\nNo. 86.",
+ "sources": [{ "description": "#S-1" }],
+ "lang": "en",
+ "id": "D-1"
+ },
+ { "text": "...Jane Doe`s analysis document...", "id": "D-2" }
+ ]
+}
diff --git a/packages/example/src/components/examples/huge/index.ts b/packages/example/src/components/examples/huge/index.ts
new file mode 100644
index 0000000000..8f5e656657
--- /dev/null
+++ b/packages/example/src/components/examples/huge/index.ts
@@ -0,0 +1,10 @@
+import schema from './schema.json';
+import uischema from './uischema.json';
+import data from './data.json';
+import { UISchemaElement, JsonSchema } from '@jsonforms/core';
+
+export const input: {
+ schema: JsonSchema;
+ uischema: UISchemaElement;
+ data: any;
+} = { schema, uischema, data };
diff --git a/packages/example/src/components/examples/huge/schema.json b/packages/example/src/components/examples/huge/schema.json
new file mode 100644
index 0000000000..6baf1b9a93
--- /dev/null
+++ b/packages/example/src/components/examples/huge/schema.json
@@ -0,0 +1,966 @@
+{
+ "$schema": "http://json-schema.org/schema#",
+
+ "definitions": {
+ "confidenceTypes": {
+ "type": "string",
+ "enum": [
+ "http://gedcomx.org/High",
+ "http://gedcomx.org/Medium",
+ "http://gedcomx.org/Low"
+ ]
+ },
+ "genderTypes": {
+ "type": "string",
+ "enum": [
+ "http://gedcomx.org/Male",
+ "http://gedcomx.org/Female",
+ "http://gedcomx.org/Unknown",
+ "http://gedcomx.org/Intersex"
+ ]
+ },
+ "nameTypes": {
+ "type": "string",
+ "enum": [
+ "http://gedcomx.org/BirthName",
+ "http://gedcomx.org/MarriedName",
+ "http://gedcomx.org/AlsoKnownAs",
+ "http://gedcomx.org/Nickname",
+ "http://gedcomx.org/AdoptiveName",
+ "http://gedcomx.org/FormalName",
+ "http://gedcomx.org/ReligiousName"
+ ]
+ },
+ "namePartTypes": {
+ "enum": [
+ "http://gedcomx.org/Prefix",
+ "http://gedcomx.org/Suffix",
+ "http://gedcomx.org/Given",
+ "http://gedcomx.org/Surname"
+ ]
+ },
+ "personFactTypes": {
+ "type": "string",
+ "enum": [
+ "http://gedcomx.org/Adoption",
+ "http://gedcomx.org/AdultChristening",
+ "http://gedcomx.org/Amnesty",
+ "http://gedcomx.org/Apprenticeship",
+ "http://gedcomx.org/Arrest",
+ "http://gedcomx.org/Baptism",
+ "http://gedcomx.org/BarMitzvah",
+ "http://gedcomx.org/BatMitzvah",
+ "http://gedcomx.org/Birth",
+ "http://gedcomx.org/Blessing",
+ "http://gedcomx.org/Burial",
+ "http://gedcomx.org/Caste",
+ "http://gedcomx.org/Census",
+ "http://gedcomx.org/Christening",
+ "http://gedcomx.org/Circumcision",
+ "http://gedcomx.org/Clan",
+ "http://gedcomx.org/Confirmation",
+ "http://gedcomx.org/Cremation",
+ "http://gedcomx.org/Death",
+ "http://gedcomx.org/Education",
+ "http://gedcomx.org/Emigration",
+ "http://gedcomx.org/Ethnicity",
+ "http://gedcomx.org/Excommunication",
+ "http://gedcomx.org/FirstCommunion",
+ "http://gedcomx.org/Funeral",
+ "http://gedcomx.org/GenderChange",
+ "http://gedcomx.org/Heimat",
+ "http://gedcomx.org/Immigration",
+ "http://gedcomx.org/Imprisonment",
+ "http://gedcomx.org/LandTransaction",
+ "http://gedcomx.org/Language",
+ "http://gedcomx.org/Living",
+ "http://gedcomx.org/MaritalStatus",
+ "http://gedcomx.org/Medical",
+ "http://gedcomx.org/MilitaryAward",
+ "http://gedcomx.org/MilitaryDischarge",
+ "http://gedcomx.org/MilitaryDraftRegistration",
+ "http://gedcomx.org/MilitaryInduction",
+ "http://gedcomx.org/MilitaryService",
+ "http://gedcomx.org/Mission",
+ "http://gedcomx.org/MoveTo",
+ "http://gedcomx.org/MoveFrom",
+ "http://gedcomx.org/MultipleBirth",
+ "http://gedcomx.org/NationalId",
+ "http://gedcomx.org/Nationality",
+ "http://gedcomx.org/Naturalization",
+ "http://gedcomx.org/NumberOfChildren",
+ "http://gedcomx.org/NumberOfMarriages",
+ "http://gedcomx.org/Occupation",
+ "http://gedcomx.org/Ordination",
+ "http://gedcomx.org/Pardon",
+ "http://gedcomx.org/PhysicalDescription",
+ "http://gedcomx.org/Probate",
+ "http://gedcomx.org/Property",
+ "http://gedcomx.org/Religion",
+ "http://gedcomx.org/Residence",
+ "http://gedcomx.org/Retirement",
+ "http://gedcomx.org/Stillbirth",
+ "http://gedcomx.org/Will",
+ "http://gedcomx.org/Visit",
+ "http://gedcomx.org/Yahrzeit"
+ ]
+ },
+ "uri": {
+ "type": "string"
+ },
+ "localeTag": {
+ "type": "string"
+ },
+ "resourceReference": {
+ "type": "object",
+ "properties": {
+ "resource": { "$ref": "#/definitions/uri" }
+ }
+ },
+ "identifier": {
+ "type": "object"
+ },
+ "attribution": {
+ "title": "Attribution",
+ "properties": {
+ "contributor": {
+ "$ref": "#/definitions/resourceReference",
+ "description": "Reference to the agent to whom the attributed data is attributed."
+ },
+ "modified": {
+ "type": "number",
+ "description": "Timestamp of when the attributed data was contributed."
+ },
+ "changeMessage": {
+ "type": "string",
+ "description": "A statement of why the attributed data is being provided by the contributor."
+ },
+ "creator": {
+ "$ref": "#/definitions/resourceReference",
+ "description": "Reference to the agent that created the attributed data. The creator MAY be different from the contributor if changes were made to the attributed data."
+ },
+ "created": {
+ "type": "number",
+ "description": "Timestamp of when the attributed data was contributed."
+ }
+ }
+ },
+ "note": {
+ "title": "Note",
+ "properties": {
+ "lang": {
+ "$ref": "#/definitions/localeTag",
+ "description": "The locale identifier for the note."
+ },
+ "subject": {
+ "type": "string",
+ "description": "A subject or title for the note."
+ },
+ "text": { "type": "string", "description": "The text of the note." },
+ "attribution": {
+ "$ref": "#/definitions/attribution",
+ "description": "The attribution of this note."
+ }
+ },
+ "required": ["text"]
+ },
+ "textValue": {
+ "type": "object",
+ "properties": {
+ "lang": {
+ "$ref": "#/definitions/localeTag",
+ "description": "The locale identifier for the value of the text."
+ },
+ "value": { "type": "string", "description": "The text value." }
+ },
+ "required": ["value"]
+ },
+ "sourceCitation": {
+ "type": "object",
+ "properties": {
+ "lang": {
+ "$ref": "#/definitions/localeTag",
+ "description": "The locale identifier for the bibliographic metadata."
+ },
+ "value": {
+ "type": "string",
+ "description": "The bibliographic metadata rendered as a full citation."
+ }
+ },
+ "required": ["value"]
+ },
+ "sourceReference": {
+ "title": "SourceReference",
+ "properties": {
+ "description": {
+ "$ref": "#/definitions/uri",
+ "description": "Reference to a description of the target source."
+ },
+ "descriptionId": {
+ "type": "string",
+ "description": "The id of the target source."
+ },
+ "attribution": {
+ "$ref": "#/definitions/attribution",
+ "description": "The attribution of this source reference."
+ },
+ "qualifiers": {
+ "items": { "$ref": "#/definitions/sourceReferenceQualifier" },
+ "description": "Qualifiers for the reference, used to identify specific fragments of the source that are being referenced."
+ }
+ },
+ "required": ["description"]
+ },
+ "sourceReferenceQualifier": {
+ "properties": {
+ "name": {
+ "anyOf": [
+ { "$ref": "#/definitions/sourceReferenceQualifierNames" },
+ { "$ref": "#/definitions/uri" }
+ ]
+ },
+ "value": { "type": "string" }
+ },
+ "required": ["name"]
+ },
+ "sourceReferenceQualifierNames": {
+ "enum": [
+ "http://gedcomx.org/CharacterRegion",
+ "http://gedcomx.org/RectangleRegion",
+ "http://gedcomx.org/TimeRegion"
+ ]
+ },
+ "evidenceReference": {
+ "title": "EvidenceReference",
+ "properties": {
+ "resource": { "$ref": "#/definitions/uri" },
+ "attribution": { "$ref": "#/definitions/attribution" }
+ },
+ "required": ["resource"]
+ },
+ "onlineAccount": {
+ "type": "object",
+ "properties": {
+ "serviceHomepage": { "$ref": "#/definitions/resourceReference" },
+ "accountName": { "type": "string" }
+ },
+ "required": ["serviceHomepage", "accountName"]
+ },
+ "address": {
+ "type": "object",
+ "properties": {
+ "value": { "type": "string" },
+ "city": { "type": "string" },
+ "country": { "type": "string" },
+ "postalCode": { "type": "string" },
+ "stateOrProvince": { "type": "string" },
+ "street": { "type": "string" },
+ "street2": { "type": "string" },
+ "street3": { "type": "string" },
+ "street4": { "type": "string" },
+ "street5": { "type": "string" },
+ "street6": { "type": "string" }
+ }
+ },
+ "conclusion": {
+ "type": "object",
+ "title": "Conclusion",
+ "properties": {
+ "id": {
+ "type": "string",
+ "description": "An identifier for the conclusion data."
+ },
+ "lang": {
+ "$ref": "#/definitions/localeTag",
+ "description": "The locale identifier for the conclusion."
+ },
+ "sources": {
+ "items": { "$ref": "#/definitions/sourceReference" },
+ "description": "The list of references to the sources of related to this conclusion."
+ },
+ "analysis": {
+ "$ref": "#/definitions/resourceReference",
+ "description": "Reference to a document containing analysis supporting this conclusion."
+ },
+ "notes": {
+ "items": { "$ref": "#/definitions/note" },
+ "description": "A list of notes about this conclusion."
+ },
+ "confidence": {
+ "anyOf": [
+ { "$ref": "#/definitions/uri" },
+ { "$ref": "#/definitions/confidenceTypes" }
+ ],
+ "description": "Reference to a confidence level for this conclusion."
+ },
+ "attribution": {
+ "$ref": "#/definitions/attribution",
+ "description": "The attribution of this conclusion."
+ }
+ }
+ },
+ "subject": {
+ "title": "Subject",
+ "allOf": [
+ { "$ref": "#/definitions/conclusion" },
+ {
+ "properties": {
+ "extracted": {
+ "type": "boolean",
+ "description": "Whether this subject is to be constrained as an extracted conclusion."
+ },
+ "evidence": {
+ "items": { "$ref": "#/definitions/evidenceReference" },
+ "description": "References to other subjects that support this subject."
+ },
+ "media": {
+ "items": { "$ref": "#/definitions/sourceReference" },
+ "description": "References to multimedia resources for this subject, such as photos or videos, intended to provide additional context or illustration for the subject and not considered evidence supporting the identity of the subject or its supporting conclusions."
+ },
+ "identifiers": {
+ "$ref": "#/definitions/identifier",
+ "description": "A list of identifiers for the subject."
+ }
+ }
+ }
+ ]
+ },
+ "gender": {
+ "allOf": [
+ { "$ref": "#/definitions/conclusion" },
+ {
+ "properties": {
+ "type": {
+ "anyOf": [
+ { "$ref": "#/definitions/uri" },
+ { "$ref": "#/definitions/genderTypes" }
+ ],
+ "description": "Enumerated value identifying the gender."
+ }
+ },
+ "required": ["type"]
+ }
+ ]
+ },
+ "date": {
+ "type": "object",
+ "properties": {
+ "original": {
+ "type": "string",
+ "description": "The original value of the date as supplied by the contributor."
+ },
+ "formal": {
+ "type": "string",
+ "pattern": "^(A?[\\+-]\\d{4}(-\\d{2})?(-\\d{2})?T?(\\d{2})?(\":\\d{2})?(\":\\d{2})?([\\+-]\\d{2}(\":\\d{2})?|Z)?)|(P(\\d{0,4}Y)?(\\d{0,4}M)?(\\d{0,4}D)?(T(\\d{0,4}H)?(\\d{0,4}M)?(\\d{0,4}S)?)?)$",
+ "description": "The standardized formal value of the date, formatted according to the GEDCOM X Date Format specification."
+ }
+ }
+ },
+ "name": {
+ "title": "Name",
+ "allOf": [
+ { "$ref": "#/definitions/conclusion" },
+ {
+ "properties": {
+ "type": {
+ "anyOf": [
+ { "$ref": "#/definitions/uri" },
+ { "$ref": "#/definitions/nameTypes" }
+ ],
+ "description": "Enumerated value identifying the name type."
+ },
+ "date": {
+ "$ref": "#/definitions/date",
+ "description": "The date of applicability of the name."
+ },
+ "nameForms": {
+ "items": {
+ "$ref": "#/definitions/nameForm"
+ },
+ "description": "The name form(s) that best express this name, usually representations considered proper and well formed in the person\"s native, historical cultural context."
+ }
+ },
+ "required": ["nameForms"]
+ }
+ ]
+ },
+ "namePart": {
+ "title": "NamePart",
+ "description": "The NamePart data type is used to model a portion of a full name, including the terms that make up that portion. Some name parts may have qualifiers to provide additional semantic meaning to the name part (e.g., \"given name\" or \"surname\").",
+ "properties": {
+ "type": {
+ "anyOf": [
+ { "$ref": "#/definitions/uri" },
+ { "$ref": "#/definitions/namePartTypes" }
+ ],
+ "description": "Enumerated value identifying the type of the name part."
+ },
+ "value": {
+ "type": "string",
+ "description": "The term(s) from the name that make up this name part."
+ },
+ "qualifiers": {
+ "items": { "$ref": "#/definitions/namePartQualifier" },
+ "description": "Qualifiers to add additional semantic meaning to the name part."
+ }
+ },
+ "required": ["value"]
+ },
+ "namePartQualifier": {
+ "properties": {
+ "name": {
+ "anyOf": [
+ { "$ref": "#/definitions/namePartQualifierNames" },
+ { "$ref": "#/definitions/uri" }
+ ]
+ },
+ "value": { "type": "string" }
+ },
+ "required": ["name"]
+ },
+ "namePartQualifierNames": {
+ "enum": [
+ "http://gedcomx.org/Title",
+ "http://gedcomx.org/Primary",
+ "http://gedcomx.org/Secondary",
+ "http://gedcomx.org/Middle",
+ "http://gedcomx.org/Familiar",
+ "http://gedcomx.org/Religious",
+ "http://gedcomx.org/Family",
+ "http://gedcomx.org/Maiden",
+ "http://gedcomx.org/Patronymic",
+ "http://gedcomx.org/Matronymic",
+ "http://gedcomx.org/Geographic",
+ "http://gedcomx.org/Occupational",
+ "http://gedcomx.org/Characteristic",
+ "http://gedcomx.org/Postnom",
+ "http://gedcomx.org/Particle",
+ "http://gedcomx.org/RootName"
+ ]
+ },
+ "nameForm": {
+ "title": "NameForm",
+ "description": "The NameForm data type defines a representation of a name (a \"name form\") within a given cultural context, such as a given language and script.\n\"As names are captured (both in records or in applications), the terms in the name are sometimes classified by type. For example, a certificate of death might prompt for \"given name(s)\" and \"surname\". The parts list can be used to represent the terms in the name that have been classified.\n\"If both a full rendering of the name and a list of parts are provided, it NOT REQUIRED that every term in the fully rendered name appear in the list of parts.\n\"Name parts in the parts list SHOULD be ordered in the natural order they would be used in the applicable cultural context.\n\"If a full rendering of the name is not provided (i.e., the name has only been expressed in parts), a full rendering of the name MAY be derived (sans punctuation) by concatenating, in order, each name part value in the list of parts, separating each part with the name part separator appropriate for the applicable cultural context.",
+ "properties": {
+ "lang": {
+ "$ref": "#/definitions/localeTag",
+ "description": "The locale identifier for the name form."
+ },
+ "fullText": {
+ "type": "string",
+ "description": "A full rendering of the name (or as much of the name as is known)."
+ },
+ "parts": {
+ "items": {
+ "$ref": "#/definitions/namePart"
+ },
+ "description": "Any identified name parts from the name."
+ }
+ }
+ },
+ "fact": {
+ "title": "PersonFact",
+ "allOf": [
+ { "$ref": "#/definitions/conclusion" },
+ {
+ "properties": {
+ "type": {
+ "anyOf": [
+ { "$ref": "#/definitions/uri" },
+ { "$ref": "#/definitions/personFactTypes" }
+ ],
+ "description": "Enumerated value identifying the type of the fact."
+ },
+ "date": {
+ "$ref": "#/definitions/date",
+ "description": "The date of applicability of the fact."
+ },
+ "place": {
+ "$ref": "#/definitions/placeReference",
+ "description": "A reference to the place applicable to this fact."
+ },
+ "value": {
+ "type": "string",
+ "description": "The value of the fact."
+ },
+ "qualifiers": {
+ "items": { "$ref": "#/definitions/factQualifier" },
+ "description": "Qualifiers to add additional details about the fact."
+ }
+ },
+ "required": ["type"]
+ }
+ ]
+ },
+ "factQualifier": {
+ "properties": {
+ "name": {
+ "anyOf": [
+ { "$ref": "#/definitions/factQualifierNames" },
+ { "$ref": "#/definitions/uri" }
+ ]
+ },
+ "value": { "type": "string" }
+ },
+ "required": ["name"]
+ },
+ "factQualifierNames": {
+ "enum": [
+ "http://gedcomx.org/Age",
+ "http://gedcomx.org/Cause",
+ "http://gedcomx.org/Religion",
+ "http://gedcomx.org/Transport",
+ "http://gedcomx.org/NonConsensual"
+ ]
+ },
+ "eventRole": {
+ "allOf": [
+ { "$ref": "#/definitions/conclusion" },
+ {
+ "properties": {
+ "person": {
+ "$ref": "#/definitions/resourceReference",
+ "description": "Reference to the event participant."
+ },
+ "type": {
+ "anyOf": [
+ { "$ref": "#/definitions/uri" },
+ { "$ref": "#/definitions/eventRoleTypes" }
+ ],
+ "description": "Enumerated value identifying the participant's role."
+ },
+ "details": {
+ "type": "string",
+ "description": "Details about the role of participant in the event."
+ }
+ },
+ "required": ["person"]
+ }
+ ]
+ },
+ "eventRoleTypes": {
+ "enum": [
+ "http://gedcomx.org/Principal",
+ "http://gedcomx.org/Participant",
+ "http://gedcomx.org/Official",
+ "http://gedcomx.org/Witness"
+ ]
+ },
+ "placeReference": {
+ "type": "object",
+ "properties": {
+ "original": {
+ "type": "string",
+ "description": "The original place name text as supplied by the contributor."
+ },
+ "description": {
+ "$ref": "#/definitions/uri",
+ "description": "A reference to a description of this place."
+ }
+ }
+ },
+ "coverage": {
+ "properties": {
+ "spatial": {
+ "$ref": "#/definitions/placeReference",
+ "description": "The spatial (i.e., geographic) coverage."
+ },
+ "temporal": {
+ "$ref": "#/definitions/date",
+ "description": "The temporal coverage."
+ }
+ }
+ },
+ "groupRole": {
+ "allOf": [
+ { "$ref": "#/definitions/conclusion" },
+ {
+ "properties": {
+ "person": {
+ "$ref": "#/definitions/resourceReference",
+ "description": "Reference to the group participant."
+ },
+ "type": {
+ "$ref": "#/definitions/uri",
+ "description": "Enumerated value identifying the participant's role."
+ },
+ "date": {
+ "$ref": "#/definitions/date",
+ "description": "The date of applicability of the role."
+ },
+ "details": {
+ "type": "string",
+ "description": "Details about the role of he participant in the group."
+ }
+ },
+ "required": ["person"]
+ }
+ ]
+ },
+ "person": {
+ "title": "Person",
+ "allOf": [
+ { "$ref": "#/definitions/subject" },
+ {
+ "properties": {
+ "private": {
+ "type": "boolean",
+ "description": "Whether this instance of Person has been designated for limited distribution or display."
+ },
+ "gender": {
+ "$ref": "#/definitions/gender",
+ "description": "The sex of the person as assigned at birth."
+ },
+ "names": {
+ "items": { "$ref": "#/definitions/name" },
+ "description": "The names of the person."
+ },
+ "facts": {
+ "items": { "$ref": "#/definitions/fact" },
+ "description": "The facts of the person."
+ }
+ }
+ }
+ ]
+ },
+ "relationship": {
+ "allOf": [
+ { "$ref": "#/definitions/subject" },
+ {
+ "properties": {
+ "type": {
+ "anyOf": [
+ { "$ref": "#/definitions/relationshipType" },
+ { "$ref": "#/definitions/uri" }
+ ],
+ "description": "Enumerated value identifying the type of the relationship."
+ },
+ "person1": {
+ "$ref": "#/definitions/resourceReference",
+ "description": "Reference to the first person in the relationship."
+ },
+ "person2": {
+ "$ref": "#/definitions/resourceReference",
+ "description": "Reference to the second person in the relationship."
+ },
+ "facts": {
+ "items": { "$ref": "#/definitions/fact" },
+ "description": "The facts about the relationship."
+ }
+ },
+ "required": ["person1", "person2"]
+ }
+ ]
+ },
+ "relationshipType": {
+ "enum": [
+ "http://gedcomx.org/Couple",
+ "http://gedcomx.org/ParentChild",
+ "http://gedcomx.org/EnslavedBy"
+ ]
+ },
+ "sourceDescription": {
+ "title": "SourceDescription",
+ "properties": {
+ "id": {
+ "type": "string",
+ "description": "An identifier for the data structure holding the source description data."
+ },
+ "resourceType": {
+ "anyOf": [
+ { "$ref": "#/definitions/resourceTypes" },
+ { "$ref": "#/definitions/uri" }
+ ],
+ "description": "Enumerated value identifying the type of resource being described."
+ },
+ "citations": {
+ "items": { "$ref": "#/definitions/sourceCitation" },
+ "description": "The citation(s) for this source."
+ },
+ "mediaType": {
+ "type": "string",
+ "description": "A hint about the media type of the resource being described."
+ },
+ "about": {
+ "$ref": "#/definitions/uri",
+ "description": "A uniform resource identifier (URI) for the resource being described."
+ },
+ "mediator": {
+ "$ref": "#/definitions/resourceReference",
+ "description": "A reference to the entity that mediates access to the described source."
+ },
+ "publisher": {
+ "$ref": "#/definitions/resourceReference",
+ "description": "A reference to the entity responsible for making the described source available."
+ },
+ "sources": {
+ "items": { "$ref": "#/definitions/sourceReference" },
+ "description": "A list of references to any sources from which this source is derived."
+ },
+ "analysis": {
+ "$ref": "#/definitions/resourceReference",
+ "description": "A reference to a document containing analysis about this source."
+ },
+ "componentOf": {
+ "$ref": "#/definitions/sourceReference",
+ "description": "A reference to the source that contains this source, i.e. its parent context. Used when the description of a source is not complete without the description of its parent (or containing) source."
+ },
+ "titles": {
+ "items": { "$ref": "#/definitions/textValue" },
+ "description": "The display name(s) for this source."
+ },
+ "notes": {
+ "items": { "$ref": "#/definitions/note" },
+ "description": "A list of notes about a source."
+ },
+ "attribution": {
+ "$ref": "#/definitions/attribution",
+ "description": "The attribution of this source description."
+ },
+ "rights": {
+ "items": { "$ref": "#/definitions/resourceReference" },
+ "description": "The rights for this resource."
+ },
+ "coverage": {
+ "$ref": "#/definitions/coverage",
+ "description": "The coverage of the resource."
+ },
+ "descriptions": {
+ "items": { "$ref": "#/definitions/textValue" },
+ "description": "Human-readable descriptions of this source."
+ },
+ "identifiers": {
+ "items": { "$ref": "#/definitions/identifier" },
+ "description": "A list of identifiers for the resource being described."
+ },
+ "created": {
+ "type": "number",
+ "description": "Timestamp of when the resource being described was created."
+ },
+ "modified": {
+ "type": "number",
+ "description": "Timestamp of when the resource being described was modified."
+ },
+ "repository": {
+ "$ref": "#/definitions/resourceReference",
+ "description": "A reference to the repository that contains the described resource."
+ }
+ },
+ "required": ["citations"]
+ },
+ "resourceTypes": {
+ "enum": [
+ "http://gedcomx.org/Collection",
+ "http://gedcomx.org/PhysicalArtifact",
+ "http://gedcomx.org/DigitalArtifact",
+ "http://gedcomx.org/Record"
+ ]
+ },
+ "agent": {
+ "title": "Agent",
+ "properties": {
+ "id": { "type": "string" },
+ "identifiers": {
+ "type": "array",
+ "items": { "$ref": "#/definitions/identifier" }
+ },
+ "names": {
+ "type": "array",
+ "items": { "$ref": "#/definitions/textValue" }
+ },
+ "homepage": { "$ref": "#/definitions/resourceReference" },
+ "openid": { "$ref": "#/definitions/resourceReference" },
+ "accounts": {
+ "type": "array",
+ "items": { "$ref": "#/definitions/onlineAccount" }
+ },
+ "emails": {
+ "type": "array",
+ "items": { "$ref": "#/definitions/resourceReference" }
+ },
+ "phones": {
+ "type": "array",
+ "items": { "$ref": "#/definitions/resourceReference" }
+ },
+ "addresses": {
+ "type": "array",
+ "items": { "$ref": "#/definitions/address" }
+ },
+ "person": {
+ "$ref": "#/definitions/resourceReference"
+ }
+ }
+ },
+ "event": {
+ "allOf": [
+ { "$ref": "#/definitions/subject" },
+ {
+ "properties": {
+ "type": {
+ "anyOf": [
+ { "$ref": "#/definitions/eventTypes" },
+ { "$ref": "#/definitions/uri" }
+ ]
+ },
+ "date": { "$ref": "#/definitions/date" },
+ "place": { "$ref": "#/definitions/placeReference" },
+ "roles": {
+ "type": "array",
+ "items": { "$ref": "#/definitions/eventRole" }
+ }
+ }
+ }
+ ]
+ },
+ "eventTypes": {
+ "enum": [
+ "http://gedcomx.org/Adoption",
+ "http://gedcomx.org/AdultChristening",
+ "http://gedcomx.org/Annulment",
+ "http://gedcomx.org/Baptism",
+ "http://gedcomx.org/BarMitzvah",
+ "http://gedcomx.org/BatMitzvah",
+ "http://gedcomx.org/Birth",
+ "http://gedcomx.org/Blessing",
+ "http://gedcomx.org/Burial",
+ "http://gedcomx.org/Census",
+ "http://gedcomx.org/Christening",
+ "http://gedcomx.org/Circumcision",
+ "http://gedcomx.org/Confirmation",
+ "http://gedcomx.org/Cremation",
+ "http://gedcomx.org/Death",
+ "http://gedcomx.org/Divorce",
+ "http://gedcomx.org/DivorceFiling",
+ "http://gedcomx.org/Education",
+ "http://gedcomx.org/Engagement",
+ "http://gedcomx.org/Emigration",
+ "http://gedcomx.org/Excommunication",
+ "http://gedcomx.org/FirstCommunion",
+ "http://gedcomx.org/Funeral",
+ "http://gedcomx.org/Immigration",
+ "http://gedcomx.org/LandTransaction",
+ "http://gedcomx.org/Marriage",
+ "http://gedcomx.org/MilitaryAward",
+ "http://gedcomx.org/MilitaryDischarge",
+ "http://gedcomx.org/Mission",
+ "http://gedcomx.org/MoveFrom",
+ "http://gedcomx.org/MoveTo",
+ "http://gedcomx.org/Naturalization",
+ "http://gedcomx.org/Ordination",
+ "http://gedcomx.org/Retirement"
+ ]
+ },
+ "document": {
+ "title": "Document",
+ "allOf": [
+ { "$ref": "#/definitions/conclusion" },
+ {
+ "properties": {
+ "type": {
+ "anyOf": [
+ { "$ref": "#/definitions/documentTypes" },
+ { "$ref": "#/definitions/uri" }
+ ]
+ },
+ "extracted": { "type": "boolean" },
+ "textType": { "type": "string" },
+ "text": { "type": "string" },
+ "attribution": { "$ref": "#/definitions/attribution" }
+ },
+ "required": ["text"]
+ }
+ ]
+ },
+ "documentTypes": {
+ "enum": [
+ "http://gedcomx.org/Abstract",
+ "http://gedcomx.org/Transcription",
+ "http://gedcomx.org/Translation",
+ "http://gedcomx.org/Analysis"
+ ]
+ },
+ "placeDescription": {
+ "title": "PlaceDescription",
+ "allOf": [
+ { "$ref": "#/definitions/subject" },
+ {
+ "properties": {
+ "names": {
+ "items": { "$ref": "#/definitions/textValue" }
+ },
+ "type": { "$ref": "#/definitions/uri" },
+ "place": { "$ref": "#/definitions/resourceReference" },
+ "jurisdiction": {
+ "$ref": "#/definitions/resourceReference"
+ },
+ "latitude": { "type": "number" },
+ "longitude": { "type": "number" },
+ "temporalDescription": { "$ref": "#/definitions/date" },
+ "spatialDescription": { "$ref": "#/definitions/resourceReference" }
+ },
+ "required": ["names"]
+ }
+ ]
+ },
+ "group": {
+ "allOf": [
+ { "$ref": "#/definitions/subject" },
+ {
+ "properties": {
+ "names": {
+ "type": "array",
+ "items": { "$ref": "#/definitions/textValue" }
+ },
+ "date": { "$ref": "#/definitions/date" },
+ "place": { "$ref": "#/definitions/resourceReference" },
+ "roles": {
+ "type": "array",
+ "items": { "$ref": "#/definitions/groupRole" }
+ }
+ },
+ "required": ["names"]
+ }
+ ]
+ }
+ },
+
+ "type": "object",
+ "properties": {
+ "persons": {
+ "type": "array",
+ "items": { "$ref": "#/definitions/person" }
+ },
+ "relationships": {
+ "type": "array",
+ "items": { "$ref": "#/definitions/relationship" }
+ },
+ "sourceDescriptions": {
+ "type": "array",
+ "items": { "$ref": "#/definitions/sourceDescription" }
+ },
+ "agents": {
+ "type": "array",
+ "items": { "$ref": "#/definitions/agent" }
+ },
+ "events": {
+ "type": "array",
+ "items": { "$ref": "#/definitions/event" }
+ },
+ "documents": {
+ "type": "array",
+ "items": { "$ref": "#/definitions/document" }
+ },
+ "places": {
+ "type": "array",
+ "items": { "$ref": "#/definitions/placeDescription" }
+ },
+ "groups": {
+ "type": "array",
+ "items": { "$ref": "#/definitions/group" }
+ },
+ "description": { "$ref": "#/definitions/uri" },
+ "id": { "type": "string" },
+ "lang": { "$ref": "#/definitions/localeTag" },
+ "attribution": { "$ref": "#/definitions/attribution" }
+ }
+}
diff --git a/packages/example/src/components/examples/huge/uischema.json b/packages/example/src/components/examples/huge/uischema.json
new file mode 100644
index 0000000000..c9c72a2e48
--- /dev/null
+++ b/packages/example/src/components/examples/huge/uischema.json
@@ -0,0 +1,58 @@
+{
+ "type": "Categorization",
+ "elements": [
+ {
+ "type": "Category",
+ "label": "Persons",
+ "elements": [
+ { "type": "ListWithDetail", "scope": "#/properties/persons" }
+ ]
+ },
+ {
+ "type": "Category",
+ "label": "Relationships",
+ "elements": [
+ { "type": "ListWithDetail", "scope": "#/properties/relationships" }
+ ]
+ },
+ {
+ "type": "Category",
+ "label": "SourceDescriptions",
+ "elements": [
+ { "type": "ListWithDetail", "scope": "#/properties/sourceDescriptions" }
+ ]
+ },
+ {
+ "type": "Category",
+ "label": "Agents",
+ "elements": [{ "type": "ListWithDetail", "scope": "#/properties/agents" }]
+ },
+ {
+ "type": "Category",
+ "label": "Events",
+ "elements": [{ "type": "ListWithDetail", "scope": "#/properties/events" }]
+ },
+ {
+ "type": "Category",
+ "label": "Documents",
+ "elements": [
+ { "type": "ListWithDetail", "scope": "#/properties/documents" }
+ ]
+ },
+ {
+ "type": "Category",
+ "label": "Places",
+ "elements": [{ "type": "ListWithDetail", "scope": "#/properties/places" }]
+ },
+ {
+ "type": "Category",
+ "label": "Generic",
+ "elements": [
+ { "type": "Control", "scope": "#/properties/description" },
+ { "type": "Control", "scope": "#/properties/lang" },
+ { "type": "Control", "scope": "#/properties/attribution" },
+ { "type": "Control", "scope": "#/properties/id" }
+ ]
+ }
+ ]
+}
diff --git a/packages/example/src/components/examples/if-then-else/data.json b/packages/example/src/components/examples/if-then-else/data.json
new file mode 100644
index 0000000000..7a73a41bfd
--- /dev/null
+++ b/packages/example/src/components/examples/if-then-else/data.json
@@ -0,0 +1,2 @@
+{
+}
\ No newline at end of file
diff --git a/packages/example/src/components/examples/if-then-else/index.ts b/packages/example/src/components/examples/if-then-else/index.ts
new file mode 100644
index 0000000000..190d6b2aef
--- /dev/null
+++ b/packages/example/src/components/examples/if-then-else/index.ts
@@ -0,0 +1,10 @@
+import schema from './schema.json';
+import data from './data.json';
+import { UISchemaElement, JsonSchema } from '@jsonforms/core';
+
+const uischema = undefined;
+export const input: {
+ schema: JsonSchema;
+ uischema: UISchemaElement | undefined;
+ data: any;
+} = { schema, uischema, data };
diff --git a/packages/example/src/components/examples/if-then-else/schema.json b/packages/example/src/components/examples/if-then-else/schema.json
new file mode 100644
index 0000000000..883ac90adb
--- /dev/null
+++ b/packages/example/src/components/examples/if-then-else/schema.json
@@ -0,0 +1,26 @@
+{
+ "type": "object",
+ "properties": {
+ "b": {
+ "type": "boolean"
+ },
+ "c": {
+ "type": "string",
+ "minLength": 1
+ }
+ },
+ "if": {
+ "properties": {
+ "b": {
+ "enum": [
+ false
+ ]
+ }
+ }
+ },
+ "then": {
+ "required": [
+ "c"
+ ]
+ }
+}
\ No newline at end of file
diff --git a/packages/example/src/components/examples/index.ts b/packages/example/src/components/examples/index.ts
new file mode 100644
index 0000000000..396acf1fbb
--- /dev/null
+++ b/packages/example/src/components/examples/index.ts
@@ -0,0 +1,196 @@
+import { input as allOf } from './allOf';
+import { input as anyOf } from './anyOf';
+import { input as anyOfSimple } from './anyOf-simple';
+import { input as array } from './array';
+import { input as arrayRestrict } from './array-restrict';
+import { input as arrayWithReorder } from './array-with-reorder';
+import { input as basic } from './basic';
+import { input as categorization } from './categorization';
+import { input as categorizationStepper } from './categorization-stepper';
+import { input as categorizationStepperNav } from './categorization-stepper-nav';
+import { input as control } from './control';
+import { input as controlOptions } from './control-options';
+import { input as enumExample } from './enum';
+import { input as enumInArray } from './enum-in-array';
+import { input as groupLayout } from './group-layout';
+import { input as horizontalLayout } from './horizontal-layout';
+import { input as listWithDetails } from './list-with-details';
+import { input as listWithDetailsAndReorder } from './list-with-details-and-reorder';
+import { input as listWithDetailsRestrict } from './list-with-details-restrict';
+import { input as login } from './login';
+import { input as main } from './main';
+import { input as multiEnum } from './multi-enum';
+import { input as nestedArray } from './nested-array';
+import { input as nestedArrayRestrict } from './nested-array-restrict';
+import { input as nestedArrayWithReorder } from './nested-array-with-reorder';
+import { input as nestedLayout } from './nested-layout';
+import { input as noSchemas } from './no-schemas';
+import { input as noUISchema } from './no-ui-schema';
+import { input as object } from './object';
+import { input as oneOf } from './oneOf';
+import { input as oneOfRecursive } from './oneOf-recursive';
+import { input as radio } from './radio';
+import { input as radioGroup } from './radio-group';
+import { input as rootObject } from './root-object';
+import { input as rule } from './rule';
+import { input as verticalLayout } from './vertical-layout';
+import { input as huge } from './huge';
+import { input as ifThenElse } from './if-then-else';
+
+export const examples = [
+ {
+ title: 'Main',
+ input: main,
+ },
+ {
+ title: 'Basic',
+ input: basic,
+ },
+ {
+ title: 'Control',
+ input: control,
+ },
+ {
+ title: 'Control Options',
+ input: controlOptions,
+ },
+ {
+ title: 'Enum',
+ input: enumExample,
+ },
+ {
+ title: 'Enum In Array',
+ input: enumInArray,
+ },
+ {
+ title: 'Multi Enum',
+ input: multiEnum,
+ },
+ {
+ title: 'Categorization',
+ input: categorization,
+ },
+ {
+ title: 'Categorization Stepper',
+ input: categorizationStepper,
+ },
+ {
+ title: 'Categorization Stepper With Navigation',
+ input: categorizationStepperNav,
+ },
+ {
+ title: 'Horizontal Layout',
+ input: horizontalLayout,
+ },
+ {
+ title: 'Vertical Layout',
+ input: verticalLayout,
+ },
+ {
+ title: 'Group Layout',
+ input: groupLayout,
+ },
+ {
+ title: 'Nested Layout',
+ input: nestedLayout,
+ },
+ {
+ title: 'Array',
+ input: array,
+ },
+ {
+ title: 'Array Min/Max Items',
+ input: arrayRestrict,
+ },
+ {
+ title: 'Array With Reorder',
+ input: arrayWithReorder,
+ },
+ {
+ title: 'Nested Array',
+ input: nestedArray,
+ },
+ {
+ title: 'Nested Array Min/Max Items',
+ input: nestedArrayRestrict,
+ },
+ {
+ title: 'Nested Array With Reorder',
+ input: nestedArrayWithReorder,
+ },
+ {
+ title: 'Rule',
+ input: rule,
+ },
+ {
+ title: 'Login',
+ input: login,
+ },
+ {
+ title: 'Radio',
+ input: radio,
+ },
+ {
+ title: 'Radio Group',
+ input: radioGroup,
+ },
+ {
+ title: 'Object',
+ input: object,
+ },
+ {
+ title: 'Root Object',
+ input: rootObject,
+ },
+ {
+ title: 'Generate UI Schema',
+ input: noUISchema,
+ },
+ {
+ title: 'Generate Both Schemas',
+ input: noSchemas,
+ },
+ {
+ title: 'Combinators oneOf',
+ input: oneOf,
+ },
+ {
+ title: 'Combinators oneOf recursive',
+ input: oneOfRecursive,
+ },
+ {
+ title: 'Combinators anyOf',
+ input: anyOf,
+ },
+ {
+ title: 'Combinators anyOf simple',
+ input: anyOfSimple,
+ },
+ {
+ title: 'Combinators allOf',
+ input: allOf,
+ },
+ {
+ title: 'List With Details',
+ input: listWithDetails,
+ },
+ {
+ title: 'List With Details Min/Max Items',
+ input: listWithDetailsRestrict,
+ },
+ {
+ title: 'List With Details And Reorder',
+ input: listWithDetailsAndReorder,
+ },
+ {
+ title: 'If Then Else',
+ input: ifThenElse,
+ },
+ //TODO: Temporary disable the Huge example since it does generate errors and the browser hangs
+ /*
+ {
+ title: 'Huge',
+ input: huge,
+ },
+ */
+];
diff --git a/packages/example/src/components/examples/list-with-details-and-reorder/data.json b/packages/example/src/components/examples/list-with-details-and-reorder/data.json
new file mode 100644
index 0000000000..ff6ff8d420
--- /dev/null
+++ b/packages/example/src/components/examples/list-with-details-and-reorder/data.json
@@ -0,0 +1,16 @@
+{
+ "users": [
+ {
+ "firstname": "Max",
+ "lastname": "Mustermann",
+ "age": 25,
+ "email": "max@mustermann.com"
+ },
+ {
+ "firstname": "John",
+ "lastname": "Doe",
+ "age": 35,
+ "email": "john@doe.com"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/packages/example/src/components/examples/list-with-details-and-reorder/index.ts b/packages/example/src/components/examples/list-with-details-and-reorder/index.ts
new file mode 100644
index 0000000000..8f5e656657
--- /dev/null
+++ b/packages/example/src/components/examples/list-with-details-and-reorder/index.ts
@@ -0,0 +1,10 @@
+import schema from './schema.json';
+import uischema from './uischema.json';
+import data from './data.json';
+import { UISchemaElement, JsonSchema } from '@jsonforms/core';
+
+export const input: {
+ schema: JsonSchema;
+ uischema: UISchemaElement;
+ data: any;
+} = { schema, uischema, data };
diff --git a/packages/example/src/components/examples/list-with-details-and-reorder/schema.json b/packages/example/src/components/examples/list-with-details-and-reorder/schema.json
new file mode 100644
index 0000000000..2714669b43
--- /dev/null
+++ b/packages/example/src/components/examples/list-with-details-and-reorder/schema.json
@@ -0,0 +1,31 @@
+{
+ "type": "object",
+ "properties": {
+ "users": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "title": "Users",
+ "properties": {
+ "firstname": {
+ "type": "string"
+ },
+ "lastname": {
+ "type": "string"
+ },
+ "email": {
+ "type": "string",
+ "format": "email"
+ },
+ "age": {
+ "type": "number",
+ "minimum": 0
+ }
+ },
+ "required": [
+ "firstname"
+ ]
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/example/src/components/examples/list-with-details-and-reorder/uischema.json b/packages/example/src/components/examples/list-with-details-and-reorder/uischema.json
new file mode 100644
index 0000000000..582b253332
--- /dev/null
+++ b/packages/example/src/components/examples/list-with-details-and-reorder/uischema.json
@@ -0,0 +1,37 @@
+{
+ "type": "ListWithDetail",
+ "scope": "#/properties/users",
+ "options": {
+ "detail": {
+ "type": "VerticalLayout",
+ "elements": [
+ {
+ "type": "HorizontalLayout",
+ "elements": [
+ {
+ "type": "Control",
+ "scope": "#/properties/firstname",
+ "label": "First Name"
+ },
+ {
+ "type": "Control",
+ "scope": "#/properties/lastname",
+ "label": "Last Name"
+ }
+ ]
+ },
+ {
+ "type": "Control",
+ "scope": "#/properties/age",
+ "label": "Age"
+ },
+ {
+ "type": "Control",
+ "scope": "#/properties/email",
+ "label": "Email"
+ }
+ ]
+ },
+ "showSortButtons": true
+ }
+}
\ No newline at end of file
diff --git a/packages/example/src/components/examples/list-with-details-restrict/data.json b/packages/example/src/components/examples/list-with-details-restrict/data.json
new file mode 100644
index 0000000000..ff6ff8d420
--- /dev/null
+++ b/packages/example/src/components/examples/list-with-details-restrict/data.json
@@ -0,0 +1,16 @@
+{
+ "users": [
+ {
+ "firstname": "Max",
+ "lastname": "Mustermann",
+ "age": 25,
+ "email": "max@mustermann.com"
+ },
+ {
+ "firstname": "John",
+ "lastname": "Doe",
+ "age": 35,
+ "email": "john@doe.com"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/packages/example/src/components/examples/list-with-details-restrict/index.ts b/packages/example/src/components/examples/list-with-details-restrict/index.ts
new file mode 100644
index 0000000000..8f5e656657
--- /dev/null
+++ b/packages/example/src/components/examples/list-with-details-restrict/index.ts
@@ -0,0 +1,10 @@
+import schema from './schema.json';
+import uischema from './uischema.json';
+import data from './data.json';
+import { UISchemaElement, JsonSchema } from '@jsonforms/core';
+
+export const input: {
+ schema: JsonSchema;
+ uischema: UISchemaElement;
+ data: any;
+} = { schema, uischema, data };
diff --git a/packages/example/src/components/examples/list-with-details-restrict/schema.json b/packages/example/src/components/examples/list-with-details-restrict/schema.json
new file mode 100644
index 0000000000..9c5367003e
--- /dev/null
+++ b/packages/example/src/components/examples/list-with-details-restrict/schema.json
@@ -0,0 +1,33 @@
+{
+ "type": "object",
+ "properties": {
+ "users": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "title": "Users",
+ "properties": {
+ "firstname": {
+ "type": "string"
+ },
+ "lastname": {
+ "type": "string"
+ },
+ "email": {
+ "type": "string",
+ "format": "email"
+ },
+ "age": {
+ "type": "number",
+ "minimum": 0
+ }
+ },
+ "required": [
+ "firstname"
+ ]
+ },
+ "minItems": 1,
+ "maxItems": 5
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/example/src/components/examples/list-with-details-restrict/uischema.json b/packages/example/src/components/examples/list-with-details-restrict/uischema.json
new file mode 100644
index 0000000000..770167653b
--- /dev/null
+++ b/packages/example/src/components/examples/list-with-details-restrict/uischema.json
@@ -0,0 +1,37 @@
+{
+ "type": "ListWithDetail",
+ "scope": "#/properties/users",
+ "options": {
+ "detail": {
+ "type": "VerticalLayout",
+ "elements": [
+ {
+ "type": "HorizontalLayout",
+ "elements": [
+ {
+ "type": "Control",
+ "scope": "#/properties/firstname",
+ "label": "First Name"
+ },
+ {
+ "type": "Control",
+ "scope": "#/properties/lastname",
+ "label": "Last Name"
+ }
+ ]
+ },
+ {
+ "type": "Control",
+ "scope": "#/properties/age",
+ "label": "Age"
+ },
+ {
+ "type": "Control",
+ "scope": "#/properties/email",
+ "label": "Email"
+ }
+ ]
+ },
+ "restrict": true
+ }
+}
\ No newline at end of file
diff --git a/packages/example/src/components/examples/list-with-details/data.json b/packages/example/src/components/examples/list-with-details/data.json
new file mode 100644
index 0000000000..ff6ff8d420
--- /dev/null
+++ b/packages/example/src/components/examples/list-with-details/data.json
@@ -0,0 +1,16 @@
+{
+ "users": [
+ {
+ "firstname": "Max",
+ "lastname": "Mustermann",
+ "age": 25,
+ "email": "max@mustermann.com"
+ },
+ {
+ "firstname": "John",
+ "lastname": "Doe",
+ "age": 35,
+ "email": "john@doe.com"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/packages/example/src/components/examples/list-with-details/index.ts b/packages/example/src/components/examples/list-with-details/index.ts
new file mode 100644
index 0000000000..8f5e656657
--- /dev/null
+++ b/packages/example/src/components/examples/list-with-details/index.ts
@@ -0,0 +1,10 @@
+import schema from './schema.json';
+import uischema from './uischema.json';
+import data from './data.json';
+import { UISchemaElement, JsonSchema } from '@jsonforms/core';
+
+export const input: {
+ schema: JsonSchema;
+ uischema: UISchemaElement;
+ data: any;
+} = { schema, uischema, data };
diff --git a/packages/example/src/components/examples/list-with-details/schema.json b/packages/example/src/components/examples/list-with-details/schema.json
new file mode 100644
index 0000000000..2714669b43
--- /dev/null
+++ b/packages/example/src/components/examples/list-with-details/schema.json
@@ -0,0 +1,31 @@
+{
+ "type": "object",
+ "properties": {
+ "users": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "title": "Users",
+ "properties": {
+ "firstname": {
+ "type": "string"
+ },
+ "lastname": {
+ "type": "string"
+ },
+ "email": {
+ "type": "string",
+ "format": "email"
+ },
+ "age": {
+ "type": "number",
+ "minimum": 0
+ }
+ },
+ "required": [
+ "firstname"
+ ]
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/example/src/components/examples/list-with-details/uischema.json b/packages/example/src/components/examples/list-with-details/uischema.json
new file mode 100644
index 0000000000..ec4596fa24
--- /dev/null
+++ b/packages/example/src/components/examples/list-with-details/uischema.json
@@ -0,0 +1,36 @@
+{
+ "type": "ListWithDetail",
+ "scope": "#/properties/users",
+ "options": {
+ "detail": {
+ "type": "VerticalLayout",
+ "elements": [
+ {
+ "type": "HorizontalLayout",
+ "elements": [
+ {
+ "type": "Control",
+ "scope": "#/properties/firstname",
+ "label": "First Name"
+ },
+ {
+ "type": "Control",
+ "scope": "#/properties/lastname",
+ "label": "Last Name"
+ }
+ ]
+ },
+ {
+ "type": "Control",
+ "scope": "#/properties/age",
+ "label": "Age"
+ },
+ {
+ "type": "Control",
+ "scope": "#/properties/email",
+ "label": "Email"
+ }
+ ]
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/example/src/components/examples/login/data.json b/packages/example/src/components/examples/login/data.json
new file mode 100644
index 0000000000..fda53a016a
--- /dev/null
+++ b/packages/example/src/components/examples/login/data.json
@@ -0,0 +1,3 @@
+{
+ "username": "john.doe@email.com"
+}
\ No newline at end of file
diff --git a/packages/example/src/components/examples/login/index.ts b/packages/example/src/components/examples/login/index.ts
new file mode 100644
index 0000000000..8f5e656657
--- /dev/null
+++ b/packages/example/src/components/examples/login/index.ts
@@ -0,0 +1,10 @@
+import schema from './schema.json';
+import uischema from './uischema.json';
+import data from './data.json';
+import { UISchemaElement, JsonSchema } from '@jsonforms/core';
+
+export const input: {
+ schema: JsonSchema;
+ uischema: UISchemaElement;
+ data: any;
+} = { schema, uischema, data };
diff --git a/packages/example/src/components/examples/login/schema.json b/packages/example/src/components/examples/login/schema.json
new file mode 100644
index 0000000000..7368bee5aa
--- /dev/null
+++ b/packages/example/src/components/examples/login/schema.json
@@ -0,0 +1,18 @@
+{
+ "type": "object",
+ "properties": {
+ "username": {
+ "type": "string",
+ "description": "Login Name"
+ },
+ "password": {
+ "type": "string",
+ "format": "password",
+ "description": "Login password"
+ }
+ },
+ "required": [
+ "username",
+ "password"
+ ]
+}
\ No newline at end of file
diff --git a/packages/example/src/components/examples/login/uischema.json b/packages/example/src/components/examples/login/uischema.json
new file mode 100644
index 0000000000..b0e5eefc7f
--- /dev/null
+++ b/packages/example/src/components/examples/login/uischema.json
@@ -0,0 +1,22 @@
+{
+ "type": "VerticalLayout",
+ "elements": [
+ {
+ "type": "Label",
+ "text": "Login Information"
+ },
+ {
+ "type": "HorizontalLayout",
+ "elements": [
+ {
+ "type": "Control",
+ "scope": "#/properties/username"
+ },
+ {
+ "type": "Control",
+ "scope": "#/properties/password"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/packages/example/src/components/examples/main/data.json b/packages/example/src/components/examples/main/data.json
new file mode 100644
index 0000000000..a113e0aa0b
--- /dev/null
+++ b/packages/example/src/components/examples/main/data.json
@@ -0,0 +1,4 @@
+{
+ "firstName": "Max",
+ "lastName": "Power"
+}
\ No newline at end of file
diff --git a/packages/example/src/components/examples/main/index.ts b/packages/example/src/components/examples/main/index.ts
new file mode 100644
index 0000000000..8f5e656657
--- /dev/null
+++ b/packages/example/src/components/examples/main/index.ts
@@ -0,0 +1,10 @@
+import schema from './schema.json';
+import uischema from './uischema.json';
+import data from './data.json';
+import { UISchemaElement, JsonSchema } from '@jsonforms/core';
+
+export const input: {
+ schema: JsonSchema;
+ uischema: UISchemaElement;
+ data: any;
+} = { schema, uischema, data };
diff --git a/packages/example/src/components/examples/main/schema.json b/packages/example/src/components/examples/main/schema.json
new file mode 100644
index 0000000000..8d4f6bcd43
--- /dev/null
+++ b/packages/example/src/components/examples/main/schema.json
@@ -0,0 +1,61 @@
+{
+ "type": "object",
+ "required": [
+ "age"
+ ],
+ "properties": {
+ "firstName": {
+ "type": "string",
+ "minLength": 2,
+ "maxLength": 20
+ },
+ "lastName": {
+ "type": "string",
+ "minLength": 5,
+ "maxLength": 15
+ },
+ "age": {
+ "type": "integer",
+ "minimum": 18,
+ "maximum": 100
+ },
+ "gender": {
+ "type": "string",
+ "enum": [
+ "Male",
+ "Female",
+ "Undisclosed"
+ ]
+ },
+ "height": {
+ "type": "number"
+ },
+ "dateOfBirth": {
+ "type": "string",
+ "format": "date"
+ },
+ "rating": {
+ "type": "integer"
+ },
+ "committer": {
+ "type": "boolean"
+ },
+ "address": {
+ "type": "object",
+ "properties": {
+ "street": {
+ "type": "string"
+ },
+ "streetnumber": {
+ "type": "string"
+ },
+ "postalCode": {
+ "type": "string"
+ },
+ "city": {
+ "type": "string"
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/example/src/components/examples/main/uischema.json b/packages/example/src/components/examples/main/uischema.json
new file mode 100644
index 0000000000..36db9d8167
--- /dev/null
+++ b/packages/example/src/components/examples/main/uischema.json
@@ -0,0 +1,89 @@
+{
+ "type": "VerticalLayout",
+ "elements": [
+ {
+ "type": "HorizontalLayout",
+ "elements": [
+ {
+ "type": "Control",
+ "scope": "#/properties/firstName"
+ },
+ {
+ "type": "Control",
+ "scope": "#/properties/lastName"
+ }
+ ]
+ },
+ {
+ "type": "HorizontalLayout",
+ "elements": [
+ {
+ "type": "Control",
+ "scope": "#/properties/age"
+ },
+ {
+ "type": "Control",
+ "scope": "#/properties/dateOfBirth"
+ }
+ ]
+ },
+ {
+ "type": "HorizontalLayout",
+ "elements": [
+ {
+ "type": "Control",
+ "scope": "#/properties/height"
+ },
+ {
+ "type": "Control",
+ "scope": "#/properties/gender"
+ },
+ {
+ "type": "Control",
+ "scope": "#/properties/committer"
+ }
+ ]
+ },
+ {
+ "type": "Group",
+ "label": "Address for Shipping T-Shirt",
+ "elements": [
+ {
+ "type": "HorizontalLayout",
+ "elements": [
+ {
+ "type": "Control",
+ "scope": "#/properties/address/properties/street"
+ },
+ {
+ "type": "Control",
+ "scope": "#/properties/address/properties/streetnumber"
+ }
+ ]
+ },
+ {
+ "type": "HorizontalLayout",
+ "elements": [
+ {
+ "type": "Control",
+ "scope": "#/properties/address/properties/postalCode"
+ },
+ {
+ "type": "Control",
+ "scope": "#/properties/address/properties/city"
+ }
+ ]
+ }
+ ],
+ "rule": {
+ "effect": "ENABLE",
+ "condition": {
+ "scope": "#/properties/committer",
+ "schema": {
+ "const": true
+ }
+ }
+ }
+ }
+ ]
+}
\ No newline at end of file
diff --git a/packages/example/src/components/examples/multi-enum/data.json b/packages/example/src/components/examples/multi-enum/data.json
new file mode 100644
index 0000000000..2f1fc9351e
--- /dev/null
+++ b/packages/example/src/components/examples/multi-enum/data.json
@@ -0,0 +1,8 @@
+{
+ "oneOfMultiEnum": [
+ "foo"
+ ],
+ "multiEnum": [
+ "bar"
+ ]
+}
\ No newline at end of file
diff --git a/packages/example/src/components/examples/multi-enum/index.ts b/packages/example/src/components/examples/multi-enum/index.ts
new file mode 100644
index 0000000000..8f5e656657
--- /dev/null
+++ b/packages/example/src/components/examples/multi-enum/index.ts
@@ -0,0 +1,10 @@
+import schema from './schema.json';
+import uischema from './uischema.json';
+import data from './data.json';
+import { UISchemaElement, JsonSchema } from '@jsonforms/core';
+
+export const input: {
+ schema: JsonSchema;
+ uischema: UISchemaElement;
+ data: any;
+} = { schema, uischema, data };
diff --git a/packages/example/src/components/examples/multi-enum/schema.json b/packages/example/src/components/examples/multi-enum/schema.json
new file mode 100644
index 0000000000..d4277792d5
--- /dev/null
+++ b/packages/example/src/components/examples/multi-enum/schema.json
@@ -0,0 +1,37 @@
+{
+ "type": "object",
+ "properties": {
+ "oneOfMultiEnum": {
+ "type": "array",
+ "uniqueItems": true,
+ "items": {
+ "oneOf": [
+ {
+ "const": "foo",
+ "title": "My Foo"
+ },
+ {
+ "const": "bar",
+ "title": "My Bar"
+ },
+ {
+ "const": "foobar",
+ "title": "My FooBar"
+ }
+ ]
+ }
+ },
+ "multiEnum": {
+ "type": "array",
+ "uniqueItems": true,
+ "items": {
+ "type": "string",
+ "enum": [
+ "foo",
+ "bar",
+ "foobar"
+ ]
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/example/src/components/examples/multi-enum/uischema.json b/packages/example/src/components/examples/multi-enum/uischema.json
new file mode 100644
index 0000000000..15dd606f63
--- /dev/null
+++ b/packages/example/src/components/examples/multi-enum/uischema.json
@@ -0,0 +1,13 @@
+{
+ "type": "VerticalLayout",
+ "elements": [
+ {
+ "type": "Control",
+ "scope": "#/properties/oneOfMultiEnum"
+ },
+ {
+ "type": "Control",
+ "scope": "#/properties/multiEnum"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/packages/example/src/components/examples/nested-array-restrict/data.json b/packages/example/src/components/examples/nested-array-restrict/data.json
new file mode 100644
index 0000000000..00273e39b3
--- /dev/null
+++ b/packages/example/src/components/examples/nested-array-restrict/data.json
@@ -0,0 +1,8 @@
+{
+ "exampleArray": [
+ {
+ "choices": ["This", "is", "an", "example"],
+ "name": "Hi there"
+ }
+ ]
+}
diff --git a/packages/example/src/components/examples/nested-array-restrict/index.ts b/packages/example/src/components/examples/nested-array-restrict/index.ts
new file mode 100644
index 0000000000..8f5e656657
--- /dev/null
+++ b/packages/example/src/components/examples/nested-array-restrict/index.ts
@@ -0,0 +1,10 @@
+import schema from './schema.json';
+import uischema from './uischema.json';
+import data from './data.json';
+import { UISchemaElement, JsonSchema } from '@jsonforms/core';
+
+export const input: {
+ schema: JsonSchema;
+ uischema: UISchemaElement;
+ data: any;
+} = { schema, uischema, data };
diff --git a/packages/example/src/components/examples/nested-array-restrict/schema.json b/packages/example/src/components/examples/nested-array-restrict/schema.json
new file mode 100644
index 0000000000..f087dce68b
--- /dev/null
+++ b/packages/example/src/components/examples/nested-array-restrict/schema.json
@@ -0,0 +1,24 @@
+{
+ "type": "object",
+ "properties": {
+ "exampleArray": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string"
+ },
+ "choices": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "minItems": 1,
+ "maxItems": 5
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/example/src/components/examples/nested-array-restrict/uischema.json b/packages/example/src/components/examples/nested-array-restrict/uischema.json
new file mode 100644
index 0000000000..a8a2689758
--- /dev/null
+++ b/packages/example/src/components/examples/nested-array-restrict/uischema.json
@@ -0,0 +1,16 @@
+{
+ "type": "HorizontalLayout",
+ "elements": [
+ {
+ "type": "Control",
+ "label": {
+ "text": "Example Array",
+ "show": true
+ },
+ "scope": "#/properties/exampleArray",
+ "options": {
+ "restrict": true
+ }
+ }
+ ]
+}
\ No newline at end of file
diff --git a/packages/example/src/components/examples/nested-array-with-reorder/data.json b/packages/example/src/components/examples/nested-array-with-reorder/data.json
new file mode 100644
index 0000000000..95ac635931
--- /dev/null
+++ b/packages/example/src/components/examples/nested-array-with-reorder/data.json
@@ -0,0 +1,8 @@
+{
+ "exampleArray": [
+ {
+ "phones": ["555-1212", "(888)555-1212"],
+ "name": "John Smith"
+ }
+ ]
+}
diff --git a/packages/example/src/components/examples/nested-array-with-reorder/index.ts b/packages/example/src/components/examples/nested-array-with-reorder/index.ts
new file mode 100644
index 0000000000..8f5e656657
--- /dev/null
+++ b/packages/example/src/components/examples/nested-array-with-reorder/index.ts
@@ -0,0 +1,10 @@
+import schema from './schema.json';
+import uischema from './uischema.json';
+import data from './data.json';
+import { UISchemaElement, JsonSchema } from '@jsonforms/core';
+
+export const input: {
+ schema: JsonSchema;
+ uischema: UISchemaElement;
+ data: any;
+} = { schema, uischema, data };
diff --git a/packages/example/src/components/examples/nested-array-with-reorder/schema.json b/packages/example/src/components/examples/nested-array-with-reorder/schema.json
new file mode 100644
index 0000000000..17220f042a
--- /dev/null
+++ b/packages/example/src/components/examples/nested-array-with-reorder/schema.json
@@ -0,0 +1,24 @@
+{
+ "type": "object",
+ "properties": {
+ "exampleArray": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "name": { "type": "string" },
+ "phones": {
+ "type": "array",
+ "items": {
+ "type": "string",
+ "pattern": "^(\\([0-9]{3}\\))?[0-9]{3}-[0-9]{4}$"
+ }
+ }
+ },
+ "required":[
+ "name"
+ ]
+ }
+ }
+ }
+}
diff --git a/packages/example/src/components/examples/nested-array-with-reorder/uischema.json b/packages/example/src/components/examples/nested-array-with-reorder/uischema.json
new file mode 100644
index 0000000000..f0d9c0a1a0
--- /dev/null
+++ b/packages/example/src/components/examples/nested-array-with-reorder/uischema.json
@@ -0,0 +1,16 @@
+{
+ "type": "HorizontalLayout",
+ "elements": [
+ {
+ "type": "Control",
+ "label": {
+ "text": "Example Array",
+ "show": true
+ },
+ "scope": "#/properties/exampleArray",
+ "options": {
+ "showSortButtons": true
+ }
+ }
+ ]
+}
diff --git a/packages/example/src/components/examples/nested-array/data.json b/packages/example/src/components/examples/nested-array/data.json
new file mode 100644
index 0000000000..00273e39b3
--- /dev/null
+++ b/packages/example/src/components/examples/nested-array/data.json
@@ -0,0 +1,8 @@
+{
+ "exampleArray": [
+ {
+ "choices": ["This", "is", "an", "example"],
+ "name": "Hi there"
+ }
+ ]
+}
diff --git a/packages/example/src/components/examples/nested-array/index.ts b/packages/example/src/components/examples/nested-array/index.ts
new file mode 100644
index 0000000000..8f5e656657
--- /dev/null
+++ b/packages/example/src/components/examples/nested-array/index.ts
@@ -0,0 +1,10 @@
+import schema from './schema.json';
+import uischema from './uischema.json';
+import data from './data.json';
+import { UISchemaElement, JsonSchema } from '@jsonforms/core';
+
+export const input: {
+ schema: JsonSchema;
+ uischema: UISchemaElement;
+ data: any;
+} = { schema, uischema, data };
diff --git a/packages/example/src/components/examples/nested-array/schema.json b/packages/example/src/components/examples/nested-array/schema.json
new file mode 100644
index 0000000000..7ae5258fcb
--- /dev/null
+++ b/packages/example/src/components/examples/nested-array/schema.json
@@ -0,0 +1,22 @@
+{
+ "type": "object",
+ "properties": {
+ "exampleArray": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string"
+ },
+ "choices": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/example/src/components/examples/nested-array/uischema.json b/packages/example/src/components/examples/nested-array/uischema.json
new file mode 100644
index 0000000000..78721de0e2
--- /dev/null
+++ b/packages/example/src/components/examples/nested-array/uischema.json
@@ -0,0 +1,13 @@
+{
+ "type": "HorizontalLayout",
+ "elements": [
+ {
+ "type": "Control",
+ "label": {
+ "text": "Example Array",
+ "show": true
+ },
+ "scope": "#/properties/exampleArray"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/packages/example/src/components/examples/nested-layout/data.json b/packages/example/src/components/examples/nested-layout/data.json
new file mode 100644
index 0000000000..59a6d43787
--- /dev/null
+++ b/packages/example/src/components/examples/nested-layout/data.json
@@ -0,0 +1,9 @@
+{
+ "name": "John Doe",
+ "vegetarian": false,
+ "birthDate": "1985-06-02",
+ "personalData": {
+ "age": 34
+ },
+ "postalCode": "12345"
+}
\ No newline at end of file
diff --git a/packages/example/src/components/examples/nested-layout/index.ts b/packages/example/src/components/examples/nested-layout/index.ts
new file mode 100644
index 0000000000..8f5e656657
--- /dev/null
+++ b/packages/example/src/components/examples/nested-layout/index.ts
@@ -0,0 +1,10 @@
+import schema from './schema.json';
+import uischema from './uischema.json';
+import data from './data.json';
+import { UISchemaElement, JsonSchema } from '@jsonforms/core';
+
+export const input: {
+ schema: JsonSchema;
+ uischema: UISchemaElement;
+ data: any;
+} = { schema, uischema, data };
diff --git a/packages/example/src/components/examples/nested-layout/schema.json b/packages/example/src/components/examples/nested-layout/schema.json
new file mode 100644
index 0000000000..215f8fd803
--- /dev/null
+++ b/packages/example/src/components/examples/nested-layout/schema.json
@@ -0,0 +1,61 @@
+{
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 3,
+ "description": "Please enter your name"
+ },
+ "vegetarian": {
+ "type": "boolean"
+ },
+ "birthDate": {
+ "type": "string",
+ "format": "date"
+ },
+ "nationality": {
+ "type": "string",
+ "enum": [
+ "DE",
+ "IT",
+ "JP",
+ "US",
+ "RU",
+ "Other"
+ ]
+ },
+ "personalData": {
+ "type": "object",
+ "properties": {
+ "age": {
+ "type": "integer",
+ "description": "Please enter your age."
+ },
+ "height": {
+ "type": "number"
+ },
+ "drivingSkill": {
+ "type": "number",
+ "maximum": 10,
+ "minimum": 1,
+ "default": 7
+ }
+ },
+ "required": [
+ "age",
+ "height"
+ ]
+ },
+ "occupation": {
+ "type": "string"
+ },
+ "postalCode": {
+ "type": "string",
+ "maxLength": 5
+ }
+ },
+ "required": [
+ "occupation",
+ "nationality"
+ ]
+}
\ No newline at end of file
diff --git a/packages/example/src/components/examples/nested-layout/uischema.json b/packages/example/src/components/examples/nested-layout/uischema.json
new file mode 100644
index 0000000000..d64d42523d
--- /dev/null
+++ b/packages/example/src/components/examples/nested-layout/uischema.json
@@ -0,0 +1,41 @@
+{
+ "type": "Group",
+ "label": "My Group",
+ "elements": [
+ {
+ "type": "HorizontalLayout",
+ "elements": [
+ {
+ "type": "VerticalLayout",
+ "elements": [
+ {
+ "type": "Control",
+ "label": "Name",
+ "scope": "#/properties/name"
+ },
+ {
+ "type": "Control",
+ "label": "Birth Date",
+ "scope": "#/properties/birthDate"
+ }
+ ]
+ },
+ {
+ "type": "VerticalLayout",
+ "elements": [
+ {
+ "type": "Control",
+ "label": "Name",
+ "scope": "#/properties/name"
+ },
+ {
+ "type": "Control",
+ "label": "Birth Date",
+ "scope": "#/properties/birthDate"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/packages/example/src/components/examples/no-schemas/data.json b/packages/example/src/components/examples/no-schemas/data.json
new file mode 100644
index 0000000000..59a6d43787
--- /dev/null
+++ b/packages/example/src/components/examples/no-schemas/data.json
@@ -0,0 +1,9 @@
+{
+ "name": "John Doe",
+ "vegetarian": false,
+ "birthDate": "1985-06-02",
+ "personalData": {
+ "age": 34
+ },
+ "postalCode": "12345"
+}
\ No newline at end of file
diff --git a/packages/example/src/components/examples/no-schemas/index.ts b/packages/example/src/components/examples/no-schemas/index.ts
new file mode 100644
index 0000000000..c382ba9191
--- /dev/null
+++ b/packages/example/src/components/examples/no-schemas/index.ts
@@ -0,0 +1,10 @@
+import data from './data.json';
+import { UISchemaElement, JsonSchema } from '@jsonforms/core';
+
+const schema = undefined;
+const uischema = undefined;
+export const input: {
+ schema: JsonSchema | undefined;
+ uischema: UISchemaElement | undefined;
+ data: any;
+} = { schema, uischema, data };
diff --git a/packages/example/src/components/examples/no-ui-schema/data.json b/packages/example/src/components/examples/no-ui-schema/data.json
new file mode 100644
index 0000000000..59a6d43787
--- /dev/null
+++ b/packages/example/src/components/examples/no-ui-schema/data.json
@@ -0,0 +1,9 @@
+{
+ "name": "John Doe",
+ "vegetarian": false,
+ "birthDate": "1985-06-02",
+ "personalData": {
+ "age": 34
+ },
+ "postalCode": "12345"
+}
\ No newline at end of file
diff --git a/packages/example/src/components/examples/no-ui-schema/index.ts b/packages/example/src/components/examples/no-ui-schema/index.ts
new file mode 100644
index 0000000000..190d6b2aef
--- /dev/null
+++ b/packages/example/src/components/examples/no-ui-schema/index.ts
@@ -0,0 +1,10 @@
+import schema from './schema.json';
+import data from './data.json';
+import { UISchemaElement, JsonSchema } from '@jsonforms/core';
+
+const uischema = undefined;
+export const input: {
+ schema: JsonSchema;
+ uischema: UISchemaElement | undefined;
+ data: any;
+} = { schema, uischema, data };
diff --git a/packages/example/src/components/examples/no-ui-schema/schema.json b/packages/example/src/components/examples/no-ui-schema/schema.json
new file mode 100644
index 0000000000..6dbc016e4e
--- /dev/null
+++ b/packages/example/src/components/examples/no-ui-schema/schema.json
@@ -0,0 +1,37 @@
+{
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string"
+ },
+ "vegetarian": {
+ "type": "boolean"
+ },
+ "birthDate": {
+ "type": "string"
+ },
+ "personalData": {
+ "type": "object",
+ "properties": {
+ "age": {
+ "type": "integer"
+ }
+ },
+ "additionalProperties": true,
+ "required": [
+ "age"
+ ]
+ },
+ "postalCode": {
+ "type": "string"
+ }
+ },
+ "additionalProperties": true,
+ "required": [
+ "name",
+ "vegetarian",
+ "birthDate",
+ "personalData",
+ "postalCode"
+ ]
+}
\ No newline at end of file
diff --git a/packages/example/src/components/examples/object/data.json b/packages/example/src/components/examples/object/data.json
new file mode 100644
index 0000000000..6d57b3ca6f
--- /dev/null
+++ b/packages/example/src/components/examples/object/data.json
@@ -0,0 +1,7 @@
+{
+ "address": {
+ "street_address": "1600 Pennsylvania Avenue NW",
+ "city": "Washington",
+ "state": "DC"
+ }
+}
\ No newline at end of file
diff --git a/packages/example/src/components/examples/object/index.ts b/packages/example/src/components/examples/object/index.ts
new file mode 100644
index 0000000000..8f5e656657
--- /dev/null
+++ b/packages/example/src/components/examples/object/index.ts
@@ -0,0 +1,10 @@
+import schema from './schema.json';
+import uischema from './uischema.json';
+import data from './data.json';
+import { UISchemaElement, JsonSchema } from '@jsonforms/core';
+
+export const input: {
+ schema: JsonSchema;
+ uischema: UISchemaElement;
+ data: any;
+} = { schema, uischema, data };
diff --git a/packages/example/src/components/examples/object/schema.json b/packages/example/src/components/examples/object/schema.json
new file mode 100644
index 0000000000..980dc09fa1
--- /dev/null
+++ b/packages/example/src/components/examples/object/schema.json
@@ -0,0 +1,40 @@
+{
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "type": "object",
+ "properties": {
+ "address": {
+ "type": "object",
+ "properties": {
+ "street_address": {
+ "type": "string"
+ },
+ "city": {
+ "type": "string"
+ },
+ "state": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "street_address",
+ "city",
+ "state"
+ ]
+ },
+ "user": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string"
+ },
+ "mail": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "name",
+ "mail"
+ ]
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/example/src/components/examples/object/uischema.json b/packages/example/src/components/examples/object/uischema.json
new file mode 100644
index 0000000000..e82adb78b0
--- /dev/null
+++ b/packages/example/src/components/examples/object/uischema.json
@@ -0,0 +1,21 @@
+{
+ "type": "VerticalLayout",
+ "elements": [
+ {
+ "type": "Control",
+ "scope": "#/properties/address"
+ },
+ {
+ "type": "Control",
+ "scope": "#/properties/user",
+ "rule": {
+ "effect": "SHOW",
+ "condition": {
+ "type": "LEAF",
+ "scope": "#/properties/address/properties/state",
+ "expectedValue": "DC"
+ }
+ }
+ }
+ ]
+}
\ No newline at end of file
diff --git a/packages/example/src/components/examples/oneOf-recursive/data.json b/packages/example/src/components/examples/oneOf-recursive/data.json
new file mode 100644
index 0000000000..7a73a41bfd
--- /dev/null
+++ b/packages/example/src/components/examples/oneOf-recursive/data.json
@@ -0,0 +1,2 @@
+{
+}
\ No newline at end of file
diff --git a/packages/example/src/components/examples/oneOf-recursive/index.ts b/packages/example/src/components/examples/oneOf-recursive/index.ts
new file mode 100644
index 0000000000..8f5e656657
--- /dev/null
+++ b/packages/example/src/components/examples/oneOf-recursive/index.ts
@@ -0,0 +1,10 @@
+import schema from './schema.json';
+import uischema from './uischema.json';
+import data from './data.json';
+import { UISchemaElement, JsonSchema } from '@jsonforms/core';
+
+export const input: {
+ schema: JsonSchema;
+ uischema: UISchemaElement;
+ data: any;
+} = { schema, uischema, data };
diff --git a/packages/example/src/components/examples/oneOf-recursive/schema.json b/packages/example/src/components/examples/oneOf-recursive/schema.json
new file mode 100644
index 0000000000..28c7c3ec02
--- /dev/null
+++ b/packages/example/src/components/examples/oneOf-recursive/schema.json
@@ -0,0 +1,49 @@
+{
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "definitions": {
+ "fileOrFolder": {
+ "title": "fileOrFolder",
+ "oneOf": [
+ {
+ "$ref": "#/definitions/file"
+ },
+ {
+ "$ref": "#/definitions/folder"
+ }
+ ]
+ },
+ "file": {
+ "title": "File",
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string"
+ }
+ }
+ },
+ "folder": {
+ "type": "object",
+ "title": "Folder",
+ "properties": {
+ "name": {
+ "type": "string"
+ },
+ "children": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/fileOrFolder"
+ }
+ }
+ }
+ }
+ },
+ "type": "object",
+ "properties": {
+ "root": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/folder"
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/example/src/components/examples/oneOf-recursive/uischema.json b/packages/example/src/components/examples/oneOf-recursive/uischema.json
new file mode 100644
index 0000000000..738e9e9c2c
--- /dev/null
+++ b/packages/example/src/components/examples/oneOf-recursive/uischema.json
@@ -0,0 +1,4 @@
+{
+ "type": "Control",
+ "scope": "#"
+}
\ No newline at end of file
diff --git a/packages/example/src/components/examples/oneOf/data.json b/packages/example/src/components/examples/oneOf/data.json
new file mode 100644
index 0000000000..200e28ad03
--- /dev/null
+++ b/packages/example/src/components/examples/oneOf/data.json
@@ -0,0 +1,3 @@
+{
+ "addressOrUser": {}
+}
\ No newline at end of file
diff --git a/packages/example/src/components/examples/oneOf/index.ts b/packages/example/src/components/examples/oneOf/index.ts
new file mode 100644
index 0000000000..8f5e656657
--- /dev/null
+++ b/packages/example/src/components/examples/oneOf/index.ts
@@ -0,0 +1,10 @@
+import schema from './schema.json';
+import uischema from './uischema.json';
+import data from './data.json';
+import { UISchemaElement, JsonSchema } from '@jsonforms/core';
+
+export const input: {
+ schema: JsonSchema;
+ uischema: UISchemaElement;
+ data: any;
+} = { schema, uischema, data };
diff --git a/packages/example/src/components/examples/oneOf/schema.json b/packages/example/src/components/examples/oneOf/schema.json
new file mode 100644
index 0000000000..6b96db35be
--- /dev/null
+++ b/packages/example/src/components/examples/oneOf/schema.json
@@ -0,0 +1,53 @@
+{
+ "definitions": {
+ "address": {
+ "type": "object",
+ "title": "Address",
+ "properties": {
+ "street_address": {
+ "type": "string"
+ },
+ "city": {
+ "type": "string"
+ },
+ "state": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "street_address",
+ "city",
+ "state"
+ ]
+ },
+ "user": {
+ "type": "object",
+ "title": "User",
+ "properties": {
+ "name": {
+ "type": "string"
+ },
+ "mail": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "name",
+ "mail"
+ ]
+ }
+ },
+ "type": "object",
+ "properties": {
+ "addressOrUser": {
+ "oneOf": [
+ {
+ "$ref": "#/definitions/address"
+ },
+ {
+ "$ref": "#/definitions/user"
+ }
+ ]
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/example/src/components/examples/oneOf/uischema.json b/packages/example/src/components/examples/oneOf/uischema.json
new file mode 100644
index 0000000000..8120bed021
--- /dev/null
+++ b/packages/example/src/components/examples/oneOf/uischema.json
@@ -0,0 +1,10 @@
+{
+ "type": "VerticalLayout",
+ "elements": [
+ {
+ "type": "Control",
+ "label": "Basic Information",
+ "scope": "#/properties/addressOrUser"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/packages/example/src/components/examples/radio-group/data.json b/packages/example/src/components/examples/radio-group/data.json
new file mode 100644
index 0000000000..9e26dfeeb6
--- /dev/null
+++ b/packages/example/src/components/examples/radio-group/data.json
@@ -0,0 +1 @@
+{}
\ No newline at end of file
diff --git a/packages/example/src/components/examples/radio-group/index.ts b/packages/example/src/components/examples/radio-group/index.ts
new file mode 100644
index 0000000000..8f5e656657
--- /dev/null
+++ b/packages/example/src/components/examples/radio-group/index.ts
@@ -0,0 +1,10 @@
+import schema from './schema.json';
+import uischema from './uischema.json';
+import data from './data.json';
+import { UISchemaElement, JsonSchema } from '@jsonforms/core';
+
+export const input: {
+ schema: JsonSchema;
+ uischema: UISchemaElement;
+ data: any;
+} = { schema, uischema, data };
diff --git a/packages/example/src/components/examples/radio-group/schema.json b/packages/example/src/components/examples/radio-group/schema.json
new file mode 100644
index 0000000000..63ad5224ea
--- /dev/null
+++ b/packages/example/src/components/examples/radio-group/schema.json
@@ -0,0 +1,30 @@
+{
+ "type": "object",
+ "properties": {
+ "exampleRadioEnum": {
+ "type": "string",
+ "enum": [
+ "One",
+ "Two",
+ "Three"
+ ]
+ },
+ "exampleRadioOneOfEnum": {
+ "type": "string",
+ "oneOf": [
+ {
+ "const": "foo",
+ "title": "Foo"
+ },
+ {
+ "const": "bar",
+ "title": "Bar"
+ },
+ {
+ "const": "foobar",
+ "title": "FooBar"
+ }
+ ]
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/example/src/components/examples/radio-group/uischema.json b/packages/example/src/components/examples/radio-group/uischema.json
new file mode 100644
index 0000000000..7622748d37
--- /dev/null
+++ b/packages/example/src/components/examples/radio-group/uischema.json
@@ -0,0 +1,31 @@
+{
+ "type": "VerticalLayout",
+ "elements": [
+ {
+ "type": "Group",
+ "label": "Simple enum",
+ "elements": [
+ {
+ "type": "Control",
+ "scope": "#/properties/exampleRadioEnum",
+ "options": {
+ "format": "radio"
+ }
+ }
+ ]
+ },
+ {
+ "type": "Group",
+ "label": "One of Enum",
+ "elements": [
+ {
+ "type": "Control",
+ "scope": "#/properties/exampleRadioOneOfEnum",
+ "options": {
+ "format": "radio"
+ }
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/packages/example/src/components/examples/radio/data.json b/packages/example/src/components/examples/radio/data.json
new file mode 100644
index 0000000000..9e26dfeeb6
--- /dev/null
+++ b/packages/example/src/components/examples/radio/data.json
@@ -0,0 +1 @@
+{}
\ No newline at end of file
diff --git a/packages/example/src/components/examples/radio/index.ts b/packages/example/src/components/examples/radio/index.ts
new file mode 100644
index 0000000000..8f5e656657
--- /dev/null
+++ b/packages/example/src/components/examples/radio/index.ts
@@ -0,0 +1,10 @@
+import schema from './schema.json';
+import uischema from './uischema.json';
+import data from './data.json';
+import { UISchemaElement, JsonSchema } from '@jsonforms/core';
+
+export const input: {
+ schema: JsonSchema;
+ uischema: UISchemaElement;
+ data: any;
+} = { schema, uischema, data };
diff --git a/packages/example/src/components/examples/radio/schema.json b/packages/example/src/components/examples/radio/schema.json
new file mode 100644
index 0000000000..1c54cdcc44
--- /dev/null
+++ b/packages/example/src/components/examples/radio/schema.json
@@ -0,0 +1,13 @@
+{
+ "type": "object",
+ "properties": {
+ "exampleRadioEnum": {
+ "type": "string",
+ "enum": [
+ "One",
+ "Two",
+ "Three"
+ ]
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/example/src/components/examples/radio/uischema.json b/packages/example/src/components/examples/radio/uischema.json
new file mode 100644
index 0000000000..5b92676686
--- /dev/null
+++ b/packages/example/src/components/examples/radio/uischema.json
@@ -0,0 +1,7 @@
+{
+ "type": "Control",
+ "scope": "#/properties/exampleRadioEnum",
+ "options": {
+ "format": "radio"
+ }
+}
\ No newline at end of file
diff --git a/packages/example/src/components/examples/root-object/data.json b/packages/example/src/components/examples/root-object/data.json
new file mode 100644
index 0000000000..6d57b3ca6f
--- /dev/null
+++ b/packages/example/src/components/examples/root-object/data.json
@@ -0,0 +1,7 @@
+{
+ "address": {
+ "street_address": "1600 Pennsylvania Avenue NW",
+ "city": "Washington",
+ "state": "DC"
+ }
+}
\ No newline at end of file
diff --git a/packages/example/src/components/examples/root-object/index.ts b/packages/example/src/components/examples/root-object/index.ts
new file mode 100644
index 0000000000..8f5e656657
--- /dev/null
+++ b/packages/example/src/components/examples/root-object/index.ts
@@ -0,0 +1,10 @@
+import schema from './schema.json';
+import uischema from './uischema.json';
+import data from './data.json';
+import { UISchemaElement, JsonSchema } from '@jsonforms/core';
+
+export const input: {
+ schema: JsonSchema;
+ uischema: UISchemaElement;
+ data: any;
+} = { schema, uischema, data };
diff --git a/packages/example/src/components/examples/root-object/schema.json b/packages/example/src/components/examples/root-object/schema.json
new file mode 100644
index 0000000000..980dc09fa1
--- /dev/null
+++ b/packages/example/src/components/examples/root-object/schema.json
@@ -0,0 +1,40 @@
+{
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "type": "object",
+ "properties": {
+ "address": {
+ "type": "object",
+ "properties": {
+ "street_address": {
+ "type": "string"
+ },
+ "city": {
+ "type": "string"
+ },
+ "state": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "street_address",
+ "city",
+ "state"
+ ]
+ },
+ "user": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string"
+ },
+ "mail": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "name",
+ "mail"
+ ]
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/example/src/components/examples/root-object/uischema.json b/packages/example/src/components/examples/root-object/uischema.json
new file mode 100644
index 0000000000..738e9e9c2c
--- /dev/null
+++ b/packages/example/src/components/examples/root-object/uischema.json
@@ -0,0 +1,4 @@
+{
+ "type": "Control",
+ "scope": "#"
+}
\ No newline at end of file
diff --git a/packages/example/src/components/examples/rule/data.json b/packages/example/src/components/examples/rule/data.json
new file mode 100644
index 0000000000..4e9c88e312
--- /dev/null
+++ b/packages/example/src/components/examples/rule/data.json
@@ -0,0 +1,5 @@
+{
+ "name": "John Doe",
+ "dead": false,
+ "vegetables": false
+}
\ No newline at end of file
diff --git a/packages/example/src/components/examples/rule/index.ts b/packages/example/src/components/examples/rule/index.ts
new file mode 100644
index 0000000000..8f5e656657
--- /dev/null
+++ b/packages/example/src/components/examples/rule/index.ts
@@ -0,0 +1,10 @@
+import schema from './schema.json';
+import uischema from './uischema.json';
+import data from './data.json';
+import { UISchemaElement, JsonSchema } from '@jsonforms/core';
+
+export const input: {
+ schema: JsonSchema;
+ uischema: UISchemaElement;
+ data: any;
+} = { schema, uischema, data };
diff --git a/packages/example/src/components/examples/rule/schema.json b/packages/example/src/components/examples/rule/schema.json
new file mode 100644
index 0000000000..ec8217353f
--- /dev/null
+++ b/packages/example/src/components/examples/rule/schema.json
@@ -0,0 +1,30 @@
+{
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string"
+ },
+ "dead": {
+ "type": "boolean"
+ },
+ "kindOfDead": {
+ "type": "string",
+ "enum": [
+ "Zombie",
+ "Vampire",
+ "Ghoul"
+ ]
+ },
+ "vegetables": {
+ "type": "boolean"
+ },
+ "kindOfVegetables": {
+ "type": "string",
+ "enum": [
+ "All",
+ "Some",
+ "Only potatoes"
+ ]
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/example/src/components/examples/rule/uischema.json b/packages/example/src/components/examples/rule/uischema.json
new file mode 100644
index 0000000000..0b214fc473
--- /dev/null
+++ b/packages/example/src/components/examples/rule/uischema.json
@@ -0,0 +1,58 @@
+{
+ "type": "VerticalLayout",
+ "elements": [
+ {
+ "type": "Control",
+ "label": "Name",
+ "scope": "#/properties/name"
+ },
+ {
+ "type": "Group",
+ "elements": [
+ {
+ "type": "Control",
+ "label": "Is Dead?",
+ "scope": "#/properties/dead"
+ },
+ {
+ "type": "Control",
+ "label": "Kind of dead",
+ "scope": "#/properties/kindOfDead",
+ "rule": {
+ "effect": "ENABLE",
+ "condition": {
+ "scope": "#/properties/dead",
+ "schema": {
+ "const": true
+ }
+ }
+ }
+ }
+ ]
+ },
+ {
+ "type": "Group",
+ "elements": [
+ {
+ "type": "Control",
+ "label": "Eats vegetables?",
+ "scope": "#/properties/vegetables"
+ },
+ {
+ "type": "Control",
+ "label": "Kind of vegetables",
+ "scope": "#/properties/kindOfVegetables",
+ "rule": {
+ "effect": "HIDE",
+ "condition": {
+ "scope": "#/properties/vegetables",
+ "schema": {
+ "const": false
+ }
+ }
+ }
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/packages/example/src/components/examples/vertical-layout/data.json b/packages/example/src/components/examples/vertical-layout/data.json
new file mode 100644
index 0000000000..59a6d43787
--- /dev/null
+++ b/packages/example/src/components/examples/vertical-layout/data.json
@@ -0,0 +1,9 @@
+{
+ "name": "John Doe",
+ "vegetarian": false,
+ "birthDate": "1985-06-02",
+ "personalData": {
+ "age": 34
+ },
+ "postalCode": "12345"
+}
\ No newline at end of file
diff --git a/packages/example/src/components/examples/vertical-layout/index.ts b/packages/example/src/components/examples/vertical-layout/index.ts
new file mode 100644
index 0000000000..8f5e656657
--- /dev/null
+++ b/packages/example/src/components/examples/vertical-layout/index.ts
@@ -0,0 +1,10 @@
+import schema from './schema.json';
+import uischema from './uischema.json';
+import data from './data.json';
+import { UISchemaElement, JsonSchema } from '@jsonforms/core';
+
+export const input: {
+ schema: JsonSchema;
+ uischema: UISchemaElement;
+ data: any;
+} = { schema, uischema, data };
diff --git a/packages/example/src/components/examples/vertical-layout/schema.json b/packages/example/src/components/examples/vertical-layout/schema.json
new file mode 100644
index 0000000000..215f8fd803
--- /dev/null
+++ b/packages/example/src/components/examples/vertical-layout/schema.json
@@ -0,0 +1,61 @@
+{
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 3,
+ "description": "Please enter your name"
+ },
+ "vegetarian": {
+ "type": "boolean"
+ },
+ "birthDate": {
+ "type": "string",
+ "format": "date"
+ },
+ "nationality": {
+ "type": "string",
+ "enum": [
+ "DE",
+ "IT",
+ "JP",
+ "US",
+ "RU",
+ "Other"
+ ]
+ },
+ "personalData": {
+ "type": "object",
+ "properties": {
+ "age": {
+ "type": "integer",
+ "description": "Please enter your age."
+ },
+ "height": {
+ "type": "number"
+ },
+ "drivingSkill": {
+ "type": "number",
+ "maximum": 10,
+ "minimum": 1,
+ "default": 7
+ }
+ },
+ "required": [
+ "age",
+ "height"
+ ]
+ },
+ "occupation": {
+ "type": "string"
+ },
+ "postalCode": {
+ "type": "string",
+ "maxLength": 5
+ }
+ },
+ "required": [
+ "occupation",
+ "nationality"
+ ]
+}
\ No newline at end of file
diff --git a/packages/example/src/components/examples/vertical-layout/uischema.json b/packages/example/src/components/examples/vertical-layout/uischema.json
new file mode 100644
index 0000000000..e57f4ba02e
--- /dev/null
+++ b/packages/example/src/components/examples/vertical-layout/uischema.json
@@ -0,0 +1,15 @@
+{
+ "type": "VerticalLayout",
+ "elements": [
+ {
+ "type": "Control",
+ "label": "Name",
+ "scope": "#/properties/name"
+ },
+ {
+ "type": "Control",
+ "label": "Birth Date",
+ "scope": "#/properties/birthDate"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/packages/example/src/core/jsonSchemaValidation.ts b/packages/example/src/core/jsonSchemaValidation.ts
new file mode 100644
index 0000000000..544a59d099
--- /dev/null
+++ b/packages/example/src/core/jsonSchemaValidation.ts
@@ -0,0 +1,122 @@
+import editorApi from 'monaco-editor/esm/vs/editor/editor.api';
+import * as monaco from 'monaco-editor/esm/vs/editor/editor.api';
+import { JsonSchema } from '@jsonforms/core';
+
+import { jsonSchemaDraft7, ruleSchema, uiSchema } from '../core/jsonschema';
+
+export type EditorApi = typeof editorApi;
+export type TextType = 'JSON' | 'JSON Schema' | 'UI Schema';
+
+/**
+ * Register a new schema for the Json language, if it isn't already registered.
+ * Schemas are identified by their uri and fileMatch rule, so that they don't
+ * leak into unrelated Json editors.
+ * @param editor
+ * The monaco editor
+ * @param schemas
+ * Schemas to register
+ */
+export const addSchema = (
+ editor: EditorApi,
+ schemas: {
+ uri: string;
+ fileMatch?: string[];
+ schema?: JsonSchema;
+ }[]
+): void => {
+ const registeredSchemas =
+ editor.languages.json.jsonDefaults.diagnosticsOptions.schemas;
+ if (registeredSchemas === undefined) {
+ editor.languages.json.jsonDefaults.setDiagnosticsOptions({
+ validate: true,
+ schemas: [...schemas],
+ });
+ } else {
+ for (const schema of schemas) {
+ const fileMatch = schema.fileMatch;
+
+ const gridSchema = registeredSchemas.find(
+ (registeredSchema) =>
+ registeredSchema.fileMatch === fileMatch &&
+ registeredSchema.uri === schema.uri
+ );
+ if (!gridSchema) {
+ registeredSchemas.push({ ...schema });
+ }
+ }
+ }
+};
+
+/**
+ * Configures the Monaco Editor to validate the input against JSON Schema Draft 7.
+ */
+export const configureJsonSchemaValidation = (
+ editor: EditorApi,
+ modelUri: monaco.Uri
+): void => {
+ /** Note that the Monaco Editor only supports JSON Schema Draft 7 itself,
+ * so if we also want to support a later standard we still have to formalize
+ * it in JSON Schema Draft 7*/
+ addSchema(editor, [
+ { ...jsonSchemaDraft7, fileMatch: [modelUri.toString()] },
+ ]);
+};
+
+/**
+ * Configures the Monaco Editor to validate the input against the Rule UI Schema meta-schema.
+ */
+export const configureRuleSchemaValidation = (
+ editor: EditorApi,
+ modelUri: monaco.Uri
+): void => {
+ /** Note that the Monaco Editor only supports JSON Schema Draft 7 itself,
+ * so if we also want to support a later standard we still have to formalize
+ * it in JSON Schema Draft 7*/
+ addSchema(editor, [
+ { ...jsonSchemaDraft7 },
+ { ...ruleSchema, fileMatch: [modelUri.toString()] },
+ ]);
+};
+
+/**
+ * Configures the Monaco Editor to validate the input against the UI Schema meta-schema.
+ */
+export const configureUISchemaValidation = (
+ editor: EditorApi,
+ modelUri: monaco.Uri
+): void => {
+ /** Note that the Monaco Editor only supports JSON Schema Draft 7 itself,
+ * so if we also want to support a later standard we still have to formalize
+ * it in JSON Schema Draft 7*/
+ addSchema(editor, [{ ...uiSchema, fileMatch: [modelUri.toString()] }]);
+};
+
+/**
+ * Configures the Monaco Editor to validate the input against JSON Schema model schema.
+ */
+export const configureDataValidation = (
+ editor: EditorApi,
+ schema: {
+ uri: string;
+ schema: JsonSchema;
+ }
+): void => {
+ /** Note that the Monaco Editor only supports JSON Schema Draft 7 itself,
+ * so if we also want to support a later standard we still have to formalize
+ * it in JSON Schema Draft 7*/
+ addSchema(editor, [{ ...schema }]);
+};
+
+export const getMonacoModelForUri = (
+ modelUri: monaco.Uri,
+ initialValue: string | undefined
+): editorApi.editor.ITextModel => {
+ const value = initialValue ?? '';
+ let model = monaco.editor.getModel(modelUri);
+ if (model) {
+ model.setValue(value);
+ } else {
+ model = monaco.editor.createModel(value, 'json', modelUri);
+ }
+ return model;
+};
diff --git a/packages/example/src/core/jsonschema/index.ts b/packages/example/src/core/jsonschema/index.ts
new file mode 100644
index 0000000000..d18aeb107f
--- /dev/null
+++ b/packages/example/src/core/jsonschema/index.ts
@@ -0,0 +1,18 @@
+import rule from './specification/rule.json';
+import schema from './specification/schema.json';
+import uischema from './specification/uischema.json';
+import { JsonSchema } from '@jsonforms/core';
+
+export const jsonSchemaDraft7 = {
+ uri: 'http://json-schema.org/draft-07/schema',
+ schema: schema as JsonSchema,
+};
+
+export const uiSchema = {
+ uri: 'http://jsonforms.io/uischema',
+ schema: uischema as JsonSchema,
+};
+export const ruleSchema = {
+ uri: 'http://jsonforms.io/uischema/rule',
+ schema: rule as JsonSchema,
+};
diff --git a/packages/example/src/core/jsonschema/specification/rule.json b/packages/example/src/core/jsonschema/specification/rule.json
new file mode 100644
index 0000000000..f2c5471f9a
--- /dev/null
+++ b/packages/example/src/core/jsonschema/specification/rule.json
@@ -0,0 +1,97 @@
+{
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "$id": "http://jsonforms.io/uischema/rule",
+ "title": "Rule UI schema meta-schema",
+ "type": ["object"],
+ "properties": {
+ "effect": {
+ "description": "The effect of the rule",
+ "type": "string",
+ "enum": ["HIDE", "SHOW", "ENABLE", "DISABLE"]
+ },
+ "condition": {
+ "description": "The condition of the rule that must evaluate to true in order to trigger the effect.",
+ "oneOf": [
+ { "$ref": "#/definitions/leafCondition" },
+ { "$ref": "#/definitions/schemaBasedCondition" },
+ { "$ref": "#/definitions/orCondition" },
+ { "$ref": "#/definitions/andCondition" }
+ ]
+ }
+ },
+ "required": ["effect", "condition"],
+ "definitions": {
+ "condition": {
+ "type": "object",
+ "properties": { "type": { "type": "string", "readOnly": true } }
+ },
+ "scopable": {
+ "type": "object",
+ "properties": {
+ "scope": { "type": "string" }
+ },
+ "required": ["scope"]
+ },
+ "leafCondition": {
+ "allOf": [
+ { "$ref": "#/definitions/scopable" },
+ {
+ "properties": {
+ "type": { "const": "LEAF" },
+ "expectedValue": {}
+ },
+ "required": ["type", "expectedValue"]
+ }
+ ]
+ },
+ "schemaBasedCondition": {
+ "allOf": [
+ { "$ref": "#/definitions/scopable" },
+ { "$ref": "#/definitions/condition" },
+ {
+ "properties": {
+ "schema": { "$ref": "http://json-schema.org/draft-07/schema#" }
+ },
+ "required": ["schema"]
+ }
+ ]
+ },
+ "composableCondition": {
+ "allOf": [
+ { "$ref": "#/definitions/condition" },
+ {
+ "properties": {
+ "conditions": {
+ "type": "array",
+ "items": { "$ref": "#/definitions/condition" }
+ }
+ },
+ "required": ["conditions"]
+ }
+ ]
+ },
+ "orCondition": {
+ "allOf": [
+ { "$ref": "#/definitions/composableCondition" },
+ {
+ "properties": {
+ "type": { "const": "OR" }
+ },
+ "required": ["type"]
+ }
+ ]
+ },
+ "andCondition": {
+ "allOf": [
+ { "$ref": "#/definitions/composableCondition" },
+ {
+ "properties": {
+ "type": { "const": "AND" }
+ },
+ "required": ["type"]
+ }
+ ]
+ }
+ }
+ }
+
\ No newline at end of file
diff --git a/packages/example/src/core/jsonschema/specification/schema.json b/packages/example/src/core/jsonschema/specification/schema.json
new file mode 100644
index 0000000000..9e7e67a8af
--- /dev/null
+++ b/packages/example/src/core/jsonschema/specification/schema.json
@@ -0,0 +1,167 @@
+{
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "$id": "http://json-schema.org/draft-07/schema#",
+ "title": "Core schema meta-schema",
+ "definitions": {
+ "schemaArray": {
+ "type": "array",
+ "minItems": 1,
+ "items": { "$ref": "#" }
+ },
+ "nonNegativeInteger": {
+ "type": "integer",
+ "minimum": 0
+ },
+ "nonNegativeIntegerDefault0": {
+ "allOf": [
+ { "$ref": "#/definitions/nonNegativeInteger" },
+ { "default": 0 }
+ ]
+ },
+ "simpleTypes": {
+ "enum": [
+ "array",
+ "boolean",
+ "integer",
+ "null",
+ "number",
+ "object",
+ "string"
+ ]
+ },
+ "stringArray": {
+ "type": "array",
+ "items": { "type": "string" },
+ "uniqueItems": true,
+ "default": []
+ }
+ },
+ "type": ["object", "boolean"],
+ "properties": {
+ "$id": {
+ "type": "string",
+ "format": "uri-reference"
+ },
+ "$schema": {
+ "type": "string",
+ "format": "uri"
+ },
+ "$ref": {
+ "type": "string",
+ "format": "uri-reference"
+ },
+ "$comment": {
+ "type": "string"
+ },
+ "title": {
+ "type": "string"
+ },
+ "description": {
+ "type": "string"
+ },
+ "default": true,
+ "readOnly": {
+ "type": "boolean",
+ "default": false
+ },
+ "writeOnly": {
+ "type": "boolean",
+ "default": false
+ },
+ "examples": {
+ "type": "array",
+ "items": true
+ },
+ "multipleOf": {
+ "type": "number",
+ "exclusiveMinimum": 0
+ },
+ "maximum": {
+ "type": "number"
+ },
+ "exclusiveMaximum": {
+ "type": "number"
+ },
+ "minimum": {
+ "type": "number"
+ },
+ "exclusiveMinimum": {
+ "type": "number"
+ },
+ "maxLength": { "$ref": "#/definitions/nonNegativeInteger" },
+ "minLength": { "$ref": "#/definitions/nonNegativeIntegerDefault0" },
+ "pattern": {
+ "type": "string",
+ "format": "regex"
+ },
+ "additionalItems": { "$ref": "#" },
+ "items": {
+ "anyOf": [{ "$ref": "#" }, { "$ref": "#/definitions/schemaArray" }],
+ "default": true
+ },
+ "maxItems": { "$ref": "#/definitions/nonNegativeInteger" },
+ "minItems": { "$ref": "#/definitions/nonNegativeIntegerDefault0" },
+ "uniqueItems": {
+ "type": "boolean",
+ "default": false
+ },
+ "contains": { "$ref": "#" },
+ "maxProperties": { "$ref": "#/definitions/nonNegativeInteger" },
+ "minProperties": { "$ref": "#/definitions/nonNegativeIntegerDefault0" },
+ "required": { "$ref": "#/definitions/stringArray" },
+ "additionalProperties": { "$ref": "#" },
+ "definitions": {
+ "type": "object",
+ "additionalProperties": { "$ref": "#" },
+ "default": {}
+ },
+ "properties": {
+ "type": "object",
+ "additionalProperties": { "$ref": "#" },
+ "default": {}
+ },
+ "patternProperties": {
+ "type": "object",
+ "additionalProperties": { "$ref": "#" },
+ "propertyNames": { "format": "regex" },
+ "default": {}
+ },
+ "dependencies": {
+ "type": "object",
+ "additionalProperties": {
+ "anyOf": [{ "$ref": "#" }, { "$ref": "#/definitions/stringArray" }]
+ }
+ },
+ "propertyNames": { "$ref": "#" },
+ "const": true,
+ "enum": {
+ "type": "array",
+ "items": true,
+ "minItems": 1,
+ "uniqueItems": true
+ },
+ "type": {
+ "anyOf": [
+ { "$ref": "#/definitions/simpleTypes" },
+ {
+ "type": "array",
+ "items": { "$ref": "#/definitions/simpleTypes" },
+ "minItems": 1,
+ "uniqueItems": true
+ }
+ ]
+ },
+ "format": { "type": "string" },
+ "contentMediaType": { "type": "string" },
+ "contentEncoding": { "type": "string" },
+ "if": { "$ref": "#" },
+ "then": { "$ref": "#" },
+ "else": { "$ref": "#" },
+ "allOf": { "$ref": "#/definitions/schemaArray" },
+ "anyOf": { "$ref": "#/definitions/schemaArray" },
+ "oneOf": { "$ref": "#/definitions/schemaArray" },
+ "not": { "$ref": "#" }
+ },
+ "default": true
+ }
+
\ No newline at end of file
diff --git a/packages/example/src/core/jsonschema/specification/uischema.json b/packages/example/src/core/jsonschema/specification/uischema.json
new file mode 100644
index 0000000000..c4023d5581
--- /dev/null
+++ b/packages/example/src/core/jsonschema/specification/uischema.json
@@ -0,0 +1,314 @@
+{
+ "$schema": "http://json-schema.org/draft-07/schema",
+ "type": "object",
+ "$id": "#root",
+ "properties": {
+ "type": {
+ "type": "string",
+ "enum": [
+ "HorizontalLayout",
+ "VerticalLayout",
+ "Group",
+ "Categorization"
+ ]
+ },
+ "label": {
+ "type": "string"
+ },
+ "elements": {
+ "$ref": "#/definitions/elements"
+ },
+ "rule": {
+ "$ref": "#/definitions/rule"
+ }
+ },
+ "definitions": {
+ "elements": {
+ "type": "array",
+ "$id": "#elements",
+ "items": {
+ "anyOf": [
+ {
+ "$ref": "#/definitions/control"
+ },
+ {
+ "$ref": "#/definitions/horizontallayout"
+ },
+ {
+ "$ref": "#/definitions/verticallayout"
+ },
+ {
+ "$ref": "#/definitions/categorization"
+ },
+ {
+ "$ref": "#/definitions/category"
+ },
+ {
+ "$ref": "#/definitions/group"
+ }
+ ]
+ }
+ },
+ "control": {
+ "type": "object",
+ "$id": "#control",
+ "properties": {
+ "type": {
+ "type": "string",
+ "const": "Control",
+ "default": "Control"
+ },
+ "label": {
+ "type": "string"
+ },
+ "scope": {
+ "$ref": "#/definitions/scope"
+ },
+ "options": {
+ "$ref": "#/definitions/options"
+ },
+ "rule": {
+ "$ref": "#/definitions/rule"
+ }
+ },
+ "required": ["type", "scope"],
+ "additionalProperties": false,
+ "errorMessage": {
+ "properties": {
+ "type": "type should be equal to one of the allowed values",
+ "scope": "Control scope should match pattern \"^#\\/properties\\/{1}\"",
+ "suggestion": "Control suggestion should be array",
+ "options": "Control options should be object",
+ "label": "Control label should be string, boolean or label object"
+ },
+ "required": {
+ "scope": "Control should have an object property \"scope\"",
+ "type": "Control should have a string property \"type\""
+ },
+ "additionalProperties": "Control should not have properties other than type, label, scope, options, suggestion and rule"
+ }
+ },
+ "horizontallayout": {
+ "type": "object",
+ "$id": "#horizontallayout",
+ "properties": {
+ "type": {
+ "type": "string",
+ "const": "HorizontalLayout",
+ "default": "HorizontalLayout"
+ },
+ "elements": {
+ "$ref": "#/definitions/elements"
+ },
+ "rule": {
+ "$ref": "#/definitions/rule"
+ }
+ },
+ "required": ["type", "elements"],
+ "additionalProperties": false,
+ "errorMessage": {
+ "properties": {
+ "type": "type should be equal to one of the allowed values"
+ },
+ "required": {
+ "elements": "Layout should have an array property \"elements\"",
+ "type": "Layout should have a string property \"type\""
+ },
+ "additionalProperties": "Layout should not have properties other than type and elements"
+ }
+ },
+ "verticallayout": {
+ "type": "object",
+ "$id": "#verticallayout",
+ "properties": {
+ "type": {
+ "type": "string",
+ "const": "VerticalLayout",
+ "default": "VerticalLayout"
+ },
+ "elements": {
+ "$ref": "#/definitions/elements"
+ },
+ "rule": {
+ "$ref": "#/definitions/rule"
+ }
+ },
+ "required": [
+ "type",
+ "elements"
+ ]
+ },
+ "categorization": {
+ "type": "object",
+ "$id": "#categorization",
+ "properties": {
+ "type": {
+ "type": "string",
+ "const": "Categorization",
+ "default": "Categorization"
+ },
+ "elements": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/category"
+ }
+ }
+ },
+ "required": [
+ "type",
+ "elements"
+ ],
+ "additionalProperties": false,
+ "errorMessage": {
+ "properties": {
+ "type": "type should be equal to one of the allowed values"
+ },
+ "required": {
+ "elements": "Categorization should have an array property \"elements\"",
+ "type": "Categorization should have a string property \"type\""
+ },
+ "additionalProperties": "Categorization should not have properties other than type and elements"
+ }
+ },
+ "category": {
+ "type": "object",
+ "$id": "#category",
+ "properties": {
+ "label": {
+ "type": "string"
+ },
+ "elements": {
+ "$ref": "#/definitions/elements"
+ },
+ "type": {
+ "type": "string",
+ "const": "Category",
+ "default": "Category"
+ },
+ "rule": {
+ "$ref": "#/definitions/rule"
+ }
+ },
+ "additionalProperties": false,
+ "errorMessage": {
+ "properties": {
+ "type": "type should be equal to one of the allowed values",
+ "label": "Category label should be string"
+ },
+ "required": {
+ "type": "Category layout should have a string property \"type\"",
+ "elements": "Category layout should have an array property \"elements\""
+ },
+ "additionalProperties": "Category layout should not have properties other than type,elements and label"
+ }
+ },
+ "group": {
+ "type": "object",
+ "$id": "#group",
+ "properties": {
+ "type": {
+ "type": "string",
+ "const": "Group",
+ "default": "Group"
+ },
+ "elements": {
+ "$ref": "#/definitions/elements"
+ },
+ "label": {
+ "type": "string"
+ }
+ },
+ "required": ["type", "elements", "label"],
+ "additionalProperties": false,
+ "errorMessage": {
+ "properties": {
+ "type": "type should be equal to one of the allowed values",
+ "label": "Group label should be string"
+ },
+ "required": {
+ "type": "Group layout should have a string property \"type\"",
+ "elements": "Group layout should have an array property \"elements\"",
+ "label": "Group layout should have a string property \"label\""
+ },
+ "additionalProperties": "Group layout should not have properties other than type,elements and label"
+ }
+ },
+ "rule": {
+ "type": "object",
+ "$id": "#rule",
+ "properties": {
+ "effect": {
+ "type": "string",
+ "enum": [
+ "HIDE",
+ "SHOW",
+ "DISABLE",
+ "ENABLE"
+ ]
+ },
+ "condition": {
+ "type": "object",
+ "properties": {
+ "type": {
+ "type": "string",
+ "const": "LEAF",
+ "default": "LEAF"
+ },
+ "scope": {
+ "$ref": "#/definitions/scope"
+ },
+ "expectedValue": {
+ "type": [
+ "string",
+ "integer",
+ "number",
+ "boolean"
+ ]
+ }
+ },
+ "required": [
+ "type",
+ "scope",
+ "expectedValue"
+ ]
+ }
+ },
+ "dependencies": {
+ "effect": ["condition"],
+ "condition": ["effect"]
+ },
+ "errorMessage": {
+ "dependencies": {
+ "effect": "Effect has to de defined",
+ "condition": "Condition has to be defined"
+ }
+ }
+ },
+ "scope": {
+ "type": "string",
+ "$id": "#scope",
+ "pattern": "^#\\/properties\\/{1}"
+ },
+ "options": {
+ "type": "object",
+ "$id": "#options",
+ "additionalProperties": true
+ }
+ },
+ "required": [
+ "elements",
+ "type"
+ ],
+ "additionalProperties": false,
+ "errorMessage": {
+ "properties": {
+ "type": "Root type should be equal to one of the allowed values",
+ "label": "Root label should be string"
+ },
+ "required": {
+ "elements": "Root should have an array property \"elements\"",
+ "type": "Root should have a string property \"type\""
+ },
+ "additionalProperties": "Root should not have properties other than type, elements, label and rule"
+ }
+}
\ No newline at end of file
diff --git a/packages/example/src/plugins/vuetify.ts b/packages/example/src/plugins/vuetify.ts
index 1448f4b669..31ca01c275 100644
--- a/packages/example/src/plugins/vuetify.ts
+++ b/packages/example/src/plugins/vuetify.ts
@@ -1,6 +1,49 @@
import Vue from 'vue';
-import Vuetify from 'vuetify/lib/framework';
+import Vuetify from 'vuetify/lib';
+import { VuetifyPreset } from 'vuetify/types/services/presets';
Vue.use(Vuetify);
-export default new Vuetify({});
+export const preset: Partial = {
+ icons: {
+ iconfont: 'mdi',
+ values: {},
+ },
+ theme: {
+ dark: false,
+ default: 'light',
+ disable: false,
+ options: {
+ cspNonce: undefined,
+ customProperties: undefined,
+ minifyTheme: undefined,
+ themeCache: undefined,
+ },
+ themes: {
+ light: {
+ primary: '#1976D2',
+ secondary: '#424242',
+ accent: '#82B1FF',
+ error: '#FF5252',
+ info: '#2196F3',
+ success: '#4CAF50',
+ warning: '#FB8C00',
+ },
+ dark: {
+ primary: '#2196F3',
+ secondary: '#424242',
+ accent: '#FF4081',
+ error: '#FF5252',
+ info: '#2196F3',
+ success: '#4CAF50',
+ warning: '#FB8C00',
+ },
+ },
+ },
+};
+
+export default new Vuetify({
+ preset,
+ rtl: false,
+ theme: { dark: false },
+});
diff --git a/packages/example/vue.config.js b/packages/example/vue.config.js
index 86974699a4..c8a6639bda 100644
--- a/packages/example/vue.config.js
+++ b/packages/example/vue.config.js
@@ -1,3 +1,24 @@
+const MonacoWebpackPlugin = require("monaco-editor-webpack-plugin");
+
module.exports = {
+ chainWebpack: (config) => {
+ // remove typecheck
+ config.plugins.delete("fork-ts-checker");
+
+ config.plugin("monaco-editor").use(MonacoWebpackPlugin, [
+ {
+ // Languages are loaded on demand at runtime
+ languages: ["json"],
+ },
+ ]);
+
+ return config;
+ },
+ devServer: {
+ watchOptions: {
+ ignored: ['node_modules'],
+ poll: true,
+ },
+ },
transpileDependencies: ['vuetify'],
};
diff --git a/packages/vue2-vuetify/package.json b/packages/vue2-vuetify/package.json
index d83b0d3527..f7189dfd14 100644
--- a/packages/vue2-vuetify/package.json
+++ b/packages/vue2-vuetify/package.json
@@ -32,10 +32,14 @@
"build": "rollup --config rollup.config.js",
"watch": "rollup --watch --config rollup.config.js"
},
+ "dependencies": {
+ "dayjs": "1.10.6"
+ },
"peerDependencies": {
"vue": "^2.6.11",
"@vue/composition-api": "^1.0.0-rc.3",
"vuetify": "^2.4.0",
+ "@mdi/font": "^5.9.55",
"@jsonforms/core": "^3.0.0-alpha.1",
"@jsonforms/vue2": "^3.0.0-alpha.1"
},
@@ -64,6 +68,9 @@
"typescript": "~4.1.5",
"vue": "^2.6.14",
"vue-template-compiler": "^2.6.14",
- "vuetify": "^2.4.0"
+ "vuetify": "^2.4.0",
+ "@mdi/font": "^5.9.55",
+ "@types/jest": "^24.0.23",
+ "@types/lodash": "^4.14.172"
}
}
diff --git a/packages/vue2-vuetify/rollup.config.js b/packages/vue2-vuetify/rollup.config.js
index c31e853a1f..5e2ef6523c 100644
--- a/packages/vue2-vuetify/rollup.config.js
+++ b/packages/vue2-vuetify/rollup.config.js
@@ -2,6 +2,7 @@ import vue from 'rollup-plugin-vue';
import babel from '@rollup/plugin-babel';
import typescript from 'rollup-plugin-typescript2';
import resolve from '@rollup/plugin-node-resolve';
+import commonjs from '@rollup/plugin-commonjs';
import packageJson from './package.json';
@@ -19,13 +20,30 @@ const buildFormats = [
'@vue/composition-api',
'@jsonforms/core',
'@jsonforms/vue2',
- 'lodash/*',
+ 'lodash/startCase',
+ 'lodash/isEmpty',
+ 'lodash/findIndex',
+ 'lodash/merge',
+ 'lodash/cloneDeep',
+ 'lodash/mergeWith',
+ 'lodash/isArray',
+ 'lodash/every',
+ 'lodash/isString',
'vuetify/lib',
+ '@mdi/font',
],
plugins: [
resolve({
extensions: ['.js', '.jsx', '.ts', '.tsx', '.vue'],
}),
+ commonjs({
+ namedExports: {
+ dayjs: ['dayjs'],
+ 'dayjs/plugin/customParseFormat': ['customParsing'],
+ 'dayjs/plugin/utc': ['utc'],
+ 'dayjs/plugin/timezone': ['timezone'],
+ },
+ }),
vue({
css: true,
template: {
diff --git a/packages/vue2-vuetify/src/additional/LabelRenderer.vue b/packages/vue2-vuetify/src/additional/LabelRenderer.vue
new file mode 100644
index 0000000000..44e93ea8f6
--- /dev/null
+++ b/packages/vue2-vuetify/src/additional/LabelRenderer.vue
@@ -0,0 +1,51 @@
+
+
+ {{ this.layoutUiSchema.text }}
+
+
+
+
diff --git a/packages/vue2-vuetify/src/additional/ListWithDetailRenderer.vue b/packages/vue2-vuetify/src/additional/ListWithDetailRenderer.vue
new file mode 100644
index 0000000000..9dac4a59e2
--- /dev/null
+++ b/packages/vue2-vuetify/src/additional/ListWithDetailRenderer.vue
@@ -0,0 +1,345 @@
+
+
+
+
+
+ {{
+ computedLabel
+ }}
+
+
+
+
+
+
+ mdi-plus
+
+
+ {{ `Add to ${control.label}` }}
+
+
+
+
+
+ No data
+
+
+
+
+
+
+
+
+
+ {{
+ index + 1
+ }}
+
+
+
+
+
+
+
+ {{ childLabelForIndex(index) }}
+
+ {{ childLabelForIndex(index) }}
+
+
+
+
+
+
+
+ mdi-arrow-up
+
+
+ Move Up
+
+
+
+
+
+
+ mdi-arrow-down
+
+
+ Move Down
+
+
+
+
+
+
+ mdi-delete
+
+
+ Delete
+
+
+
+
+
+
+
+
+ No Selection
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/vue2-vuetify/src/additional/index.ts b/packages/vue2-vuetify/src/additional/index.ts
new file mode 100644
index 0000000000..8ae994c211
--- /dev/null
+++ b/packages/vue2-vuetify/src/additional/index.ts
@@ -0,0 +1,10 @@
+export { default as LabelRenderer } from './LabelRenderer.vue';
+export { default as ListWithDetailRenderer } from './ListWithDetailRenderer.vue';
+
+import { entry as labelRendererEntry } from './LabelRenderer.vue';
+import { entry as listWithDetailRendererEntry } from './ListWithDetailRenderer.vue';
+
+export const additionalRenderers = [
+ labelRendererEntry,
+ listWithDetailRendererEntry,
+];
diff --git a/packages/vue2-vuetify/src/array/index.ts b/packages/vue2-vuetify/src/array/index.ts
new file mode 100644
index 0000000000..319cc1c15b
--- /dev/null
+++ b/packages/vue2-vuetify/src/array/index.ts
@@ -0,0 +1,13 @@
+import {
+ JsonFormsRendererRegistryEntry,
+ rankWith,
+ schemaTypeIs,
+} from '@jsonforms/core';
+import { ArrayLayoutRenderer } from '../layouts';
+
+export const arrayListRendererEntry: JsonFormsRendererRegistryEntry = {
+ renderer: ArrayLayoutRenderer,
+ tester: rankWith(2, schemaTypeIs('array')),
+};
+
+export const arrayRenderers = [arrayListRendererEntry];
diff --git a/packages/vue2-vuetify/src/complex/AllOfRenderer.vue b/packages/vue2-vuetify/src/complex/AllOfRenderer.vue
new file mode 100644
index 0000000000..9d52f7ec7b
--- /dev/null
+++ b/packages/vue2-vuetify/src/complex/AllOfRenderer.vue
@@ -0,0 +1,95 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/vue2-vuetify/src/complex/AnyOfRenderer.vue b/packages/vue2-vuetify/src/complex/AnyOfRenderer.vue
new file mode 100644
index 0000000000..1b1d04c81a
--- /dev/null
+++ b/packages/vue2-vuetify/src/complex/AnyOfRenderer.vue
@@ -0,0 +1,108 @@
+
+
+
+
+
+
+ {{ anyOfRenderInfo.label }}
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/vue2-vuetify/src/complex/ArrayControlRenderer.vue b/packages/vue2-vuetify/src/complex/ArrayControlRenderer.vue
new file mode 100644
index 0000000000..c8d7b30a68
--- /dev/null
+++ b/packages/vue2-vuetify/src/complex/ArrayControlRenderer.vue
@@ -0,0 +1,335 @@
+
+
+
+
+ {{
+ computedLabel
+ }}
+
+
+
+
+
+
+ mdi-plus
+
+
+ {{ `Add to ${control.label}` }}
+
+
+
+
+
+
+
+
+
+
+ {{ title(prop) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ mdi-arrow-up
+
+
+ Move Up
+
+
+
+
+ mdi-arrow-down
+
+
+ Move Down
+
+
+
+
+ mdi-delete
+
+
+ Delete
+
+
+
+
+
+
+
+
+ No data
+
+
+
+
+
+
+
+
diff --git a/packages/vue2-vuetify/src/complex/EnumArrayRenderer.vue b/packages/vue2-vuetify/src/complex/EnumArrayRenderer.vue
new file mode 100644
index 0000000000..2cf68329f0
--- /dev/null
+++ b/packages/vue2-vuetify/src/complex/EnumArrayRenderer.vue
@@ -0,0 +1,126 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/vue2-vuetify/src/complex/ObjectRenderer.vue b/packages/vue2-vuetify/src/complex/ObjectRenderer.vue
new file mode 100644
index 0000000000..88c40b53f6
--- /dev/null
+++ b/packages/vue2-vuetify/src/complex/ObjectRenderer.vue
@@ -0,0 +1,75 @@
+
+
+
+
+
+
+
diff --git a/packages/vue2-vuetify/src/complex/OneOfRenderer.vue b/packages/vue2-vuetify/src/complex/OneOfRenderer.vue
new file mode 100644
index 0000000000..a2a34feadc
--- /dev/null
+++ b/packages/vue2-vuetify/src/complex/OneOfRenderer.vue
@@ -0,0 +1,235 @@
+
+
+
+
+
+
+ {{ oneOfRenderInfo.label }}
+
+
+
+
+
+
+
+
+
+
+
+ Clear form?
+
+
+ Your data will be cleared if you navigate away from this tab. Do you
+ want to proceed?
+
+
+
+
+
+ No
+ Yes
+
+
+
+
+
+
+
diff --git a/packages/vue2-vuetify/src/complex/components/CombinatorProperties.vue b/packages/vue2-vuetify/src/complex/components/CombinatorProperties.vue
new file mode 100644
index 0000000000..5c606079e7
--- /dev/null
+++ b/packages/vue2-vuetify/src/complex/components/CombinatorProperties.vue
@@ -0,0 +1,67 @@
+
+
+
+
+
+
+
diff --git a/packages/vue2-vuetify/src/complex/components/index.ts b/packages/vue2-vuetify/src/complex/components/index.ts
new file mode 100644
index 0000000000..31f2572e93
--- /dev/null
+++ b/packages/vue2-vuetify/src/complex/components/index.ts
@@ -0,0 +1 @@
+export { default as CombinatorProperties } from './CombinatorProperties.vue';
diff --git a/packages/vue2-vuetify/src/complex/index.ts b/packages/vue2-vuetify/src/complex/index.ts
new file mode 100644
index 0000000000..4fc25c031c
--- /dev/null
+++ b/packages/vue2-vuetify/src/complex/index.ts
@@ -0,0 +1,22 @@
+export { default as AllOfRenderer } from './AllOfRenderer.vue';
+export { default as AnyOfRenderer } from './AnyOfRenderer.vue';
+export { default as ArrayControlRenderer } from './ArrayControlRenderer.vue';
+export { default as EnumArrayRenderer } from './EnumArrayRenderer.vue';
+export { default as ObjectRenderer } from './ObjectRenderer.vue';
+export { default as OneOfRenderer } from './OneOfRenderer.vue';
+
+import { entry as allOfRendererEntry } from './AllOfRenderer.vue';
+import { entry as anyOfRendererEntry } from './AnyOfRenderer.vue';
+import { entry as arrayControlRendererEntry } from './ArrayControlRenderer.vue';
+import { entry as enumArrayRendererEntry } from './EnumArrayRenderer.vue';
+import { entry as objectRendererEntry } from './ObjectRenderer.vue';
+import { entry as oneOfRendererEntry } from './OneOfRenderer.vue';
+
+export const complexRenderers = [
+ allOfRendererEntry,
+ anyOfRendererEntry,
+ arrayControlRendererEntry,
+ enumArrayRendererEntry,
+ objectRendererEntry,
+ oneOfRendererEntry,
+];
diff --git a/packages/vue2-vuetify/src/controls/AnyOfStringOrEnumControlRenderer.vue b/packages/vue2-vuetify/src/controls/AnyOfStringOrEnumControlRenderer.vue
new file mode 100644
index 0000000000..3fe39caef0
--- /dev/null
+++ b/packages/vue2-vuetify/src/controls/AnyOfStringOrEnumControlRenderer.vue
@@ -0,0 +1,119 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/vue2-vuetify/src/controls/BooleanControlRenderer.vue b/packages/vue2-vuetify/src/controls/BooleanControlRenderer.vue
new file mode 100644
index 0000000000..d71e1f4dbc
--- /dev/null
+++ b/packages/vue2-vuetify/src/controls/BooleanControlRenderer.vue
@@ -0,0 +1,65 @@
+
+
+
+
+
+
+
diff --git a/packages/vue2-vuetify/src/controls/BooleanToggleControlRenderer.vue b/packages/vue2-vuetify/src/controls/BooleanToggleControlRenderer.vue
new file mode 100644
index 0000000000..129338567c
--- /dev/null
+++ b/packages/vue2-vuetify/src/controls/BooleanToggleControlRenderer.vue
@@ -0,0 +1,66 @@
+
+
+
+
+
+
+
diff --git a/packages/vue2-vuetify/src/controls/ControlRenderer.vue b/packages/vue2-vuetify/src/controls/ControlRenderer.vue
deleted file mode 100644
index aeee47a521..0000000000
--- a/packages/vue2-vuetify/src/controls/ControlRenderer.vue
+++ /dev/null
@@ -1,50 +0,0 @@
-
-
-
-
-
-
diff --git a/packages/vue2-vuetify/src/controls/ControlWrapper.vue b/packages/vue2-vuetify/src/controls/ControlWrapper.vue
new file mode 100644
index 0000000000..392575a636
--- /dev/null
+++ b/packages/vue2-vuetify/src/controls/ControlWrapper.vue
@@ -0,0 +1,82 @@
+
+
+
+
+
+
+
diff --git a/packages/vue2-vuetify/src/controls/DateControlRenderer.vue b/packages/vue2-vuetify/src/controls/DateControlRenderer.vue
new file mode 100644
index 0000000000..8072bfd7cf
--- /dev/null
+++ b/packages/vue2-vuetify/src/controls/DateControlRenderer.vue
@@ -0,0 +1,65 @@
+
+
+
+
+
+
+
diff --git a/packages/vue2-vuetify/src/controls/DateTimeControlRenderer.vue b/packages/vue2-vuetify/src/controls/DateTimeControlRenderer.vue
new file mode 100644
index 0000000000..5f7d0a9f2f
--- /dev/null
+++ b/packages/vue2-vuetify/src/controls/DateTimeControlRenderer.vue
@@ -0,0 +1,90 @@
+
+
+
+
+
+
+
diff --git a/packages/vue2-vuetify/src/controls/EnumControlRenderer.vue b/packages/vue2-vuetify/src/controls/EnumControlRenderer.vue
index 05316818f4..4620b220de 100644
--- a/packages/vue2-vuetify/src/controls/EnumControlRenderer.vue
+++ b/packages/vue2-vuetify/src/controls/EnumControlRenderer.vue
@@ -1,49 +1,72 @@
-
-
-
-
+
+
+
+
+
diff --git a/packages/vue2-vuetify/src/controls/MultiStringControlRenderer.vue b/packages/vue2-vuetify/src/controls/MultiStringControlRenderer.vue
new file mode 100644
index 0000000000..ac3842f6f1
--- /dev/null
+++ b/packages/vue2-vuetify/src/controls/MultiStringControlRenderer.vue
@@ -0,0 +1,87 @@
+
+
+
+
+
+
+
+
+
diff --git a/packages/vue2-vuetify/src/controls/NumberControlRenderer.vue b/packages/vue2-vuetify/src/controls/NumberControlRenderer.vue
new file mode 100644
index 0000000000..24144be72b
--- /dev/null
+++ b/packages/vue2-vuetify/src/controls/NumberControlRenderer.vue
@@ -0,0 +1,75 @@
+
+
+
+
+
+
+
diff --git a/packages/vue2-vuetify/src/controls/OneOfEnumControlRenderer.vue b/packages/vue2-vuetify/src/controls/OneOfEnumControlRenderer.vue
index 77cf1c88c2..f630bcb00b 100644
--- a/packages/vue2-vuetify/src/controls/OneOfEnumControlRenderer.vue
+++ b/packages/vue2-vuetify/src/controls/OneOfEnumControlRenderer.vue
@@ -1,47 +1,72 @@
-
-
+
+
+
+
diff --git a/packages/vue2-vuetify/src/controls/OneOfRadioGroupControlRenderer.vue b/packages/vue2-vuetify/src/controls/OneOfRadioGroupControlRenderer.vue
new file mode 100644
index 0000000000..ed7376c9bd
--- /dev/null
+++ b/packages/vue2-vuetify/src/controls/OneOfRadioGroupControlRenderer.vue
@@ -0,0 +1,76 @@
+
+
+ {{ computedLabel }}
+
+
+
+
+
+
+
diff --git a/packages/vue2-vuetify/src/controls/PasswordControlRenderer.vue b/packages/vue2-vuetify/src/controls/PasswordControlRenderer.vue
new file mode 100644
index 0000000000..7a9dddde47
--- /dev/null
+++ b/packages/vue2-vuetify/src/controls/PasswordControlRenderer.vue
@@ -0,0 +1,85 @@
+
+
+ (passwordVisible = !passwordVisible)"
+ :id="control.id + '-input'"
+ :class="styles.control.input"
+ :disabled="!control.enabled"
+ :autofocus="appliedOptions.focus"
+ :placeholder="appliedOptions.placeholder"
+ :label="computedLabel"
+ :hint="control.description"
+ :persistent-hint="persistentHint()"
+ :required="control.required"
+ :error-messages="control.errors"
+ v-model="control.data"
+ :maxlength="
+ appliedOptions.restrict ? control.schema.maxLength : undefined
+ "
+ :size="
+ appliedOptions.trim && control.schema.maxLength !== undefined
+ ? control.schema.maxLength
+ : undefined
+ "
+ @change="onChange"
+ @focus="isFocused = true"
+ @blur="isFocused = false"
+ />
+
+
+
+
diff --git a/packages/vue2-vuetify/src/controls/RadioGroupControlRenderer.vue b/packages/vue2-vuetify/src/controls/RadioGroupControlRenderer.vue
new file mode 100644
index 0000000000..3a2c6cc8a5
--- /dev/null
+++ b/packages/vue2-vuetify/src/controls/RadioGroupControlRenderer.vue
@@ -0,0 +1,76 @@
+
+
+ {{ computedLabel }}
+
+
+
+
+
+
+
diff --git a/packages/vue2-vuetify/src/controls/SliderControlRenderer.vue b/packages/vue2-vuetify/src/controls/SliderControlRenderer.vue
new file mode 100644
index 0000000000..cc5bc2bf0b
--- /dev/null
+++ b/packages/vue2-vuetify/src/controls/SliderControlRenderer.vue
@@ -0,0 +1,70 @@
+
+
+
+
+
+
+
diff --git a/packages/vue2-vuetify/src/controls/StringControlRenderer.vue b/packages/vue2-vuetify/src/controls/StringControlRenderer.vue
new file mode 100644
index 0000000000..f121c7b313
--- /dev/null
+++ b/packages/vue2-vuetify/src/controls/StringControlRenderer.vue
@@ -0,0 +1,133 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/vue2-vuetify/src/controls/TimeControlRenderer.vue b/packages/vue2-vuetify/src/controls/TimeControlRenderer.vue
new file mode 100644
index 0000000000..5f267c46f0
--- /dev/null
+++ b/packages/vue2-vuetify/src/controls/TimeControlRenderer.vue
@@ -0,0 +1,65 @@
+
+
+
+
+
+
+
diff --git a/packages/vue2-vuetify/src/controls/components/ValidationBadge.vue b/packages/vue2-vuetify/src/controls/components/ValidationBadge.vue
new file mode 100644
index 0000000000..4a4e4a19b2
--- /dev/null
+++ b/packages/vue2-vuetify/src/controls/components/ValidationBadge.vue
@@ -0,0 +1,119 @@
+
+
+
+
+
+
+ {{ errors.length }}
+
+
+
+
+
+ Validation Errors
+
+ {{ message }}
+
+
+
+
+
+
+
diff --git a/packages/vue2-vuetify/src/controls/components/ValidationIcon.vue b/packages/vue2-vuetify/src/controls/components/ValidationIcon.vue
new file mode 100644
index 0000000000..c581b1af42
--- /dev/null
+++ b/packages/vue2-vuetify/src/controls/components/ValidationIcon.vue
@@ -0,0 +1,26 @@
+
+
+ mdi-alert-circle-outline
+
+
+
+
diff --git a/packages/vue2-vuetify/src/controls/components/index.ts b/packages/vue2-vuetify/src/controls/components/index.ts
new file mode 100644
index 0000000000..87028e7c11
--- /dev/null
+++ b/packages/vue2-vuetify/src/controls/components/index.ts
@@ -0,0 +1,2 @@
+export { default as ValidationBadge } from './ValidationBadge.vue';
+export { default as ValidationIcon } from './ValidationIcon.vue';
diff --git a/packages/vue2-vuetify/src/controls/directives/DisabledIconFocus.ts b/packages/vue2-vuetify/src/controls/directives/DisabledIconFocus.ts
new file mode 100644
index 0000000000..bcb550d0d0
--- /dev/null
+++ b/packages/vue2-vuetify/src/controls/directives/DisabledIconFocus.ts
@@ -0,0 +1,9 @@
+export const DisabledIconFocus = {
+ componentUpdated(el: HTMLElement): void {
+ el.querySelectorAll('.v-input__icon button').forEach((x) =>
+ x.setAttribute('tabindex', '-1')
+ );
+ },
+};
+
+export default DisabledIconFocus;
diff --git a/packages/vue2-vuetify/src/controls/directives/index.ts b/packages/vue2-vuetify/src/controls/directives/index.ts
new file mode 100644
index 0000000000..9606c8e20e
--- /dev/null
+++ b/packages/vue2-vuetify/src/controls/directives/index.ts
@@ -0,0 +1 @@
+export { default as DisabledIconFocus } from './DisabledIconFocus';
diff --git a/packages/vue2-vuetify/src/controls/index.ts b/packages/vue2-vuetify/src/controls/index.ts
index 45e407fac0..c27af691d0 100644
--- a/packages/vue2-vuetify/src/controls/index.ts
+++ b/packages/vue2-vuetify/src/controls/index.ts
@@ -1,14 +1,53 @@
-export { default as ControlRenderer } from './ControlRenderer.vue';
-import { entry as controlRendererEntry } from './ControlRenderer.vue';
-
+export { default as AnyOfStringOrEnumControlRenderer } from './AnyOfStringOrEnumControlRenderer.vue';
+export { default as BooleanControlRenderer } from './BooleanControlRenderer.vue';
+export { default as BooleanToggleControlRenderer } from './BooleanToggleControlRenderer.vue';
+export { default as ControlWrapper } from './ControlWrapper.vue';
+export { default as DateControlRenderer } from './DateControlRenderer.vue';
+export { default as DateTimeControlRenderer } from './DateTimeControlRenderer.vue';
export { default as EnumControlRenderer } from './EnumControlRenderer.vue';
-import { entry as enumControlRendererEntry } from './EnumControlRenderer.vue';
-
+export { default as IntegerControlRenderer } from './IntegerControlRenderer.vue';
+export { default as MultiStringControlRenderer } from './MultiStringControlRenderer.vue';
+export { default as NumberControlRenderer } from './NumberControlRenderer.vue';
export { default as OneOfEnumControlRenderer } from './OneOfEnumControlRenderer.vue';
+export { default as OneOfRadioGroupControlRenderer } from './OneOfRadioGroupControlRenderer.vue';
+export { default as PasswordControlRenderer } from './PasswordControlRenderer.vue';
+export { default as RadioGroupControlRenderer } from './RadioGroupControlRenderer.vue';
+export { default as SliderControlRenderer } from './SliderControlRenderer.vue';
+export { default as StringControlRenderer } from './StringControlRenderer.vue';
+export { default as TimeControlRenderer } from './TimeControlRenderer.vue';
+
+import { entry as anyOfStringOrEnumControlRendererEntry } from './AnyOfStringOrEnumControlRenderer.vue';
+import { entry as booleanControlRendererEntry } from './BooleanControlRenderer.vue';
+import { entry as booleanToggleControlRendererEntry } from './BooleanToggleControlRenderer.vue';
+import { entry as dateControlRendererEntry } from './DateControlRenderer.vue';
+import { entry as dateTimeControlRendererEntry } from './DateTimeControlRenderer.vue';
+import { entry as enumControlRendererEntry } from './EnumControlRenderer.vue';
+import { entry as integerControlRendererEntry } from './IntegerControlRenderer.vue';
+import { entry as multiStringControlRendererEntry } from './MultiStringControlRenderer.vue';
+import { entry as numberControlRendererEntry } from './NumberControlRenderer.vue';
import { entry as oneOfEnumControlRendererEntry } from './OneOfEnumControlRenderer.vue';
+import { entry as oneOfRadioGroupControlRendererEntry } from './OneOfRadioGroupControlRenderer.vue';
+import { entry as passwordControlRendererEntry } from './PasswordControlRenderer.vue';
+import { entry as radioGroupControlRendererEntry } from './RadioGroupControlRenderer.vue';
+import { entry as sliderControlRendererEntry } from './SliderControlRenderer.vue';
+import { entry as stringControlRendererEntry } from './StringControlRenderer.vue';
+import { entry as timeControlRendererEntry } from './TimeControlRenderer.vue';
export const controlRenderers = [
- controlRendererEntry,
+ anyOfStringOrEnumControlRendererEntry,
+ booleanControlRendererEntry,
+ booleanToggleControlRendererEntry,
+ dateControlRendererEntry,
+ dateTimeControlRendererEntry,
enumControlRendererEntry,
+ integerControlRendererEntry,
+ multiStringControlRendererEntry,
+ numberControlRendererEntry,
oneOfEnumControlRendererEntry,
+ oneOfRadioGroupControlRendererEntry,
+ passwordControlRendererEntry,
+ radioGroupControlRendererEntry,
+ sliderControlRendererEntry,
+ stringControlRendererEntry,
+ timeControlRendererEntry,
];
diff --git a/packages/vue2-vuetify/src/extended/AutocompleteEnumControlRenderer.vue b/packages/vue2-vuetify/src/extended/AutocompleteEnumControlRenderer.vue
new file mode 100644
index 0000000000..c59440fcde
--- /dev/null
+++ b/packages/vue2-vuetify/src/extended/AutocompleteEnumControlRenderer.vue
@@ -0,0 +1,103 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/vue2-vuetify/src/extended/AutocompleteOneOfEnumControlRenderer.vue b/packages/vue2-vuetify/src/extended/AutocompleteOneOfEnumControlRenderer.vue
new file mode 100644
index 0000000000..17d9d2b181
--- /dev/null
+++ b/packages/vue2-vuetify/src/extended/AutocompleteOneOfEnumControlRenderer.vue
@@ -0,0 +1,103 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/vue2-vuetify/src/extended/index.ts b/packages/vue2-vuetify/src/extended/index.ts
new file mode 100644
index 0000000000..5c37277325
--- /dev/null
+++ b/packages/vue2-vuetify/src/extended/index.ts
@@ -0,0 +1,10 @@
+export { default as AutocompleteEnumControlRenderer } from './AutocompleteEnumControlRenderer.vue';
+export { default as AutocompleteOneOfEnumControlRenderer } from './AutocompleteOneOfEnumControlRenderer.vue';
+
+import { entry as autocompleteEnumControlRendererEntry } from './AutocompleteEnumControlRenderer.vue';
+import { entry as autocompleteOneOfEnumControlRendererEntry } from './AutocompleteOneOfEnumControlRenderer.vue';
+
+export const extendedRenderers = [
+ autocompleteEnumControlRendererEntry,
+ autocompleteOneOfEnumControlRendererEntry,
+];
diff --git a/packages/vue2-vuetify/src/index.ts b/packages/vue2-vuetify/src/index.ts
index 59ce1d2b66..ee3a5bd8ce 100644
--- a/packages/vue2-vuetify/src/index.ts
+++ b/packages/vue2-vuetify/src/index.ts
@@ -1 +1,9 @@
+export * from './additional';
+export * from './array';
+export * from './complex';
+export * from './controls';
+export * from './extended';
+export * from './layouts';
+export * from './styles';
+export * from './util';
export * from './renderers';
diff --git a/packages/vue2-vuetify/src/layouts/ArrayLayoutRenderer.vue b/packages/vue2-vuetify/src/layouts/ArrayLayoutRenderer.vue
new file mode 100644
index 0000000000..db87c52d38
--- /dev/null
+++ b/packages/vue2-vuetify/src/layouts/ArrayLayoutRenderer.vue
@@ -0,0 +1,317 @@
+
+
+
+
+ {{
+ computedLabel
+ }}
+
+
+
+
+
+
+ mdi-plus
+
+
+ {{ `Add to ${control.label}` }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{
+ index + 1
+ }}
+
+
+
+ {{ childLabelForIndex(index) }}
+
+
+
+
+
+ Move Up
+
+
+
+
+
+
+
+ Move Down
+
+
+
+
+
+
+
+ Delete
+
+
+
+
+
+
+
+
+
+
+
+
+
+ No data
+
+
+
+
+
+
+
diff --git a/packages/vue2-vuetify/src/layouts/CategorizationRenderer.vue b/packages/vue2-vuetify/src/layouts/CategorizationRenderer.vue
new file mode 100644
index 0000000000..6acb7ae169
--- /dev/null
+++ b/packages/vue2-vuetify/src/layouts/CategorizationRenderer.vue
@@ -0,0 +1,106 @@
+
+
+
+
+ {{ element.label }}
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/vue2-vuetify/src/layouts/CategorizationStepperRenderer.vue b/packages/vue2-vuetify/src/layouts/CategorizationStepperRenderer.vue
new file mode 100644
index 0000000000..447e26a7a5
--- /dev/null
+++ b/packages/vue2-vuetify/src/layouts/CategorizationStepperRenderer.vue
@@ -0,0 +1,163 @@
+
+
+
+
+
+
+ {{ element.label }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Back
+
+
+
+ Next
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/vue2-vuetify/src/layouts/GroupRenderer.vue b/packages/vue2-vuetify/src/layouts/GroupRenderer.vue
new file mode 100644
index 0000000000..ea9a72e8c0
--- /dev/null
+++ b/packages/vue2-vuetify/src/layouts/GroupRenderer.vue
@@ -0,0 +1,77 @@
+
+
+ {{ groupLayoutUiSchema.label }}
+
+
+
+
+
+
+
+
diff --git a/packages/vue2-vuetify/src/layouts/HorizontalLayoutRenderer.vue b/packages/vue2-vuetify/src/layouts/HorizontalLayoutRenderer.vue
new file mode 100644
index 0000000000..51762a6f15
--- /dev/null
+++ b/packages/vue2-vuetify/src/layouts/HorizontalLayoutRenderer.vue
@@ -0,0 +1,70 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/vue2-vuetify/src/layouts/LayoutRenderer.vue b/packages/vue2-vuetify/src/layouts/LayoutRenderer.vue
deleted file mode 100644
index 1bd1331203..0000000000
--- a/packages/vue2-vuetify/src/layouts/LayoutRenderer.vue
+++ /dev/null
@@ -1,54 +0,0 @@
-
-
-
-
-
-
-
-
-
diff --git a/packages/vue2-vuetify/src/layouts/VerticalLayoutRenderer.vue b/packages/vue2-vuetify/src/layouts/VerticalLayoutRenderer.vue
new file mode 100644
index 0000000000..7b0ee5a83f
--- /dev/null
+++ b/packages/vue2-vuetify/src/layouts/VerticalLayoutRenderer.vue
@@ -0,0 +1,71 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/vue2-vuetify/src/layouts/index.ts b/packages/vue2-vuetify/src/layouts/index.ts
index e56dba0e5c..ef057a6c9e 100644
--- a/packages/vue2-vuetify/src/layouts/index.ts
+++ b/packages/vue2-vuetify/src/layouts/index.ts
@@ -1,5 +1,36 @@
-export { default as LayoutRenderer } from './LayoutRenderer.vue';
+import {
+ JsonFormsRendererRegistryEntry,
+ rankWith,
+ isLayout,
+} from '@jsonforms/core';
-import { entry as layoutRendererEntry } from './LayoutRenderer.vue';
+import { entry as arrayLayoutRendererEntry } from './ArrayLayoutRenderer.vue';
+import { entry as categorizationRendererEntry } from './CategorizationRenderer.vue';
+import { entry as categorizationStepperRendererEntry } from './CategorizationStepperRenderer.vue';
+import { entry as groupRendererEntry } from './GroupRenderer.vue';
+import { entry as horizontalLayoutRendererEntry } from './HorizontalLayoutRenderer.vue';
+import { entry as verticalLayoutRendererEntry } from './VerticalLayoutRenderer.vue';
+import { default as VerticalLayoutRenderer } from './VerticalLayoutRenderer.vue';
-export const layoutRenderers = [layoutRendererEntry];
+export { default as ArrayLayoutRenderer } from './ArrayLayoutRenderer.vue';
+export { default as CategorizationRenderer } from './CategorizationRenderer.vue';
+export { default as CategorizationStepperRenderer } from './CategorizationStepperRenderer.vue';
+export { default as GroupRenderer } from './GroupRenderer.vue';
+export { default as HorizontalLayoutRenderer } from './HorizontalLayoutRenderer.vue';
+export { default as VerticalLayoutRenderer } from './VerticalLayoutRenderer.vue';
+
+// default layout renderer is the VerticalLayoutRenderer
+const layoutRendererEntry: JsonFormsRendererRegistryEntry = {
+ renderer: VerticalLayoutRenderer,
+ tester: rankWith(1, isLayout),
+};
+
+export const layoutRenderers = [
+ layoutRendererEntry,
+ arrayLayoutRendererEntry,
+ categorizationRendererEntry,
+ categorizationStepperRendererEntry,
+ groupRendererEntry,
+ horizontalLayoutRendererEntry,
+ verticalLayoutRendererEntry,
+];
diff --git a/packages/vue2-vuetify/src/renderers.ts b/packages/vue2-vuetify/src/renderers.ts
index 6c161fd39c..8e711241c1 100644
--- a/packages/vue2-vuetify/src/renderers.ts
+++ b/packages/vue2-vuetify/src/renderers.ts
@@ -1,7 +1,19 @@
-export * from './controls';
-export * from './layouts';
-
+import { additionalRenderers } from './additional';
+import { arrayRenderers } from './array';
+import { complexRenderers } from './complex';
import { controlRenderers } from './controls';
+import { extendedRenderers } from './extended';
import { layoutRenderers } from './layouts';
-export const vuetifyRenderers = [...controlRenderers, ...layoutRenderers];
+export const vuetifyRenderers = [
+ ...additionalRenderers,
+ ...arrayRenderers,
+ ...complexRenderers,
+ ...controlRenderers,
+ ...layoutRenderers,
+];
+
+export const extendedVuetifyRenderers = [
+ ...extendedRenderers,
+ ...vuetifyRenderers,
+];
diff --git a/packages/vue2-vuetify/src/styles/defaultStyles.ts b/packages/vue2-vuetify/src/styles/defaultStyles.ts
new file mode 100644
index 0000000000..b5a32324d2
--- /dev/null
+++ b/packages/vue2-vuetify/src/styles/defaultStyles.ts
@@ -0,0 +1,38 @@
+import { Styles } from './styles';
+
+export const defaultStyles: Styles = {
+ control: {
+ root: 'control',
+ input: 'input',
+ },
+ verticalLayout: {
+ root: 'vertical-layout',
+ item: 'vertical-layout-item',
+ },
+ horizontalLayout: {
+ root: 'horizontal-layout',
+ item: 'horizontal-layout-item',
+ },
+ group: {
+ root: 'group',
+ label: 'group-label',
+ item: 'group-item',
+ },
+ arrayList: {
+ root: 'array-list',
+ toolbar: 'array-list-toolbar',
+ addButton: 'array-list-add',
+ label: 'array-list-label',
+ noData: 'array-list-no-data',
+ item: 'array-list-item',
+ itemHeader: 'array-list-item-header',
+ itemLabel: 'array-list-item-label',
+ itemContent: 'array-list-item-content',
+ itemMoveUp: 'array-list-item-move-up',
+ itemMoveDown: 'array-list-item-move-down',
+ itemDelete: 'array-list-item-delete',
+ },
+ label: {
+ root: 'label-element',
+ },
+};
diff --git a/packages/vue2-vuetify/src/styles/index.ts b/packages/vue2-vuetify/src/styles/index.ts
new file mode 100644
index 0000000000..2161b5dcd8
--- /dev/null
+++ b/packages/vue2-vuetify/src/styles/index.ts
@@ -0,0 +1,3 @@
+export * from './styles';
+export * from './util';
+export * from './defaultStyles';
diff --git a/packages/vue2-vuetify/src/styles/styles.ts b/packages/vue2-vuetify/src/styles/styles.ts
new file mode 100644
index 0000000000..8303f5ed73
--- /dev/null
+++ b/packages/vue2-vuetify/src/styles/styles.ts
@@ -0,0 +1,67 @@
+import { UISchemaElement } from '@jsonforms/core';
+import { inject } from '../vue';
+import merge from 'lodash/merge';
+import { defaultStyles } from './defaultStyles';
+
+const createEmptyStyles = (): Styles => ({
+ control: {},
+ verticalLayout: {},
+ horizontalLayout: {},
+ group: {},
+ arrayList: {},
+ label: {},
+});
+
+export interface Styles {
+ control: {
+ root?: string;
+ input?: string;
+ };
+ verticalLayout: {
+ root?: string;
+ item?: string;
+ };
+ horizontalLayout: {
+ root?: string;
+ item?: string;
+ };
+ group: {
+ root?: string;
+ label?: string;
+ item?: string;
+ };
+ arrayList: {
+ root?: string;
+ toolbar?: string;
+ addButton?: string;
+ label?: string;
+ noData?: string;
+ item?: string;
+ itemHeader?: string;
+ itemLabel?: string;
+ itemContent?: string;
+ itemMoveUp?: string;
+ itemMoveDown?: string;
+ itemDelete?: string;
+ };
+ label: {
+ root?: string;
+ };
+}
+
+export const useStyles = (element?: UISchemaElement): Styles => {
+ const userStyles = inject('styles', defaultStyles);
+ if (!element?.options?.styles) {
+ return userStyles;
+ }
+ const styles = createEmptyStyles();
+ if (userStyles) {
+ merge(styles, userStyles);
+ } else {
+ merge(styles, defaultStyles);
+ }
+ if (element?.options?.styles) {
+ merge(styles, element.options.styles);
+ }
+ return styles;
+};
diff --git a/packages/vue2-vuetify/src/styles/util.ts b/packages/vue2-vuetify/src/styles/util.ts
new file mode 100644
index 0000000000..aa459bf43f
--- /dev/null
+++ b/packages/vue2-vuetify/src/styles/util.ts
@@ -0,0 +1,36 @@
+import { Styles } from './styles';
+import cloneDeep from 'lodash/cloneDeep';
+import mergeWith from 'lodash/mergeWith';
+
+export const classes = (
+ strings: TemplateStringsArray,
+ ...variables: any[]
+): string => {
+ return strings
+ .reduce((acc, curr, index) => {
+ return `${acc}${curr}${variables[index] || ''}`;
+ }, '')
+ .trim();
+};
+
+/**
+ * Helper function to merge two styles definitions. The contained classes will be combined, not overwritten.
+ *
+ * Example usage:
+ * ```ts
+ * const myStyles = mergeStyles(defaultStyles, { control: { root: 'mycontrol' } });
+ * ```
+ */
+export const mergeStyles = (
+ stylesA: Partial,
+ stylesB: Partial
+): Partial => {
+ const styles = cloneDeep(stylesA);
+ mergeWith(styles, stylesB, (aValue, bValue) => {
+ if (typeof aValue === 'string' && typeof bValue === 'string') {
+ return `${aValue} ${bValue}`;
+ }
+ return undefined;
+ });
+ return styles;
+};
diff --git a/packages/vue2-vuetify/src/util/composition.ts b/packages/vue2-vuetify/src/util/composition.ts
new file mode 100644
index 0000000000..0432234a3d
--- /dev/null
+++ b/packages/vue2-vuetify/src/util/composition.ts
@@ -0,0 +1,149 @@
+import {
+ composePaths,
+ computeLabel,
+ getFirstPrimitiveProp,
+ isDescriptionHidden,
+ Resolve,
+} from '@jsonforms/core';
+import cloneDeep from 'lodash/cloneDeep';
+import merge from 'lodash/merge';
+import { useStyles } from '../styles';
+import { computed, ComputedRef, ref } from '../vue';
+
+const useControlAppliedOptions = (input: I) => {
+ return computed(() =>
+ merge(
+ {},
+ cloneDeep(input.control.value.config),
+ cloneDeep(input.control.value.uischema.options)
+ )
+ );
+};
+
+const useComputedLabel = (
+ input: I,
+ appliedOptions: ComputedRef
+) => {
+ return computed((): string => {
+ return computeLabel(
+ input.control.value.label,
+ input.control.value.required,
+ !!appliedOptions.value?.hideRequiredAsterisk
+ );
+ });
+};
+
+/**
+ * Adds styles, isFocused, appliedOptions and onChange
+ */
+export const useVuetifyControl = <
+ I extends { control: any; handleChange: any }
+>(
+ input: I,
+ adaptValue: (target: any) => any = (v) => v
+) => {
+ const appliedOptions = useControlAppliedOptions(input);
+
+ const isFocused = ref(false);
+ const onChange = (value: any) => {
+ input.handleChange(input.control.value.path, adaptValue(value));
+ };
+
+ const persistentHint = (): boolean => {
+ return !isDescriptionHidden(
+ input.control.value.visible,
+ input.control.value.description,
+ isFocused.value,
+ !!appliedOptions.value?.showUnfocusedDescription
+ );
+ };
+
+ const computedLabel = useComputedLabel(input, appliedOptions);
+
+ const controlWrapper = computed(() => {
+ const { id, description, errors, label, visible, required } =
+ input.control.value;
+ return { id, description, errors, label, visible, required };
+ });
+
+ const styles = useStyles(input.control.value.uischema);
+
+ return {
+ ...input,
+ styles,
+ isFocused,
+ appliedOptions,
+ controlWrapper,
+ onChange,
+ persistentHint,
+ computedLabel,
+ };
+};
+
+/**
+ * Adds styles and appliedOptions
+ */
+export const useVuetifyLayout = (input: I) => {
+ const appliedOptions = computed(() =>
+ merge(
+ {},
+ cloneDeep(input.layout.value.config),
+ cloneDeep(input.layout.value.uischema.options)
+ )
+ );
+ return {
+ ...input,
+ styles: useStyles(input.layout.value.uischema),
+ appliedOptions,
+ };
+};
+
+/**
+ * Adds styles, appliedOptions and childUiSchema
+ */
+export const useVuetifyArrayControl = (
+ input: I
+) => {
+ const appliedOptions = useControlAppliedOptions(input);
+
+ const computedLabel = useComputedLabel(input, appliedOptions);
+
+ const childLabelForIndex = (index: number) => {
+ const childLabelProp =
+ input.control.value.uischema.options?.childLabelProp ??
+ getFirstPrimitiveProp(input.control.value.schema);
+ if (!childLabelProp) {
+ return `${index}`;
+ }
+ const labelValue = Resolve.data(
+ input.control.value.data,
+ composePaths(`${index}`, childLabelProp)
+ );
+ if (labelValue === undefined || labelValue === null || isNaN(labelValue)) {
+ return '';
+ }
+ return `${labelValue}`;
+ };
+ return {
+ ...input,
+ styles: useStyles(input.control.value.uischema),
+ appliedOptions,
+ childLabelForIndex,
+ computedLabel,
+ };
+};
+
+/**
+ * Adds styles, appliedOptions and childUiSchema
+ */
+export const useVuetifyMultiEnumControl = (
+ input: I
+) => {
+ const appliedOptions = useControlAppliedOptions(input);
+
+ return {
+ ...input,
+ styles: useStyles(input.control.value.uischema),
+ appliedOptions,
+ };
+};
diff --git a/packages/vue2-vuetify/src/util/datejs.ts b/packages/vue2-vuetify/src/util/datejs.ts
new file mode 100644
index 0000000000..7c3c1de10b
--- /dev/null
+++ b/packages/vue2-vuetify/src/util/datejs.ts
@@ -0,0 +1,23 @@
+import dayjs from 'dayjs';
+import customParsing from 'dayjs/plugin/customParseFormat';
+import utc from 'dayjs/plugin/utc';
+import timezone from 'dayjs/plugin/timezone'; // dependent on utc plugin
+
+// required for the custom save formats in the date, time and date-time pickers
+dayjs.extend(customParsing);
+dayjs.extend(utc);
+dayjs.extend(timezone);
+
+export const parseDateTime = (
+ data: string | null | undefined,
+ format: string | string[] | undefined
+): dayjs.Dayjs | null => {
+ if (!data) {
+ return null;
+ }
+ const dayjsData = dayjs(data, format);
+ if (!dayjsData.isValid()) {
+ return null;
+ }
+ return dayjsData;
+};
diff --git a/packages/vue2-vuetify/src/util/index.ts b/packages/vue2-vuetify/src/util/index.ts
new file mode 100644
index 0000000000..3f367a8dee
--- /dev/null
+++ b/packages/vue2-vuetify/src/util/index.ts
@@ -0,0 +1,4 @@
+export * from './options';
+export * from './composition';
+export * from './validator';
+export * from './datejs';
diff --git a/packages/vue2-vuetify/src/util/options.ts b/packages/vue2-vuetify/src/util/options.ts
new file mode 100644
index 0000000000..0c490ea992
--- /dev/null
+++ b/packages/vue2-vuetify/src/util/options.ts
@@ -0,0 +1,6 @@
+export interface Options {
+ showUnfocusedDescription?: boolean;
+ hideRequiredAsterisk?: boolean;
+ focus?: boolean;
+ step?: number;
+}
diff --git a/packages/vue2-vuetify/src/util/validator.ts b/packages/vue2-vuetify/src/util/validator.ts
new file mode 100644
index 0000000000..e25f7e59a6
--- /dev/null
+++ b/packages/vue2-vuetify/src/util/validator.ts
@@ -0,0 +1,9 @@
+import { Options } from 'ajv';
+import { createAjv as createAjvCore } from '@jsonforms/core';
+import AJV from 'ajv';
+
+export const createAjv = (options?: Options): AJV.Ajv => {
+ const ajv = createAjvCore(options);
+ ajv.addFormat('password', (_) => true);
+ return ajv;
+};
diff --git a/packages/vue2-vuetify/src/vue.ts b/packages/vue2-vuetify/src/vue.ts
new file mode 100644
index 0000000000..48c3637134
--- /dev/null
+++ b/packages/vue2-vuetify/src/vue.ts
@@ -0,0 +1,19 @@
+/**
+ * Switch between Vue 3 and Vue 2 '@vue/composition-api'.
+ */
+export {
+ computed,
+ defineComponent,
+ inject,
+ onBeforeMount,
+ onUnmounted,
+ reactive,
+ ref,
+ watch,
+ watchEffect,
+} from '@vue/composition-api';
+export type { Ref, ComputedRef } from '@vue/composition-api';
+/**
+ * Compatibility type as defineComponent of '@vue/composition-api' can't properly handle PropTypes.
+ */
+export type CompType<_S, V> = V;
From d57ba102693f60a7eb58e7cb53e4175f98ad8c0b Mon Sep 17 00:00:00 2001
From: Stefan Dirix
Date: Sun, 26 Sep 2021 20:54:23 +0200
Subject: [PATCH 006/185] Polish contributed Vuetify renderer set
Minor overhaul to the contributed Vuetify renderer set. Prime change
is to bind via value instead of v-model in the renderers. Also the
built library no longer bundles any dependency.
Includes numerous minor changes like adjusted style classes,
refactored multi-enum-binding, fixing Typescript and linting issues,
fixed array child labels, etc.
---
packages/example/package.json | 2 +-
packages/vue2-vuetify/.eslintrc.js | 2 +
packages/vue2-vuetify/package.json | 8 +--
packages/vue2-vuetify/rollup.config.js | 17 +++---
.../src/additional/LabelRenderer.vue | 8 +--
.../src/additional/ListWithDetailRenderer.vue | 28 +++++-----
.../src/complex/ArrayControlRenderer.vue | 7 ++-
.../src/complex/EnumArrayRenderer.vue | 38 ++++++-------
.../components/CombinatorProperties.vue | 4 +-
.../AnyOfStringOrEnumControlRenderer.vue | 18 +++----
.../src/controls/BooleanControlRenderer.vue | 7 ++-
.../controls/BooleanToggleControlRenderer.vue | 2 +-
.../src/controls/ControlWrapper.vue | 53 -------------------
.../src/controls/DateControlRenderer.vue | 2 +-
.../src/controls/DateTimeControlRenderer.vue | 2 +-
.../src/controls/EnumControlRenderer.vue | 2 +-
.../src/controls/IntegerControlRenderer.vue | 16 ++----
.../controls/MultiStringControlRenderer.vue | 2 +-
.../src/controls/NumberControlRenderer.vue | 10 ++--
.../src/controls/OneOfEnumControlRenderer.vue | 2 +-
.../OneOfRadioGroupControlRenderer.vue | 2 +-
.../src/controls/PasswordControlRenderer.vue | 2 +-
.../controls/RadioGroupControlRenderer.vue | 2 +-
.../src/controls/SliderControlRenderer.vue | 2 +-
.../src/controls/StringControlRenderer.vue | 4 +-
.../src/controls/TimeControlRenderer.vue | 2 +-
.../AutocompleteEnumControlRenderer.vue | 4 +-
.../AutocompleteOneOfEnumControlRenderer.vue | 4 +-
.../src/layouts/ArrayLayoutRenderer.vue | 5 +-
.../src/layouts/CategorizationRenderer.vue | 29 ++++------
.../layouts/CategorizationStepperRenderer.vue | 31 +++++------
.../src/layouts/GroupRenderer.vue | 16 ++----
.../src/layouts/HorizontalLayoutRenderer.vue | 8 +--
.../src/layouts/VerticalLayoutRenderer.vue | 8 +--
.../vue2-vuetify/src/styles/defaultStyles.ts | 16 ++++++
packages/vue2-vuetify/src/styles/styles.ts | 18 +++++++
packages/vue2-vuetify/src/util/composition.ts | 30 +++++++++--
37 files changed, 184 insertions(+), 229 deletions(-)
diff --git a/packages/example/package.json b/packages/example/package.json
index 5b94eb55fe..26f1b01574 100644
--- a/packages/example/package.json
+++ b/packages/example/package.json
@@ -11,7 +11,7 @@
"@jsonforms/core": "3.0.0-alpha.1",
"@jsonforms/vue2": "3.0.0-alpha.1",
"@jsonforms/vue2-vuetify": "3.0.0-alpha.1",
- "@vue/composition-api": "^1.0.0-rc.3",
+ "@vue/composition-api": "1.0.0-rc.3",
"core-js": "^3.6.5",
"vue": "^2.6.14",
"vuetify": "^2.4.0",
diff --git a/packages/vue2-vuetify/.eslintrc.js b/packages/vue2-vuetify/.eslintrc.js
index 87fa7ce65e..92d57b1e9e 100644
--- a/packages/vue2-vuetify/.eslintrc.js
+++ b/packages/vue2-vuetify/.eslintrc.js
@@ -17,5 +17,7 @@ module.exports = {
'no-console': 'warn',
'no-debugger': 'warn',
'@typescript-eslint/no-explicit-any': 'off',
+ '@typescript-eslint/explicit-function-return-type': 'off',
+ '@typescript-eslint/explicit-module-boundary-types': 'off',
},
};
diff --git a/packages/vue2-vuetify/package.json b/packages/vue2-vuetify/package.json
index f7189dfd14..eb6f0f7292 100644
--- a/packages/vue2-vuetify/package.json
+++ b/packages/vue2-vuetify/package.json
@@ -33,11 +33,12 @@
"watch": "rollup --watch --config rollup.config.js"
},
"dependencies": {
- "dayjs": "1.10.6"
+ "dayjs": "^1.10.6",
+ "lodash": "^4.17.15"
},
"peerDependencies": {
"vue": "^2.6.11",
- "@vue/composition-api": "^1.0.0-rc.3",
+ "@vue/composition-api": "1.0.0-rc.3",
"vuetify": "^2.4.0",
"@mdi/font": "^5.9.55",
"@jsonforms/core": "^3.0.0-alpha.1",
@@ -53,7 +54,7 @@
"@typescript-eslint/parser": "^4.18.0",
"@vue/eslint-config-prettier": "^6.0.0",
"@vue/eslint-config-typescript": "^7.0.0",
- "@vue/composition-api": "^1.0.0-rc.3",
+ "@vue/composition-api": "1.0.0-rc.3",
"rimraf": "^3.0.2",
"rollup": "^2.52.8",
"@rollup/plugin-commonjs": "^14.0.0",
@@ -61,6 +62,7 @@
"rollup-plugin-typescript2": "^0.30.0",
"rollup-plugin-vue": "^5.1.9",
"@rollup/plugin-node-resolve": "^9.0.0",
+ "rollup-plugin-visualizer": "^5.5.2",
"eslint": "^6.7.2",
"eslint-plugin-prettier": "^3.3.1",
"eslint-plugin-vue": "^6.2.2",
diff --git a/packages/vue2-vuetify/rollup.config.js b/packages/vue2-vuetify/rollup.config.js
index 5e2ef6523c..bf072962ea 100644
--- a/packages/vue2-vuetify/rollup.config.js
+++ b/packages/vue2-vuetify/rollup.config.js
@@ -3,6 +3,7 @@ import babel from '@rollup/plugin-babel';
import typescript from 'rollup-plugin-typescript2';
import resolve from '@rollup/plugin-node-resolve';
import commonjs from '@rollup/plugin-commonjs';
+import visualizer from 'rollup-plugin-visualizer';
import packageJson from './package.json';
@@ -20,6 +21,7 @@ const buildFormats = [
'@vue/composition-api',
'@jsonforms/core',
'@jsonforms/vue2',
+ 'lodash',
'lodash/startCase',
'lodash/isEmpty',
'lodash/findIndex',
@@ -29,21 +31,19 @@ const buildFormats = [
'lodash/isArray',
'lodash/every',
'lodash/isString',
+ 'lodash/omit',
'vuetify/lib',
'@mdi/font',
+ 'dayjs',
+ 'dayjs/plugin/customParseFormat',
+ 'dayjs/plugin/utc',
+ 'dayjs/plugin/timezone',
],
plugins: [
resolve({
extensions: ['.js', '.jsx', '.ts', '.tsx', '.vue'],
}),
- commonjs({
- namedExports: {
- dayjs: ['dayjs'],
- 'dayjs/plugin/customParseFormat': ['customParsing'],
- 'dayjs/plugin/utc': ['utc'],
- 'dayjs/plugin/timezone': ['timezone'],
- },
- }),
+ commonjs(),
vue({
css: true,
template: {
@@ -61,6 +61,7 @@ const buildFormats = [
extensions: ['.js', '.jsx', '.ts', '.tsx', '.vue'],
babelHelpers: 'bundled',
}),
+ visualizer(),
],
},
];
diff --git a/packages/vue2-vuetify/src/additional/LabelRenderer.vue b/packages/vue2-vuetify/src/additional/LabelRenderer.vue
index 44e93ea8f6..cf73c5a818 100644
--- a/packages/vue2-vuetify/src/additional/LabelRenderer.vue
+++ b/packages/vue2-vuetify/src/additional/LabelRenderer.vue
@@ -1,6 +1,6 @@
- {{ this.layoutUiSchema.text }}
+ {{ layout.uischema.text }}
@@ -10,7 +10,6 @@ import {
Layout,
rankWith,
uiTypeIs,
- LabelElement,
} from '@jsonforms/core';
import { defineComponent } from '../vue';
import {
@@ -35,11 +34,6 @@ const labelRenderer = defineComponent({
// reuse layout bindings for label
return useVuetifyLayout(useJsonFormsLayout(props));
},
- computed: {
- layoutUiSchema(): LabelElement {
- return this.layout.uischema as LabelElement;
- },
- },
});
export default labelRenderer;
diff --git a/packages/vue2-vuetify/src/additional/ListWithDetailRenderer.vue b/packages/vue2-vuetify/src/additional/ListWithDetailRenderer.vue
index 9dac4a59e2..afd8b1490f 100644
--- a/packages/vue2-vuetify/src/additional/ListWithDetailRenderer.vue
+++ b/packages/vue2-vuetify/src/additional/ListWithDetailRenderer.vue
@@ -2,12 +2,12 @@
-
- {{
+
+ {{
computedLabel
}}
+
No data
@@ -59,7 +59,11 @@
max-width="350"
>
-
+
{{ childLabelForIndex(index) }}
@@ -106,7 +110,7 @@
class="ma-0"
aria-label="Move up"
:disabled="index <= 0 || !control.enabled"
- :class="styles.arrayList.itemMoveUp"
+ :class="styles.listWithDetail.itemMoveUp"
@click.native="moveUpClick($event, index)"
>
mdi-arrow-up
@@ -129,7 +133,7 @@
:disabled="
index >= control.data.length - 1 || !control.enabled
"
- :class="styles.arrayList.itemMoveDown"
+ :class="styles.listWithDetail.itemMoveDown"
@click.native="moveDownClick($event, index)"
>
mdi-arrow-down
@@ -149,7 +153,7 @@
small
class="ma-0"
aria-label="Delete"
- :class="styles.arrayList.itemDelete"
+ :class="styles.listWithDetail.itemDelete"
@click.native="removeItemsClick($event, [index])"
:disabled="
!control.enabled ||
@@ -173,7 +177,7 @@
No Selection
-
+
-
diff --git a/packages/vue2-vuetify/src/complex/ArrayControlRenderer.vue b/packages/vue2-vuetify/src/complex/ArrayControlRenderer.vue
index c8d7b30a68..b0cb35c06f 100644
--- a/packages/vue2-vuetify/src/complex/ArrayControlRenderer.vue
+++ b/packages/vue2-vuetify/src/complex/ArrayControlRenderer.vue
@@ -240,10 +240,6 @@ const controlRenderer = defineComponent({
return useVuetifyArrayControl(useJsonFormsArrayControl(props));
},
computed: {
- noData(): boolean {
- return !this.control.data || this.control.data.length === 0;
- },
- //TODO: check is that is the appropate way to get the array schema, possibly it would be better for the core to have a property that exports that schema
arraySchema(): JsonSchema | undefined {
return Resolve.schema(
this.control.rootSchema,
@@ -251,6 +247,9 @@ const controlRenderer = defineComponent({
this.control.rootSchema
);
},
+ noData(): boolean {
+ return !this.control.data || this.control.data.length === 0;
+ },
},
methods: {
composePaths,
diff --git a/packages/vue2-vuetify/src/complex/EnumArrayRenderer.vue b/packages/vue2-vuetify/src/complex/EnumArrayRenderer.vue
index 2cf68329f0..5416f4ffba 100644
--- a/packages/vue2-vuetify/src/complex/EnumArrayRenderer.vue
+++ b/packages/vue2-vuetify/src/complex/EnumArrayRenderer.vue
@@ -4,15 +4,13 @@
toggle(o.value, value)"
>
@@ -33,9 +31,6 @@ import {
schemaSubPathMatches,
uiTypeIs,
composePaths,
- update,
- Dispatch,
- CoreActions,
} from '@jsonforms/core';
import { VCheckbox, VContainer, VRow, VCol } from 'vuetify/lib';
import {
@@ -45,8 +40,8 @@ import {
useControl,
ControlProps,
} from '@jsonforms/vue2';
-import { defineComponent, inject } from '../vue';
-import { useVuetifyMultiEnumControl } from '../util';
+import { defineComponent } from '../vue';
+import { useVuetifyBasicControl } from '../util';
//TODO: move into JsonForm Vue project under src/components/jsonFormsCompositions.ts
const useJsonFormsMultiEnumControl = (props: ControlProps) => {
@@ -70,23 +65,20 @@ const controlRenderer = defineComponent({
...rendererProps(),
},
setup(props: RendererProps) {
- const dispatch = inject>('dispatch');
-
- if (!dispatch) {
- throw new Error(
- "'jsonforms' or 'dispatch' couldn't be injected. Are you within JSON Forms?"
- );
- }
-
- return {
- ...useVuetifyMultiEnumControl(useJsonFormsMultiEnumControl(props)),
- dispatch,
- };
+ return useVuetifyBasicControl(useJsonFormsMultiEnumControl(props));
},
methods: {
+ dataHasEnum(value: any) {
+ return !!this.control.data?.includes(value);
+ },
composePaths,
- onChange() {
- this.dispatch(update(this.control.path, () => this.control.data));
+ toggle(value: any, add: boolean) {
+ if (add) {
+ this.addItem(this.control.path, value);
+ } else {
+ // mistyped in core
+ this.removeItem?.(this.control.path, value);
+ }
},
},
});
diff --git a/packages/vue2-vuetify/src/complex/components/CombinatorProperties.vue b/packages/vue2-vuetify/src/complex/components/CombinatorProperties.vue
index 5c606079e7..bec6f39255 100644
--- a/packages/vue2-vuetify/src/complex/components/CombinatorProperties.vue
+++ b/packages/vue2-vuetify/src/complex/components/CombinatorProperties.vue
@@ -10,7 +10,7 @@
-
diff --git a/packages/vue2-vuetify/src/controls/BooleanControlRenderer.vue b/packages/vue2-vuetify/src/controls/BooleanControlRenderer.vue
index d71e1f4dbc..46bb5dec74 100644
--- a/packages/vue2-vuetify/src/controls/BooleanControlRenderer.vue
+++ b/packages/vue2-vuetify/src/controls/BooleanControlRenderer.vue
@@ -17,7 +17,7 @@
:required="control.required"
:error-messages="control.errors"
:indeterminate="control.data === undefined"
- v-model="control.data"
+ :value="control.data"
@change="onChange"
@focus="isFocused = true"
@blur="isFocused = false"
@@ -52,7 +52,10 @@ const controlRenderer = defineComponent({
...rendererProps(),
},
setup(props: RendererProps) {
- return useVuetifyControl(useJsonFormsControl(props));
+ return useVuetifyControl(
+ useJsonFormsControl(props),
+ (newValue) => newValue || false
+ );
},
});
diff --git a/packages/vue2-vuetify/src/controls/BooleanToggleControlRenderer.vue b/packages/vue2-vuetify/src/controls/BooleanToggleControlRenderer.vue
index 129338567c..0f29b9f1aa 100644
--- a/packages/vue2-vuetify/src/controls/BooleanToggleControlRenderer.vue
+++ b/packages/vue2-vuetify/src/controls/BooleanToggleControlRenderer.vue
@@ -16,7 +16,7 @@
:persistent-hint="persistentHint()"
:required="control.required"
:error-messages="control.errors"
- v-model="control.data"
+ :value="control.data"
@change="onChange"
@focus="isFocused = true"
@blur="isFocused = false"
diff --git a/packages/vue2-vuetify/src/controls/ControlWrapper.vue b/packages/vue2-vuetify/src/controls/ControlWrapper.vue
index 392575a636..216bcb5aa7 100644
--- a/packages/vue2-vuetify/src/controls/ControlWrapper.vue
+++ b/packages/vue2-vuetify/src/controls/ControlWrapper.vue
@@ -5,78 +5,25 @@
diff --git a/packages/vue2-vuetify/src/controls/DateControlRenderer.vue b/packages/vue2-vuetify/src/controls/DateControlRenderer.vue
index 8072bfd7cf..d09757469d 100644
--- a/packages/vue2-vuetify/src/controls/DateControlRenderer.vue
+++ b/packages/vue2-vuetify/src/controls/DateControlRenderer.vue
@@ -17,7 +17,7 @@
:persistent-hint="persistentHint()"
:required="control.required"
:error-messages="control.errors"
- v-model="control.data"
+ :value="control.data"
@change="onChange"
@focus="isFocused = true"
@blur="isFocused = false"
diff --git a/packages/vue2-vuetify/src/controls/DateTimeControlRenderer.vue b/packages/vue2-vuetify/src/controls/DateTimeControlRenderer.vue
index 5f7d0a9f2f..c0545c9e25 100644
--- a/packages/vue2-vuetify/src/controls/DateTimeControlRenderer.vue
+++ b/packages/vue2-vuetify/src/controls/DateTimeControlRenderer.vue
@@ -17,7 +17,7 @@
:persistent-hint="persistentHint()"
:required="control.required"
:error-messages="control.errors"
- v-model="dataTime"
+ :value="dataTime"
@focus="isFocused = true"
@blur="isFocused = false"
/>
diff --git a/packages/vue2-vuetify/src/controls/EnumControlRenderer.vue b/packages/vue2-vuetify/src/controls/EnumControlRenderer.vue
index 4620b220de..28abfffcc6 100644
--- a/packages/vue2-vuetify/src/controls/EnumControlRenderer.vue
+++ b/packages/vue2-vuetify/src/controls/EnumControlRenderer.vue
@@ -19,7 +19,7 @@
:required="control.required"
:error-messages="control.errors"
:clearable="hover"
- v-model="control.data"
+ :value="control.data"
:items="control.options"
item-text="label"
item-value="value"
diff --git a/packages/vue2-vuetify/src/controls/IntegerControlRenderer.vue b/packages/vue2-vuetify/src/controls/IntegerControlRenderer.vue
index 5d8a54ecca..56f37bae34 100644
--- a/packages/vue2-vuetify/src/controls/IntegerControlRenderer.vue
+++ b/packages/vue2-vuetify/src/controls/IntegerControlRenderer.vue
@@ -18,7 +18,7 @@
:persistent-hint="persistentHint()"
:required="control.required"
:error-messages="control.errors"
- v-model="control.data"
+ :value="control.data"
@change="onChange"
@focus="isFocused = true"
@blur="isFocused = false"
@@ -53,16 +53,10 @@ const controlRenderer = defineComponent({
...rendererProps(),
},
setup(props: RendererProps) {
- const toInteger = (value: string) => {
- var regex = /^[-+]?\d+$/;
-
- if (regex.test(value)) {
- return parseInt(value, 10);
- }
-
- return value === '' ? undefined : value;
- };
- return useVuetifyControl(useJsonFormsControl(props), toInteger);
+ return useVuetifyControl(
+ useJsonFormsControl(props),
+ (value) => parseInt(value, 10) || undefined
+ );
},
computed: {
step(): number {
diff --git a/packages/vue2-vuetify/src/controls/MultiStringControlRenderer.vue b/packages/vue2-vuetify/src/controls/MultiStringControlRenderer.vue
index ac3842f6f1..03f64d0fef 100644
--- a/packages/vue2-vuetify/src/controls/MultiStringControlRenderer.vue
+++ b/packages/vue2-vuetify/src/controls/MultiStringControlRenderer.vue
@@ -18,7 +18,7 @@
:persistent-hint="persistentHint()"
:required="control.required"
:error-messages="control.errors"
- v-model="control.data"
+ :value="control.data"
:maxlength="
appliedOptions.restrict ? control.schema.maxLength : undefined
"
diff --git a/packages/vue2-vuetify/src/controls/NumberControlRenderer.vue b/packages/vue2-vuetify/src/controls/NumberControlRenderer.vue
index 24144be72b..3535042cc4 100644
--- a/packages/vue2-vuetify/src/controls/NumberControlRenderer.vue
+++ b/packages/vue2-vuetify/src/controls/NumberControlRenderer.vue
@@ -18,7 +18,7 @@
:persistent-hint="persistentHint()"
:required="control.required"
:error-messages="control.errors"
- v-model="control.data"
+ :value="control.data"
@change="onChange"
@focus="isFocused = true"
@blur="isFocused = false"
@@ -53,10 +53,10 @@ const controlRenderer = defineComponent({
...rendererProps(),
},
setup(props: RendererProps) {
- const toNumber = (value: string) =>
- value === '' ? undefined : parseFloat(value);
-
- return useVuetifyControl(useJsonFormsControl(props), toNumber);
+ return useVuetifyControl(
+ useJsonFormsControl(props),
+ (value) => parseFloat(value) || undefined
+ );
},
computed: {
step(): number {
diff --git a/packages/vue2-vuetify/src/controls/OneOfEnumControlRenderer.vue b/packages/vue2-vuetify/src/controls/OneOfEnumControlRenderer.vue
index f630bcb00b..caa94f9087 100644
--- a/packages/vue2-vuetify/src/controls/OneOfEnumControlRenderer.vue
+++ b/packages/vue2-vuetify/src/controls/OneOfEnumControlRenderer.vue
@@ -19,7 +19,7 @@
:required="control.required"
:error-messages="control.errors"
:clearable="hover"
- v-model="control.data"
+ :value="control.data"
:items="control.options"
item-text="label"
item-value="value"
diff --git a/packages/vue2-vuetify/src/controls/OneOfRadioGroupControlRenderer.vue b/packages/vue2-vuetify/src/controls/OneOfRadioGroupControlRenderer.vue
index ed7376c9bd..59d60967dc 100644
--- a/packages/vue2-vuetify/src/controls/OneOfRadioGroupControlRenderer.vue
+++ b/packages/vue2-vuetify/src/controls/OneOfRadioGroupControlRenderer.vue
@@ -17,7 +17,7 @@
:required="control.required"
:error-messages="control.errors"
row
- v-model="control.data"
+ :value="control.data"
@change="onChange"
@focus="isFocused = true"
@blur="isFocused = false"
diff --git a/packages/vue2-vuetify/src/controls/PasswordControlRenderer.vue b/packages/vue2-vuetify/src/controls/PasswordControlRenderer.vue
index 7a9dddde47..46f6d503e0 100644
--- a/packages/vue2-vuetify/src/controls/PasswordControlRenderer.vue
+++ b/packages/vue2-vuetify/src/controls/PasswordControlRenderer.vue
@@ -19,7 +19,7 @@
:persistent-hint="persistentHint()"
:required="control.required"
:error-messages="control.errors"
- v-model="control.data"
+ :value="control.data"
:maxlength="
appliedOptions.restrict ? control.schema.maxLength : undefined
"
diff --git a/packages/vue2-vuetify/src/controls/RadioGroupControlRenderer.vue b/packages/vue2-vuetify/src/controls/RadioGroupControlRenderer.vue
index 3a2c6cc8a5..e38e83a7bc 100644
--- a/packages/vue2-vuetify/src/controls/RadioGroupControlRenderer.vue
+++ b/packages/vue2-vuetify/src/controls/RadioGroupControlRenderer.vue
@@ -17,7 +17,7 @@
:required="control.required"
:error-messages="control.errors"
row
- v-model="control.data"
+ :value="control.data"
@change="onChange"
@focus="isFocused = true"
@blur="isFocused = false"
diff --git a/packages/vue2-vuetify/src/controls/SliderControlRenderer.vue b/packages/vue2-vuetify/src/controls/SliderControlRenderer.vue
index cc5bc2bf0b..e5d1458853 100644
--- a/packages/vue2-vuetify/src/controls/SliderControlRenderer.vue
+++ b/packages/vue2-vuetify/src/controls/SliderControlRenderer.vue
@@ -20,7 +20,7 @@
:persistent-hint="persistentHint()"
:required="control.required"
:error-messages="control.errors"
- v-model="control.data"
+ :value="control.data"
@change="onChange"
@focus="isFocused = true"
@blur="isFocused = false"
diff --git a/packages/vue2-vuetify/src/controls/StringControlRenderer.vue b/packages/vue2-vuetify/src/controls/StringControlRenderer.vue
index f121c7b313..e23f3bc27f 100644
--- a/packages/vue2-vuetify/src/controls/StringControlRenderer.vue
+++ b/packages/vue2-vuetify/src/controls/StringControlRenderer.vue
@@ -28,7 +28,7 @@
: undefined
"
:clearable="hover"
- v-model="control.data"
+ :value="control.data"
:items="suggestions"
hide-no-data
@change="onChange"
@@ -48,7 +48,7 @@
:persistent-hint="persistentHint()"
:required="control.required"
:error-messages="control.errors"
- v-model="control.data"
+ :value="control.data"
:maxlength="
appliedOptions.restrict ? control.schema.maxLength : undefined
"
diff --git a/packages/vue2-vuetify/src/controls/TimeControlRenderer.vue b/packages/vue2-vuetify/src/controls/TimeControlRenderer.vue
index 5f267c46f0..9fe0e56c3a 100644
--- a/packages/vue2-vuetify/src/controls/TimeControlRenderer.vue
+++ b/packages/vue2-vuetify/src/controls/TimeControlRenderer.vue
@@ -17,7 +17,7 @@
:persistent-hint="persistentHint()"
:required="control.required"
:error-messages="control.errors"
- v-model="control.data"
+ :value="control.data"
@change="onChange"
@focus="isFocused = true"
@blur="isFocused = false"
diff --git a/packages/vue2-vuetify/src/extended/AutocompleteEnumControlRenderer.vue b/packages/vue2-vuetify/src/extended/AutocompleteEnumControlRenderer.vue
index c59440fcde..8a9a9c7b1f 100644
--- a/packages/vue2-vuetify/src/extended/AutocompleteEnumControlRenderer.vue
+++ b/packages/vue2-vuetify/src/extended/AutocompleteEnumControlRenderer.vue
@@ -20,7 +20,7 @@
:required="control.required"
:error-messages="control.errors"
:clearable="hover"
- v-model="control.data"
+ :value="control.data"
:items="control.options"
item-text="label"
item-value="value"
@@ -42,7 +42,7 @@
:required="control.required"
:error-messages="control.errors"
:clearable="hover"
- v-model="control.data"
+ :value="control.data"
:items="control.options"
item-text="label"
item-value="value"
diff --git a/packages/vue2-vuetify/src/extended/AutocompleteOneOfEnumControlRenderer.vue b/packages/vue2-vuetify/src/extended/AutocompleteOneOfEnumControlRenderer.vue
index 17d9d2b181..0fd343b7cf 100644
--- a/packages/vue2-vuetify/src/extended/AutocompleteOneOfEnumControlRenderer.vue
+++ b/packages/vue2-vuetify/src/extended/AutocompleteOneOfEnumControlRenderer.vue
@@ -20,7 +20,7 @@
:required="control.required"
:error-messages="control.errors"
:clearable="hover"
- v-model="control.data"
+ :value="control.data"
:items="control.options"
item-text="label"
item-value="value"
@@ -42,7 +42,7 @@
:required="control.required"
:error-messages="control.errors"
:clearable="hover"
- v-model="control.data"
+ :value="control.data"
:items="control.options"
item-text="label"
item-value="value"
diff --git a/packages/vue2-vuetify/src/layouts/ArrayLayoutRenderer.vue b/packages/vue2-vuetify/src/layouts/ArrayLayoutRenderer.vue
index db87c52d38..d277967782 100644
--- a/packages/vue2-vuetify/src/layouts/ArrayLayoutRenderer.vue
+++ b/packages/vue2-vuetify/src/layouts/ArrayLayoutRenderer.vue
@@ -184,10 +184,10 @@ import {
isObjectArrayWithNesting,
composePaths,
createDefaultValue,
- Resolve,
- JsonSchema,
UISchemaElement,
findUISchema,
+ Resolve,
+ JsonSchema,
} from '@jsonforms/core';
import { defineComponent } from '../vue';
import {
@@ -264,7 +264,6 @@ const controlRenderer = defineComponent({
this.control.rootSchema
);
},
- //TODO: check is that is the appropate way to get the array schema, possibly it would be better for the core to have a property that exports that schema
arraySchema(): JsonSchema | undefined {
return Resolve.schema(
this.control.rootSchema,
diff --git a/packages/vue2-vuetify/src/layouts/CategorizationRenderer.vue b/packages/vue2-vuetify/src/layouts/CategorizationRenderer.vue
index 6acb7ae169..37c0c8b41b 100644
--- a/packages/vue2-vuetify/src/layouts/CategorizationRenderer.vue
+++ b/packages/vue2-vuetify/src/layouts/CategorizationRenderer.vue
@@ -1,5 +1,5 @@
-
+
) {
const activeCategory = ref(0);
+ const ajv = useAjv();
- return { ...useVuetifyLayout(useJsonFormsLayout(props)), activeCategory };
+ return {
+ ...useVuetifyLayout(useJsonFormsLayout(props)),
+ activeCategory,
+ ajv,
+ };
},
computed: {
visibleCategories(): (Category | Categorization)[] {
- const jsonforms = inject('jsonforms');
-
- if (!jsonforms) {
- throw new Error(
- "'jsonforms' couldn't be injected. Are you within JSON Forms?"
- );
- }
-
return (this.layout.uischema as Categorization).elements.filter(
(category: Category | Categorization) =>
- isVisible(
- category,
- this.layout.data,
- this.layout.path,
- jsonforms?.core?.ajv!
- )
+ isVisible(category, this.layout.data, this.layout.path, this.ajv)
);
},
},
diff --git a/packages/vue2-vuetify/src/layouts/CategorizationStepperRenderer.vue b/packages/vue2-vuetify/src/layouts/CategorizationStepperRenderer.vue
index 447e26a7a5..8944aab4c9 100644
--- a/packages/vue2-vuetify/src/layouts/CategorizationStepperRenderer.vue
+++ b/packages/vue2-vuetify/src/layouts/CategorizationStepperRenderer.vue
@@ -1,5 +1,5 @@
-
+
) {
const activeCategory = ref(1);
+ const ajv = useAjv();
- return { ...useVuetifyLayout(useJsonFormsLayout(props)), activeCategory };
+ return {
+ ...useVuetifyLayout(useJsonFormsLayout(props)),
+ activeCategory,
+ ajv,
+ };
},
computed: {
visibleCategories(): (Category | Categorization)[] {
- const jsonforms = inject('jsonforms');
-
- if (!jsonforms) {
- throw new Error(
- "'jsonforms' couldn't be injected. Are you within JSON Forms?"
- );
- }
-
return (this.layout.uischema as Categorization).elements.filter(
(category: Category | Categorization) =>
- isVisible(
- category,
- this.layout.data,
- this.layout.path,
- jsonforms?.core?.ajv!
- )
+ isVisible(category, this.layout.data, this.layout.path, this.ajv)
);
},
},
diff --git a/packages/vue2-vuetify/src/layouts/GroupRenderer.vue b/packages/vue2-vuetify/src/layouts/GroupRenderer.vue
index ea9a72e8c0..350775e91c 100644
--- a/packages/vue2-vuetify/src/layouts/GroupRenderer.vue
+++ b/packages/vue2-vuetify/src/layouts/GroupRenderer.vue
@@ -4,14 +4,12 @@
:class="`pa-0 ${styles.group.root}`"
elevation="2"
>
- {{ groupLayoutUiSchema.label }}
+ {{
+ layout.uischema.label
+ }}
@@ -31,7 +29,6 @@
import {
JsonFormsRendererRegistryEntry,
Layout,
- GroupLayout,
rankWith,
and,
isLayout,
@@ -61,11 +58,6 @@ const layoutRenderer = defineComponent({
setup(props: RendererProps) {
return useVuetifyLayout(useJsonFormsLayout(props));
},
- computed: {
- groupLayoutUiSchema(): GroupLayout {
- return this.layout.uischema as GroupLayout;
- },
- },
});
export default layoutRenderer;
diff --git a/packages/vue2-vuetify/src/layouts/HorizontalLayoutRenderer.vue b/packages/vue2-vuetify/src/layouts/HorizontalLayoutRenderer.vue
index 51762a6f15..1d8fc6134e 100644
--- a/packages/vue2-vuetify/src/layouts/HorizontalLayoutRenderer.vue
+++ b/packages/vue2-vuetify/src/layouts/HorizontalLayoutRenderer.vue
@@ -5,7 +5,7 @@
>
@@ -27,7 +27,6 @@ import {
uiTypeIs,
JsonFormsRendererRegistryEntry,
Layout,
- HorizontalLayout,
rankWith,
} from '@jsonforms/core';
import { defineComponent } from '../vue';
@@ -54,11 +53,6 @@ const layoutRenderer = defineComponent({
setup(props: RendererProps) {
return useVuetifyLayout(useJsonFormsLayout(props));
},
- computed: {
- layoutUiSchema(): HorizontalLayout {
- return this.layout.uischema as HorizontalLayout;
- },
- },
});
export default layoutRenderer;
diff --git a/packages/vue2-vuetify/src/layouts/VerticalLayoutRenderer.vue b/packages/vue2-vuetify/src/layouts/VerticalLayoutRenderer.vue
index 7b0ee5a83f..f408f1c458 100644
--- a/packages/vue2-vuetify/src/layouts/VerticalLayoutRenderer.vue
+++ b/packages/vue2-vuetify/src/layouts/VerticalLayoutRenderer.vue
@@ -5,7 +5,7 @@
:class="`pa-0 ${styles.verticalLayout.root}`"
>
@@ -28,7 +28,6 @@ import {
uiTypeIs,
JsonFormsRendererRegistryEntry,
Layout,
- VerticalLayout,
rankWith,
} from '@jsonforms/core';
import { defineComponent } from '../vue';
@@ -55,11 +54,6 @@ const layoutRenderer = defineComponent({
setup(props: RendererProps) {
return useVuetifyLayout(useJsonFormsLayout(props));
},
- computed: {
- layoutUiSchema(): VerticalLayout {
- return this.layout.uischema as VerticalLayout;
- },
- },
});
export default layoutRenderer;
diff --git a/packages/vue2-vuetify/src/styles/defaultStyles.ts b/packages/vue2-vuetify/src/styles/defaultStyles.ts
index b5a32324d2..63dc7df49d 100644
--- a/packages/vue2-vuetify/src/styles/defaultStyles.ts
+++ b/packages/vue2-vuetify/src/styles/defaultStyles.ts
@@ -32,7 +32,23 @@ export const defaultStyles: Styles = {
itemMoveDown: 'array-list-item-move-down',
itemDelete: 'array-list-item-delete',
},
+ listWithDetail: {
+ root: 'list-with-detail',
+ toolbar: 'list-with-detail-toolbar',
+ addButton: 'list-with-detail-add',
+ label: 'list-with-detail-label',
+ noData: 'list-with-detail-no-data',
+ item: 'list-with-detail-item',
+ itemLabel: 'list-with-detail-item-label',
+ itemContent: 'list-with-detail-item-content',
+ itemMoveUp: 'list-with-detail-item-move-up',
+ itemMoveDown: 'list-with-detail-item-move-down',
+ itemDelete: 'list-with-detail-item-delete',
+ },
label: {
root: 'label-element',
},
+ categorization: {
+ root: 'categorization',
+ },
};
diff --git a/packages/vue2-vuetify/src/styles/styles.ts b/packages/vue2-vuetify/src/styles/styles.ts
index 8303f5ed73..45aba53e52 100644
--- a/packages/vue2-vuetify/src/styles/styles.ts
+++ b/packages/vue2-vuetify/src/styles/styles.ts
@@ -9,7 +9,9 @@ const createEmptyStyles = (): Styles => ({
horizontalLayout: {},
group: {},
arrayList: {},
+ listWithDetail: {},
label: {},
+ categorization: {},
});
export interface Styles {
@@ -44,9 +46,25 @@ export interface Styles {
itemMoveDown?: string;
itemDelete?: string;
};
+ listWithDetail: {
+ root?: string;
+ toolbar?: string;
+ addButton?: string;
+ label?: string;
+ noData?: string;
+ item?: string;
+ itemLabel?: string;
+ itemContent?: string;
+ itemMoveUp?: string;
+ itemMoveDown?: string;
+ itemDelete?: string;
+ };
label: {
root?: string;
};
+ categorization: {
+ root?: string;
+ };
}
export const useStyles = (element?: UISchemaElement): Styles => {
diff --git a/packages/vue2-vuetify/src/util/composition.ts b/packages/vue2-vuetify/src/util/composition.ts
index 0432234a3d..ddbcffb35f 100644
--- a/packages/vue2-vuetify/src/util/composition.ts
+++ b/packages/vue2-vuetify/src/util/composition.ts
@@ -3,12 +3,14 @@ import {
computeLabel,
getFirstPrimitiveProp,
isDescriptionHidden,
+ JsonFormsSubStates,
Resolve,
} from '@jsonforms/core';
import cloneDeep from 'lodash/cloneDeep';
import merge from 'lodash/merge';
import { useStyles } from '../styles';
-import { computed, ComputedRef, ref } from '../vue';
+import { computed, ComputedRef, inject, ref } from '../vue';
+import { Ajv } from 'ajv';
const useControlAppliedOptions = (input: I) => {
return computed(() =>
@@ -119,7 +121,11 @@ export const useVuetifyArrayControl = (
input.control.value.data,
composePaths(`${index}`, childLabelProp)
);
- if (labelValue === undefined || labelValue === null || isNaN(labelValue)) {
+ if (
+ labelValue === undefined ||
+ labelValue === null ||
+ Number.isNaN(labelValue)
+ ) {
return '';
}
return `${labelValue}`;
@@ -134,9 +140,9 @@ export const useVuetifyArrayControl = (
};
/**
- * Adds styles, appliedOptions and childUiSchema
+ * Adds styles and appliedOptions
*/
-export const useVuetifyMultiEnumControl = (
+export const useVuetifyBasicControl = (
input: I
) => {
const appliedOptions = useControlAppliedOptions(input);
@@ -147,3 +153,19 @@ export const useVuetifyMultiEnumControl = (
appliedOptions,
};
};
+
+/**
+ * Extracts Ajv from JSON Forms
+ */
+export const useAjv = () => {
+ const jsonforms = inject('jsonforms');
+
+ if (!jsonforms) {
+ throw new Error(
+ "'jsonforms' couldn't be injected. Are you within JSON Forms?"
+ );
+ }
+
+ // should always exist
+ return jsonforms.core?.ajv as Ajv;
+};
From 58dac02a711827990e3854650b5fcf83132cab3e Mon Sep 17 00:00:00 2001
From: Krasimir Chobantonov
Date: Tue, 26 Oct 2021 16:59:12 -0400
Subject: [PATCH 007/185] Improve example app
* update example demo project
* remove history mode
* move examples into a root project folder
* add tooltips
---
packages/example/package.json | 8 +-
packages/example/src/App.vue | 450 +----------------
packages/example/src/components/DemoForm.vue | 155 ++++++
.../example/src/components/MonacoEditor.vue | 31 +-
packages/example/src/components/Settings.vue | 47 +-
.../example/src/core/jsonSchemaValidation.ts | 44 +-
.../core/jsonschema/specification/rule.json | 183 ++++---
.../core/jsonschema/specification/schema.json | 321 ++++++------
.../jsonschema/specification/uischema.json | 99 +---
packages/example/src/core/types.ts | 17 +
.../{components => }/examples/allOf/data.json | 0
.../{components => }/examples/allOf/index.ts | 0
.../examples/allOf/schema.json | 0
.../examples/allOf/uischema.json | 0
.../examples/anyOf-simple/data.json | 0
.../examples/anyOf-simple/index.ts | 0
.../examples/anyOf-simple/schema.json | 0
.../{components => }/examples/anyOf/data.json | 0
.../{components => }/examples/anyOf/index.ts | 0
.../examples/anyOf/schema.json | 0
.../examples/anyOf/uischema.json | 0
.../examples/array-restrict/data.json | 0
.../examples/array-restrict/index.ts | 0
.../examples/array-restrict/schema.json | 0
.../examples/array-restrict/uischema.json | 0
.../examples/array-with-reorder/data.json | 0
.../examples/array-with-reorder/index.ts | 0
.../examples/array-with-reorder/schema.json | 0
.../examples/array-with-reorder/uischema.json | 0
.../{components => }/examples/array/data.json | 0
.../{components => }/examples/array/index.ts | 0
.../examples/array/schema.json | 0
.../examples/array/uischema.json | 0
.../{components => }/examples/basic/data.json | 0
.../{components => }/examples/basic/index.ts | 0
.../examples/basic/schema.json | 0
.../examples/basic/uischema.json | 0
.../categorization-stepper-nav/data.json | 0
.../categorization-stepper-nav/index.ts | 0
.../categorization-stepper-nav/schema.json | 0
.../categorization-stepper-nav/uischema.json | 0
.../examples/categorization-stepper/data.json | 0
.../examples/categorization-stepper/index.ts | 0
.../categorization-stepper/schema.json | 0
.../categorization-stepper/uischema.json | 0
.../examples/categorization/data.json | 0
.../examples/categorization/index.ts | 0
.../examples/categorization/schema.json | 0
.../examples/categorization/uischema.json | 0
.../examples/control-options/data.json | 0
.../examples/control-options/index.ts | 0
.../examples/control-options/schema.json | 0
.../examples/control-options/uischema.json | 0
.../examples/control/data.json | 0
.../examples/control/index.ts | 0
.../examples/control/schema.json | 0
.../examples/control/uischema.json | 0
.../examples/enum-in-array/data.json | 0
.../examples/enum-in-array/index.ts | 0
.../examples/enum-in-array/schema.json | 0
.../examples/enum-in-array/uischema.json | 0
.../{components => }/examples/enum/data.json | 0
.../{components => }/examples/enum/index.ts | 0
.../examples/enum/schema.json | 0
.../examples/enum/uischema.json | 0
.../examples/group-layout/data.json | 0
.../examples/group-layout/index.ts | 0
.../examples/group-layout/schema.json | 0
.../examples/group-layout/uischema.json | 0
.../examples/horizontal-layout/data.json | 0
.../examples/horizontal-layout/index.ts | 0
.../examples/horizontal-layout/schema.json | 0
.../examples/horizontal-layout/uischema.json | 0
.../{components => }/examples/huge/data.json | 0
.../{components => }/examples/huge/index.ts | 0
.../examples/huge/schema.json | 0
.../examples/huge/uischema.json | 0
.../examples/if-then-else/data.json | 0
.../examples/if-then-else/index.ts | 0
.../examples/if-then-else/schema.json | 0
.../src/{components => }/examples/index.ts | 41 +-
.../list-with-details-and-reorder/data.json | 0
.../list-with-details-and-reorder/index.ts | 0
.../list-with-details-and-reorder/schema.json | 0
.../uischema.json | 0
.../list-with-details-restrict/data.json | 0
.../list-with-details-restrict/index.ts | 0
.../list-with-details-restrict/schema.json | 0
.../list-with-details-restrict/uischema.json | 0
.../examples/list-with-details/data.json | 0
.../examples/list-with-details/index.ts | 0
.../examples/list-with-details/schema.json | 0
.../examples/list-with-details/uischema.json | 0
.../{components => }/examples/login/data.json | 0
.../{components => }/examples/login/index.ts | 0
.../examples/login/schema.json | 0
.../examples/login/uischema.json | 0
.../{components => }/examples/main/data.json | 0
.../{components => }/examples/main/index.ts | 0
.../examples/main/schema.json | 0
.../examples/main/uischema.json | 0
.../examples/multi-enum/data.json | 0
.../examples/multi-enum/index.ts | 0
.../examples/multi-enum/schema.json | 0
.../examples/multi-enum/uischema.json | 0
.../examples/nested-array-restrict/data.json | 0
.../examples/nested-array-restrict/index.ts | 0
.../nested-array-restrict/schema.json | 0
.../nested-array-restrict/uischema.json | 0
.../nested-array-with-reorder/data.json | 0
.../nested-array-with-reorder/index.ts | 0
.../nested-array-with-reorder/schema.json | 0
.../nested-array-with-reorder/uischema.json | 0
.../examples/nested-array/data.json | 0
.../examples/nested-array/index.ts | 0
.../examples/nested-array/schema.json | 0
.../examples/nested-array/uischema.json | 0
.../examples/nested-layout/data.json | 0
.../examples/nested-layout/index.ts | 0
.../examples/nested-layout/schema.json | 0
.../examples/nested-layout/uischema.json | 0
.../examples/no-schemas/data.json | 0
.../examples/no-schemas/index.ts | 0
.../examples/no-ui-schema/data.json | 0
.../examples/no-ui-schema/index.ts | 0
.../examples/no-ui-schema/schema.json | 0
.../examples/object/data.json | 0
.../{components => }/examples/object/index.ts | 0
.../examples/object/schema.json | 0
.../examples/object/uischema.json | 0
.../examples/oneOf-recursive/data.json | 0
.../examples/oneOf-recursive/index.ts | 0
.../examples/oneOf-recursive/schema.json | 0
.../examples/oneOf-recursive/uischema.json | 0
.../{components => }/examples/oneOf/data.json | 0
.../{components => }/examples/oneOf/index.ts | 0
.../examples/oneOf/schema.json | 0
.../examples/oneOf/uischema.json | 0
.../examples/radio-group/data.json | 0
.../examples/radio-group/index.ts | 0
.../examples/radio-group/schema.json | 0
.../examples/radio-group/uischema.json | 0
.../{components => }/examples/radio/data.json | 0
.../{components => }/examples/radio/index.ts | 0
.../examples/radio/schema.json | 0
.../examples/radio/uischema.json | 0
.../examples/root-object/data.json | 0
.../examples/root-object/index.ts | 0
.../examples/root-object/schema.json | 0
.../examples/root-object/uischema.json | 0
.../{components => }/examples/rule/data.json | 0
.../{components => }/examples/rule/index.ts | 0
.../examples/rule/schema.json | 0
.../examples/rule/uischema.json | 0
.../examples/vertical-layout/data.json | 0
.../examples/vertical-layout/index.ts | 0
.../examples/vertical-layout/schema.json | 0
.../examples/vertical-layout/uischema.json | 0
.../example/src/layouts/default/AppBar.vue | 57 +++
.../example/src/layouts/default/Drawer.vue | 56 +++
packages/example/src/layouts/default/View.vue | 11 +
.../example/src/layouts/default/index.vue | 21 +
packages/example/src/main.ts | 8 +-
packages/example/src/plugins/app.ts | 23 +
packages/example/src/plugins/index.ts | 1 +
packages/example/src/plugins/vuex-pathify.ts | 9 +
packages/example/src/router/index.ts | 32 ++
packages/example/src/store/index.ts | 34 ++
packages/example/src/store/modules/app.ts | 47 ++
packages/example/src/store/modules/index.ts | 1 +
packages/example/src/store/modules/types.ts | 29 ++
packages/example/src/store/types.ts | 3 +
.../example/src/views/example/Example.vue | 468 ++++++++++++++++++
packages/example/src/views/example/index.ts | 3 +
packages/example/src/views/home/Home.vue | 34 ++
packages/example/src/views/home/index.ts | 3 +
packages/example/tsconfig.json | 5 +-
packages/example/vue.config.js | 12 +-
178 files changed, 1382 insertions(+), 871 deletions(-)
create mode 100644 packages/example/src/components/DemoForm.vue
create mode 100644 packages/example/src/core/types.ts
rename packages/example/src/{components => }/examples/allOf/data.json (100%)
rename packages/example/src/{components => }/examples/allOf/index.ts (100%)
rename packages/example/src/{components => }/examples/allOf/schema.json (100%)
rename packages/example/src/{components => }/examples/allOf/uischema.json (100%)
rename packages/example/src/{components => }/examples/anyOf-simple/data.json (100%)
rename packages/example/src/{components => }/examples/anyOf-simple/index.ts (100%)
rename packages/example/src/{components => }/examples/anyOf-simple/schema.json (100%)
rename packages/example/src/{components => }/examples/anyOf/data.json (100%)
rename packages/example/src/{components => }/examples/anyOf/index.ts (100%)
rename packages/example/src/{components => }/examples/anyOf/schema.json (100%)
rename packages/example/src/{components => }/examples/anyOf/uischema.json (100%)
rename packages/example/src/{components => }/examples/array-restrict/data.json (100%)
rename packages/example/src/{components => }/examples/array-restrict/index.ts (100%)
rename packages/example/src/{components => }/examples/array-restrict/schema.json (100%)
rename packages/example/src/{components => }/examples/array-restrict/uischema.json (100%)
rename packages/example/src/{components => }/examples/array-with-reorder/data.json (100%)
rename packages/example/src/{components => }/examples/array-with-reorder/index.ts (100%)
rename packages/example/src/{components => }/examples/array-with-reorder/schema.json (100%)
rename packages/example/src/{components => }/examples/array-with-reorder/uischema.json (100%)
rename packages/example/src/{components => }/examples/array/data.json (100%)
rename packages/example/src/{components => }/examples/array/index.ts (100%)
rename packages/example/src/{components => }/examples/array/schema.json (100%)
rename packages/example/src/{components => }/examples/array/uischema.json (100%)
rename packages/example/src/{components => }/examples/basic/data.json (100%)
rename packages/example/src/{components => }/examples/basic/index.ts (100%)
rename packages/example/src/{components => }/examples/basic/schema.json (100%)
rename packages/example/src/{components => }/examples/basic/uischema.json (100%)
rename packages/example/src/{components => }/examples/categorization-stepper-nav/data.json (100%)
rename packages/example/src/{components => }/examples/categorization-stepper-nav/index.ts (100%)
rename packages/example/src/{components => }/examples/categorization-stepper-nav/schema.json (100%)
rename packages/example/src/{components => }/examples/categorization-stepper-nav/uischema.json (100%)
rename packages/example/src/{components => }/examples/categorization-stepper/data.json (100%)
rename packages/example/src/{components => }/examples/categorization-stepper/index.ts (100%)
rename packages/example/src/{components => }/examples/categorization-stepper/schema.json (100%)
rename packages/example/src/{components => }/examples/categorization-stepper/uischema.json (100%)
rename packages/example/src/{components => }/examples/categorization/data.json (100%)
rename packages/example/src/{components => }/examples/categorization/index.ts (100%)
rename packages/example/src/{components => }/examples/categorization/schema.json (100%)
rename packages/example/src/{components => }/examples/categorization/uischema.json (100%)
rename packages/example/src/{components => }/examples/control-options/data.json (100%)
rename packages/example/src/{components => }/examples/control-options/index.ts (100%)
rename packages/example/src/{components => }/examples/control-options/schema.json (100%)
rename packages/example/src/{components => }/examples/control-options/uischema.json (100%)
rename packages/example/src/{components => }/examples/control/data.json (100%)
rename packages/example/src/{components => }/examples/control/index.ts (100%)
rename packages/example/src/{components => }/examples/control/schema.json (100%)
rename packages/example/src/{components => }/examples/control/uischema.json (100%)
rename packages/example/src/{components => }/examples/enum-in-array/data.json (100%)
rename packages/example/src/{components => }/examples/enum-in-array/index.ts (100%)
rename packages/example/src/{components => }/examples/enum-in-array/schema.json (100%)
rename packages/example/src/{components => }/examples/enum-in-array/uischema.json (100%)
rename packages/example/src/{components => }/examples/enum/data.json (100%)
rename packages/example/src/{components => }/examples/enum/index.ts (100%)
rename packages/example/src/{components => }/examples/enum/schema.json (100%)
rename packages/example/src/{components => }/examples/enum/uischema.json (100%)
rename packages/example/src/{components => }/examples/group-layout/data.json (100%)
rename packages/example/src/{components => }/examples/group-layout/index.ts (100%)
rename packages/example/src/{components => }/examples/group-layout/schema.json (100%)
rename packages/example/src/{components => }/examples/group-layout/uischema.json (100%)
rename packages/example/src/{components => }/examples/horizontal-layout/data.json (100%)
rename packages/example/src/{components => }/examples/horizontal-layout/index.ts (100%)
rename packages/example/src/{components => }/examples/horizontal-layout/schema.json (100%)
rename packages/example/src/{components => }/examples/horizontal-layout/uischema.json (100%)
rename packages/example/src/{components => }/examples/huge/data.json (100%)
rename packages/example/src/{components => }/examples/huge/index.ts (100%)
rename packages/example/src/{components => }/examples/huge/schema.json (100%)
rename packages/example/src/{components => }/examples/huge/uischema.json (100%)
rename packages/example/src/{components => }/examples/if-then-else/data.json (100%)
rename packages/example/src/{components => }/examples/if-then-else/index.ts (100%)
rename packages/example/src/{components => }/examples/if-then-else/schema.json (100%)
rename packages/example/src/{components => }/examples/index.ts (83%)
rename packages/example/src/{components => }/examples/list-with-details-and-reorder/data.json (100%)
rename packages/example/src/{components => }/examples/list-with-details-and-reorder/index.ts (100%)
rename packages/example/src/{components => }/examples/list-with-details-and-reorder/schema.json (100%)
rename packages/example/src/{components => }/examples/list-with-details-and-reorder/uischema.json (100%)
rename packages/example/src/{components => }/examples/list-with-details-restrict/data.json (100%)
rename packages/example/src/{components => }/examples/list-with-details-restrict/index.ts (100%)
rename packages/example/src/{components => }/examples/list-with-details-restrict/schema.json (100%)
rename packages/example/src/{components => }/examples/list-with-details-restrict/uischema.json (100%)
rename packages/example/src/{components => }/examples/list-with-details/data.json (100%)
rename packages/example/src/{components => }/examples/list-with-details/index.ts (100%)
rename packages/example/src/{components => }/examples/list-with-details/schema.json (100%)
rename packages/example/src/{components => }/examples/list-with-details/uischema.json (100%)
rename packages/example/src/{components => }/examples/login/data.json (100%)
rename packages/example/src/{components => }/examples/login/index.ts (100%)
rename packages/example/src/{components => }/examples/login/schema.json (100%)
rename packages/example/src/{components => }/examples/login/uischema.json (100%)
rename packages/example/src/{components => }/examples/main/data.json (100%)
rename packages/example/src/{components => }/examples/main/index.ts (100%)
rename packages/example/src/{components => }/examples/main/schema.json (100%)
rename packages/example/src/{components => }/examples/main/uischema.json (100%)
rename packages/example/src/{components => }/examples/multi-enum/data.json (100%)
rename packages/example/src/{components => }/examples/multi-enum/index.ts (100%)
rename packages/example/src/{components => }/examples/multi-enum/schema.json (100%)
rename packages/example/src/{components => }/examples/multi-enum/uischema.json (100%)
rename packages/example/src/{components => }/examples/nested-array-restrict/data.json (100%)
rename packages/example/src/{components => }/examples/nested-array-restrict/index.ts (100%)
rename packages/example/src/{components => }/examples/nested-array-restrict/schema.json (100%)
rename packages/example/src/{components => }/examples/nested-array-restrict/uischema.json (100%)
rename packages/example/src/{components => }/examples/nested-array-with-reorder/data.json (100%)
rename packages/example/src/{components => }/examples/nested-array-with-reorder/index.ts (100%)
rename packages/example/src/{components => }/examples/nested-array-with-reorder/schema.json (100%)
rename packages/example/src/{components => }/examples/nested-array-with-reorder/uischema.json (100%)
rename packages/example/src/{components => }/examples/nested-array/data.json (100%)
rename packages/example/src/{components => }/examples/nested-array/index.ts (100%)
rename packages/example/src/{components => }/examples/nested-array/schema.json (100%)
rename packages/example/src/{components => }/examples/nested-array/uischema.json (100%)
rename packages/example/src/{components => }/examples/nested-layout/data.json (100%)
rename packages/example/src/{components => }/examples/nested-layout/index.ts (100%)
rename packages/example/src/{components => }/examples/nested-layout/schema.json (100%)
rename packages/example/src/{components => }/examples/nested-layout/uischema.json (100%)
rename packages/example/src/{components => }/examples/no-schemas/data.json (100%)
rename packages/example/src/{components => }/examples/no-schemas/index.ts (100%)
rename packages/example/src/{components => }/examples/no-ui-schema/data.json (100%)
rename packages/example/src/{components => }/examples/no-ui-schema/index.ts (100%)
rename packages/example/src/{components => }/examples/no-ui-schema/schema.json (100%)
rename packages/example/src/{components => }/examples/object/data.json (100%)
rename packages/example/src/{components => }/examples/object/index.ts (100%)
rename packages/example/src/{components => }/examples/object/schema.json (100%)
rename packages/example/src/{components => }/examples/object/uischema.json (100%)
rename packages/example/src/{components => }/examples/oneOf-recursive/data.json (100%)
rename packages/example/src/{components => }/examples/oneOf-recursive/index.ts (100%)
rename packages/example/src/{components => }/examples/oneOf-recursive/schema.json (100%)
rename packages/example/src/{components => }/examples/oneOf-recursive/uischema.json (100%)
rename packages/example/src/{components => }/examples/oneOf/data.json (100%)
rename packages/example/src/{components => }/examples/oneOf/index.ts (100%)
rename packages/example/src/{components => }/examples/oneOf/schema.json (100%)
rename packages/example/src/{components => }/examples/oneOf/uischema.json (100%)
rename packages/example/src/{components => }/examples/radio-group/data.json (100%)
rename packages/example/src/{components => }/examples/radio-group/index.ts (100%)
rename packages/example/src/{components => }/examples/radio-group/schema.json (100%)
rename packages/example/src/{components => }/examples/radio-group/uischema.json (100%)
rename packages/example/src/{components => }/examples/radio/data.json (100%)
rename packages/example/src/{components => }/examples/radio/index.ts (100%)
rename packages/example/src/{components => }/examples/radio/schema.json (100%)
rename packages/example/src/{components => }/examples/radio/uischema.json (100%)
rename packages/example/src/{components => }/examples/root-object/data.json (100%)
rename packages/example/src/{components => }/examples/root-object/index.ts (100%)
rename packages/example/src/{components => }/examples/root-object/schema.json (100%)
rename packages/example/src/{components => }/examples/root-object/uischema.json (100%)
rename packages/example/src/{components => }/examples/rule/data.json (100%)
rename packages/example/src/{components => }/examples/rule/index.ts (100%)
rename packages/example/src/{components => }/examples/rule/schema.json (100%)
rename packages/example/src/{components => }/examples/rule/uischema.json (100%)
rename packages/example/src/{components => }/examples/vertical-layout/data.json (100%)
rename packages/example/src/{components => }/examples/vertical-layout/index.ts (100%)
rename packages/example/src/{components => }/examples/vertical-layout/schema.json (100%)
rename packages/example/src/{components => }/examples/vertical-layout/uischema.json (100%)
create mode 100644 packages/example/src/layouts/default/AppBar.vue
create mode 100644 packages/example/src/layouts/default/Drawer.vue
create mode 100644 packages/example/src/layouts/default/View.vue
create mode 100644 packages/example/src/layouts/default/index.vue
create mode 100644 packages/example/src/plugins/app.ts
create mode 100644 packages/example/src/plugins/index.ts
create mode 100644 packages/example/src/plugins/vuex-pathify.ts
create mode 100644 packages/example/src/router/index.ts
create mode 100644 packages/example/src/store/index.ts
create mode 100644 packages/example/src/store/modules/app.ts
create mode 100644 packages/example/src/store/modules/index.ts
create mode 100644 packages/example/src/store/modules/types.ts
create mode 100644 packages/example/src/store/types.ts
create mode 100644 packages/example/src/views/example/Example.vue
create mode 100644 packages/example/src/views/example/index.ts
create mode 100644 packages/example/src/views/home/Home.vue
create mode 100644 packages/example/src/views/home/index.ts
diff --git a/packages/example/package.json b/packages/example/package.json
index 26f1b01574..cbe647099d 100644
--- a/packages/example/package.json
+++ b/packages/example/package.json
@@ -15,7 +15,10 @@
"core-js": "^3.6.5",
"vue": "^2.6.14",
"vuetify": "^2.4.0",
- "monaco-editor": "^0.26.0"
+ "vue-router": "^3.2.0",
+ "vuex": "^3.4.0",
+ "monaco-editor": "^0.26.0",
+ "json-refs": "^3.0.15"
},
"devDependencies": {
"@typescript-eslint/eslint-plugin": "^4.18.0",
@@ -37,6 +40,7 @@
"vue-cli-plugin-vuetify": "~2.4.2",
"vue-template-compiler": "^2.6.14",
"vuetify-loader": "^1.7.0",
- "monaco-editor-webpack-plugin": "^4.1.1"
+ "monaco-editor-webpack-plugin": "^4.1.1",
+ "vuex-pathify": "^1.4.5"
}
}
diff --git a/packages/example/src/App.vue b/packages/example/src/App.vue
index 973ee2a305..e1866adc99 100644
--- a/packages/example/src/App.vue
+++ b/packages/example/src/App.vue
@@ -1,451 +1,9 @@
-
-
-
-
-
-
-
- Examples
- Vuetify Renderers
-
-
-
-
-
-
-
-
- {{ example.title }}
-
-
-
-
-
-
-
-
-
-
-
- JSON Forms
-
-
-
-
-
-
- (this.validationMode = validation)
- "
- @hide-required-asterisk-changed="
- (value) => (this.config.hideRequiredAsterisk = value)
- "
- @show-unfocused-description-changed="
- (value) => (this.config.showUnfocusedDescription = value)
- "
- @readonly-changed="(value) => (this.readonly = value)"
- @restrict-changed="(value) => (this.config.restrict = value)"
- />
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Welcome to JSON Forms Vue 2 Vuetify
-
-
-
- For help and collaboration with other JSON Forms developers,
- please join our online
- Discourse Community
-
-
-
-
-
-
-
- {{ example.title }}
-
-
- Demo
-
- Schema
- UI Schema
- Data
-
-
-
-
-
-
- Schema
-
-
-
-
-
-
- UI Schema
-
-
-
-
-
-
- Data
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
-
-
-
-
diff --git a/packages/example/src/components/DemoForm.vue b/packages/example/src/components/DemoForm.vue
new file mode 100644
index 0000000000..19a31c289f
--- /dev/null
+++ b/packages/example/src/components/DemoForm.vue
@@ -0,0 +1,155 @@
+
+
+
+
+
+
+ Resolving Schema Refs
+
+
+
+
+
+
+
+
+ {{ resolvedSchema.error }}
+
+
+
+
+
+
+
+
diff --git a/packages/example/src/components/MonacoEditor.vue b/packages/example/src/components/MonacoEditor.vue
index 98b11dd073..898363d228 100644
--- a/packages/example/src/components/MonacoEditor.vue
+++ b/packages/example/src/components/MonacoEditor.vue
@@ -28,8 +28,7 @@ export default {
props: {
width: { type: [String, Number], default: '100%' },
height: { type: [String, Number], default: '100%' },
- value: String,
- defaultValue: { type: String, default: '' },
+ value: { type: Object as PropType },
language: { type: String, default: 'javascript' },
theme: { type: String, default: 'vs' },
options: {
@@ -84,25 +83,12 @@ export default {
}
},
},
- value(value) {
+ value(newModel: monaco.editor.ITextModel) {
if (this.editor) {
const { editor } = this;
- const model = editor.getModel();
- if (this.value != null && this.value !== model?.getValue()) {
- this.prevent_trigger_change_event = true;
- this.editor.pushUndoStop();
- model?.pushEditOperations(
- [],
- [
- {
- range: model?.getFullModelRange(),
- text: value,
- },
- ],
- () => null
- );
- this.editor.pushUndoStop();
- this.prevent_trigger_change_event = false;
+
+ if (!newModel.isDisposed()) {
+ editor.setModel(newModel);
}
}
},
@@ -155,16 +141,15 @@ export default {
this.subscription.dispose();
}
},
-
initMonaco() {
- const value = this.value != null ? this.value : this.defaultValue;
const { language, theme, overrideServices, className } = this;
// Before initializing monaco editor
const options = { ...this.options, ...this.editorWillMount() };
+
this.editor = monaco.editor.create(
this.$refs.containerElement as HTMLElement,
{
- value,
+ model: this.value,
language,
...(className ? { extraEditorClassName: className } : {}),
...options,
@@ -175,12 +160,10 @@ export default {
// After initializing monaco editor
this.editorDidMount(this.editor);
},
-
editorWillMount(): Record {
const options = this.editorBeforeMount(monaco);
return options || {};
},
-
editorDidMount(editor: monaco.editor.IStandaloneCodeEditor): void {
this.editorMounted(editor, monaco);
diff --git a/packages/example/src/components/Settings.vue b/packages/example/src/components/Settings.vue
index 171575b4fa..85a90598cc 100644
--- a/packages/example/src/components/Settings.vue
+++ b/packages/example/src/components/Settings.vue
@@ -102,9 +102,8 @@
outlined
persistent-hint
dense
- v-model="validationModeData"
+ v-model="validationMode"
:items="validationModes"
- @change="$emit('validation-changed', validationModeData)"
>
@@ -119,15 +118,9 @@
If asterisks in labels for required fields should be hidden
@@ -139,15 +132,9 @@
If input descriptions should hide when not focused
@@ -159,10 +146,9 @@
Whether to restrict the number of characters to maxLength, if
@@ -175,10 +161,9 @@
If true, sets all controls to read-only
@@ -193,30 +178,28 @@
-
diff --git a/packages/example/src/core/jsonSchemaValidation.ts b/packages/example/src/core/jsonSchemaValidation.ts
index 544a59d099..b2f7971508 100644
--- a/packages/example/src/core/jsonSchemaValidation.ts
+++ b/packages/example/src/core/jsonSchemaValidation.ts
@@ -5,7 +5,6 @@ import { JsonSchema } from '@jsonforms/core';
import { jsonSchemaDraft7, ruleSchema, uiSchema } from '../core/jsonschema';
export type EditorApi = typeof editorApi;
-export type TextType = 'JSON' | 'JSON Schema' | 'UI Schema';
/**
* Register a new schema for the Json language, if it isn't already registered.
@@ -26,9 +25,13 @@ export const addSchema = (
): void => {
const registeredSchemas =
editor.languages.json.jsonDefaults.diagnosticsOptions.schemas;
- if (registeredSchemas === undefined) {
+ if (registeredSchemas === undefined || registeredSchemas.length === 0) {
editor.languages.json.jsonDefaults.setDiagnosticsOptions({
validate: true,
+ allowComments: false,
+ enableSchemaRequest: false,
+ schemaRequest: 'warning',
+ schemaValidation: 'error',
schemas: [...schemas],
});
} else {
@@ -52,59 +55,44 @@ export const addSchema = (
*/
export const configureJsonSchemaValidation = (
editor: EditorApi,
- modelUri: monaco.Uri
+ fileMatch: string[]
): void => {
/** Note that the Monaco Editor only supports JSON Schema Draft 7 itself,
* so if we also want to support a later standard we still have to formalize
* it in JSON Schema Draft 7*/
- addSchema(editor, [
- { ...jsonSchemaDraft7, fileMatch: [modelUri.toString()] },
- ]);
+ addSchema(editor, [{ ...jsonSchemaDraft7, fileMatch }]);
};
/**
- * Configures the Monaco Editor to validate the input against the Rule UI Schema meta-schema.
+ * Configures the Monaco Editor to validate the input against the UI Schema meta-schema.
*/
-export const configureRuleSchemaValidation = (
+export const configureUISchemaValidation = (
editor: EditorApi,
- modelUri: monaco.Uri
+ fileMatch: string[]
): void => {
/** Note that the Monaco Editor only supports JSON Schema Draft 7 itself,
* so if we also want to support a later standard we still have to formalize
* it in JSON Schema Draft 7*/
addSchema(editor, [
{ ...jsonSchemaDraft7 },
- { ...ruleSchema, fileMatch: [modelUri.toString()] },
+ { ...ruleSchema },
+ { ...uiSchema, fileMatch },
]);
};
-/**
- * Configures the Monaco Editor to validate the input against the UI Schema meta-schema.
- */
-export const configureUISchemaValidation = (
- editor: EditorApi,
- modelUri: monaco.Uri
-): void => {
- /** Note that the Monaco Editor only supports JSON Schema Draft 7 itself,
- * so if we also want to support a later standard we still have to formalize
- * it in JSON Schema Draft 7*/
- addSchema(editor, [{ ...uiSchema, fileMatch: [modelUri.toString()] }]);
-};
-
/**
* Configures the Monaco Editor to validate the input against JSON Schema model schema.
*/
export const configureDataValidation = (
editor: EditorApi,
- schema: {
- uri: string;
- schema: JsonSchema;
- }
+ uri: string,
+ fileMatch: string,
+ schema: JsonSchema
): void => {
/** Note that the Monaco Editor only supports JSON Schema Draft 7 itself,
* so if we also want to support a later standard we still have to formalize
* it in JSON Schema Draft 7*/
- addSchema(editor, [{ ...schema }]);
+ addSchema(editor, [{ schema, uri, fileMatch: [fileMatch] }]);
};
export const getMonacoModelForUri = (
diff --git a/packages/example/src/core/jsonschema/specification/rule.json b/packages/example/src/core/jsonschema/specification/rule.json
index f2c5471f9a..4a54a709c0 100644
--- a/packages/example/src/core/jsonschema/specification/rule.json
+++ b/packages/example/src/core/jsonschema/specification/rule.json
@@ -1,97 +1,96 @@
{
- "$schema": "http://json-schema.org/draft-07/schema#",
- "$id": "http://jsonforms.io/uischema/rule",
- "title": "Rule UI schema meta-schema",
- "type": ["object"],
- "properties": {
- "effect": {
- "description": "The effect of the rule",
- "type": "string",
- "enum": ["HIDE", "SHOW", "ENABLE", "DISABLE"]
- },
- "condition": {
- "description": "The condition of the rule that must evaluate to true in order to trigger the effect.",
- "oneOf": [
- { "$ref": "#/definitions/leafCondition" },
- { "$ref": "#/definitions/schemaBasedCondition" },
- { "$ref": "#/definitions/orCondition" },
- { "$ref": "#/definitions/andCondition" }
- ]
- }
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "$id": "http://jsonforms.io/uischema/rule",
+ "title": "Rule UI schema meta-schema",
+ "type": ["object"],
+ "properties": {
+ "effect": {
+ "description": "The effect of the rule",
+ "type": "string",
+ "enum": ["HIDE", "SHOW", "ENABLE", "DISABLE"]
},
- "required": ["effect", "condition"],
- "definitions": {
- "condition": {
- "type": "object",
- "properties": { "type": { "type": "string", "readOnly": true } }
- },
- "scopable": {
- "type": "object",
- "properties": {
- "scope": { "type": "string" }
- },
- "required": ["scope"]
- },
- "leafCondition": {
- "allOf": [
- { "$ref": "#/definitions/scopable" },
- {
- "properties": {
- "type": { "const": "LEAF" },
- "expectedValue": {}
- },
- "required": ["type", "expectedValue"]
- }
- ]
- },
- "schemaBasedCondition": {
- "allOf": [
- { "$ref": "#/definitions/scopable" },
- { "$ref": "#/definitions/condition" },
- {
- "properties": {
- "schema": { "$ref": "http://json-schema.org/draft-07/schema#" }
- },
- "required": ["schema"]
- }
- ]
- },
- "composableCondition": {
- "allOf": [
- { "$ref": "#/definitions/condition" },
- {
- "properties": {
- "conditions": {
- "type": "array",
- "items": { "$ref": "#/definitions/condition" }
- }
- },
- "required": ["conditions"]
- }
- ]
- },
- "orCondition": {
- "allOf": [
- { "$ref": "#/definitions/composableCondition" },
- {
- "properties": {
- "type": { "const": "OR" }
- },
- "required": ["type"]
- }
- ]
+ "condition": {
+ "description": "The condition of the rule that must evaluate to true in order to trigger the effect.",
+ "oneOf": [
+ { "$ref": "#/definitions/leafCondition" },
+ { "$ref": "#/definitions/schemaBasedCondition" },
+ { "$ref": "#/definitions/orCondition" },
+ { "$ref": "#/definitions/andCondition" }
+ ]
+ }
+ },
+ "required": ["effect", "condition"],
+ "definitions": {
+ "condition": {
+ "type": "object",
+ "properties": { "type": { "type": "string", "readOnly": true } }
+ },
+ "scopable": {
+ "type": "object",
+ "properties": {
+ "scope": { "type": "string" }
},
- "andCondition": {
- "allOf": [
- { "$ref": "#/definitions/composableCondition" },
- {
- "properties": {
- "type": { "const": "AND" }
- },
- "required": ["type"]
- }
- ]
- }
+ "required": ["scope"]
+ },
+ "leafCondition": {
+ "allOf": [
+ { "$ref": "#/definitions/scopable" },
+ {
+ "properties": {
+ "type": { "const": "LEAF" },
+ "expectedValue": {}
+ },
+ "required": ["type", "expectedValue"]
+ }
+ ]
+ },
+ "schemaBasedCondition": {
+ "allOf": [
+ { "$ref": "#/definitions/scopable" },
+ { "$ref": "#/definitions/condition" },
+ {
+ "properties": {
+ "schema": { "$ref": "http://json-schema.org/draft-07/schema#" }
+ },
+ "required": ["schema"]
+ }
+ ]
+ },
+ "composableCondition": {
+ "allOf": [
+ { "$ref": "#/definitions/condition" },
+ {
+ "properties": {
+ "conditions": {
+ "type": "array",
+ "items": { "$ref": "#/definitions/condition" }
+ }
+ },
+ "required": ["conditions"]
+ }
+ ]
+ },
+ "orCondition": {
+ "allOf": [
+ { "$ref": "#/definitions/composableCondition" },
+ {
+ "properties": {
+ "type": { "const": "OR" }
+ },
+ "required": ["type"]
+ }
+ ]
+ },
+ "andCondition": {
+ "allOf": [
+ { "$ref": "#/definitions/composableCondition" },
+ {
+ "properties": {
+ "type": { "const": "AND" }
+ },
+ "required": ["type"]
+ }
+ ]
}
}
-
\ No newline at end of file
+}
diff --git a/packages/example/src/core/jsonschema/specification/schema.json b/packages/example/src/core/jsonschema/specification/schema.json
index 9e7e67a8af..8875d422c2 100644
--- a/packages/example/src/core/jsonschema/specification/schema.json
+++ b/packages/example/src/core/jsonschema/specification/schema.json
@@ -1,167 +1,166 @@
{
- "$schema": "http://json-schema.org/draft-07/schema#",
- "$id": "http://json-schema.org/draft-07/schema#",
- "title": "Core schema meta-schema",
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "$id": "http://json-schema.org/draft-07/schema#",
+ "title": "Core schema meta-schema",
+ "definitions": {
+ "schemaArray": {
+ "type": "array",
+ "minItems": 1,
+ "items": { "$ref": "#" }
+ },
+ "nonNegativeInteger": {
+ "type": "integer",
+ "minimum": 0
+ },
+ "nonNegativeIntegerDefault0": {
+ "allOf": [
+ { "$ref": "#/definitions/nonNegativeInteger" },
+ { "default": 0 }
+ ]
+ },
+ "simpleTypes": {
+ "enum": [
+ "array",
+ "boolean",
+ "integer",
+ "null",
+ "number",
+ "object",
+ "string"
+ ]
+ },
+ "stringArray": {
+ "type": "array",
+ "items": { "type": "string" },
+ "uniqueItems": true,
+ "default": []
+ }
+ },
+ "type": ["object", "boolean"],
+ "properties": {
+ "$id": {
+ "type": "string",
+ "format": "uri-reference"
+ },
+ "$schema": {
+ "type": "string",
+ "format": "uri"
+ },
+ "$ref": {
+ "type": "string",
+ "format": "uri-reference"
+ },
+ "$comment": {
+ "type": "string"
+ },
+ "title": {
+ "type": "string"
+ },
+ "description": {
+ "type": "string"
+ },
+ "default": true,
+ "readOnly": {
+ "type": "boolean",
+ "default": false
+ },
+ "writeOnly": {
+ "type": "boolean",
+ "default": false
+ },
+ "examples": {
+ "type": "array",
+ "items": true
+ },
+ "multipleOf": {
+ "type": "number",
+ "exclusiveMinimum": 0
+ },
+ "maximum": {
+ "type": "number"
+ },
+ "exclusiveMaximum": {
+ "type": "number"
+ },
+ "minimum": {
+ "type": "number"
+ },
+ "exclusiveMinimum": {
+ "type": "number"
+ },
+ "maxLength": { "$ref": "#/definitions/nonNegativeInteger" },
+ "minLength": { "$ref": "#/definitions/nonNegativeIntegerDefault0" },
+ "pattern": {
+ "type": "string",
+ "format": "regex"
+ },
+ "additionalItems": { "$ref": "#" },
+ "items": {
+ "anyOf": [{ "$ref": "#" }, { "$ref": "#/definitions/schemaArray" }],
+ "default": true
+ },
+ "maxItems": { "$ref": "#/definitions/nonNegativeInteger" },
+ "minItems": { "$ref": "#/definitions/nonNegativeIntegerDefault0" },
+ "uniqueItems": {
+ "type": "boolean",
+ "default": false
+ },
+ "contains": { "$ref": "#" },
+ "maxProperties": { "$ref": "#/definitions/nonNegativeInteger" },
+ "minProperties": { "$ref": "#/definitions/nonNegativeIntegerDefault0" },
+ "required": { "$ref": "#/definitions/stringArray" },
+ "additionalProperties": { "$ref": "#" },
"definitions": {
- "schemaArray": {
- "type": "array",
- "minItems": 1,
- "items": { "$ref": "#" }
- },
- "nonNegativeInteger": {
- "type": "integer",
- "minimum": 0
- },
- "nonNegativeIntegerDefault0": {
- "allOf": [
- { "$ref": "#/definitions/nonNegativeInteger" },
- { "default": 0 }
- ]
- },
- "simpleTypes": {
- "enum": [
- "array",
- "boolean",
- "integer",
- "null",
- "number",
- "object",
- "string"
- ]
- },
- "stringArray": {
- "type": "array",
- "items": { "type": "string" },
- "uniqueItems": true,
- "default": []
- }
+ "type": "object",
+ "additionalProperties": { "$ref": "#" },
+ "default": {}
},
- "type": ["object", "boolean"],
"properties": {
- "$id": {
- "type": "string",
- "format": "uri-reference"
- },
- "$schema": {
- "type": "string",
- "format": "uri"
- },
- "$ref": {
- "type": "string",
- "format": "uri-reference"
- },
- "$comment": {
- "type": "string"
- },
- "title": {
- "type": "string"
- },
- "description": {
- "type": "string"
- },
- "default": true,
- "readOnly": {
- "type": "boolean",
- "default": false
- },
- "writeOnly": {
- "type": "boolean",
- "default": false
- },
- "examples": {
- "type": "array",
- "items": true
- },
- "multipleOf": {
- "type": "number",
- "exclusiveMinimum": 0
- },
- "maximum": {
- "type": "number"
- },
- "exclusiveMaximum": {
- "type": "number"
- },
- "minimum": {
- "type": "number"
- },
- "exclusiveMinimum": {
- "type": "number"
- },
- "maxLength": { "$ref": "#/definitions/nonNegativeInteger" },
- "minLength": { "$ref": "#/definitions/nonNegativeIntegerDefault0" },
- "pattern": {
- "type": "string",
- "format": "regex"
- },
- "additionalItems": { "$ref": "#" },
- "items": {
- "anyOf": [{ "$ref": "#" }, { "$ref": "#/definitions/schemaArray" }],
- "default": true
- },
- "maxItems": { "$ref": "#/definitions/nonNegativeInteger" },
- "minItems": { "$ref": "#/definitions/nonNegativeIntegerDefault0" },
- "uniqueItems": {
- "type": "boolean",
- "default": false
- },
- "contains": { "$ref": "#" },
- "maxProperties": { "$ref": "#/definitions/nonNegativeInteger" },
- "minProperties": { "$ref": "#/definitions/nonNegativeIntegerDefault0" },
- "required": { "$ref": "#/definitions/stringArray" },
+ "type": "object",
"additionalProperties": { "$ref": "#" },
- "definitions": {
- "type": "object",
- "additionalProperties": { "$ref": "#" },
- "default": {}
- },
- "properties": {
- "type": "object",
- "additionalProperties": { "$ref": "#" },
- "default": {}
- },
- "patternProperties": {
- "type": "object",
- "additionalProperties": { "$ref": "#" },
- "propertyNames": { "format": "regex" },
- "default": {}
- },
- "dependencies": {
- "type": "object",
- "additionalProperties": {
- "anyOf": [{ "$ref": "#" }, { "$ref": "#/definitions/stringArray" }]
+ "default": {}
+ },
+ "patternProperties": {
+ "type": "object",
+ "additionalProperties": { "$ref": "#" },
+ "propertyNames": { "format": "regex" },
+ "default": {}
+ },
+ "dependencies": {
+ "type": "object",
+ "additionalProperties": {
+ "anyOf": [{ "$ref": "#" }, { "$ref": "#/definitions/stringArray" }]
+ }
+ },
+ "propertyNames": { "$ref": "#" },
+ "const": true,
+ "enum": {
+ "type": "array",
+ "items": true,
+ "minItems": 1,
+ "uniqueItems": true
+ },
+ "type": {
+ "anyOf": [
+ { "$ref": "#/definitions/simpleTypes" },
+ {
+ "type": "array",
+ "items": { "$ref": "#/definitions/simpleTypes" },
+ "minItems": 1,
+ "uniqueItems": true
}
- },
- "propertyNames": { "$ref": "#" },
- "const": true,
- "enum": {
- "type": "array",
- "items": true,
- "minItems": 1,
- "uniqueItems": true
- },
- "type": {
- "anyOf": [
- { "$ref": "#/definitions/simpleTypes" },
- {
- "type": "array",
- "items": { "$ref": "#/definitions/simpleTypes" },
- "minItems": 1,
- "uniqueItems": true
- }
- ]
- },
- "format": { "type": "string" },
- "contentMediaType": { "type": "string" },
- "contentEncoding": { "type": "string" },
- "if": { "$ref": "#" },
- "then": { "$ref": "#" },
- "else": { "$ref": "#" },
- "allOf": { "$ref": "#/definitions/schemaArray" },
- "anyOf": { "$ref": "#/definitions/schemaArray" },
- "oneOf": { "$ref": "#/definitions/schemaArray" },
- "not": { "$ref": "#" }
- },
- "default": true
- }
-
\ No newline at end of file
+ ]
+ },
+ "format": { "type": "string" },
+ "contentMediaType": { "type": "string" },
+ "contentEncoding": { "type": "string" },
+ "if": { "$ref": "#" },
+ "then": { "$ref": "#" },
+ "else": { "$ref": "#" },
+ "allOf": { "$ref": "#/definitions/schemaArray" },
+ "anyOf": { "$ref": "#/definitions/schemaArray" },
+ "oneOf": { "$ref": "#/definitions/schemaArray" },
+ "not": { "$ref": "#" }
+ },
+ "default": true
+}
diff --git a/packages/example/src/core/jsonschema/specification/uischema.json b/packages/example/src/core/jsonschema/specification/uischema.json
index c4023d5581..3b606db923 100644
--- a/packages/example/src/core/jsonschema/specification/uischema.json
+++ b/packages/example/src/core/jsonschema/specification/uischema.json
@@ -1,16 +1,12 @@
{
"$schema": "http://json-schema.org/draft-07/schema",
+ "$id": "http://jsonforms.io/uischema",
+ "title": "UI schema meta-schema",
"type": "object",
- "$id": "#root",
"properties": {
"type": {
"type": "string",
- "enum": [
- "HorizontalLayout",
- "VerticalLayout",
- "Group",
- "Categorization"
- ]
+ "enum": ["HorizontalLayout", "VerticalLayout", "Group", "Categorization"]
},
"label": {
"type": "string"
@@ -19,7 +15,7 @@
"$ref": "#/definitions/elements"
},
"rule": {
- "$ref": "#/definitions/rule"
+ "$ref": "http://jsonforms.io/uischema/rule"
}
},
"definitions": {
@@ -114,7 +110,7 @@
"elements": "Layout should have an array property \"elements\"",
"type": "Layout should have a string property \"type\""
},
- "additionalProperties": "Layout should not have properties other than type and elements"
+ "additionalProperties": "Layout should not have properties other than type, elements and rule"
}
},
"verticallayout": {
@@ -133,10 +129,18 @@
"$ref": "#/definitions/rule"
}
},
- "required": [
- "type",
- "elements"
- ]
+ "required": ["type", "elements"],
+ "additionalProperties": false,
+ "errorMessage": {
+ "properties": {
+ "type": "type should be equal to one of the allowed values"
+ },
+ "required": {
+ "elements": "Layout should have an array property \"elements\"",
+ "type": "Layout should have a string property \"type\""
+ },
+ "additionalProperties": "Layout should not have properties other than type, elements and rule"
+ }
},
"categorization": {
"type": "object",
@@ -154,10 +158,7 @@
}
}
},
- "required": [
- "type",
- "elements"
- ],
+ "required": ["type", "elements"],
"additionalProperties": false,
"errorMessage": {
"properties": {
@@ -199,7 +200,7 @@
"type": "Category layout should have a string property \"type\"",
"elements": "Category layout should have an array property \"elements\""
},
- "additionalProperties": "Category layout should not have properties other than type,elements and label"
+ "additionalProperties": "Category layout should not have properties other than type, elements, label and rule"
}
},
"group": {
@@ -216,6 +217,9 @@
},
"label": {
"type": "string"
+ },
+ "rule": {
+ "$ref": "#/definitions/rule"
}
},
"required": ["type", "elements", "label"],
@@ -230,59 +234,11 @@
"elements": "Group layout should have an array property \"elements\"",
"label": "Group layout should have a string property \"label\""
},
- "additionalProperties": "Group layout should not have properties other than type,elements and label"
+ "additionalProperties": "Group layout should not have properties other than type, elements, label and rule"
}
},
"rule": {
- "type": "object",
- "$id": "#rule",
- "properties": {
- "effect": {
- "type": "string",
- "enum": [
- "HIDE",
- "SHOW",
- "DISABLE",
- "ENABLE"
- ]
- },
- "condition": {
- "type": "object",
- "properties": {
- "type": {
- "type": "string",
- "const": "LEAF",
- "default": "LEAF"
- },
- "scope": {
- "$ref": "#/definitions/scope"
- },
- "expectedValue": {
- "type": [
- "string",
- "integer",
- "number",
- "boolean"
- ]
- }
- },
- "required": [
- "type",
- "scope",
- "expectedValue"
- ]
- }
- },
- "dependencies": {
- "effect": ["condition"],
- "condition": ["effect"]
- },
- "errorMessage": {
- "dependencies": {
- "effect": "Effect has to de defined",
- "condition": "Condition has to be defined"
- }
- }
+ "$ref": "http://jsonforms.io/uischema/rule"
},
"scope": {
"type": "string",
@@ -295,10 +251,7 @@
"additionalProperties": true
}
},
- "required": [
- "elements",
- "type"
- ],
+ "required": ["elements", "type"],
"additionalProperties": false,
"errorMessage": {
"properties": {
@@ -311,4 +264,4 @@
},
"additionalProperties": "Root should not have properties other than type, elements, label and rule"
}
-}
\ No newline at end of file
+}
diff --git a/packages/example/src/core/types.ts b/packages/example/src/core/types.ts
new file mode 100644
index 0000000000..16fa0a0837
--- /dev/null
+++ b/packages/example/src/core/types.ts
@@ -0,0 +1,17 @@
+import { UISchemaElement, JsonSchema } from '@jsonforms/core';
+
+export type Example = {
+ id: string;
+ title: string;
+ input: {
+ schema?: JsonSchema;
+ uischema?: UISchemaElement;
+ data: Record;
+ };
+};
+
+export type ResolvedSchema = {
+ schema?: JsonSchema;
+ resolved: boolean;
+ error?: string;
+};
diff --git a/packages/example/src/components/examples/allOf/data.json b/packages/example/src/examples/allOf/data.json
similarity index 100%
rename from packages/example/src/components/examples/allOf/data.json
rename to packages/example/src/examples/allOf/data.json
diff --git a/packages/example/src/components/examples/allOf/index.ts b/packages/example/src/examples/allOf/index.ts
similarity index 100%
rename from packages/example/src/components/examples/allOf/index.ts
rename to packages/example/src/examples/allOf/index.ts
diff --git a/packages/example/src/components/examples/allOf/schema.json b/packages/example/src/examples/allOf/schema.json
similarity index 100%
rename from packages/example/src/components/examples/allOf/schema.json
rename to packages/example/src/examples/allOf/schema.json
diff --git a/packages/example/src/components/examples/allOf/uischema.json b/packages/example/src/examples/allOf/uischema.json
similarity index 100%
rename from packages/example/src/components/examples/allOf/uischema.json
rename to packages/example/src/examples/allOf/uischema.json
diff --git a/packages/example/src/components/examples/anyOf-simple/data.json b/packages/example/src/examples/anyOf-simple/data.json
similarity index 100%
rename from packages/example/src/components/examples/anyOf-simple/data.json
rename to packages/example/src/examples/anyOf-simple/data.json
diff --git a/packages/example/src/components/examples/anyOf-simple/index.ts b/packages/example/src/examples/anyOf-simple/index.ts
similarity index 100%
rename from packages/example/src/components/examples/anyOf-simple/index.ts
rename to packages/example/src/examples/anyOf-simple/index.ts
diff --git a/packages/example/src/components/examples/anyOf-simple/schema.json b/packages/example/src/examples/anyOf-simple/schema.json
similarity index 100%
rename from packages/example/src/components/examples/anyOf-simple/schema.json
rename to packages/example/src/examples/anyOf-simple/schema.json
diff --git a/packages/example/src/components/examples/anyOf/data.json b/packages/example/src/examples/anyOf/data.json
similarity index 100%
rename from packages/example/src/components/examples/anyOf/data.json
rename to packages/example/src/examples/anyOf/data.json
diff --git a/packages/example/src/components/examples/anyOf/index.ts b/packages/example/src/examples/anyOf/index.ts
similarity index 100%
rename from packages/example/src/components/examples/anyOf/index.ts
rename to packages/example/src/examples/anyOf/index.ts
diff --git a/packages/example/src/components/examples/anyOf/schema.json b/packages/example/src/examples/anyOf/schema.json
similarity index 100%
rename from packages/example/src/components/examples/anyOf/schema.json
rename to packages/example/src/examples/anyOf/schema.json
diff --git a/packages/example/src/components/examples/anyOf/uischema.json b/packages/example/src/examples/anyOf/uischema.json
similarity index 100%
rename from packages/example/src/components/examples/anyOf/uischema.json
rename to packages/example/src/examples/anyOf/uischema.json
diff --git a/packages/example/src/components/examples/array-restrict/data.json b/packages/example/src/examples/array-restrict/data.json
similarity index 100%
rename from packages/example/src/components/examples/array-restrict/data.json
rename to packages/example/src/examples/array-restrict/data.json
diff --git a/packages/example/src/components/examples/array-restrict/index.ts b/packages/example/src/examples/array-restrict/index.ts
similarity index 100%
rename from packages/example/src/components/examples/array-restrict/index.ts
rename to packages/example/src/examples/array-restrict/index.ts
diff --git a/packages/example/src/components/examples/array-restrict/schema.json b/packages/example/src/examples/array-restrict/schema.json
similarity index 100%
rename from packages/example/src/components/examples/array-restrict/schema.json
rename to packages/example/src/examples/array-restrict/schema.json
diff --git a/packages/example/src/components/examples/array-restrict/uischema.json b/packages/example/src/examples/array-restrict/uischema.json
similarity index 100%
rename from packages/example/src/components/examples/array-restrict/uischema.json
rename to packages/example/src/examples/array-restrict/uischema.json
diff --git a/packages/example/src/components/examples/array-with-reorder/data.json b/packages/example/src/examples/array-with-reorder/data.json
similarity index 100%
rename from packages/example/src/components/examples/array-with-reorder/data.json
rename to packages/example/src/examples/array-with-reorder/data.json
diff --git a/packages/example/src/components/examples/array-with-reorder/index.ts b/packages/example/src/examples/array-with-reorder/index.ts
similarity index 100%
rename from packages/example/src/components/examples/array-with-reorder/index.ts
rename to packages/example/src/examples/array-with-reorder/index.ts
diff --git a/packages/example/src/components/examples/array-with-reorder/schema.json b/packages/example/src/examples/array-with-reorder/schema.json
similarity index 100%
rename from packages/example/src/components/examples/array-with-reorder/schema.json
rename to packages/example/src/examples/array-with-reorder/schema.json
diff --git a/packages/example/src/components/examples/array-with-reorder/uischema.json b/packages/example/src/examples/array-with-reorder/uischema.json
similarity index 100%
rename from packages/example/src/components/examples/array-with-reorder/uischema.json
rename to packages/example/src/examples/array-with-reorder/uischema.json
diff --git a/packages/example/src/components/examples/array/data.json b/packages/example/src/examples/array/data.json
similarity index 100%
rename from packages/example/src/components/examples/array/data.json
rename to packages/example/src/examples/array/data.json
diff --git a/packages/example/src/components/examples/array/index.ts b/packages/example/src/examples/array/index.ts
similarity index 100%
rename from packages/example/src/components/examples/array/index.ts
rename to packages/example/src/examples/array/index.ts
diff --git a/packages/example/src/components/examples/array/schema.json b/packages/example/src/examples/array/schema.json
similarity index 100%
rename from packages/example/src/components/examples/array/schema.json
rename to packages/example/src/examples/array/schema.json
diff --git a/packages/example/src/components/examples/array/uischema.json b/packages/example/src/examples/array/uischema.json
similarity index 100%
rename from packages/example/src/components/examples/array/uischema.json
rename to packages/example/src/examples/array/uischema.json
diff --git a/packages/example/src/components/examples/basic/data.json b/packages/example/src/examples/basic/data.json
similarity index 100%
rename from packages/example/src/components/examples/basic/data.json
rename to packages/example/src/examples/basic/data.json
diff --git a/packages/example/src/components/examples/basic/index.ts b/packages/example/src/examples/basic/index.ts
similarity index 100%
rename from packages/example/src/components/examples/basic/index.ts
rename to packages/example/src/examples/basic/index.ts
diff --git a/packages/example/src/components/examples/basic/schema.json b/packages/example/src/examples/basic/schema.json
similarity index 100%
rename from packages/example/src/components/examples/basic/schema.json
rename to packages/example/src/examples/basic/schema.json
diff --git a/packages/example/src/components/examples/basic/uischema.json b/packages/example/src/examples/basic/uischema.json
similarity index 100%
rename from packages/example/src/components/examples/basic/uischema.json
rename to packages/example/src/examples/basic/uischema.json
diff --git a/packages/example/src/components/examples/categorization-stepper-nav/data.json b/packages/example/src/examples/categorization-stepper-nav/data.json
similarity index 100%
rename from packages/example/src/components/examples/categorization-stepper-nav/data.json
rename to packages/example/src/examples/categorization-stepper-nav/data.json
diff --git a/packages/example/src/components/examples/categorization-stepper-nav/index.ts b/packages/example/src/examples/categorization-stepper-nav/index.ts
similarity index 100%
rename from packages/example/src/components/examples/categorization-stepper-nav/index.ts
rename to packages/example/src/examples/categorization-stepper-nav/index.ts
diff --git a/packages/example/src/components/examples/categorization-stepper-nav/schema.json b/packages/example/src/examples/categorization-stepper-nav/schema.json
similarity index 100%
rename from packages/example/src/components/examples/categorization-stepper-nav/schema.json
rename to packages/example/src/examples/categorization-stepper-nav/schema.json
diff --git a/packages/example/src/components/examples/categorization-stepper-nav/uischema.json b/packages/example/src/examples/categorization-stepper-nav/uischema.json
similarity index 100%
rename from packages/example/src/components/examples/categorization-stepper-nav/uischema.json
rename to packages/example/src/examples/categorization-stepper-nav/uischema.json
diff --git a/packages/example/src/components/examples/categorization-stepper/data.json b/packages/example/src/examples/categorization-stepper/data.json
similarity index 100%
rename from packages/example/src/components/examples/categorization-stepper/data.json
rename to packages/example/src/examples/categorization-stepper/data.json
diff --git a/packages/example/src/components/examples/categorization-stepper/index.ts b/packages/example/src/examples/categorization-stepper/index.ts
similarity index 100%
rename from packages/example/src/components/examples/categorization-stepper/index.ts
rename to packages/example/src/examples/categorization-stepper/index.ts
diff --git a/packages/example/src/components/examples/categorization-stepper/schema.json b/packages/example/src/examples/categorization-stepper/schema.json
similarity index 100%
rename from packages/example/src/components/examples/categorization-stepper/schema.json
rename to packages/example/src/examples/categorization-stepper/schema.json
diff --git a/packages/example/src/components/examples/categorization-stepper/uischema.json b/packages/example/src/examples/categorization-stepper/uischema.json
similarity index 100%
rename from packages/example/src/components/examples/categorization-stepper/uischema.json
rename to packages/example/src/examples/categorization-stepper/uischema.json
diff --git a/packages/example/src/components/examples/categorization/data.json b/packages/example/src/examples/categorization/data.json
similarity index 100%
rename from packages/example/src/components/examples/categorization/data.json
rename to packages/example/src/examples/categorization/data.json
diff --git a/packages/example/src/components/examples/categorization/index.ts b/packages/example/src/examples/categorization/index.ts
similarity index 100%
rename from packages/example/src/components/examples/categorization/index.ts
rename to packages/example/src/examples/categorization/index.ts
diff --git a/packages/example/src/components/examples/categorization/schema.json b/packages/example/src/examples/categorization/schema.json
similarity index 100%
rename from packages/example/src/components/examples/categorization/schema.json
rename to packages/example/src/examples/categorization/schema.json
diff --git a/packages/example/src/components/examples/categorization/uischema.json b/packages/example/src/examples/categorization/uischema.json
similarity index 100%
rename from packages/example/src/components/examples/categorization/uischema.json
rename to packages/example/src/examples/categorization/uischema.json
diff --git a/packages/example/src/components/examples/control-options/data.json b/packages/example/src/examples/control-options/data.json
similarity index 100%
rename from packages/example/src/components/examples/control-options/data.json
rename to packages/example/src/examples/control-options/data.json
diff --git a/packages/example/src/components/examples/control-options/index.ts b/packages/example/src/examples/control-options/index.ts
similarity index 100%
rename from packages/example/src/components/examples/control-options/index.ts
rename to packages/example/src/examples/control-options/index.ts
diff --git a/packages/example/src/components/examples/control-options/schema.json b/packages/example/src/examples/control-options/schema.json
similarity index 100%
rename from packages/example/src/components/examples/control-options/schema.json
rename to packages/example/src/examples/control-options/schema.json
diff --git a/packages/example/src/components/examples/control-options/uischema.json b/packages/example/src/examples/control-options/uischema.json
similarity index 100%
rename from packages/example/src/components/examples/control-options/uischema.json
rename to packages/example/src/examples/control-options/uischema.json
diff --git a/packages/example/src/components/examples/control/data.json b/packages/example/src/examples/control/data.json
similarity index 100%
rename from packages/example/src/components/examples/control/data.json
rename to packages/example/src/examples/control/data.json
diff --git a/packages/example/src/components/examples/control/index.ts b/packages/example/src/examples/control/index.ts
similarity index 100%
rename from packages/example/src/components/examples/control/index.ts
rename to packages/example/src/examples/control/index.ts
diff --git a/packages/example/src/components/examples/control/schema.json b/packages/example/src/examples/control/schema.json
similarity index 100%
rename from packages/example/src/components/examples/control/schema.json
rename to packages/example/src/examples/control/schema.json
diff --git a/packages/example/src/components/examples/control/uischema.json b/packages/example/src/examples/control/uischema.json
similarity index 100%
rename from packages/example/src/components/examples/control/uischema.json
rename to packages/example/src/examples/control/uischema.json
diff --git a/packages/example/src/components/examples/enum-in-array/data.json b/packages/example/src/examples/enum-in-array/data.json
similarity index 100%
rename from packages/example/src/components/examples/enum-in-array/data.json
rename to packages/example/src/examples/enum-in-array/data.json
diff --git a/packages/example/src/components/examples/enum-in-array/index.ts b/packages/example/src/examples/enum-in-array/index.ts
similarity index 100%
rename from packages/example/src/components/examples/enum-in-array/index.ts
rename to packages/example/src/examples/enum-in-array/index.ts
diff --git a/packages/example/src/components/examples/enum-in-array/schema.json b/packages/example/src/examples/enum-in-array/schema.json
similarity index 100%
rename from packages/example/src/components/examples/enum-in-array/schema.json
rename to packages/example/src/examples/enum-in-array/schema.json
diff --git a/packages/example/src/components/examples/enum-in-array/uischema.json b/packages/example/src/examples/enum-in-array/uischema.json
similarity index 100%
rename from packages/example/src/components/examples/enum-in-array/uischema.json
rename to packages/example/src/examples/enum-in-array/uischema.json
diff --git a/packages/example/src/components/examples/enum/data.json b/packages/example/src/examples/enum/data.json
similarity index 100%
rename from packages/example/src/components/examples/enum/data.json
rename to packages/example/src/examples/enum/data.json
diff --git a/packages/example/src/components/examples/enum/index.ts b/packages/example/src/examples/enum/index.ts
similarity index 100%
rename from packages/example/src/components/examples/enum/index.ts
rename to packages/example/src/examples/enum/index.ts
diff --git a/packages/example/src/components/examples/enum/schema.json b/packages/example/src/examples/enum/schema.json
similarity index 100%
rename from packages/example/src/components/examples/enum/schema.json
rename to packages/example/src/examples/enum/schema.json
diff --git a/packages/example/src/components/examples/enum/uischema.json b/packages/example/src/examples/enum/uischema.json
similarity index 100%
rename from packages/example/src/components/examples/enum/uischema.json
rename to packages/example/src/examples/enum/uischema.json
diff --git a/packages/example/src/components/examples/group-layout/data.json b/packages/example/src/examples/group-layout/data.json
similarity index 100%
rename from packages/example/src/components/examples/group-layout/data.json
rename to packages/example/src/examples/group-layout/data.json
diff --git a/packages/example/src/components/examples/group-layout/index.ts b/packages/example/src/examples/group-layout/index.ts
similarity index 100%
rename from packages/example/src/components/examples/group-layout/index.ts
rename to packages/example/src/examples/group-layout/index.ts
diff --git a/packages/example/src/components/examples/group-layout/schema.json b/packages/example/src/examples/group-layout/schema.json
similarity index 100%
rename from packages/example/src/components/examples/group-layout/schema.json
rename to packages/example/src/examples/group-layout/schema.json
diff --git a/packages/example/src/components/examples/group-layout/uischema.json b/packages/example/src/examples/group-layout/uischema.json
similarity index 100%
rename from packages/example/src/components/examples/group-layout/uischema.json
rename to packages/example/src/examples/group-layout/uischema.json
diff --git a/packages/example/src/components/examples/horizontal-layout/data.json b/packages/example/src/examples/horizontal-layout/data.json
similarity index 100%
rename from packages/example/src/components/examples/horizontal-layout/data.json
rename to packages/example/src/examples/horizontal-layout/data.json
diff --git a/packages/example/src/components/examples/horizontal-layout/index.ts b/packages/example/src/examples/horizontal-layout/index.ts
similarity index 100%
rename from packages/example/src/components/examples/horizontal-layout/index.ts
rename to packages/example/src/examples/horizontal-layout/index.ts
diff --git a/packages/example/src/components/examples/horizontal-layout/schema.json b/packages/example/src/examples/horizontal-layout/schema.json
similarity index 100%
rename from packages/example/src/components/examples/horizontal-layout/schema.json
rename to packages/example/src/examples/horizontal-layout/schema.json
diff --git a/packages/example/src/components/examples/horizontal-layout/uischema.json b/packages/example/src/examples/horizontal-layout/uischema.json
similarity index 100%
rename from packages/example/src/components/examples/horizontal-layout/uischema.json
rename to packages/example/src/examples/horizontal-layout/uischema.json
diff --git a/packages/example/src/components/examples/huge/data.json b/packages/example/src/examples/huge/data.json
similarity index 100%
rename from packages/example/src/components/examples/huge/data.json
rename to packages/example/src/examples/huge/data.json
diff --git a/packages/example/src/components/examples/huge/index.ts b/packages/example/src/examples/huge/index.ts
similarity index 100%
rename from packages/example/src/components/examples/huge/index.ts
rename to packages/example/src/examples/huge/index.ts
diff --git a/packages/example/src/components/examples/huge/schema.json b/packages/example/src/examples/huge/schema.json
similarity index 100%
rename from packages/example/src/components/examples/huge/schema.json
rename to packages/example/src/examples/huge/schema.json
diff --git a/packages/example/src/components/examples/huge/uischema.json b/packages/example/src/examples/huge/uischema.json
similarity index 100%
rename from packages/example/src/components/examples/huge/uischema.json
rename to packages/example/src/examples/huge/uischema.json
diff --git a/packages/example/src/components/examples/if-then-else/data.json b/packages/example/src/examples/if-then-else/data.json
similarity index 100%
rename from packages/example/src/components/examples/if-then-else/data.json
rename to packages/example/src/examples/if-then-else/data.json
diff --git a/packages/example/src/components/examples/if-then-else/index.ts b/packages/example/src/examples/if-then-else/index.ts
similarity index 100%
rename from packages/example/src/components/examples/if-then-else/index.ts
rename to packages/example/src/examples/if-then-else/index.ts
diff --git a/packages/example/src/components/examples/if-then-else/schema.json b/packages/example/src/examples/if-then-else/schema.json
similarity index 100%
rename from packages/example/src/components/examples/if-then-else/schema.json
rename to packages/example/src/examples/if-then-else/schema.json
diff --git a/packages/example/src/components/examples/index.ts b/packages/example/src/examples/index.ts
similarity index 83%
rename from packages/example/src/components/examples/index.ts
rename to packages/example/src/examples/index.ts
index 396acf1fbb..4c236f89f1 100644
--- a/packages/example/src/components/examples/index.ts
+++ b/packages/example/src/examples/index.ts
@@ -39,158 +39,193 @@ import { input as ifThenElse } from './if-then-else';
export const examples = [
{
+ id: 'main',
title: 'Main',
input: main,
},
{
+ id: 'basic',
title: 'Basic',
input: basic,
},
{
+ id: 'control',
title: 'Control',
input: control,
},
{
+ id: 'control-options',
title: 'Control Options',
input: controlOptions,
},
{
+ id: 'enum',
title: 'Enum',
input: enumExample,
},
{
+ id: 'enum-in-array',
title: 'Enum In Array',
input: enumInArray,
},
{
+ id: 'multi-array',
title: 'Multi Enum',
input: multiEnum,
},
{
+ id: 'categorization',
title: 'Categorization',
input: categorization,
},
{
+ id: 'categorization-stepper',
title: 'Categorization Stepper',
input: categorizationStepper,
},
{
+ id: 'categorization-stepper-nav',
title: 'Categorization Stepper With Navigation',
input: categorizationStepperNav,
},
{
+ id: 'horizontal-layout',
title: 'Horizontal Layout',
input: horizontalLayout,
},
{
+ id: 'vertical-layout',
title: 'Vertical Layout',
input: verticalLayout,
},
{
+ id: 'group-layout',
title: 'Group Layout',
input: groupLayout,
},
{
+ id: 'nested-layout',
title: 'Nested Layout',
input: nestedLayout,
},
{
+ id: 'array',
title: 'Array',
input: array,
},
{
+ id: 'array-restrict',
title: 'Array Min/Max Items',
input: arrayRestrict,
},
{
+ id: 'array-with-reorder',
title: 'Array With Reorder',
input: arrayWithReorder,
},
{
+ id: 'nested-array',
title: 'Nested Array',
input: nestedArray,
},
{
+ id: 'nested-array-restrict',
title: 'Nested Array Min/Max Items',
input: nestedArrayRestrict,
},
{
+ id: 'nested-array-with-reorder',
title: 'Nested Array With Reorder',
input: nestedArrayWithReorder,
},
{
+ id: 'rule',
title: 'Rule',
input: rule,
},
{
+ id: 'login',
title: 'Login',
input: login,
},
{
+ id: 'radio',
title: 'Radio',
input: radio,
},
{
+ id: 'radio-group',
title: 'Radio Group',
input: radioGroup,
},
{
+ id: 'object',
title: 'Object',
input: object,
},
{
+ id: 'root-object',
title: 'Root Object',
input: rootObject,
},
{
+ id: 'no-ui-schema',
title: 'Generate UI Schema',
input: noUISchema,
},
{
+ id: 'no-schemas',
title: 'Generate Both Schemas',
input: noSchemas,
},
{
+ id: 'one-of',
title: 'Combinators oneOf',
input: oneOf,
},
{
+ id: 'one-of-recursive',
title: 'Combinators oneOf recursive',
input: oneOfRecursive,
},
{
+ id: 'any-of',
title: 'Combinators anyOf',
input: anyOf,
},
{
+ id: 'any-of-simple',
title: 'Combinators anyOf simple',
input: anyOfSimple,
},
{
+ id: 'all-of',
title: 'Combinators allOf',
input: allOf,
},
{
+ id: 'list-with-details',
title: 'List With Details',
input: listWithDetails,
},
{
+ id: 'list-with-details-restrict',
title: 'List With Details Min/Max Items',
input: listWithDetailsRestrict,
},
{
+ id: 'list-with-details-reorder',
title: 'List With Details And Reorder',
input: listWithDetailsAndReorder,
},
{
+ id: 'if-then-else',
title: 'If Then Else',
input: ifThenElse,
},
- //TODO: Temporary disable the Huge example since it does generate errors and the browser hangs
- /*
{
+ id: 'huge',
title: 'Huge',
input: huge,
},
- */
];
diff --git a/packages/example/src/components/examples/list-with-details-and-reorder/data.json b/packages/example/src/examples/list-with-details-and-reorder/data.json
similarity index 100%
rename from packages/example/src/components/examples/list-with-details-and-reorder/data.json
rename to packages/example/src/examples/list-with-details-and-reorder/data.json
diff --git a/packages/example/src/components/examples/list-with-details-and-reorder/index.ts b/packages/example/src/examples/list-with-details-and-reorder/index.ts
similarity index 100%
rename from packages/example/src/components/examples/list-with-details-and-reorder/index.ts
rename to packages/example/src/examples/list-with-details-and-reorder/index.ts
diff --git a/packages/example/src/components/examples/list-with-details-and-reorder/schema.json b/packages/example/src/examples/list-with-details-and-reorder/schema.json
similarity index 100%
rename from packages/example/src/components/examples/list-with-details-and-reorder/schema.json
rename to packages/example/src/examples/list-with-details-and-reorder/schema.json
diff --git a/packages/example/src/components/examples/list-with-details-and-reorder/uischema.json b/packages/example/src/examples/list-with-details-and-reorder/uischema.json
similarity index 100%
rename from packages/example/src/components/examples/list-with-details-and-reorder/uischema.json
rename to packages/example/src/examples/list-with-details-and-reorder/uischema.json
diff --git a/packages/example/src/components/examples/list-with-details-restrict/data.json b/packages/example/src/examples/list-with-details-restrict/data.json
similarity index 100%
rename from packages/example/src/components/examples/list-with-details-restrict/data.json
rename to packages/example/src/examples/list-with-details-restrict/data.json
diff --git a/packages/example/src/components/examples/list-with-details-restrict/index.ts b/packages/example/src/examples/list-with-details-restrict/index.ts
similarity index 100%
rename from packages/example/src/components/examples/list-with-details-restrict/index.ts
rename to packages/example/src/examples/list-with-details-restrict/index.ts
diff --git a/packages/example/src/components/examples/list-with-details-restrict/schema.json b/packages/example/src/examples/list-with-details-restrict/schema.json
similarity index 100%
rename from packages/example/src/components/examples/list-with-details-restrict/schema.json
rename to packages/example/src/examples/list-with-details-restrict/schema.json
diff --git a/packages/example/src/components/examples/list-with-details-restrict/uischema.json b/packages/example/src/examples/list-with-details-restrict/uischema.json
similarity index 100%
rename from packages/example/src/components/examples/list-with-details-restrict/uischema.json
rename to packages/example/src/examples/list-with-details-restrict/uischema.json
diff --git a/packages/example/src/components/examples/list-with-details/data.json b/packages/example/src/examples/list-with-details/data.json
similarity index 100%
rename from packages/example/src/components/examples/list-with-details/data.json
rename to packages/example/src/examples/list-with-details/data.json
diff --git a/packages/example/src/components/examples/list-with-details/index.ts b/packages/example/src/examples/list-with-details/index.ts
similarity index 100%
rename from packages/example/src/components/examples/list-with-details/index.ts
rename to packages/example/src/examples/list-with-details/index.ts
diff --git a/packages/example/src/components/examples/list-with-details/schema.json b/packages/example/src/examples/list-with-details/schema.json
similarity index 100%
rename from packages/example/src/components/examples/list-with-details/schema.json
rename to packages/example/src/examples/list-with-details/schema.json
diff --git a/packages/example/src/components/examples/list-with-details/uischema.json b/packages/example/src/examples/list-with-details/uischema.json
similarity index 100%
rename from packages/example/src/components/examples/list-with-details/uischema.json
rename to packages/example/src/examples/list-with-details/uischema.json
diff --git a/packages/example/src/components/examples/login/data.json b/packages/example/src/examples/login/data.json
similarity index 100%
rename from packages/example/src/components/examples/login/data.json
rename to packages/example/src/examples/login/data.json
diff --git a/packages/example/src/components/examples/login/index.ts b/packages/example/src/examples/login/index.ts
similarity index 100%
rename from packages/example/src/components/examples/login/index.ts
rename to packages/example/src/examples/login/index.ts
diff --git a/packages/example/src/components/examples/login/schema.json b/packages/example/src/examples/login/schema.json
similarity index 100%
rename from packages/example/src/components/examples/login/schema.json
rename to packages/example/src/examples/login/schema.json
diff --git a/packages/example/src/components/examples/login/uischema.json b/packages/example/src/examples/login/uischema.json
similarity index 100%
rename from packages/example/src/components/examples/login/uischema.json
rename to packages/example/src/examples/login/uischema.json
diff --git a/packages/example/src/components/examples/main/data.json b/packages/example/src/examples/main/data.json
similarity index 100%
rename from packages/example/src/components/examples/main/data.json
rename to packages/example/src/examples/main/data.json
diff --git a/packages/example/src/components/examples/main/index.ts b/packages/example/src/examples/main/index.ts
similarity index 100%
rename from packages/example/src/components/examples/main/index.ts
rename to packages/example/src/examples/main/index.ts
diff --git a/packages/example/src/components/examples/main/schema.json b/packages/example/src/examples/main/schema.json
similarity index 100%
rename from packages/example/src/components/examples/main/schema.json
rename to packages/example/src/examples/main/schema.json
diff --git a/packages/example/src/components/examples/main/uischema.json b/packages/example/src/examples/main/uischema.json
similarity index 100%
rename from packages/example/src/components/examples/main/uischema.json
rename to packages/example/src/examples/main/uischema.json
diff --git a/packages/example/src/components/examples/multi-enum/data.json b/packages/example/src/examples/multi-enum/data.json
similarity index 100%
rename from packages/example/src/components/examples/multi-enum/data.json
rename to packages/example/src/examples/multi-enum/data.json
diff --git a/packages/example/src/components/examples/multi-enum/index.ts b/packages/example/src/examples/multi-enum/index.ts
similarity index 100%
rename from packages/example/src/components/examples/multi-enum/index.ts
rename to packages/example/src/examples/multi-enum/index.ts
diff --git a/packages/example/src/components/examples/multi-enum/schema.json b/packages/example/src/examples/multi-enum/schema.json
similarity index 100%
rename from packages/example/src/components/examples/multi-enum/schema.json
rename to packages/example/src/examples/multi-enum/schema.json
diff --git a/packages/example/src/components/examples/multi-enum/uischema.json b/packages/example/src/examples/multi-enum/uischema.json
similarity index 100%
rename from packages/example/src/components/examples/multi-enum/uischema.json
rename to packages/example/src/examples/multi-enum/uischema.json
diff --git a/packages/example/src/components/examples/nested-array-restrict/data.json b/packages/example/src/examples/nested-array-restrict/data.json
similarity index 100%
rename from packages/example/src/components/examples/nested-array-restrict/data.json
rename to packages/example/src/examples/nested-array-restrict/data.json
diff --git a/packages/example/src/components/examples/nested-array-restrict/index.ts b/packages/example/src/examples/nested-array-restrict/index.ts
similarity index 100%
rename from packages/example/src/components/examples/nested-array-restrict/index.ts
rename to packages/example/src/examples/nested-array-restrict/index.ts
diff --git a/packages/example/src/components/examples/nested-array-restrict/schema.json b/packages/example/src/examples/nested-array-restrict/schema.json
similarity index 100%
rename from packages/example/src/components/examples/nested-array-restrict/schema.json
rename to packages/example/src/examples/nested-array-restrict/schema.json
diff --git a/packages/example/src/components/examples/nested-array-restrict/uischema.json b/packages/example/src/examples/nested-array-restrict/uischema.json
similarity index 100%
rename from packages/example/src/components/examples/nested-array-restrict/uischema.json
rename to packages/example/src/examples/nested-array-restrict/uischema.json
diff --git a/packages/example/src/components/examples/nested-array-with-reorder/data.json b/packages/example/src/examples/nested-array-with-reorder/data.json
similarity index 100%
rename from packages/example/src/components/examples/nested-array-with-reorder/data.json
rename to packages/example/src/examples/nested-array-with-reorder/data.json
diff --git a/packages/example/src/components/examples/nested-array-with-reorder/index.ts b/packages/example/src/examples/nested-array-with-reorder/index.ts
similarity index 100%
rename from packages/example/src/components/examples/nested-array-with-reorder/index.ts
rename to packages/example/src/examples/nested-array-with-reorder/index.ts
diff --git a/packages/example/src/components/examples/nested-array-with-reorder/schema.json b/packages/example/src/examples/nested-array-with-reorder/schema.json
similarity index 100%
rename from packages/example/src/components/examples/nested-array-with-reorder/schema.json
rename to packages/example/src/examples/nested-array-with-reorder/schema.json
diff --git a/packages/example/src/components/examples/nested-array-with-reorder/uischema.json b/packages/example/src/examples/nested-array-with-reorder/uischema.json
similarity index 100%
rename from packages/example/src/components/examples/nested-array-with-reorder/uischema.json
rename to packages/example/src/examples/nested-array-with-reorder/uischema.json
diff --git a/packages/example/src/components/examples/nested-array/data.json b/packages/example/src/examples/nested-array/data.json
similarity index 100%
rename from packages/example/src/components/examples/nested-array/data.json
rename to packages/example/src/examples/nested-array/data.json
diff --git a/packages/example/src/components/examples/nested-array/index.ts b/packages/example/src/examples/nested-array/index.ts
similarity index 100%
rename from packages/example/src/components/examples/nested-array/index.ts
rename to packages/example/src/examples/nested-array/index.ts
diff --git a/packages/example/src/components/examples/nested-array/schema.json b/packages/example/src/examples/nested-array/schema.json
similarity index 100%
rename from packages/example/src/components/examples/nested-array/schema.json
rename to packages/example/src/examples/nested-array/schema.json
diff --git a/packages/example/src/components/examples/nested-array/uischema.json b/packages/example/src/examples/nested-array/uischema.json
similarity index 100%
rename from packages/example/src/components/examples/nested-array/uischema.json
rename to packages/example/src/examples/nested-array/uischema.json
diff --git a/packages/example/src/components/examples/nested-layout/data.json b/packages/example/src/examples/nested-layout/data.json
similarity index 100%
rename from packages/example/src/components/examples/nested-layout/data.json
rename to packages/example/src/examples/nested-layout/data.json
diff --git a/packages/example/src/components/examples/nested-layout/index.ts b/packages/example/src/examples/nested-layout/index.ts
similarity index 100%
rename from packages/example/src/components/examples/nested-layout/index.ts
rename to packages/example/src/examples/nested-layout/index.ts
diff --git a/packages/example/src/components/examples/nested-layout/schema.json b/packages/example/src/examples/nested-layout/schema.json
similarity index 100%
rename from packages/example/src/components/examples/nested-layout/schema.json
rename to packages/example/src/examples/nested-layout/schema.json
diff --git a/packages/example/src/components/examples/nested-layout/uischema.json b/packages/example/src/examples/nested-layout/uischema.json
similarity index 100%
rename from packages/example/src/components/examples/nested-layout/uischema.json
rename to packages/example/src/examples/nested-layout/uischema.json
diff --git a/packages/example/src/components/examples/no-schemas/data.json b/packages/example/src/examples/no-schemas/data.json
similarity index 100%
rename from packages/example/src/components/examples/no-schemas/data.json
rename to packages/example/src/examples/no-schemas/data.json
diff --git a/packages/example/src/components/examples/no-schemas/index.ts b/packages/example/src/examples/no-schemas/index.ts
similarity index 100%
rename from packages/example/src/components/examples/no-schemas/index.ts
rename to packages/example/src/examples/no-schemas/index.ts
diff --git a/packages/example/src/components/examples/no-ui-schema/data.json b/packages/example/src/examples/no-ui-schema/data.json
similarity index 100%
rename from packages/example/src/components/examples/no-ui-schema/data.json
rename to packages/example/src/examples/no-ui-schema/data.json
diff --git a/packages/example/src/components/examples/no-ui-schema/index.ts b/packages/example/src/examples/no-ui-schema/index.ts
similarity index 100%
rename from packages/example/src/components/examples/no-ui-schema/index.ts
rename to packages/example/src/examples/no-ui-schema/index.ts
diff --git a/packages/example/src/components/examples/no-ui-schema/schema.json b/packages/example/src/examples/no-ui-schema/schema.json
similarity index 100%
rename from packages/example/src/components/examples/no-ui-schema/schema.json
rename to packages/example/src/examples/no-ui-schema/schema.json
diff --git a/packages/example/src/components/examples/object/data.json b/packages/example/src/examples/object/data.json
similarity index 100%
rename from packages/example/src/components/examples/object/data.json
rename to packages/example/src/examples/object/data.json
diff --git a/packages/example/src/components/examples/object/index.ts b/packages/example/src/examples/object/index.ts
similarity index 100%
rename from packages/example/src/components/examples/object/index.ts
rename to packages/example/src/examples/object/index.ts
diff --git a/packages/example/src/components/examples/object/schema.json b/packages/example/src/examples/object/schema.json
similarity index 100%
rename from packages/example/src/components/examples/object/schema.json
rename to packages/example/src/examples/object/schema.json
diff --git a/packages/example/src/components/examples/object/uischema.json b/packages/example/src/examples/object/uischema.json
similarity index 100%
rename from packages/example/src/components/examples/object/uischema.json
rename to packages/example/src/examples/object/uischema.json
diff --git a/packages/example/src/components/examples/oneOf-recursive/data.json b/packages/example/src/examples/oneOf-recursive/data.json
similarity index 100%
rename from packages/example/src/components/examples/oneOf-recursive/data.json
rename to packages/example/src/examples/oneOf-recursive/data.json
diff --git a/packages/example/src/components/examples/oneOf-recursive/index.ts b/packages/example/src/examples/oneOf-recursive/index.ts
similarity index 100%
rename from packages/example/src/components/examples/oneOf-recursive/index.ts
rename to packages/example/src/examples/oneOf-recursive/index.ts
diff --git a/packages/example/src/components/examples/oneOf-recursive/schema.json b/packages/example/src/examples/oneOf-recursive/schema.json
similarity index 100%
rename from packages/example/src/components/examples/oneOf-recursive/schema.json
rename to packages/example/src/examples/oneOf-recursive/schema.json
diff --git a/packages/example/src/components/examples/oneOf-recursive/uischema.json b/packages/example/src/examples/oneOf-recursive/uischema.json
similarity index 100%
rename from packages/example/src/components/examples/oneOf-recursive/uischema.json
rename to packages/example/src/examples/oneOf-recursive/uischema.json
diff --git a/packages/example/src/components/examples/oneOf/data.json b/packages/example/src/examples/oneOf/data.json
similarity index 100%
rename from packages/example/src/components/examples/oneOf/data.json
rename to packages/example/src/examples/oneOf/data.json
diff --git a/packages/example/src/components/examples/oneOf/index.ts b/packages/example/src/examples/oneOf/index.ts
similarity index 100%
rename from packages/example/src/components/examples/oneOf/index.ts
rename to packages/example/src/examples/oneOf/index.ts
diff --git a/packages/example/src/components/examples/oneOf/schema.json b/packages/example/src/examples/oneOf/schema.json
similarity index 100%
rename from packages/example/src/components/examples/oneOf/schema.json
rename to packages/example/src/examples/oneOf/schema.json
diff --git a/packages/example/src/components/examples/oneOf/uischema.json b/packages/example/src/examples/oneOf/uischema.json
similarity index 100%
rename from packages/example/src/components/examples/oneOf/uischema.json
rename to packages/example/src/examples/oneOf/uischema.json
diff --git a/packages/example/src/components/examples/radio-group/data.json b/packages/example/src/examples/radio-group/data.json
similarity index 100%
rename from packages/example/src/components/examples/radio-group/data.json
rename to packages/example/src/examples/radio-group/data.json
diff --git a/packages/example/src/components/examples/radio-group/index.ts b/packages/example/src/examples/radio-group/index.ts
similarity index 100%
rename from packages/example/src/components/examples/radio-group/index.ts
rename to packages/example/src/examples/radio-group/index.ts
diff --git a/packages/example/src/components/examples/radio-group/schema.json b/packages/example/src/examples/radio-group/schema.json
similarity index 100%
rename from packages/example/src/components/examples/radio-group/schema.json
rename to packages/example/src/examples/radio-group/schema.json
diff --git a/packages/example/src/components/examples/radio-group/uischema.json b/packages/example/src/examples/radio-group/uischema.json
similarity index 100%
rename from packages/example/src/components/examples/radio-group/uischema.json
rename to packages/example/src/examples/radio-group/uischema.json
diff --git a/packages/example/src/components/examples/radio/data.json b/packages/example/src/examples/radio/data.json
similarity index 100%
rename from packages/example/src/components/examples/radio/data.json
rename to packages/example/src/examples/radio/data.json
diff --git a/packages/example/src/components/examples/radio/index.ts b/packages/example/src/examples/radio/index.ts
similarity index 100%
rename from packages/example/src/components/examples/radio/index.ts
rename to packages/example/src/examples/radio/index.ts
diff --git a/packages/example/src/components/examples/radio/schema.json b/packages/example/src/examples/radio/schema.json
similarity index 100%
rename from packages/example/src/components/examples/radio/schema.json
rename to packages/example/src/examples/radio/schema.json
diff --git a/packages/example/src/components/examples/radio/uischema.json b/packages/example/src/examples/radio/uischema.json
similarity index 100%
rename from packages/example/src/components/examples/radio/uischema.json
rename to packages/example/src/examples/radio/uischema.json
diff --git a/packages/example/src/components/examples/root-object/data.json b/packages/example/src/examples/root-object/data.json
similarity index 100%
rename from packages/example/src/components/examples/root-object/data.json
rename to packages/example/src/examples/root-object/data.json
diff --git a/packages/example/src/components/examples/root-object/index.ts b/packages/example/src/examples/root-object/index.ts
similarity index 100%
rename from packages/example/src/components/examples/root-object/index.ts
rename to packages/example/src/examples/root-object/index.ts
diff --git a/packages/example/src/components/examples/root-object/schema.json b/packages/example/src/examples/root-object/schema.json
similarity index 100%
rename from packages/example/src/components/examples/root-object/schema.json
rename to packages/example/src/examples/root-object/schema.json
diff --git a/packages/example/src/components/examples/root-object/uischema.json b/packages/example/src/examples/root-object/uischema.json
similarity index 100%
rename from packages/example/src/components/examples/root-object/uischema.json
rename to packages/example/src/examples/root-object/uischema.json
diff --git a/packages/example/src/components/examples/rule/data.json b/packages/example/src/examples/rule/data.json
similarity index 100%
rename from packages/example/src/components/examples/rule/data.json
rename to packages/example/src/examples/rule/data.json
diff --git a/packages/example/src/components/examples/rule/index.ts b/packages/example/src/examples/rule/index.ts
similarity index 100%
rename from packages/example/src/components/examples/rule/index.ts
rename to packages/example/src/examples/rule/index.ts
diff --git a/packages/example/src/components/examples/rule/schema.json b/packages/example/src/examples/rule/schema.json
similarity index 100%
rename from packages/example/src/components/examples/rule/schema.json
rename to packages/example/src/examples/rule/schema.json
diff --git a/packages/example/src/components/examples/rule/uischema.json b/packages/example/src/examples/rule/uischema.json
similarity index 100%
rename from packages/example/src/components/examples/rule/uischema.json
rename to packages/example/src/examples/rule/uischema.json
diff --git a/packages/example/src/components/examples/vertical-layout/data.json b/packages/example/src/examples/vertical-layout/data.json
similarity index 100%
rename from packages/example/src/components/examples/vertical-layout/data.json
rename to packages/example/src/examples/vertical-layout/data.json
diff --git a/packages/example/src/components/examples/vertical-layout/index.ts b/packages/example/src/examples/vertical-layout/index.ts
similarity index 100%
rename from packages/example/src/components/examples/vertical-layout/index.ts
rename to packages/example/src/examples/vertical-layout/index.ts
diff --git a/packages/example/src/components/examples/vertical-layout/schema.json b/packages/example/src/examples/vertical-layout/schema.json
similarity index 100%
rename from packages/example/src/components/examples/vertical-layout/schema.json
rename to packages/example/src/examples/vertical-layout/schema.json
diff --git a/packages/example/src/components/examples/vertical-layout/uischema.json b/packages/example/src/examples/vertical-layout/uischema.json
similarity index 100%
rename from packages/example/src/components/examples/vertical-layout/uischema.json
rename to packages/example/src/examples/vertical-layout/uischema.json
diff --git a/packages/example/src/layouts/default/AppBar.vue b/packages/example/src/layouts/default/AppBar.vue
new file mode 100644
index 0000000000..a13d5d8a6e
--- /dev/null
+++ b/packages/example/src/layouts/default/AppBar.vue
@@ -0,0 +1,57 @@
+
+
+
+
+
+
+
+
+
+ JSON Forms
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/example/src/layouts/default/Drawer.vue b/packages/example/src/layouts/default/Drawer.vue
new file mode 100644
index 0000000000..205f363943
--- /dev/null
+++ b/packages/example/src/layouts/default/Drawer.vue
@@ -0,0 +1,56 @@
+
+
+
+
+
+
+
+ Examples
+ Vuetify Renderers
+
+
+
+
+
+
+
+
+ {{ example.title }}
+
+
+
+
+
+
+
diff --git a/packages/example/src/layouts/default/View.vue b/packages/example/src/layouts/default/View.vue
new file mode 100644
index 0000000000..fe91fbcd34
--- /dev/null
+++ b/packages/example/src/layouts/default/View.vue
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
diff --git a/packages/example/src/layouts/default/index.vue b/packages/example/src/layouts/default/index.vue
new file mode 100644
index 0000000000..d3395efc56
--- /dev/null
+++ b/packages/example/src/layouts/default/index.vue
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/example/src/main.ts b/packages/example/src/main.ts
index 893a0fb45f..7843a5489f 100644
--- a/packages/example/src/main.ts
+++ b/packages/example/src/main.ts
@@ -1,13 +1,17 @@
import Vue from 'vue';
import App from './App.vue';
-
-import VueCompositionAPI from '@vue/composition-api';
+import router from './router';
+import store from './store';
import vuetify from './plugins/vuetify';
+import './plugins';
+import VueCompositionAPI from '@vue/composition-api';
Vue.use(VueCompositionAPI);
Vue.config.productionTip = false;
new Vue({
+ router,
+ store,
vuetify,
render: (h) => h(App),
}).$mount('#app');
diff --git a/packages/example/src/plugins/app.ts b/packages/example/src/plugins/app.ts
new file mode 100644
index 0000000000..b9f14cd58f
--- /dev/null
+++ b/packages/example/src/plugins/app.ts
@@ -0,0 +1,23 @@
+/**
+ * plugins/app.ts
+ *
+ * Automatically loads and bootstraps files
+ * in the `./src/components/` folder.
+ */
+
+export function registerComponents(app) {
+ // Automatically get all .vue files within
+ // `src/components` and register them to
+ // the current app.
+ // https://webpack.js.org/guides/dependency-management/#requirecontext
+ const requireComponent = require.context('@/components', true, /\.vue$/);
+
+ for (const file of requireComponent.keys()) {
+ const componentConfig = requireComponent(file);
+
+ app.component(
+ componentConfig.default.name,
+ componentConfig.default || componentConfig
+ );
+ }
+}
diff --git a/packages/example/src/plugins/index.ts b/packages/example/src/plugins/index.ts
new file mode 100644
index 0000000000..36c3352e9f
--- /dev/null
+++ b/packages/example/src/plugins/index.ts
@@ -0,0 +1 @@
+import './app';
diff --git a/packages/example/src/plugins/vuex-pathify.ts b/packages/example/src/plugins/vuex-pathify.ts
new file mode 100644
index 0000000000..ef21fe3ae9
--- /dev/null
+++ b/packages/example/src/plugins/vuex-pathify.ts
@@ -0,0 +1,9 @@
+import pathify from 'vuex-pathify';
+
+// options
+pathify.options.mapping = 'standard'; // map states to store members using the "standard" scheme [standard, simple, custom]
+pathify.options.strict = true; // throw an error if the store member cannot be found
+pathify.options.cache = true; // cache generated functions for faster re-use
+pathify.options.deep = 2; // allow sub-property access to Vuex stores
+
+export default pathify;
diff --git a/packages/example/src/router/index.ts b/packages/example/src/router/index.ts
new file mode 100644
index 0000000000..dec20133ce
--- /dev/null
+++ b/packages/example/src/router/index.ts
@@ -0,0 +1,32 @@
+import Vue from 'vue';
+import Router from 'vue-router';
+
+Vue.use(Router);
+
+export default new Router({
+ base: process.env.BASE_URL,
+ scrollBehavior: (to, _, savedPosition) => {
+ if (to.hash) return { selector: to.hash };
+ if (savedPosition) return savedPosition;
+
+ return { x: 0, y: 0 };
+ },
+ routes: [
+ {
+ path: '/',
+ component: () => import('../layouts/default/index.vue'),
+ children: [
+ {
+ path: '',
+ name: 'Default',
+ component: () => import('../views/home'),
+ },
+ {
+ path: 'example/:id',
+ name: 'example',
+ component: () => import('../views/example'),
+ },
+ ],
+ },
+ ],
+});
diff --git a/packages/example/src/store/index.ts b/packages/example/src/store/index.ts
new file mode 100644
index 0000000000..5eeb2c57aa
--- /dev/null
+++ b/packages/example/src/store/index.ts
@@ -0,0 +1,34 @@
+/**
+ * Vuetify Vue CLI Preset
+ *
+ * store/index.js
+ *
+ * vuex documentation: https://vuex.vuejs.org/
+ */
+
+// Vue
+import Vue from 'vue';
+import Vuex from 'vuex';
+import { RootState } from './types';
+
+// Utilities
+// https://davestewart.github.io/vuex-pathify/#/
+import pathify from '../plugins/vuex-pathify';
+
+// Modules
+// https://vuex.vuejs.org/guide/modules.html
+import * as modules from './modules';
+
+Vue.use(Vuex);
+
+export default new Vuex.Store({
+ state: {
+ version: '1.0.0',
+ },
+ modules,
+ plugins: [pathify.plugin],
+});
+
+// A reusable const for making root commits and dispatches
+// https://vuex.vuejs.org/guide/modules.html#accessing-global-assets-in-namespaced-modules
+export const ROOT_DISPATCH = Object.freeze({ root: true });
diff --git a/packages/example/src/store/modules/app.ts b/packages/example/src/store/modules/app.ts
new file mode 100644
index 0000000000..53cc416d2d
--- /dev/null
+++ b/packages/example/src/store/modules/app.ts
@@ -0,0 +1,47 @@
+// Pathify
+import { make } from 'vuex-pathify';
+import { AppState } from './types';
+import { RootState } from '../types';
+import { Module } from 'vuex';
+import { createAjv, extendedVuetifyRenderers } from '@jsonforms/vue2-vuetify';
+
+const ajv = createAjv({ useDefaults: true });
+
+// Data
+const state: AppState = {
+ drawer: null,
+ jsonforms: {
+ readonly: false,
+ validationMode: 'ValidateAndShow',
+ config: {
+ restrict: true,
+ trim: false,
+ showUnfocusedDescription: false,
+ hideRequiredAsterisk: true,
+ },
+ renderers: extendedVuetifyRenderers,
+ cells: extendedVuetifyRenderers,
+ ajv,
+ },
+ monaco: {
+ schemaModel: undefined,
+ uischemaModel: undefined,
+ dataModel: undefined,
+ },
+};
+
+const mutations = make.mutations(state);
+
+const actions = make.actions(state);
+
+const getters = {};
+
+const app: Module = {
+ namespaced: true,
+ state,
+ mutations,
+ actions,
+ getters,
+};
+
+export default app;
diff --git a/packages/example/src/store/modules/index.ts b/packages/example/src/store/modules/index.ts
new file mode 100644
index 0000000000..92704b8d88
--- /dev/null
+++ b/packages/example/src/store/modules/index.ts
@@ -0,0 +1 @@
+export { default as app } from './app';
diff --git a/packages/example/src/store/modules/types.ts b/packages/example/src/store/modules/types.ts
new file mode 100644
index 0000000000..440eb37a83
--- /dev/null
+++ b/packages/example/src/store/modules/types.ts
@@ -0,0 +1,29 @@
+import {
+ JsonFormsRendererRegistryEntry,
+ JsonFormsCellRendererRegistryEntry,
+} from '@jsonforms/core';
+import * as monaco from 'monaco-editor/esm/vs/editor/editor.api';
+import AJV from 'ajv';
+
+// declare your own store states
+export interface AppState {
+ drawer: boolean | null;
+ jsonforms: {
+ readonly: boolean;
+ validationMode: 'ValidateAndShow' | 'ValidateAndHide' | 'NoValidation';
+ config: {
+ restrict: boolean;
+ trim: boolean;
+ showUnfocusedDescription: boolean;
+ hideRequiredAsterisk: boolean;
+ };
+ renderers: JsonFormsRendererRegistryEntry[];
+ cells: JsonFormsCellRendererRegistryEntry[];
+ ajv: AJV.Ajv;
+ };
+ monaco: {
+ schemaModel: monaco.editor.ITextModel | undefined;
+ uischemaModel: monaco.editor.ITextModel | undefined;
+ dataModel: monaco.editor.ITextModel | undefined;
+ };
+}
diff --git a/packages/example/src/store/types.ts b/packages/example/src/store/types.ts
new file mode 100644
index 0000000000..6e9937309e
--- /dev/null
+++ b/packages/example/src/store/types.ts
@@ -0,0 +1,3 @@
+export interface RootState {
+ version: string;
+}
diff --git a/packages/example/src/views/example/Example.vue b/packages/example/src/views/example/Example.vue
new file mode 100644
index 0000000000..e16f4b32d8
--- /dev/null
+++ b/packages/example/src/views/example/Example.vue
@@ -0,0 +1,468 @@
+
+
+
+
+ {{ example.title }}
+
+
+ Demo
+
+ Schema
+ UI Schema
+ Data
+
+
+
+
+
+
+
+
+ Schema
+
+
+
+
+ mdi-reload
+
+
+ {{ `Reload Example Schema` }}
+
+
+
+
+ mdi-content-save
+
+
+ {{ `Apply Change To Example Schema` }}
+
+
+
+
+
+
+
+
+
+
+
+ UI Schema
+
+
+
+
+ mdi-reload
+
+
+ {{ `Reload Example UI Schema` }}
+
+
+
+
+ mdi-content-save
+
+
+ {{ `Apply Change To Example UI Schema` }}
+
+
+
+
+
+
+
+
+
+
+
+ Data
+
+
+
+
+ mdi-reload
+
+
+ {{ `Reload Example Data` }}
+
+
+
+
+ mdi-content-save
+
+
+ {{ `Apply Change To Example Data` }}
+
+
+
+
+
+
+
+
+
+
+
+ {{ snackbarText }}
+
+
+ Close
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/example/src/views/example/index.ts b/packages/example/src/views/example/index.ts
new file mode 100644
index 0000000000..b803b68d2a
--- /dev/null
+++ b/packages/example/src/views/example/index.ts
@@ -0,0 +1,3 @@
+import Example from './Example.vue';
+
+export default Example;
diff --git a/packages/example/src/views/home/Home.vue b/packages/example/src/views/home/Home.vue
new file mode 100644
index 0000000000..fa7834d166
--- /dev/null
+++ b/packages/example/src/views/home/Home.vue
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
+
+
+ Welcome to JSON Forms Vue 2 Vuetify
+
+
+
+ For help and collaboration with other JSON Forms developers,
+ please join our online
+ Discourse Community
+
+
+
+
+
+
+
diff --git a/packages/example/src/views/home/index.ts b/packages/example/src/views/home/index.ts
new file mode 100644
index 0000000000..a94aeae41f
--- /dev/null
+++ b/packages/example/src/views/home/index.ts
@@ -0,0 +1,3 @@
+import Home from './Home.vue';
+
+export default Home;
diff --git a/packages/example/tsconfig.json b/packages/example/tsconfig.json
index e621cbc365..b3f57742e2 100644
--- a/packages/example/tsconfig.json
+++ b/packages/example/tsconfig.json
@@ -12,12 +12,13 @@
"sourceMap": true,
"baseUrl": ".",
"types": [
- "webpack-env"
+ "webpack-env",
+ "vuex-pathify/types/vuex"
],
"paths": {
"@/*": [
"src/*"
- ]
+ ],
},
"lib": [
"esnext",
diff --git a/packages/example/vue.config.js b/packages/example/vue.config.js
index c8a6639bda..2c37abdb82 100644
--- a/packages/example/vue.config.js
+++ b/packages/example/vue.config.js
@@ -1,17 +1,17 @@
-const MonacoWebpackPlugin = require("monaco-editor-webpack-plugin");
+const MonacoWebpackPlugin = require('monaco-editor-webpack-plugin');
module.exports = {
chainWebpack: (config) => {
// remove typecheck
- config.plugins.delete("fork-ts-checker");
+ config.plugins.delete('fork-ts-checker');
- config.plugin("monaco-editor").use(MonacoWebpackPlugin, [
+ config.plugin('monaco-editor').use(MonacoWebpackPlugin, [
{
// Languages are loaded on demand at runtime
- languages: ["json"],
+ languages: ['json'],
},
]);
-
+
return config;
},
devServer: {
@@ -19,6 +19,6 @@ module.exports = {
ignored: ['node_modules'],
poll: true,
},
- },
+ },
transpileDependencies: ['vuetify'],
};
From 1f89e5785bdbc0706da32380fda1898b50c103c7 Mon Sep 17 00:00:00 2001
From: Stefan Dirix
Date: Thu, 28 Oct 2021 09:24:00 +0200
Subject: [PATCH 008/185] I18n integration
Update to JSON Forms 3.0.0-alpha.2 which contains the new
i18n customization capatibilities. As AJV is now consumed
on version 8 some additional code changes are necessary.
Adapts the label renderer to use the new translation
functions.
Adds an example translation function to the example app.
---
packages/example/package.json | 6 +-
packages/example/src/components/DemoForm.vue | 19 +++-
packages/example/src/components/Settings.vue | 36 ++++++++
.../example/src/examples/basic/schema.json | 46 +++++-----
packages/example/src/i18n/i18n.ts | 91 +++++++++++++++++++
packages/example/src/i18n/index.ts | 1 +
packages/example/src/store/modules/app.ts | 1 +
packages/example/src/store/modules/types.ts | 5 +-
.../example/src/views/example/Example.vue | 2 +
packages/vue2-vuetify/package.json | 12 ++-
.../src/additional/LabelRenderer.vue | 24 ++++-
.../src/additional/ListWithDetailRenderer.vue | 4 +-
.../controls/components/ValidationBadge.vue | 13 +--
.../src/layouts/ArrayLayoutRenderer.vue | 4 +-
packages/vue2-vuetify/src/util/composition.ts | 25 ++++-
packages/vue2-vuetify/src/util/validator.ts | 4 +-
16 files changed, 242 insertions(+), 51 deletions(-)
create mode 100644 packages/example/src/i18n/i18n.ts
create mode 100644 packages/example/src/i18n/index.ts
diff --git a/packages/example/package.json b/packages/example/package.json
index cbe647099d..8d1aaa00c2 100644
--- a/packages/example/package.json
+++ b/packages/example/package.json
@@ -8,9 +8,9 @@
"clean": "rimraf dist"
},
"dependencies": {
- "@jsonforms/core": "3.0.0-alpha.1",
- "@jsonforms/vue2": "3.0.0-alpha.1",
- "@jsonforms/vue2-vuetify": "3.0.0-alpha.1",
+ "@jsonforms/core": "3.0.0-alpha.2",
+ "@jsonforms/vue2": "3.0.0-alpha.2",
+ "@jsonforms/vue2-vuetify": "3.0.0-alpha.2",
"@vue/composition-api": "1.0.0-rc.3",
"core-js": "^3.6.5",
"vue": "^2.6.14",
diff --git a/packages/example/src/components/DemoForm.vue b/packages/example/src/components/DemoForm.vue
index 19a31c289f..868a66b42d 100644
--- a/packages/example/src/components/DemoForm.vue
+++ b/packages/example/src/components/DemoForm.vue
@@ -12,6 +12,7 @@
:validationMode="validationMode"
:ajv="ajv"
:readonly="readonly"
+ :i18n="i18n"
@change="onChange"
/>
@@ -58,9 +59,11 @@ import {
JsonFormsRendererRegistryEntry,
JsonFormsCellRendererRegistryEntry,
JsonSchema,
+ JsonFormsI18nState,
} from '@jsonforms/core';
import { JsonForms, JsonFormsChangeEvent } from '@jsonforms/vue2';
import JsonRefs from 'json-refs';
+import { createTranslator } from '../i18n';
export default {
name: 'demo-form',
@@ -103,6 +106,11 @@ export default {
type: Object as PropType,
default: undefined,
},
+ locale: {
+ required: false,
+ type: String,
+ default: 'en',
+ },
},
data() {
return {
@@ -111,15 +119,24 @@ export default {
resolved: false,
error: undefined,
} as ResolvedSchema,
+ i18n: {
+ locale: this.locale,
+ translate: createTranslator(this.locale),
+ } as JsonFormsI18nState,
};
},
watch: {
example: {
deep: true,
- handler(newExample: Example, oldExample: Example) {
+ handler(newExample: Example, oldExample: Example): void {
this.resolveSchema(newExample.input.schema);
},
},
+ locale(newLocale: string): void {
+ console.log('LOCALE SWITCH', newLocale);
+ this.i18n.locale = newLocale;
+ this.i18n.translate = createTranslator(newLocale);
+ },
},
mounted() {
this.resolveSchema(this.example.input.schema);
diff --git a/packages/example/src/components/Settings.vue b/packages/example/src/components/Settings.vue
index 85a90598cc..03cd038599 100644
--- a/packages/example/src/components/Settings.vue
+++ b/packages/example/src/components/Settings.vue
@@ -111,6 +111,23 @@
+
+ Locale (Mostly in basic example)
+
+
+
+
+
+
+
+
+
Options
@@ -170,6 +187,20 @@
+
+
+
+
+
+
+ Only applies to basic example
+
+
+
@@ -190,6 +221,7 @@ export default {
),
restrict: sync('app/jsonforms@config.restrict'),
readonly: sync('app/jsonforms@readonly'),
+ locale: sync('app/jsonforms@locale'),
},
data: function () {
return {
@@ -199,6 +231,10 @@ export default {
{ text: 'Validate And Hide', value: 'ValidateAndHide' },
{ text: 'No Validation', value: 'NoValidation' },
],
+ locales: [
+ { text: 'English (en)', value: 'en' },
+ { text: 'German (de)', value: 'de' },
+ ],
};
},
};
diff --git a/packages/example/src/examples/basic/schema.json b/packages/example/src/examples/basic/schema.json
index 215f8fd803..9ca98a942f 100644
--- a/packages/example/src/examples/basic/schema.json
+++ b/packages/example/src/examples/basic/schema.json
@@ -4,58 +4,54 @@
"name": {
"type": "string",
"minLength": 3,
- "description": "Please enter your name"
+ "description": "Please enter your name",
+ "i18n": "name"
},
"vegetarian": {
- "type": "boolean"
+ "type": "boolean",
+ "i18n": "vegetarian"
},
"birthDate": {
"type": "string",
- "format": "date"
+ "format": "date",
+ "i18n": "birth"
},
"nationality": {
"type": "string",
- "enum": [
- "DE",
- "IT",
- "JP",
- "US",
- "RU",
- "Other"
- ]
+ "enum": ["DE", "IT", "JP", "US", "RU", "Other"],
+ "i18n": "nationality"
},
"personalData": {
"type": "object",
"properties": {
"age": {
"type": "integer",
- "description": "Please enter your age."
+ "description": "Please enter your age.",
+ "i18n": "personal-data.age"
},
"height": {
- "type": "number"
+ "type": "number",
+ "i18n": "height"
},
"drivingSkill": {
"type": "number",
"maximum": 10,
"minimum": 1,
- "default": 7
+ "default": 7,
+ "i18n": "personal-data.driving"
}
},
- "required": [
- "age",
- "height"
- ]
+ "required": ["age", "height"]
},
"occupation": {
- "type": "string"
+ "type": "string",
+ "i18n": "occupation"
},
"postalCode": {
"type": "string",
- "maxLength": 5
+ "maxLength": 5,
+ "i18n": "postal-code"
}
},
- "required": [
- "occupation",
- "nationality"
- ]
-}
\ No newline at end of file
+ "required": ["occupation", "nationality"]
+}
diff --git a/packages/example/src/i18n/i18n.ts b/packages/example/src/i18n/i18n.ts
new file mode 100644
index 0000000000..92ec02ad7d
--- /dev/null
+++ b/packages/example/src/i18n/i18n.ts
@@ -0,0 +1,91 @@
+import get from 'lodash/get';
+
+const en = {
+ name: {
+ label: 'Name',
+ description: 'The name of the person',
+ },
+ vegetarian: {
+ label: 'Vegetarian',
+ description: 'Wether the person is a vegetarian',
+ },
+ birth: {
+ label: 'Birth Date',
+ description: '',
+ },
+ nationality: {
+ label: 'Nationality',
+ description: '',
+ },
+ 'personal-data': {
+ age: {
+ label: 'Age',
+ },
+ driving: {
+ label: 'Driving Skill',
+ description: 'Indicating experience level',
+ },
+ },
+ height: {
+ label: 'Height',
+ },
+ occupation: {
+ label: 'Occupation',
+ description: '',
+ },
+ 'postal-code': {
+ label: 'Postal Code',
+ },
+ error: {
+ required: 'field is required',
+ },
+};
+
+const de = {
+ name: {
+ label: 'Name',
+ description: 'Der Name der Person',
+ },
+ vegetarian: {
+ label: 'Vegetarier',
+ description: 'Isst die Person vegetarisch?',
+ },
+ birth: {
+ label: 'Geburtsdatum',
+ description: '',
+ },
+ nationality: {
+ label: 'Nationalität',
+ description: '',
+ Other: 'Andere',
+ },
+ 'personal-data': {
+ age: {
+ label: 'Alter',
+ },
+ driving: {
+ label: 'Fahrkenntnisse',
+ description: 'Fahrerfahrung der Person',
+ },
+ },
+ height: {
+ label: 'Größe',
+ },
+ occupation: {
+ label: 'Beruf',
+ description: '',
+ },
+ 'postal-code': {
+ label: 'Postleitzahl',
+ },
+ error: {
+ required: 'Pflichtfeld',
+ },
+ 'Additional Information': 'Zusätzliche Informationen',
+};
+
+export const createTranslator =
+ (locale: 'en' | 'de') =>
+ (key: string, defaultMessage: string | undefined): string | undefined => {
+ return get(locale === 'en' ? en : de, key) ?? defaultMessage;
+ };
diff --git a/packages/example/src/i18n/index.ts b/packages/example/src/i18n/index.ts
new file mode 100644
index 0000000000..e82230f1bf
--- /dev/null
+++ b/packages/example/src/i18n/index.ts
@@ -0,0 +1 @@
+export * from './i18n';
diff --git a/packages/example/src/store/modules/app.ts b/packages/example/src/store/modules/app.ts
index 53cc416d2d..9ee350ad7f 100644
--- a/packages/example/src/store/modules/app.ts
+++ b/packages/example/src/store/modules/app.ts
@@ -22,6 +22,7 @@ const state: AppState = {
renderers: extendedVuetifyRenderers,
cells: extendedVuetifyRenderers,
ajv,
+ locale: 'en',
},
monaco: {
schemaModel: undefined,
diff --git a/packages/example/src/store/modules/types.ts b/packages/example/src/store/modules/types.ts
index 440eb37a83..d4085c631d 100644
--- a/packages/example/src/store/modules/types.ts
+++ b/packages/example/src/store/modules/types.ts
@@ -3,7 +3,7 @@ import {
JsonFormsCellRendererRegistryEntry,
} from '@jsonforms/core';
import * as monaco from 'monaco-editor/esm/vs/editor/editor.api';
-import AJV from 'ajv';
+import Ajv from 'ajv';
// declare your own store states
export interface AppState {
@@ -19,7 +19,8 @@ export interface AppState {
};
renderers: JsonFormsRendererRegistryEntry[];
cells: JsonFormsCellRendererRegistryEntry[];
- ajv: AJV.Ajv;
+ ajv: Ajv;
+ locale: string;
};
monaco: {
schemaModel: monaco.editor.ITextModel | undefined;
diff --git a/packages/example/src/views/example/Example.vue b/packages/example/src/views/example/Example.vue
index e16f4b32d8..d001fcda30 100644
--- a/packages/example/src/views/example/Example.vue
+++ b/packages/example/src/views/example/Example.vue
@@ -20,6 +20,7 @@
:validationMode="validationMode"
:ajv="ajv"
:readonly="readonly"
+ :locale="locale"
@change="onChange"
/>
@@ -200,6 +201,7 @@ export default {
monacoSchemaModel: sync('app/monaco@schemaModel'),
monacoUiSchemaModel: sync('app/monaco@uischemaModel'),
monacoDataModel: sync('app/monaco@dataModel'),
+ locale: sync('app/jsonforms@locale'),
},
mounted() {
this.setExample(
diff --git a/packages/vue2-vuetify/package.json b/packages/vue2-vuetify/package.json
index eb6f0f7292..bedeab32fb 100644
--- a/packages/vue2-vuetify/package.json
+++ b/packages/vue2-vuetify/package.json
@@ -1,6 +1,6 @@
{
"name": "@jsonforms/vue2-vuetify",
- "version": "3.0.0-alpha.1",
+ "version": "3.0.0-alpha.2",
"description": "Vue 2 Vuetify renderers for JSON Forms",
"repository": "https://github.com/eclipsesource/jsonforms-vuetify-renderers",
"bugs": "https://github.com/eclipsesource/jsonforms/issues",
@@ -33,6 +33,7 @@
"watch": "rollup --watch --config rollup.config.js"
},
"dependencies": {
+ "ajv": "^8.6.1",
"dayjs": "^1.10.6",
"lodash": "^4.17.15"
},
@@ -41,15 +42,16 @@
"@vue/composition-api": "1.0.0-rc.3",
"vuetify": "^2.4.0",
"@mdi/font": "^5.9.55",
- "@jsonforms/core": "^3.0.0-alpha.1",
- "@jsonforms/vue2": "^3.0.0-alpha.1"
+ "@jsonforms/core": "^3.0.0-alpha.2",
+ "@jsonforms/vue2": "^3.0.0-alpha.2"
},
"devDependencies": {
+ "ajv": "^8.6.1",
"@babel/core": "^7.14.6",
"@babel/preset-env": "^7.14.7",
"@babel/preset-typescript": "^7.14.5",
- "@jsonforms/core": "3.0.0-alpha.1",
- "@jsonforms/vue2": "3.0.0-alpha.1",
+ "@jsonforms/core": "3.0.0-alpha.2",
+ "@jsonforms/vue2": "3.0.0-alpha.2",
"@typescript-eslint/eslint-plugin": "^4.18.0",
"@typescript-eslint/parser": "^4.18.0",
"@vue/eslint-config-prettier": "^6.0.0",
diff --git a/packages/vue2-vuetify/src/additional/LabelRenderer.vue b/packages/vue2-vuetify/src/additional/LabelRenderer.vue
index cf73c5a818..cce43332b7 100644
--- a/packages/vue2-vuetify/src/additional/LabelRenderer.vue
+++ b/packages/vue2-vuetify/src/additional/LabelRenderer.vue
@@ -1,6 +1,6 @@
- {{ layout.uischema.text }}
+ {{ translatedLabel }}
@@ -10,6 +10,7 @@ import {
Layout,
rankWith,
uiTypeIs,
+ LabelElement,
} from '@jsonforms/core';
import { defineComponent } from '../vue';
import {
@@ -18,7 +19,7 @@ import {
useJsonFormsLayout,
RendererProps,
} from '@jsonforms/vue2';
-import { useVuetifyLayout } from '../util';
+import { useVuetifyLayout, useTranslator } from '../util';
import { VLabel } from 'vuetify/lib';
const labelRenderer = defineComponent({
@@ -31,8 +32,23 @@ const labelRenderer = defineComponent({
...rendererProps(),
},
setup(props: RendererProps) {
- // reuse layout bindings for label
- return useVuetifyLayout(useJsonFormsLayout(props));
+ const t = useTranslator();
+ const layout = useVuetifyLayout(useJsonFormsLayout(props));
+ return { ...layout, t };
+ },
+ computed: {
+ translatedLabel(): string | undefined {
+ if (this.layout.uischema.options?.i18n) {
+ return this.t(
+ this.layout.uischema.options.i18n,
+ (this.layout.uischema as LabelElement).text
+ );
+ }
+ return this.t(
+ (this.layout.uischema as LabelElement).text,
+ (this.layout.uischema as LabelElement).text
+ );
+ },
},
});
diff --git a/packages/vue2-vuetify/src/additional/ListWithDetailRenderer.vue b/packages/vue2-vuetify/src/additional/ListWithDetailRenderer.vue
index afd8b1490f..21f42c9818 100644
--- a/packages/vue2-vuetify/src/additional/ListWithDetailRenderer.vue
+++ b/packages/vue2-vuetify/src/additional/ListWithDetailRenderer.vue
@@ -326,7 +326,9 @@ const controlRenderer = defineComponent({
},
childErrors(index: number): ErrorObject[] {
return this.control.childErrors.filter((e) =>
- e.dataPath.startsWith(this.composePaths(this.control.path, `${index}`))
+ e.instancePath.startsWith(
+ this.composePaths(this.control.path, `${index}`)
+ )
);
},
},
diff --git a/packages/vue2-vuetify/src/controls/components/ValidationBadge.vue b/packages/vue2-vuetify/src/controls/components/ValidationBadge.vue
index 4a4e4a19b2..fc4e170aad 100644
--- a/packages/vue2-vuetify/src/controls/components/ValidationBadge.vue
+++ b/packages/vue2-vuetify/src/controls/components/ValidationBadge.vue
@@ -38,6 +38,7 @@ import findIndex from 'lodash/findIndex';
import {
createControlElement,
createLabelDescriptionFrom,
+ JsonSchema,
} from '@jsonforms/core';
export default defineComponent({
@@ -79,7 +80,7 @@ export default defineComponent({
computed: {
tooltipMessages(): string[] {
const error: {
- dataPath: string;
+ instancePath: string;
schemaPath: string;
labels: (string | undefined)[];
message: string;
@@ -92,11 +93,11 @@ export default defineComponent({
if (index == -1) {
error.push({
schemaPath: errorObject.schemaPath,
- dataPath: errorObject.dataPath,
+ instancePath: errorObject.instancePath,
labels: [
createLabelDescriptionFrom(
- createControlElement(errorObject.dataPath),
- errorObject.schema
+ createControlElement(errorObject.instancePath),
+ errorObject.schema as JsonSchema
).text,
],
message: errorObject.message,
@@ -104,8 +105,8 @@ export default defineComponent({
} else {
error[index].labels.push(
createLabelDescriptionFrom(
- createControlElement(errorObject.dataPath),
- errorObject.schema
+ createControlElement(errorObject.instancePath),
+ errorObject.schema as JsonSchema
).text
);
}
diff --git a/packages/vue2-vuetify/src/layouts/ArrayLayoutRenderer.vue b/packages/vue2-vuetify/src/layouts/ArrayLayoutRenderer.vue
index d277967782..0cf2e5c010 100644
--- a/packages/vue2-vuetify/src/layouts/ArrayLayoutRenderer.vue
+++ b/packages/vue2-vuetify/src/layouts/ArrayLayoutRenderer.vue
@@ -295,7 +295,9 @@ const controlRenderer = defineComponent({
},
childErrors(index: number): ErrorObject[] {
return this.control.childErrors.filter((e) =>
- e.dataPath.startsWith(this.composePaths(this.control.path, `${index}`))
+ e.instancePath.startsWith(
+ this.composePaths(this.control.path, `${index}`)
+ )
);
},
},
diff --git a/packages/vue2-vuetify/src/util/composition.ts b/packages/vue2-vuetify/src/util/composition.ts
index ddbcffb35f..718a70e387 100644
--- a/packages/vue2-vuetify/src/util/composition.ts
+++ b/packages/vue2-vuetify/src/util/composition.ts
@@ -10,7 +10,7 @@ import cloneDeep from 'lodash/cloneDeep';
import merge from 'lodash/merge';
import { useStyles } from '../styles';
import { computed, ComputedRef, inject, ref } from '../vue';
-import { Ajv } from 'ajv';
+import Ajv from 'ajv';
const useControlAppliedOptions = (input: I) => {
return computed(() =>
@@ -82,6 +82,29 @@ export const useVuetifyControl = <
};
};
+export const useTranslator = () => {
+ const jsonforms = inject('jsonforms');
+
+ if (!jsonforms) {
+ throw new Error(
+ "'jsonforms couldn't be injected. Are you within JSON Forms?"
+ );
+ }
+
+ if (!jsonforms.i18n || !jsonforms.i18n.translate) {
+ throw new Error(
+ "'jsonforms i18n couldn't be injected. Are you within JSON Forms?"
+ );
+ }
+
+ const translate = computed(() => {
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
+ return jsonforms.i18n!.translate!;
+ });
+
+ return translate;
+};
+
/**
* Adds styles and appliedOptions
*/
diff --git a/packages/vue2-vuetify/src/util/validator.ts b/packages/vue2-vuetify/src/util/validator.ts
index e25f7e59a6..f78b8b33b7 100644
--- a/packages/vue2-vuetify/src/util/validator.ts
+++ b/packages/vue2-vuetify/src/util/validator.ts
@@ -1,8 +1,8 @@
import { Options } from 'ajv';
import { createAjv as createAjvCore } from '@jsonforms/core';
-import AJV from 'ajv';
+import Ajv from 'ajv';
-export const createAjv = (options?: Options): AJV.Ajv => {
+export const createAjv = (options?: Options): Ajv => {
const ajv = createAjvCore(options);
ajv.addFormat('password', (_) => true);
return ajv;
From db03376132a816220f98c75c4ba3ee9a99c90970 Mon Sep 17 00:00:00 2001
From: Stefan Dirix
Date: Mon, 8 Nov 2021 17:06:42 +0100
Subject: [PATCH 009/185] Prepare renderer set package.json for release
- Mark directories to be included in release
- Mark package to be publicly available
Release commit of @jsonforms/vue2-vuetify@3.0.0-alpha.2
---
packages/vue2-vuetify/package.json | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/packages/vue2-vuetify/package.json b/packages/vue2-vuetify/package.json
index bedeab32fb..914ed4ef10 100644
--- a/packages/vue2-vuetify/package.json
+++ b/packages/vue2-vuetify/package.json
@@ -6,6 +6,9 @@
"bugs": "https://github.com/eclipsesource/jsonforms/issues",
"homepage": "http://jsonforms.io/",
"license": "MIT",
+ "publishConfig": {
+ "access": "public"
+ },
"keywords": [
"vue",
"vue2",
@@ -27,6 +30,10 @@
],
"main": "lib/jsonforms-vue2-vuetify.cjs.js",
"typings": "lib/index.d.ts",
+ "files": [
+ "lib",
+ "src"
+ ],
"scripts": {
"prebuild": "rimraf lib",
"build": "rollup --config rollup.config.js",
From 9a597477285a892045ae84727eaa8191b3bfb62a Mon Sep 17 00:00:00 2001
From: Stefan Dirix
Date: Wed, 15 Dec 2021 10:57:57 +0100
Subject: [PATCH 010/185] Dispatch text changes immediately
Hook the update mechanism to `@input` instead of `@change` for text
based inputs. This allows JSON Forms to validate new data immediately
instead of waiting for the user to 'exit' the current input. However
this has a negative effect on performance.
---
packages/vue2-vuetify/src/controls/DateControlRenderer.vue | 2 +-
packages/vue2-vuetify/src/controls/IntegerControlRenderer.vue | 2 +-
.../vue2-vuetify/src/controls/MultiStringControlRenderer.vue | 2 +-
packages/vue2-vuetify/src/controls/NumberControlRenderer.vue | 2 +-
.../vue2-vuetify/src/controls/PasswordControlRenderer.vue | 2 +-
packages/vue2-vuetify/src/controls/StringControlRenderer.vue | 4 ++--
packages/vue2-vuetify/src/controls/TimeControlRenderer.vue | 2 +-
.../src/extended/AutocompleteEnumControlRenderer.vue | 2 +-
.../src/extended/AutocompleteOneOfEnumControlRenderer.vue | 2 +-
9 files changed, 10 insertions(+), 10 deletions(-)
diff --git a/packages/vue2-vuetify/src/controls/DateControlRenderer.vue b/packages/vue2-vuetify/src/controls/DateControlRenderer.vue
index d09757469d..22edf67c74 100644
--- a/packages/vue2-vuetify/src/controls/DateControlRenderer.vue
+++ b/packages/vue2-vuetify/src/controls/DateControlRenderer.vue
@@ -18,7 +18,7 @@
:required="control.required"
:error-messages="control.errors"
:value="control.data"
- @change="onChange"
+ @input="onChange"
@focus="isFocused = true"
@blur="isFocused = false"
/>
diff --git a/packages/vue2-vuetify/src/controls/IntegerControlRenderer.vue b/packages/vue2-vuetify/src/controls/IntegerControlRenderer.vue
index 56f37bae34..efc5acf628 100644
--- a/packages/vue2-vuetify/src/controls/IntegerControlRenderer.vue
+++ b/packages/vue2-vuetify/src/controls/IntegerControlRenderer.vue
@@ -19,7 +19,7 @@
:required="control.required"
:error-messages="control.errors"
:value="control.data"
- @change="onChange"
+ @input="onChange"
@focus="isFocused = true"
@blur="isFocused = false"
/>
diff --git a/packages/vue2-vuetify/src/controls/MultiStringControlRenderer.vue b/packages/vue2-vuetify/src/controls/MultiStringControlRenderer.vue
index 03f64d0fef..10e0074923 100644
--- a/packages/vue2-vuetify/src/controls/MultiStringControlRenderer.vue
+++ b/packages/vue2-vuetify/src/controls/MultiStringControlRenderer.vue
@@ -29,7 +29,7 @@
"
:clearable="hover"
multi-line
- @change="onChange"
+ @input="onChange"
@focus="isFocused = true"
@blur="isFocused = false"
/>
diff --git a/packages/vue2-vuetify/src/controls/NumberControlRenderer.vue b/packages/vue2-vuetify/src/controls/NumberControlRenderer.vue
index 3535042cc4..5cc35535ec 100644
--- a/packages/vue2-vuetify/src/controls/NumberControlRenderer.vue
+++ b/packages/vue2-vuetify/src/controls/NumberControlRenderer.vue
@@ -19,7 +19,7 @@
:required="control.required"
:error-messages="control.errors"
:value="control.data"
- @change="onChange"
+ @input="onChange"
@focus="isFocused = true"
@blur="isFocused = false"
/>
diff --git a/packages/vue2-vuetify/src/controls/PasswordControlRenderer.vue b/packages/vue2-vuetify/src/controls/PasswordControlRenderer.vue
index 46f6d503e0..f0ed780d4d 100644
--- a/packages/vue2-vuetify/src/controls/PasswordControlRenderer.vue
+++ b/packages/vue2-vuetify/src/controls/PasswordControlRenderer.vue
@@ -28,7 +28,7 @@
? control.schema.maxLength
: undefined
"
- @change="onChange"
+ @input="onChange"
@focus="isFocused = true"
@blur="isFocused = false"
/>
diff --git a/packages/vue2-vuetify/src/controls/StringControlRenderer.vue b/packages/vue2-vuetify/src/controls/StringControlRenderer.vue
index e23f3bc27f..0f2f71ad1c 100644
--- a/packages/vue2-vuetify/src/controls/StringControlRenderer.vue
+++ b/packages/vue2-vuetify/src/controls/StringControlRenderer.vue
@@ -31,7 +31,7 @@
:value="control.data"
:items="suggestions"
hide-no-data
- @change="onChange"
+ @input="onChange"
@focus="isFocused = true"
@blur="isFocused = false"
/>
@@ -58,7 +58,7 @@
: undefined
"
:clearable="hover"
- @change="onChange"
+ @input="onChange"
@focus="isFocused = true"
@blur="isFocused = false"
/>
diff --git a/packages/vue2-vuetify/src/controls/TimeControlRenderer.vue b/packages/vue2-vuetify/src/controls/TimeControlRenderer.vue
index 9fe0e56c3a..9964fdde78 100644
--- a/packages/vue2-vuetify/src/controls/TimeControlRenderer.vue
+++ b/packages/vue2-vuetify/src/controls/TimeControlRenderer.vue
@@ -18,7 +18,7 @@
:required="control.required"
:error-messages="control.errors"
:value="control.data"
- @change="onChange"
+ @input="onChange"
@focus="isFocused = true"
@blur="isFocused = false"
/>
diff --git a/packages/vue2-vuetify/src/extended/AutocompleteEnumControlRenderer.vue b/packages/vue2-vuetify/src/extended/AutocompleteEnumControlRenderer.vue
index 8a9a9c7b1f..e00e6b59c2 100644
--- a/packages/vue2-vuetify/src/extended/AutocompleteEnumControlRenderer.vue
+++ b/packages/vue2-vuetify/src/extended/AutocompleteEnumControlRenderer.vue
@@ -46,7 +46,7 @@
:items="control.options"
item-text="label"
item-value="value"
- @change="onChange"
+ @input="onChange"
@focus="isFocused = true"
@blur="isFocused = false"
/>
diff --git a/packages/vue2-vuetify/src/extended/AutocompleteOneOfEnumControlRenderer.vue b/packages/vue2-vuetify/src/extended/AutocompleteOneOfEnumControlRenderer.vue
index 0fd343b7cf..94ddacb72b 100644
--- a/packages/vue2-vuetify/src/extended/AutocompleteOneOfEnumControlRenderer.vue
+++ b/packages/vue2-vuetify/src/extended/AutocompleteOneOfEnumControlRenderer.vue
@@ -46,7 +46,7 @@
:items="control.options"
item-text="label"
item-value="value"
- @change="onChange"
+ @input="onChange"
@focus="isFocused = true"
@blur="isFocused = false"
/>
From 070e89540340392119b91833e6c4d6f9f610f570 Mon Sep 17 00:00:00 2001
From: Stefan Dirix
Date: Wed, 15 Dec 2021 13:00:07 +0100
Subject: [PATCH 011/185] Expand new array layout items by default
Array layouts now expand new items by default. This behavior can
be disabled via the UI Schema option 'collapseNewItems'.
---
packages/example/src/components/Settings.vue | 17 ++++++++++++++++-
packages/example/src/store/modules/app.ts | 1 +
packages/example/src/store/modules/types.ts | 1 +
.../src/layouts/ArrayLayoutRenderer.vue | 10 ++++++++--
4 files changed, 26 insertions(+), 3 deletions(-)
diff --git a/packages/example/src/components/Settings.vue b/packages/example/src/components/Settings.vue
index 03cd038599..a10782f1c6 100644
--- a/packages/example/src/components/Settings.vue
+++ b/packages/example/src/components/Settings.vue
@@ -187,13 +187,27 @@
+
+
+
+
+
+
+ If true, new array items are not expanded by default
+
+
+
@@ -220,6 +234,7 @@ export default {
'app/jsonforms@config.showUnfocusedDescription'
),
restrict: sync('app/jsonforms@config.restrict'),
+ collapseNewItems: sync('app/jsonforms@config.collapseNewItems'),
readonly: sync('app/jsonforms@readonly'),
locale: sync('app/jsonforms@locale'),
},
diff --git a/packages/example/src/store/modules/app.ts b/packages/example/src/store/modules/app.ts
index 9ee350ad7f..af2cc45009 100644
--- a/packages/example/src/store/modules/app.ts
+++ b/packages/example/src/store/modules/app.ts
@@ -18,6 +18,7 @@ const state: AppState = {
trim: false,
showUnfocusedDescription: false,
hideRequiredAsterisk: true,
+ collapseNewItems: false,
},
renderers: extendedVuetifyRenderers,
cells: extendedVuetifyRenderers,
diff --git a/packages/example/src/store/modules/types.ts b/packages/example/src/store/modules/types.ts
index d4085c631d..9a7695e3a3 100644
--- a/packages/example/src/store/modules/types.ts
+++ b/packages/example/src/store/modules/types.ts
@@ -16,6 +16,7 @@ export interface AppState {
trim: boolean;
showUnfocusedDescription: boolean;
hideRequiredAsterisk: boolean;
+ collapseNewItems: boolean;
};
renderers: JsonFormsRendererRegistryEntry[];
cells: JsonFormsCellRendererRegistryEntry[];
diff --git a/packages/vue2-vuetify/src/layouts/ArrayLayoutRenderer.vue b/packages/vue2-vuetify/src/layouts/ArrayLayoutRenderer.vue
index 0cf2e5c010..38ad74d2ec 100644
--- a/packages/vue2-vuetify/src/layouts/ArrayLayoutRenderer.vue
+++ b/packages/vue2-vuetify/src/layouts/ArrayLayoutRenderer.vue
@@ -40,7 +40,7 @@
-
+
(),
},
setup(props: RendererProps) {
- return useVuetifyArrayControl(useJsonFormsArrayControl(props));
+ const control = useVuetifyArrayControl(useJsonFormsArrayControl(props));
+ const currentlyExpanded = ref(null);
+ return { ...control, currentlyExpanded };
},
computed: {
noData(): boolean {
@@ -280,6 +283,9 @@ const controlRenderer = defineComponent({
this.control.path,
createDefaultValue(this.control.schema)
)();
+ if (!this.appliedOptions.collapseNewItems && this.control.data?.length) {
+ this.currentlyExpanded = this.control.data.length - 1;
+ }
},
moveUpClick(event: Event, toMove: number): void {
event.stopPropagation();
From 4c5e614ccec7eab92a05f71a367d7884a3ff8abc Mon Sep 17 00:00:00 2001
From: Stefan Dirix
Date: Wed, 15 Dec 2021 13:03:10 +0100
Subject: [PATCH 012/185] v3.0.0-alpha.3
---
packages/example/package.json | 6 ++--
packages/vue2-vuetify/package.json | 44 +++++++++++++++---------------
2 files changed, 25 insertions(+), 25 deletions(-)
diff --git a/packages/example/package.json b/packages/example/package.json
index 8d1aaa00c2..3ea945acd6 100644
--- a/packages/example/package.json
+++ b/packages/example/package.json
@@ -8,9 +8,9 @@
"clean": "rimraf dist"
},
"dependencies": {
- "@jsonforms/core": "3.0.0-alpha.2",
- "@jsonforms/vue2": "3.0.0-alpha.2",
- "@jsonforms/vue2-vuetify": "3.0.0-alpha.2",
+ "@jsonforms/core": "3.0.0-alpha.3",
+ "@jsonforms/vue2": "3.0.0-alpha.3",
+ "@jsonforms/vue2-vuetify": "3.0.0-alpha.3",
"@vue/composition-api": "1.0.0-rc.3",
"core-js": "^3.6.5",
"vue": "^2.6.14",
diff --git a/packages/vue2-vuetify/package.json b/packages/vue2-vuetify/package.json
index 914ed4ef10..d873e2dba1 100644
--- a/packages/vue2-vuetify/package.json
+++ b/packages/vue2-vuetify/package.json
@@ -1,6 +1,6 @@
{
"name": "@jsonforms/vue2-vuetify",
- "version": "3.0.0-alpha.2",
+ "version": "3.0.0-alpha.3",
"description": "Vue 2 Vuetify renderers for JSON Forms",
"repository": "https://github.com/eclipsesource/jsonforms-vuetify-renderers",
"bugs": "https://github.com/eclipsesource/jsonforms/issues",
@@ -45,43 +45,43 @@
"lodash": "^4.17.15"
},
"peerDependencies": {
- "vue": "^2.6.11",
- "@vue/composition-api": "1.0.0-rc.3",
- "vuetify": "^2.4.0",
+ "@jsonforms/core": "^3.0.0-alpha.3",
+ "@jsonforms/vue2": "^3.0.0-alpha.3",
"@mdi/font": "^5.9.55",
- "@jsonforms/core": "^3.0.0-alpha.2",
- "@jsonforms/vue2": "^3.0.0-alpha.2"
+ "@vue/composition-api": "1.0.0-rc.3",
+ "vue": "^2.6.11",
+ "vuetify": "^2.4.0"
},
"devDependencies": {
- "ajv": "^8.6.1",
"@babel/core": "^7.14.6",
"@babel/preset-env": "^7.14.7",
"@babel/preset-typescript": "^7.14.5",
- "@jsonforms/core": "3.0.0-alpha.2",
- "@jsonforms/vue2": "3.0.0-alpha.2",
+ "@jsonforms/core": "3.0.0-alpha.3",
+ "@jsonforms/vue2": "3.0.0-alpha.3",
+ "@mdi/font": "^5.9.55",
+ "@rollup/plugin-babel": "^5.3.0",
+ "@rollup/plugin-commonjs": "^14.0.0",
+ "@rollup/plugin-node-resolve": "^9.0.0",
+ "@types/jest": "^24.0.23",
+ "@types/lodash": "^4.14.172",
"@typescript-eslint/eslint-plugin": "^4.18.0",
"@typescript-eslint/parser": "^4.18.0",
+ "@vue/composition-api": "1.0.0-rc.3",
"@vue/eslint-config-prettier": "^6.0.0",
"@vue/eslint-config-typescript": "^7.0.0",
- "@vue/composition-api": "1.0.0-rc.3",
- "rimraf": "^3.0.2",
- "rollup": "^2.52.8",
- "@rollup/plugin-commonjs": "^14.0.0",
- "@rollup/plugin-babel": "^5.3.0",
- "rollup-plugin-typescript2": "^0.30.0",
- "rollup-plugin-vue": "^5.1.9",
- "@rollup/plugin-node-resolve": "^9.0.0",
- "rollup-plugin-visualizer": "^5.5.2",
+ "ajv": "^8.6.1",
"eslint": "^6.7.2",
"eslint-plugin-prettier": "^3.3.1",
"eslint-plugin-vue": "^6.2.2",
"prettier": "^2.2.1",
+ "rimraf": "^3.0.2",
+ "rollup": "^2.52.8",
+ "rollup-plugin-typescript2": "^0.30.0",
+ "rollup-plugin-visualizer": "^5.5.2",
+ "rollup-plugin-vue": "^5.1.9",
"typescript": "~4.1.5",
"vue": "^2.6.14",
"vue-template-compiler": "^2.6.14",
- "vuetify": "^2.4.0",
- "@mdi/font": "^5.9.55",
- "@types/jest": "^24.0.23",
- "@types/lodash": "^4.14.172"
+ "vuetify": "^2.4.0"
}
}
From f2e591651e1653dfe552665d9427203cedac0495 Mon Sep 17 00:00:00 2001
From: Stefan Dirix
Date: Mon, 10 Jan 2022 13:17:58 +0100
Subject: [PATCH 013/185] Update to JSON Forms 3.0.0-beta.0
Updates to JSON Forms 3.0.0-beta.0. This requires some babel customization in
the example app because the Vue CLI uses the older Webpack 4 which does not
support all 'ESNext' features by default.
---
packages/example/babel.config.js | 4 ++++
packages/example/package.json | 18 ++++++++++--------
packages/example/vue.config.js | 2 +-
packages/vue2-vuetify/package.json | 14 +++++++-------
4 files changed, 22 insertions(+), 16 deletions(-)
diff --git a/packages/example/babel.config.js b/packages/example/babel.config.js
index 078c0056ff..92dd109033 100644
--- a/packages/example/babel.config.js
+++ b/packages/example/babel.config.js
@@ -1,3 +1,7 @@
module.exports = {
presets: ['@vue/cli-plugin-babel/preset'],
+ plugins: [
+ '@babel/plugin-proposal-optional-chaining',
+ '@babel/plugin-proposal-nullish-coalescing-operator',
+ ],
};
diff --git a/packages/example/package.json b/packages/example/package.json
index 3ea945acd6..d43cd46ce0 100644
--- a/packages/example/package.json
+++ b/packages/example/package.json
@@ -8,19 +8,21 @@
"clean": "rimraf dist"
},
"dependencies": {
- "@jsonforms/core": "3.0.0-alpha.3",
- "@jsonforms/vue2": "3.0.0-alpha.3",
+ "@jsonforms/core": "^3.0.0-beta.0",
+ "@jsonforms/vue2": "^3.0.0-beta.0",
"@jsonforms/vue2-vuetify": "3.0.0-alpha.3",
- "@vue/composition-api": "1.0.0-rc.3",
+ "@vue/composition-api": "^1.4.3",
"core-js": "^3.6.5",
+ "json-refs": "^3.0.15",
+ "monaco-editor": "^0.26.0",
"vue": "^2.6.14",
- "vuetify": "^2.4.0",
"vue-router": "^3.2.0",
- "vuex": "^3.4.0",
- "monaco-editor": "^0.26.0",
- "json-refs": "^3.0.15"
+ "vuetify": "^2.4.0",
+ "vuex": "^3.4.0"
},
"devDependencies": {
+ "@babel/plugin-proposal-optional-chaining": "^7.16.7",
+ "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.7",
"@typescript-eslint/eslint-plugin": "^4.18.0",
"@typescript-eslint/parser": "^4.18.0",
"@vue/cli-plugin-babel": "~4.5.0",
@@ -32,6 +34,7 @@
"eslint": "^6.7.2",
"eslint-plugin-prettier": "^3.3.1",
"eslint-plugin-vue": "^6.2.2",
+ "monaco-editor-webpack-plugin": "^4.1.1",
"prettier": "^2.2.1",
"rimraf": "^3.0.2",
"sass": "~1.32.0",
@@ -40,7 +43,6 @@
"vue-cli-plugin-vuetify": "~2.4.2",
"vue-template-compiler": "^2.6.14",
"vuetify-loader": "^1.7.0",
- "monaco-editor-webpack-plugin": "^4.1.1",
"vuex-pathify": "^1.4.5"
}
}
diff --git a/packages/example/vue.config.js b/packages/example/vue.config.js
index 2c37abdb82..7d6ae0edd0 100644
--- a/packages/example/vue.config.js
+++ b/packages/example/vue.config.js
@@ -20,5 +20,5 @@ module.exports = {
poll: true,
},
},
- transpileDependencies: ['vuetify'],
+ transpileDependencies: ['vuetify', '@jsonforms/core', '@jsonforms/vue2'],
};
diff --git a/packages/vue2-vuetify/package.json b/packages/vue2-vuetify/package.json
index d873e2dba1..3a81116f5c 100644
--- a/packages/vue2-vuetify/package.json
+++ b/packages/vue2-vuetify/package.json
@@ -45,19 +45,19 @@
"lodash": "^4.17.15"
},
"peerDependencies": {
- "@jsonforms/core": "^3.0.0-alpha.3",
- "@jsonforms/vue2": "^3.0.0-alpha.3",
+ "@jsonforms/core": "^3.0.0-beta.0",
+ "@jsonforms/vue2": "^3.0.0-beta.0",
"@mdi/font": "^5.9.55",
- "@vue/composition-api": "1.0.0-rc.3",
- "vue": "^2.6.11",
+ "@vue/composition-api": "^1.4.3",
+ "vue": "^2.6.14",
"vuetify": "^2.4.0"
},
"devDependencies": {
"@babel/core": "^7.14.6",
"@babel/preset-env": "^7.14.7",
"@babel/preset-typescript": "^7.14.5",
- "@jsonforms/core": "3.0.0-alpha.3",
- "@jsonforms/vue2": "3.0.0-alpha.3",
+ "@jsonforms/core": "^3.0.0-beta.0",
+ "@jsonforms/vue2": "^3.0.0-beta.0",
"@mdi/font": "^5.9.55",
"@rollup/plugin-babel": "^5.3.0",
"@rollup/plugin-commonjs": "^14.0.0",
@@ -66,7 +66,7 @@
"@types/lodash": "^4.14.172",
"@typescript-eslint/eslint-plugin": "^4.18.0",
"@typescript-eslint/parser": "^4.18.0",
- "@vue/composition-api": "1.0.0-rc.3",
+ "@vue/composition-api": "^1.4.3",
"@vue/eslint-config-prettier": "^6.0.0",
"@vue/eslint-config-typescript": "^7.0.0",
"ajv": "^8.6.1",
From f8f5b62783f5748398c2e572cbf6b8faeeaf4ab8 Mon Sep 17 00:00:00 2001
From: Stefan Dirix
Date: Mon, 10 Jan 2022 17:37:50 +0100
Subject: [PATCH 014/185] Add debouncing to performance critical inputs
With a recent change all input changes are applied and validated
immediately. This leads to performance problems for especially text
inputs as users can type really fast which leads to a full rerender
and validation cycle. These inputs are now debounced to mitigate
the performance issues.
---
.../src/controls/DateControlRenderer.vue | 2 +-
.../src/controls/IntegerControlRenderer.vue | 3 ++-
.../src/controls/MultiStringControlRenderer.vue | 3 ++-
.../src/controls/NumberControlRenderer.vue | 3 ++-
.../src/controls/PasswordControlRenderer.vue | 3 ++-
.../src/controls/StringControlRenderer.vue | 3 ++-
.../src/controls/TimeControlRenderer.vue | 2 +-
.../extended/AutocompleteEnumControlRenderer.vue | 3 ++-
.../AutocompleteOneOfEnumControlRenderer.vue | 3 ++-
packages/vue2-vuetify/src/util/composition.ts | 15 +++++++++++----
10 files changed, 27 insertions(+), 13 deletions(-)
diff --git a/packages/vue2-vuetify/src/controls/DateControlRenderer.vue b/packages/vue2-vuetify/src/controls/DateControlRenderer.vue
index 22edf67c74..81045c4c9a 100644
--- a/packages/vue2-vuetify/src/controls/DateControlRenderer.vue
+++ b/packages/vue2-vuetify/src/controls/DateControlRenderer.vue
@@ -52,7 +52,7 @@ const controlRenderer = defineComponent({
...rendererProps(),
},
setup(props: RendererProps) {
- return useVuetifyControl(useJsonFormsControl(props));
+ return useVuetifyControl(useJsonFormsControl(props), undefined, 300);
},
});
diff --git a/packages/vue2-vuetify/src/controls/IntegerControlRenderer.vue b/packages/vue2-vuetify/src/controls/IntegerControlRenderer.vue
index efc5acf628..5f87fa1548 100644
--- a/packages/vue2-vuetify/src/controls/IntegerControlRenderer.vue
+++ b/packages/vue2-vuetify/src/controls/IntegerControlRenderer.vue
@@ -55,7 +55,8 @@ const controlRenderer = defineComponent({
setup(props: RendererProps) {
return useVuetifyControl(
useJsonFormsControl(props),
- (value) => parseInt(value, 10) || undefined
+ (value) => parseInt(value, 10) || undefined,
+ 300
);
},
computed: {
diff --git a/packages/vue2-vuetify/src/controls/MultiStringControlRenderer.vue b/packages/vue2-vuetify/src/controls/MultiStringControlRenderer.vue
index 10e0074923..714a913d86 100644
--- a/packages/vue2-vuetify/src/controls/MultiStringControlRenderer.vue
+++ b/packages/vue2-vuetify/src/controls/MultiStringControlRenderer.vue
@@ -73,7 +73,8 @@ const controlRenderer = defineComponent({
setup(props: RendererProps) {
return useVuetifyControl(
useJsonFormsControl(props),
- (value) => value || undefined
+ (value) => value || undefined,
+ 300
);
},
});
diff --git a/packages/vue2-vuetify/src/controls/NumberControlRenderer.vue b/packages/vue2-vuetify/src/controls/NumberControlRenderer.vue
index 5cc35535ec..806ed51be3 100644
--- a/packages/vue2-vuetify/src/controls/NumberControlRenderer.vue
+++ b/packages/vue2-vuetify/src/controls/NumberControlRenderer.vue
@@ -55,7 +55,8 @@ const controlRenderer = defineComponent({
setup(props: RendererProps) {
return useVuetifyControl(
useJsonFormsControl(props),
- (value) => parseFloat(value) || undefined
+ (value) => parseFloat(value) || undefined,
+ 300
);
},
computed: {
diff --git a/packages/vue2-vuetify/src/controls/PasswordControlRenderer.vue b/packages/vue2-vuetify/src/controls/PasswordControlRenderer.vue
index f0ed780d4d..401f81704e 100644
--- a/packages/vue2-vuetify/src/controls/PasswordControlRenderer.vue
+++ b/packages/vue2-vuetify/src/controls/PasswordControlRenderer.vue
@@ -69,7 +69,8 @@ const controlRenderer = defineComponent({
return {
...useVuetifyControl(
useJsonFormsControl(props),
- (value) => value || undefined
+ (value) => value || undefined,
+ 300
),
passwordVisible,
};
diff --git a/packages/vue2-vuetify/src/controls/StringControlRenderer.vue b/packages/vue2-vuetify/src/controls/StringControlRenderer.vue
index 0f2f71ad1c..3a12984754 100644
--- a/packages/vue2-vuetify/src/controls/StringControlRenderer.vue
+++ b/packages/vue2-vuetify/src/controls/StringControlRenderer.vue
@@ -104,7 +104,8 @@ const controlRenderer = defineComponent({
setup(props: RendererProps) {
return useVuetifyControl(
useJsonFormsControl(props),
- (value) => value || undefined
+ (value) => value || undefined,
+ 300
);
},
computed: {
diff --git a/packages/vue2-vuetify/src/controls/TimeControlRenderer.vue b/packages/vue2-vuetify/src/controls/TimeControlRenderer.vue
index 9964fdde78..adf1bdf9f1 100644
--- a/packages/vue2-vuetify/src/controls/TimeControlRenderer.vue
+++ b/packages/vue2-vuetify/src/controls/TimeControlRenderer.vue
@@ -52,7 +52,7 @@ const controlRenderer = defineComponent({
...rendererProps(),
},
setup(props: RendererProps) {
- return useVuetifyControl(useJsonFormsControl(props));
+ return useVuetifyControl(useJsonFormsControl(props), undefined, 300);
},
});
diff --git a/packages/vue2-vuetify/src/extended/AutocompleteEnumControlRenderer.vue b/packages/vue2-vuetify/src/extended/AutocompleteEnumControlRenderer.vue
index e00e6b59c2..fe2983b87f 100644
--- a/packages/vue2-vuetify/src/extended/AutocompleteEnumControlRenderer.vue
+++ b/packages/vue2-vuetify/src/extended/AutocompleteEnumControlRenderer.vue
@@ -89,7 +89,8 @@ const controlRenderer = defineComponent({
setup(props: RendererProps) {
return useVuetifyControl(
useJsonFormsEnumControl(props),
- (value) => value || undefined
+ (value) => value || undefined,
+ 300
);
},
});
diff --git a/packages/vue2-vuetify/src/extended/AutocompleteOneOfEnumControlRenderer.vue b/packages/vue2-vuetify/src/extended/AutocompleteOneOfEnumControlRenderer.vue
index 94ddacb72b..031b2bba74 100644
--- a/packages/vue2-vuetify/src/extended/AutocompleteOneOfEnumControlRenderer.vue
+++ b/packages/vue2-vuetify/src/extended/AutocompleteOneOfEnumControlRenderer.vue
@@ -89,7 +89,8 @@ const controlRenderer = defineComponent({
setup(props: RendererProps) {
return useVuetifyControl(
useJsonFormsOneOfEnumControl(props),
- (value) => value || undefined
+ (value) => value || undefined,
+ 300
);
},
});
diff --git a/packages/vue2-vuetify/src/util/composition.ts b/packages/vue2-vuetify/src/util/composition.ts
index 718a70e387..4c5de1f325 100644
--- a/packages/vue2-vuetify/src/util/composition.ts
+++ b/packages/vue2-vuetify/src/util/composition.ts
@@ -7,6 +7,7 @@ import {
Resolve,
} from '@jsonforms/core';
import cloneDeep from 'lodash/cloneDeep';
+import debounce from 'lodash/debounce';
import merge from 'lodash/merge';
import { useStyles } from '../styles';
import { computed, ComputedRef, inject, ref } from '../vue';
@@ -42,15 +43,21 @@ export const useVuetifyControl = <
I extends { control: any; handleChange: any }
>(
input: I,
- adaptValue: (target: any) => any = (v) => v
+ adaptValue: (target: any) => any = (v) => v,
+ debounceWait?: number
) => {
- const appliedOptions = useControlAppliedOptions(input);
+ const changeEmitter =
+ typeof debounceWait === 'number'
+ ? debounce(input.handleChange, debounceWait)
+ : input.handleChange;
- const isFocused = ref(false);
const onChange = (value: any) => {
- input.handleChange(input.control.value.path, adaptValue(value));
+ changeEmitter(input.control.value.path, adaptValue(value));
};
+ const appliedOptions = useControlAppliedOptions(input);
+ const isFocused = ref(false);
+
const persistentHint = (): boolean => {
return !isDescriptionHidden(
input.control.value.visible,
From 0aae0e98d1976281be34c8525b582c593d8d7c1e Mon Sep 17 00:00:00 2001
From: Stefan Dirix
Date: Mon, 10 Jan 2022 18:01:06 +0100
Subject: [PATCH 015/185] Build in CommonJS and ESM formats
JSON Forms Vue 2 Vuetitfy is now built in CommonJS and ESM format,
similar to the core repository.
---
packages/vue2-vuetify/package.json | 3 +-
packages/vue2-vuetify/rollup.config.js | 81 +++++++++++++++++---------
2 files changed, 55 insertions(+), 29 deletions(-)
diff --git a/packages/vue2-vuetify/package.json b/packages/vue2-vuetify/package.json
index 3a81116f5c..f311144e73 100644
--- a/packages/vue2-vuetify/package.json
+++ b/packages/vue2-vuetify/package.json
@@ -29,6 +29,7 @@
"customization"
],
"main": "lib/jsonforms-vue2-vuetify.cjs.js",
+ "module": "lib/jsonforms-vue2-vuetify.esm.js",
"typings": "lib/index.d.ts",
"files": [
"lib",
@@ -60,7 +61,6 @@
"@jsonforms/vue2": "^3.0.0-beta.0",
"@mdi/font": "^5.9.55",
"@rollup/plugin-babel": "^5.3.0",
- "@rollup/plugin-commonjs": "^14.0.0",
"@rollup/plugin-node-resolve": "^9.0.0",
"@types/jest": "^24.0.23",
"@types/lodash": "^4.14.172",
@@ -79,6 +79,7 @@
"rollup-plugin-typescript2": "^0.30.0",
"rollup-plugin-visualizer": "^5.5.2",
"rollup-plugin-vue": "^5.1.9",
+ "rollup-plugin-cleanup": "^3.2.1",
"typescript": "~4.1.5",
"vue": "^2.6.14",
"vue-template-compiler": "^2.6.14",
diff --git a/packages/vue2-vuetify/rollup.config.js b/packages/vue2-vuetify/rollup.config.js
index bf072962ea..f12c745268 100644
--- a/packages/vue2-vuetify/rollup.config.js
+++ b/packages/vue2-vuetify/rollup.config.js
@@ -2,48 +2,70 @@ import vue from 'rollup-plugin-vue';
import babel from '@rollup/plugin-babel';
import typescript from 'rollup-plugin-typescript2';
import resolve from '@rollup/plugin-node-resolve';
-import commonjs from '@rollup/plugin-commonjs';
+import cleanup from 'rollup-plugin-cleanup';
import visualizer from 'rollup-plugin-visualizer';
import packageJson from './package.json';
+const baseConfig = {
+ input: 'src/index.ts',
+ external: [
+ ...Object.keys(packageJson.dependencies),
+ ...Object.keys(packageJson.peerDependencies),
+ /^lodash\/.*/,
+ 'vuetify/lib',
+ '@mdi/font',
+ /^dayjs\/.*/,
+ ],
+};
+
const buildFormats = [
{
- input: 'src/index.ts',
+ ...baseConfig,
+ output: {
+ file: packageJson.module,
+ format: 'esm',
+ sourcemap: true,
+ },
+ plugins: [
+ resolve({
+ extensions: ['.js', '.jsx', '.ts', '.tsx', '.vue'],
+ }),
+ vue({
+ css: true,
+ template: {
+ isProduction: true,
+ },
+ // rollup-plugin-vue can't handle Vue source maps in watch mode
+ // https://github.com/vuejs/rollup-plugin-vue/issues/238
+ needMap: !process.env.ROLLUP_WATCH,
+ }),
+ typescript({
+ emitDeclarationOnly: true,
+ tsconfigOverride: {
+ target: 'ES5',
+ },
+ }),
+ babel({
+ exclude: 'node_modules/**',
+ extensions: ['.js', '.jsx', '.ts', '.tsx', '.vue'],
+ babelHelpers: 'bundled',
+ }),
+ cleanup({ extensions: ['js', 'ts', 'jsx', 'tsx', 'vue'] }),
+ visualizer(),
+ ],
+ },
+ {
+ ...baseConfig,
output: {
file: packageJson.main,
format: 'cjs',
- exports: 'named',
sourcemap: true,
},
- external: [
- 'vue',
- '@vue/composition-api',
- '@jsonforms/core',
- '@jsonforms/vue2',
- 'lodash',
- 'lodash/startCase',
- 'lodash/isEmpty',
- 'lodash/findIndex',
- 'lodash/merge',
- 'lodash/cloneDeep',
- 'lodash/mergeWith',
- 'lodash/isArray',
- 'lodash/every',
- 'lodash/isString',
- 'lodash/omit',
- 'vuetify/lib',
- '@mdi/font',
- 'dayjs',
- 'dayjs/plugin/customParseFormat',
- 'dayjs/plugin/utc',
- 'dayjs/plugin/timezone',
- ],
plugins: [
resolve({
extensions: ['.js', '.jsx', '.ts', '.tsx', '.vue'],
}),
- commonjs(),
vue({
css: true,
template: {
@@ -55,13 +77,16 @@ const buildFormats = [
}),
typescript({
emitDeclarationOnly: true,
+ tsconfigOverride: {
+ target: 'ES5',
+ },
}),
babel({
exclude: 'node_modules/**',
extensions: ['.js', '.jsx', '.ts', '.tsx', '.vue'],
babelHelpers: 'bundled',
}),
- visualizer(),
+ cleanup({ extensions: ['js', 'ts', 'jsx', 'tsx', 'vue'] }),
],
},
];
From b2e04d1c4ada868d0e57a31a1afe824504080d7d Mon Sep 17 00:00:00 2001
From: Stefan Dirix
Date: Mon, 17 Jan 2022 11:36:10 +0100
Subject: [PATCH 016/185] v3.0.0-beta.0
---
packages/vue2-vuetify/package.json | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/packages/vue2-vuetify/package.json b/packages/vue2-vuetify/package.json
index f311144e73..2ada345e5a 100644
--- a/packages/vue2-vuetify/package.json
+++ b/packages/vue2-vuetify/package.json
@@ -1,6 +1,6 @@
{
"name": "@jsonforms/vue2-vuetify",
- "version": "3.0.0-alpha.3",
+ "version": "3.0.0-beta.0",
"description": "Vue 2 Vuetify renderers for JSON Forms",
"repository": "https://github.com/eclipsesource/jsonforms-vuetify-renderers",
"bugs": "https://github.com/eclipsesource/jsonforms/issues",
@@ -76,10 +76,10 @@
"prettier": "^2.2.1",
"rimraf": "^3.0.2",
"rollup": "^2.52.8",
+ "rollup-plugin-cleanup": "^3.2.1",
"rollup-plugin-typescript2": "^0.30.0",
"rollup-plugin-visualizer": "^5.5.2",
"rollup-plugin-vue": "^5.1.9",
- "rollup-plugin-cleanup": "^3.2.1",
"typescript": "~4.1.5",
"vue": "^2.6.14",
"vue-template-compiler": "^2.6.14",
From 832247d3173a1fcfac7b32eb0663d9266e0d856e Mon Sep 17 00:00:00 2001
From: Stefan Dirix
Date: Tue, 25 Jan 2022 17:07:01 +0100
Subject: [PATCH 017/185] Fix example app
---
packages/example/package.json | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/packages/example/package.json b/packages/example/package.json
index d43cd46ce0..57de46b63d 100644
--- a/packages/example/package.json
+++ b/packages/example/package.json
@@ -10,7 +10,7 @@
"dependencies": {
"@jsonforms/core": "^3.0.0-beta.0",
"@jsonforms/vue2": "^3.0.0-beta.0",
- "@jsonforms/vue2-vuetify": "3.0.0-alpha.3",
+ "@jsonforms/vue2-vuetify": "3.0.0-beta.0",
"@vue/composition-api": "^1.4.3",
"core-js": "^3.6.5",
"json-refs": "^3.0.15",
From 02df211cf334f9269041b542bb5b259436e5cd5d Mon Sep 17 00:00:00 2001
From: Stefan Dirix
Date: Mon, 24 Jan 2022 17:53:09 +0100
Subject: [PATCH 018/185] Improve rendering for nested objects
Nested objects are now rendered indented without any additional
elevation. The indentation stops at level four. This leads to
a less cluttered UI for heavily nested objects.
Extends the group renderer to being able to support a 'bare' UI
without elevation and borders. Also supports left-aligning to
prevent further indentation when necessary. These two UI
Schema options are used by the object renderer to render nested
objects appropriately.
Objects within arrays are also rendered 'bare' and are left
aligned at the item level.
Adds a nested object example to demonstrate the new behavior.
---
packages/example/src/examples/index.ts | 6 ++
.../src/examples/object-nested/data.json | 1 +
.../src/examples/object-nested/index.ts | 9 ++
.../src/examples/object-nested/schema.json | 94 +++++++++++++++++++
.../src/complex/ObjectRenderer.vue | 20 +++-
.../src/layouts/ArrayLayoutRenderer.vue | 4 +-
.../src/layouts/GroupRenderer.vue | 38 +++++++-
.../vue2-vuetify/src/styles/defaultStyles.ts | 2 +
packages/vue2-vuetify/src/styles/styles.ts | 2 +
packages/vue2-vuetify/src/util/composition.ts | 16 ++++
10 files changed, 186 insertions(+), 6 deletions(-)
create mode 100644 packages/example/src/examples/object-nested/data.json
create mode 100644 packages/example/src/examples/object-nested/index.ts
create mode 100644 packages/example/src/examples/object-nested/schema.json
diff --git a/packages/example/src/examples/index.ts b/packages/example/src/examples/index.ts
index 4c236f89f1..283cdac0b4 100644
--- a/packages/example/src/examples/index.ts
+++ b/packages/example/src/examples/index.ts
@@ -27,6 +27,7 @@ import { input as nestedLayout } from './nested-layout';
import { input as noSchemas } from './no-schemas';
import { input as noUISchema } from './no-ui-schema';
import { input as object } from './object';
+import { input as objectNested } from './object-nested';
import { input as oneOf } from './oneOf';
import { input as oneOfRecursive } from './oneOf-recursive';
import { input as radio } from './radio';
@@ -163,6 +164,11 @@ export const examples = [
title: 'Object',
input: object,
},
+ {
+ id: 'object-nested',
+ title: 'Object (Nested)',
+ input: objectNested,
+ },
{
id: 'root-object',
title: 'Root Object',
diff --git a/packages/example/src/examples/object-nested/data.json b/packages/example/src/examples/object-nested/data.json
new file mode 100644
index 0000000000..0967ef424b
--- /dev/null
+++ b/packages/example/src/examples/object-nested/data.json
@@ -0,0 +1 @@
+{}
diff --git a/packages/example/src/examples/object-nested/index.ts b/packages/example/src/examples/object-nested/index.ts
new file mode 100644
index 0000000000..4696aeb4bb
--- /dev/null
+++ b/packages/example/src/examples/object-nested/index.ts
@@ -0,0 +1,9 @@
+import schema from './schema.json';
+import data from './data.json';
+import { UISchemaElement, JsonSchema } from '@jsonforms/core';
+
+export const input: {
+ schema: JsonSchema;
+ uischema: UISchemaElement | undefined;
+ data: any;
+} = { schema, uischema: undefined, data };
diff --git a/packages/example/src/examples/object-nested/schema.json b/packages/example/src/examples/object-nested/schema.json
new file mode 100644
index 0000000000..a087b5f532
--- /dev/null
+++ b/packages/example/src/examples/object-nested/schema.json
@@ -0,0 +1,94 @@
+{
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "type": "object",
+ "properties": {
+ "address": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "nestedObject": {
+ "type": "object",
+ "properties": {
+ "loc": {
+ "type": "string"
+ },
+ "toll": {
+ "type": ["string", "null"]
+ },
+ "message": {
+ "type": ["string", "null"]
+ }
+ },
+ "required": ["loc"]
+ },
+ "loc": {
+ "type": "string"
+ },
+ "toll": {
+ "type": ["string", "null"]
+ },
+ "message": {
+ "type": ["string", "null"]
+ }
+ },
+ "required": ["loc"]
+ }
+ },
+ "user": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string"
+ },
+ "mail": {
+ "type": "string"
+ },
+ "additional_details": {
+ "type": "object",
+ "properties": {
+ "interests": {
+ "type": "string"
+ },
+ "optional_details": {
+ "type": "object",
+ "properties": {
+ "type": {
+ "type": "string"
+ },
+ "related_activities": {
+ "type": "object",
+ "properties": {
+ "id": {
+ "type": "string"
+ },
+ "excemption": {
+ "type": "object",
+ "properties": {
+ "cause": {
+ "type": "string"
+ },
+ "further_information": {
+ "type": "object",
+ "properties": {
+ "info": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "private_mail": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "required": ["name", "mail"]
+ }
+ }
+}
diff --git a/packages/vue2-vuetify/src/complex/ObjectRenderer.vue b/packages/vue2-vuetify/src/complex/ObjectRenderer.vue
index 88c40b53f6..2f3c886f7c 100644
--- a/packages/vue2-vuetify/src/complex/ObjectRenderer.vue
+++ b/packages/vue2-vuetify/src/complex/ObjectRenderer.vue
@@ -30,7 +30,7 @@ import {
useJsonFormsControlWithDetail,
} from '@jsonforms/vue2';
import { defineComponent } from '../vue';
-import { useVuetifyControl } from '../util';
+import { useNested, useVuetifyControl } from '../util';
const controlRenderer = defineComponent({
name: 'object-renderer',
@@ -41,7 +41,12 @@ const controlRenderer = defineComponent({
...rendererProps(),
},
setup(props: RendererProps) {
- return useVuetifyControl(useJsonFormsControlWithDetail(props));
+ const control = useVuetifyControl(useJsonFormsControlWithDetail(props));
+ const nested = useNested('object');
+ return {
+ ...control,
+ nested,
+ };
},
computed: {
detailUiSchema(): UISchemaElement {
@@ -55,12 +60,21 @@ const controlRenderer = defineComponent({
this.control.rootSchema
);
+ // TODO: The following code can be streamlined once we have generator support
+ // for 'findUISchema' in JSON Forms Core (https://github.com/eclipsesource/jsonforms/pull/1871)
if (isEmpty(this.control.path)) {
result.type = 'VerticalLayout';
} else {
(result as GroupLayout).label = this.control.label;
+ if (this.nested.level > 0) {
+ result.options = {
+ ...result.options,
+ bare: true,
+ alignLeft:
+ this.nested.level >= 4 || this.nested.parentElement === 'array',
+ };
+ }
}
-
return result;
},
},
diff --git a/packages/vue2-vuetify/src/layouts/ArrayLayoutRenderer.vue b/packages/vue2-vuetify/src/layouts/ArrayLayoutRenderer.vue
index 38ad74d2ec..ec7421ddee 100644
--- a/packages/vue2-vuetify/src/layouts/ArrayLayoutRenderer.vue
+++ b/packages/vue2-vuetify/src/layouts/ArrayLayoutRenderer.vue
@@ -196,7 +196,7 @@ import {
useJsonFormsArrayControl,
RendererProps,
} from '@jsonforms/vue2';
-import { useVuetifyArrayControl } from '../util';
+import { useNested, useVuetifyArrayControl } from '../util';
import {
VCard,
VCardTitle,
@@ -250,6 +250,8 @@ const controlRenderer = defineComponent({
setup(props: RendererProps) {
const control = useVuetifyArrayControl(useJsonFormsArrayControl(props));
const currentlyExpanded = ref(null);
+ // indicate to our child renderers that we are increasing the "nested" level
+ useNested('array');
return { ...control, currentlyExpanded };
},
computed: {
diff --git a/packages/vue2-vuetify/src/layouts/GroupRenderer.vue b/packages/vue2-vuetify/src/layouts/GroupRenderer.vue
index 350775e91c..b9e90a61e9 100644
--- a/packages/vue2-vuetify/src/layouts/GroupRenderer.vue
+++ b/packages/vue2-vuetify/src/layouts/GroupRenderer.vue
@@ -1,8 +1,9 @@
{{
layout.uischema.label
@@ -58,6 +59,24 @@ const layoutRenderer = defineComponent({
setup(props: RendererProps) {
return useVuetifyLayout(useJsonFormsLayout(props));
},
+ computed: {
+ bare(): boolean {
+ return !!this.appliedOptions.bare;
+ },
+ alignLeft(): boolean {
+ return !!this.appliedOptions.alignLeft;
+ },
+ classes(): string {
+ const classes = ['my-1', 'pa-0', `${this.styles.group.root}`];
+ if (this.bare) {
+ classes.push(`${this.styles.group.bare}`);
+ }
+ if (this.alignLeft) {
+ classes.push(`${this.styles.group.alignLeft}`);
+ }
+ return classes.join(' ');
+ },
+ },
});
export default layoutRenderer;
@@ -67,3 +86,18 @@ export const entry: JsonFormsRendererRegistryEntry = {
tester: rankWith(2, and(isLayout, uiTypeIs('Group'))),
};
+
+
+
diff --git a/packages/vue2-vuetify/src/styles/defaultStyles.ts b/packages/vue2-vuetify/src/styles/defaultStyles.ts
index 63dc7df49d..cbc658335c 100644
--- a/packages/vue2-vuetify/src/styles/defaultStyles.ts
+++ b/packages/vue2-vuetify/src/styles/defaultStyles.ts
@@ -17,6 +17,8 @@ export const defaultStyles: Styles = {
root: 'group',
label: 'group-label',
item: 'group-item',
+ bare: 'group-bare',
+ alignLeft: 'group-align-left',
},
arrayList: {
root: 'array-list',
diff --git a/packages/vue2-vuetify/src/styles/styles.ts b/packages/vue2-vuetify/src/styles/styles.ts
index 45aba53e52..6a8cbb8746 100644
--- a/packages/vue2-vuetify/src/styles/styles.ts
+++ b/packages/vue2-vuetify/src/styles/styles.ts
@@ -31,6 +31,8 @@ export interface Styles {
root?: string;
label?: string;
item?: string;
+ bare?: string;
+ alignLeft?: string;
};
arrayList: {
root?: string;
diff --git a/packages/vue2-vuetify/src/util/composition.ts b/packages/vue2-vuetify/src/util/composition.ts
index 4c5de1f325..e9e587c69f 100644
--- a/packages/vue2-vuetify/src/util/composition.ts
+++ b/packages/vue2-vuetify/src/util/composition.ts
@@ -12,6 +12,7 @@ import merge from 'lodash/merge';
import { useStyles } from '../styles';
import { computed, ComputedRef, inject, ref } from '../vue';
import Ajv from 'ajv';
+import { provide } from '@vue/composition-api';
const useControlAppliedOptions = (input: I) => {
return computed(() =>
@@ -199,3 +200,18 @@ export const useAjv = () => {
// should always exist
return jsonforms.core?.ajv as Ajv;
};
+
+export interface NestedInfo {
+ level: number;
+ parentElement?: 'array' | 'object';
+}
+export const useNested = (element: false | 'array' | 'object'): NestedInfo => {
+ const nestedInfo = inject('jsonforms.nestedInfo', { level: 0 });
+ if (element) {
+ provide('jsonforms.nestedInfo', {
+ level: nestedInfo.level + 1,
+ parentElement: element,
+ });
+ }
+ return nestedInfo;
+};
From bc98cdeae87ab2508e19949dca99d4c1eebb11dd Mon Sep 17 00:00:00 2001
From: Stefan Dirix
Date: Sun, 30 Jan 2022 21:52:20 +0100
Subject: [PATCH 019/185] Adapt Array Item Avatar
Use primary instead of info colors for a more consistent look and
feel of array item avatars. Also allows to hide them completely via
the new 'hideAvatar' UI Schema option.
---
packages/example/src/components/Settings.vue | 7 ++++---
packages/example/src/store/modules/app.ts | 1 +
packages/example/src/store/modules/types.ts | 1 +
.../src/layouts/ArrayLayoutRenderer.vue | 13 +++++++++----
4 files changed, 15 insertions(+), 7 deletions(-)
diff --git a/packages/example/src/components/Settings.vue b/packages/example/src/components/Settings.vue
index a10782f1c6..074db645e5 100644
--- a/packages/example/src/components/Settings.vue
+++ b/packages/example/src/components/Settings.vue
@@ -206,12 +206,12 @@
- Only applies to basic example
+ Whether the array index avatars shall be shown
@@ -237,6 +237,7 @@ export default {
collapseNewItems: sync('app/jsonforms@config.collapseNewItems'),
readonly: sync('app/jsonforms@readonly'),
locale: sync('app/jsonforms@locale'),
+ hideAvatar: sync('app/jsonforms@config.hideAvatar'),
},
data: function () {
return {
diff --git a/packages/example/src/store/modules/app.ts b/packages/example/src/store/modules/app.ts
index af2cc45009..f3a07caa56 100644
--- a/packages/example/src/store/modules/app.ts
+++ b/packages/example/src/store/modules/app.ts
@@ -19,6 +19,7 @@ const state: AppState = {
showUnfocusedDescription: false,
hideRequiredAsterisk: true,
collapseNewItems: false,
+ hideAvatar: false,
},
renderers: extendedVuetifyRenderers,
cells: extendedVuetifyRenderers,
diff --git a/packages/example/src/store/modules/types.ts b/packages/example/src/store/modules/types.ts
index 9a7695e3a3..1982a13da5 100644
--- a/packages/example/src/store/modules/types.ts
+++ b/packages/example/src/store/modules/types.ts
@@ -17,6 +17,7 @@ export interface AppState {
showUnfocusedDescription: boolean;
hideRequiredAsterisk: boolean;
collapseNewItems: boolean;
+ hideAvatar: boolean;
};
renderers: JsonFormsRendererRegistryEntry[];
cells: JsonFormsCellRendererRegistryEntry[];
diff --git a/packages/vue2-vuetify/src/layouts/ArrayLayoutRenderer.vue b/packages/vue2-vuetify/src/layouts/ArrayLayoutRenderer.vue
index ec7421ddee..56c4b02fae 100644
--- a/packages/vue2-vuetify/src/layouts/ArrayLayoutRenderer.vue
+++ b/packages/vue2-vuetify/src/layouts/ArrayLayoutRenderer.vue
@@ -49,20 +49,22 @@
-
+
- {{
+ {{
index + 1
}}
@@ -276,6 +278,9 @@ const controlRenderer = defineComponent({
this.control.rootSchema
);
},
+ hideAvatar(): boolean {
+ return !!this.appliedOptions.hideAvatar;
+ },
},
methods: {
composePaths,
From 60abda686054557f8ba065893b7b099e35ac2775 Mon Sep 17 00:00:00 2001
From: Stefan Dirix
Date: Sun, 30 Jan 2022 21:54:08 +0100
Subject: [PATCH 020/185] Show validation marker on array items
Fixes the calculation of the validation marker for nested array
items. Previously it tried to match the raw AJV path against the
data path, however as they use different separators this did
never match.
---
packages/example/src/examples/nested-array/schema.json | 5 +++--
.../vue2-vuetify/src/layouts/ArrayLayoutRenderer.vue | 10 ++++++----
2 files changed, 9 insertions(+), 6 deletions(-)
diff --git a/packages/example/src/examples/nested-array/schema.json b/packages/example/src/examples/nested-array/schema.json
index 7ae5258fcb..82eab10f96 100644
--- a/packages/example/src/examples/nested-array/schema.json
+++ b/packages/example/src/examples/nested-array/schema.json
@@ -7,7 +7,8 @@
"type": "object",
"properties": {
"name": {
- "type": "string"
+ "type": "string",
+ "minLength": 3
},
"choices": {
"type": "array",
@@ -19,4 +20,4 @@
}
}
}
-}
\ No newline at end of file
+}
diff --git a/packages/vue2-vuetify/src/layouts/ArrayLayoutRenderer.vue b/packages/vue2-vuetify/src/layouts/ArrayLayoutRenderer.vue
index 56c4b02fae..8b492e4b2b 100644
--- a/packages/vue2-vuetify/src/layouts/ArrayLayoutRenderer.vue
+++ b/packages/vue2-vuetify/src/layouts/ArrayLayoutRenderer.vue
@@ -190,6 +190,7 @@ import {
findUISchema,
Resolve,
JsonSchema,
+ getControlPath,
} from '@jsonforms/core';
import { defineComponent } from '../vue';
import {
@@ -307,11 +308,12 @@ const controlRenderer = defineComponent({
this.removeItems?.(this.control.path, toDelete)();
},
childErrors(index: number): ErrorObject[] {
- return this.control.childErrors.filter((e) =>
- e.instancePath.startsWith(
+ return this.control.childErrors.filter((e) => {
+ const errorDataPath = getControlPath(e);
+ return errorDataPath.startsWith(
this.composePaths(this.control.path, `${index}`)
- )
- );
+ );
+ });
},
},
});
From 0aa3c41782aa470188ac3b4d2f77cb271fcaf5de Mon Sep 17 00:00:00 2001
From: Stefan Dirix
Date: Mon, 31 Jan 2022 13:28:01 +0100
Subject: [PATCH 021/185] Show confirmation dialog when deleting array items
The array layout renderer now shows a confirmation dialog before
deleting an element.
---
.../src/layouts/ArrayLayoutRenderer.vue | 42 +++++++++++++++++--
1 file changed, 38 insertions(+), 4 deletions(-)
diff --git a/packages/vue2-vuetify/src/layouts/ArrayLayoutRenderer.vue b/packages/vue2-vuetify/src/layouts/ArrayLayoutRenderer.vue
index 8b492e4b2b..f3ce70272f 100644
--- a/packages/vue2-vuetify/src/layouts/ArrayLayoutRenderer.vue
+++ b/packages/vue2-vuetify/src/layouts/ArrayLayoutRenderer.vue
@@ -146,7 +146,7 @@
arraySchema.minItems !== undefined &&
control.data.length <= arraySchema.minItems)
"
- @click.native="removeItemsClick($event, [index])"
+ @click.stop.native="suggestToDelete = index"
>
mdi-delete
@@ -175,6 +175,36 @@
No data
+
+
+
+ Delete {{ childLabelForIndex(suggestToDelete) || 'element' }}?
+
+
+ The element will be deleted.
+
+
+
+
+ Cancel
+
+ Delete
+
+
+
+
@@ -202,8 +232,10 @@ import {
import { useNested, useVuetifyArrayControl } from '../util';
import {
VCard,
+ VCardActions,
VCardTitle,
VCardText,
+ VDialog,
VRow,
VCol,
VContainer,
@@ -228,9 +260,11 @@ const controlRenderer = defineComponent({
components: {
DispatchRenderer,
VCard,
+ VCardActions,
VCardTitle,
VCardText,
VAvatar,
+ VDialog,
VRow,
VCol,
VToolbar,
@@ -253,9 +287,10 @@ const controlRenderer = defineComponent({
setup(props: RendererProps) {
const control = useVuetifyArrayControl(useJsonFormsArrayControl(props));
const currentlyExpanded = ref(null);
+ const suggestToDelete = ref(null);
// indicate to our child renderers that we are increasing the "nested" level
useNested('array');
- return { ...control, currentlyExpanded };
+ return { ...control, currentlyExpanded, suggestToDelete };
},
computed: {
noData(): boolean {
@@ -303,8 +338,7 @@ const controlRenderer = defineComponent({
event.stopPropagation();
this.moveDown?.(this.control.path, toMove)();
},
- removeItemsClick(event: Event, toDelete: number[]): void {
- event.stopPropagation();
+ removeItemsClick(toDelete: number[]): void {
this.removeItems?.(this.control.path, toDelete)();
},
childErrors(index: number): ErrorObject[] {
From 36a744237ad320e0495728574c18545d70732b94 Mon Sep 17 00:00:00 2001
From: Krasimir Chobantonov
Date: Mon, 31 Jan 2022 07:52:24 -0500
Subject: [PATCH 022/185] Configure Vuetify components via UI Schema options
Vuetify components can now be configured via corresponding
UI Schema options.
Also extends the categorization renderer to being able to render
categories vertically.
---
packages/example/src/components/Settings.vue | 1 +
.../jsonschema/specification/uischema.json | 91 +++++++++++----
.../src/examples/control/uischema.json | 11 +-
.../examples/horizontal-layout/uischema.json | 15 ++-
.../src/examples/multi-enum/uischema.json | 24 +++-
.../example/src/examples/radio/schema.json | 8 +-
.../example/src/examples/radio/uischema.json | 22 +++-
.../src/additional/LabelRenderer.vue | 6 +-
.../src/complex/EnumArrayRenderer.vue | 1 +
.../AnyOfStringOrEnumControlRenderer.vue | 1 +
.../src/controls/BooleanControlRenderer.vue | 1 +
.../controls/BooleanToggleControlRenderer.vue | 1 +
.../src/controls/DateControlRenderer.vue | 1 +
.../src/controls/DateTimeControlRenderer.vue | 1 +
.../src/controls/EnumControlRenderer.vue | 2 +
.../src/controls/IntegerControlRenderer.vue | 1 +
.../controls/MultiStringControlRenderer.vue | 1 +
.../src/controls/NumberControlRenderer.vue | 1 +
.../src/controls/OneOfEnumControlRenderer.vue | 2 +
.../OneOfRadioGroupControlRenderer.vue | 7 +-
.../src/controls/PasswordControlRenderer.vue | 1 +
.../controls/RadioGroupControlRenderer.vue | 7 +-
.../src/controls/SliderControlRenderer.vue | 1 +
.../src/controls/StringControlRenderer.vue | 2 +
.../src/controls/TimeControlRenderer.vue | 1 +
.../AutocompleteEnumControlRenderer.vue | 4 +
.../AutocompleteOneOfEnumControlRenderer.vue | 4 +
.../src/layouts/CategorizationRenderer.vue | 107 +++++++++++++-----
.../layouts/CategorizationStepperRenderer.vue | 57 +++++++++-
.../src/layouts/GroupRenderer.vue | 11 +-
.../src/layouts/HorizontalLayoutRenderer.vue | 4 +-
.../src/layouts/VerticalLayoutRenderer.vue | 8 +-
packages/vue2-vuetify/src/util/composition.ts | 24 ++++
packages/vue2-vuetify/src/vue.ts | 1 +
34 files changed, 359 insertions(+), 71 deletions(-)
diff --git a/packages/example/src/components/Settings.vue b/packages/example/src/components/Settings.vue
index 074db645e5..39f76913a0 100644
--- a/packages/example/src/components/Settings.vue
+++ b/packages/example/src/components/Settings.vue
@@ -99,6 +99,7 @@
-
+
{{ translatedLabel }}
diff --git a/packages/vue2-vuetify/src/complex/EnumArrayRenderer.vue b/packages/vue2-vuetify/src/complex/EnumArrayRenderer.vue
index 5416f4ffba..3cee5b9037 100644
--- a/packages/vue2-vuetify/src/complex/EnumArrayRenderer.vue
+++ b/packages/vue2-vuetify/src/complex/EnumArrayRenderer.vue
@@ -10,6 +10,7 @@
:error-messages="control.errors"
:disabled="!control.enabled"
:indeterminate="control.data === undefined"
+ v-bind="vuetifyProps(`v-checkbox[${o.value}]`)"
@change="(value) => toggle(o.value, value)"
>
diff --git a/packages/vue2-vuetify/src/controls/AnyOfStringOrEnumControlRenderer.vue b/packages/vue2-vuetify/src/controls/AnyOfStringOrEnumControlRenderer.vue
index abd02f09b1..f427618f0a 100644
--- a/packages/vue2-vuetify/src/controls/AnyOfStringOrEnumControlRenderer.vue
+++ b/packages/vue2-vuetify/src/controls/AnyOfStringOrEnumControlRenderer.vue
@@ -29,6 +29,7 @@
"
:items="items"
:clearable="hover"
+ v-bind="vuetifyProps('v-combobox')"
@change="onChange"
@focus="isFocused = true"
@blur="isFocused = false"
diff --git a/packages/vue2-vuetify/src/controls/BooleanControlRenderer.vue b/packages/vue2-vuetify/src/controls/BooleanControlRenderer.vue
index 46bb5dec74..3367f1b8c2 100644
--- a/packages/vue2-vuetify/src/controls/BooleanControlRenderer.vue
+++ b/packages/vue2-vuetify/src/controls/BooleanControlRenderer.vue
@@ -18,6 +18,7 @@
:error-messages="control.errors"
:indeterminate="control.data === undefined"
:value="control.data"
+ v-bind="vuetifyProps('v-checkbox')"
@change="onChange"
@focus="isFocused = true"
@blur="isFocused = false"
diff --git a/packages/vue2-vuetify/src/controls/BooleanToggleControlRenderer.vue b/packages/vue2-vuetify/src/controls/BooleanToggleControlRenderer.vue
index 0f29b9f1aa..279eaa6213 100644
--- a/packages/vue2-vuetify/src/controls/BooleanToggleControlRenderer.vue
+++ b/packages/vue2-vuetify/src/controls/BooleanToggleControlRenderer.vue
@@ -17,6 +17,7 @@
:required="control.required"
:error-messages="control.errors"
:value="control.data"
+ v-bind="vuetifyProps('v-switch')"
@change="onChange"
@focus="isFocused = true"
@blur="isFocused = false"
diff --git a/packages/vue2-vuetify/src/controls/DateControlRenderer.vue b/packages/vue2-vuetify/src/controls/DateControlRenderer.vue
index 81045c4c9a..edb38f8f88 100644
--- a/packages/vue2-vuetify/src/controls/DateControlRenderer.vue
+++ b/packages/vue2-vuetify/src/controls/DateControlRenderer.vue
@@ -18,6 +18,7 @@
:required="control.required"
:error-messages="control.errors"
:value="control.data"
+ v-bind="vuetifyProps('v-text-field')"
@input="onChange"
@focus="isFocused = true"
@blur="isFocused = false"
diff --git a/packages/vue2-vuetify/src/controls/DateTimeControlRenderer.vue b/packages/vue2-vuetify/src/controls/DateTimeControlRenderer.vue
index c0545c9e25..e5691f99b2 100644
--- a/packages/vue2-vuetify/src/controls/DateTimeControlRenderer.vue
+++ b/packages/vue2-vuetify/src/controls/DateTimeControlRenderer.vue
@@ -18,6 +18,7 @@
:required="control.required"
:error-messages="control.errors"
:value="dataTime"
+ v-bind="vuetifyProps('v-text-field')"
@focus="isFocused = true"
@blur="isFocused = false"
/>
diff --git a/packages/vue2-vuetify/src/controls/EnumControlRenderer.vue b/packages/vue2-vuetify/src/controls/EnumControlRenderer.vue
index 28abfffcc6..24178fdf2e 100644
--- a/packages/vue2-vuetify/src/controls/EnumControlRenderer.vue
+++ b/packages/vue2-vuetify/src/controls/EnumControlRenderer.vue
@@ -23,6 +23,8 @@
:items="control.options"
item-text="label"
item-value="value"
+ attach
+ v-bind="vuetifyProps('v-select')"
@change="onChange"
@focus="isFocused = true"
@blur="isFocused = false"
diff --git a/packages/vue2-vuetify/src/controls/IntegerControlRenderer.vue b/packages/vue2-vuetify/src/controls/IntegerControlRenderer.vue
index 5f87fa1548..f7615aaedb 100644
--- a/packages/vue2-vuetify/src/controls/IntegerControlRenderer.vue
+++ b/packages/vue2-vuetify/src/controls/IntegerControlRenderer.vue
@@ -19,6 +19,7 @@
:required="control.required"
:error-messages="control.errors"
:value="control.data"
+ v-bind="vuetifyProps('v-text-field')"
@input="onChange"
@focus="isFocused = true"
@blur="isFocused = false"
diff --git a/packages/vue2-vuetify/src/controls/MultiStringControlRenderer.vue b/packages/vue2-vuetify/src/controls/MultiStringControlRenderer.vue
index 714a913d86..26871dda11 100644
--- a/packages/vue2-vuetify/src/controls/MultiStringControlRenderer.vue
+++ b/packages/vue2-vuetify/src/controls/MultiStringControlRenderer.vue
@@ -29,6 +29,7 @@
"
:clearable="hover"
multi-line
+ v-bind="vuetifyProps('v-textarea')"
@input="onChange"
@focus="isFocused = true"
@blur="isFocused = false"
diff --git a/packages/vue2-vuetify/src/controls/NumberControlRenderer.vue b/packages/vue2-vuetify/src/controls/NumberControlRenderer.vue
index 806ed51be3..3f8113a2eb 100644
--- a/packages/vue2-vuetify/src/controls/NumberControlRenderer.vue
+++ b/packages/vue2-vuetify/src/controls/NumberControlRenderer.vue
@@ -19,6 +19,7 @@
:required="control.required"
:error-messages="control.errors"
:value="control.data"
+ v-bind="vuetifyProps('v-text-field')"
@input="onChange"
@focus="isFocused = true"
@blur="isFocused = false"
diff --git a/packages/vue2-vuetify/src/controls/OneOfEnumControlRenderer.vue b/packages/vue2-vuetify/src/controls/OneOfEnumControlRenderer.vue
index caa94f9087..53bd4e7057 100644
--- a/packages/vue2-vuetify/src/controls/OneOfEnumControlRenderer.vue
+++ b/packages/vue2-vuetify/src/controls/OneOfEnumControlRenderer.vue
@@ -23,6 +23,8 @@
:items="control.options"
item-text="label"
item-value="value"
+ attach
+ v-bind="vuetifyProps('v-select')"
@change="onChange"
@focus="isFocused = true"
@blur="isFocused = false"
diff --git a/packages/vue2-vuetify/src/controls/OneOfRadioGroupControlRenderer.vue b/packages/vue2-vuetify/src/controls/OneOfRadioGroupControlRenderer.vue
index 59d60967dc..585bf04ee3 100644
--- a/packages/vue2-vuetify/src/controls/OneOfRadioGroupControlRenderer.vue
+++ b/packages/vue2-vuetify/src/controls/OneOfRadioGroupControlRenderer.vue
@@ -5,7 +5,9 @@
:isFocused="isFocused"
:appliedOptions="appliedOptions"
>
- {{ computedLabel }}
+ {{
+ computedLabel
+ }}
- {{ computedLabel }}
+ {{
+ computedLabel
+ }}
-
-
-
- {{ element.label }}
-
-
+
+
+
+
+
+ {{ element.label }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ element.label }}
+
+
-
-
-
-
-
-
+
+
+
+
+
+
diff --git a/packages/vue2-vuetify/tests/unit/util/index.ts b/packages/vue2-vuetify/tests/unit/util/index.ts
new file mode 100644
index 0000000000..bbebd88eb4
--- /dev/null
+++ b/packages/vue2-vuetify/tests/unit/util/index.ts
@@ -0,0 +1 @@
+export * from './util';
diff --git a/packages/vue2-vuetify/tests/unit/util/util.ts b/packages/vue2-vuetify/tests/unit/util/util.ts
new file mode 100644
index 0000000000..51bd8fc4b0
--- /dev/null
+++ b/packages/vue2-vuetify/tests/unit/util/util.ts
@@ -0,0 +1,32 @@
+import {
+ JsonFormsRendererRegistryEntry,
+ JsonSchema,
+ UISchemaElement,
+} from '@jsonforms/core';
+import { createLocalVue, mount } from '@vue/test-utils';
+import TestComponent from './TestComponent.vue';
+import Vuetify from 'vuetify';
+
+const localVue = createLocalVue();
+const vuetify = new Vuetify();
+
+export const mountJsonForms = (
+ data: any,
+ schema: JsonSchema,
+ renderers: JsonFormsRendererRegistryEntry[],
+ uischema?: UISchemaElement,
+ config?: any
+) => {
+ return mount(TestComponent, {
+ localVue,
+ vuetify,
+ propsData: {
+ initialData: data,
+ schema,
+ uischema,
+ config,
+ initialRenderers: renderers,
+ },
+ attachTo: document.body,
+ });
+};
diff --git a/packages/vue2-vuetify/tsconfig.json b/packages/vue2-vuetify/tsconfig.json
index 66dcace019..1f30593e61 100644
--- a/packages/vue2-vuetify/tsconfig.json
+++ b/packages/vue2-vuetify/tsconfig.json
@@ -13,8 +13,22 @@
"allowSyntheticDefaultImports": true,
"sourceMap": true,
"outDir": "./lib",
- "types": ["node", "vue", "vuetify"],
- "lib": ["esnext", "dom", "dom.iterable", "scripthost"]
+ "jsx": "preserve",
+ "types": [
+ "node",
+ "vue",
+ "vuetify",
+ "jest"
+ ],
+ "lib": [
+ "esnext",
+ "dom",
+ "dom.iterable",
+ "scripthost"
+ ]
},
- "exclude": ["node_modules", "lib"]
+ "exclude": [
+ "node_modules",
+ "lib"
+ ]
}
From 46f146ed7db0c7c07b879a822587ffcda913fa6d Mon Sep 17 00:00:00 2001
From: Stefan Dirix
Date: Tue, 28 Jun 2022 00:07:52 +0200
Subject: [PATCH 036/185] Update to JSON Forms 3.0.0-beta.4
---
packages/example/package.json | 4 ++--
packages/vue2-vuetify/package.json | 8 ++++----
2 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/packages/example/package.json b/packages/example/package.json
index 9203af43fa..77f2964ce8 100644
--- a/packages/example/package.json
+++ b/packages/example/package.json
@@ -8,8 +8,8 @@
"clean": "rimraf dist"
},
"dependencies": {
- "@jsonforms/core": "3.0.0-beta.2",
- "@jsonforms/vue2": "3.0.0-beta.2",
+ "@jsonforms/core": "3.0.0-beta.4",
+ "@jsonforms/vue2": "3.0.0-beta.4",
"@jsonforms/vue2-vuetify": "3.0.0-beta.2",
"@vue/composition-api": "^1.4.3",
"core-js": "^3.9.1",
diff --git a/packages/vue2-vuetify/package.json b/packages/vue2-vuetify/package.json
index 9bab1f97e4..145421fc72 100644
--- a/packages/vue2-vuetify/package.json
+++ b/packages/vue2-vuetify/package.json
@@ -47,8 +47,8 @@
"lodash": "^4.17.15"
},
"peerDependencies": {
- "@jsonforms/core": "3.0.0-beta.2",
- "@jsonforms/vue2": "3.0.0-beta.2",
+ "@jsonforms/core": "3.0.0-beta.4",
+ "@jsonforms/vue2": "3.0.0-beta.4",
"@mdi/font": "^5.9.55",
"@vue/composition-api": "^1.4.3",
"vue": "^2.6.14",
@@ -58,8 +58,8 @@
"@babel/core": "^7.14.6",
"@babel/preset-env": "^7.14.7",
"@babel/preset-typescript": "^7.14.5",
- "@jsonforms/core": "3.0.0-beta.2",
- "@jsonforms/vue2": "3.0.0-beta.2",
+ "@jsonforms/core": "3.0.0-beta.4",
+ "@jsonforms/vue2": "3.0.0-beta.4",
"@mdi/font": "^5.9.55",
"@rollup/plugin-babel": "^5.3.0",
"@rollup/plugin-node-resolve": "^9.0.0",
From 22b123fd1888837a1ab5c6f5c4039d5e0074f1a7 Mon Sep 17 00:00:00 2001
From: Stefan Dirix
Date: Tue, 28 Jun 2022 17:12:50 +0200
Subject: [PATCH 037/185] v3.0.0-beta.4
---
packages/example/package.json | 2 +-
packages/vue2-vuetify/package.json | 4 ++--
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/packages/example/package.json b/packages/example/package.json
index 77f2964ce8..aac649cd7a 100644
--- a/packages/example/package.json
+++ b/packages/example/package.json
@@ -10,7 +10,7 @@
"dependencies": {
"@jsonforms/core": "3.0.0-beta.4",
"@jsonforms/vue2": "3.0.0-beta.4",
- "@jsonforms/vue2-vuetify": "3.0.0-beta.2",
+ "@jsonforms/vue2-vuetify": "3.0.0-beta.4",
"@vue/composition-api": "^1.4.3",
"core-js": "^3.9.1",
"json-refs": "^3.0.15",
diff --git a/packages/vue2-vuetify/package.json b/packages/vue2-vuetify/package.json
index 145421fc72..e579c26d8d 100644
--- a/packages/vue2-vuetify/package.json
+++ b/packages/vue2-vuetify/package.json
@@ -1,6 +1,6 @@
{
"name": "@jsonforms/vue2-vuetify",
- "version": "3.0.0-beta.2",
+ "version": "3.0.0-beta.4",
"description": "Vue 2 Vuetify renderers for JSON Forms",
"repository": "https://github.com/eclipsesource/jsonforms-vuetify-renderers",
"bugs": "https://github.com/eclipsesource/jsonforms/issues",
@@ -67,8 +67,8 @@
"@types/lodash": "^4.14.172",
"@typescript-eslint/eslint-plugin": "^4.18.0",
"@typescript-eslint/parser": "^4.18.0",
- "@vue/cli-service": "~4.5.0",
"@vue/cli-plugin-unit-jest": "~4.5.0",
+ "@vue/cli-service": "~4.5.0",
"@vue/composition-api": "^1.4.3",
"@vue/eslint-config-prettier": "^6.0.0",
"@vue/eslint-config-typescript": "^7.0.0",
From 9214ec8f610d299b9f6e5dd825e79c747223f5af Mon Sep 17 00:00:00 2001
From: Stefan Dirix
Date: Tue, 28 Jun 2022 19:52:55 +0200
Subject: [PATCH 038/185] Fix build typings
The test sources interfered with the build as they are also covered by the tsconfig. The
build then also generated the test typings and moved the source typings into a nested
directory. As the package.json was not modified it now pointed to the parent directory
which breaks all Typescript consumers.
This is now fixed be excluding the 'test' directory from the rollup build.
---
packages/vue2-vuetify/rollup.config.js | 2 ++
packages/vue2-vuetify/tsconfig.compile.json | 4 ++++
2 files changed, 6 insertions(+)
create mode 100644 packages/vue2-vuetify/tsconfig.compile.json
diff --git a/packages/vue2-vuetify/rollup.config.js b/packages/vue2-vuetify/rollup.config.js
index f12c745268..8b438dc55b 100644
--- a/packages/vue2-vuetify/rollup.config.js
+++ b/packages/vue2-vuetify/rollup.config.js
@@ -45,6 +45,7 @@ const buildFormats = [
tsconfigOverride: {
target: 'ES5',
},
+ tsconfig: 'tsconfig.compile.json',
}),
babel({
exclude: 'node_modules/**',
@@ -80,6 +81,7 @@ const buildFormats = [
tsconfigOverride: {
target: 'ES5',
},
+ tsconfig: 'tsconfig.compile.json',
}),
babel({
exclude: 'node_modules/**',
diff --git a/packages/vue2-vuetify/tsconfig.compile.json b/packages/vue2-vuetify/tsconfig.compile.json
new file mode 100644
index 0000000000..c29c7bef3c
--- /dev/null
+++ b/packages/vue2-vuetify/tsconfig.compile.json
@@ -0,0 +1,4 @@
+{
+ "extends": "./tsconfig.json",
+ "exclude": ["node_modules", "lib", "tests"]
+}
From 2e453da105bdecc629aef37989fe58a5920d1242 Mon Sep 17 00:00:00 2001
From: Stefan Dirix
Date: Tue, 28 Jun 2022 20:14:19 +0200
Subject: [PATCH 039/185] Align ESM build with JSON Forms 'core' and 'vue2'
Do not transpile to 'ES5' for the 'ESM' build and add 'transpileDependencies' information
to the Readme.
---
packages/vue2-vuetify/README.md | 8 ++++++++
packages/vue2-vuetify/rollup.config.js | 3 ---
2 files changed, 8 insertions(+), 3 deletions(-)
diff --git a/packages/vue2-vuetify/README.md b/packages/vue2-vuetify/README.md
index f368ee63d4..047f377f41 100644
--- a/packages/vue2-vuetify/README.md
+++ b/packages/vue2-vuetify/README.md
@@ -16,6 +16,14 @@ Install JSON Forms Core, Vue 2 and Vue 2 Vuetify Renderers.
npm i --save @jsonforms/core @jsonforms/vue2 @jsonforms/vue2-vuetify
```
+Also add the packages to the transpile dependencies in the `vue.config.js` file:
+
+```js
+module.exports = {
+ transpileDependencies: ['@jsonforms/core', '@jsonforms/vue2', '@jsonforms/vue2-vuetify']
+}
+```
+
Use the `json-forms` component for each form you want to render and hand over the renderer set.
```vue
diff --git a/packages/vue2-vuetify/rollup.config.js b/packages/vue2-vuetify/rollup.config.js
index 8b438dc55b..cf45856481 100644
--- a/packages/vue2-vuetify/rollup.config.js
+++ b/packages/vue2-vuetify/rollup.config.js
@@ -42,9 +42,6 @@ const buildFormats = [
}),
typescript({
emitDeclarationOnly: true,
- tsconfigOverride: {
- target: 'ES5',
- },
tsconfig: 'tsconfig.compile.json',
}),
babel({
From 09f45c806c9025f0fbdd5608030b6902f99fada8 Mon Sep 17 00:00:00 2001
From: Stefan Dirix
Date: Tue, 28 Jun 2022 20:15:57 +0200
Subject: [PATCH 040/185] v3.0.0-beta.4.1
---
packages/example/package.json | 4 ++--
packages/vue2-vuetify/package.json | 2 +-
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/packages/example/package.json b/packages/example/package.json
index aac649cd7a..fe652777e0 100644
--- a/packages/example/package.json
+++ b/packages/example/package.json
@@ -10,7 +10,7 @@
"dependencies": {
"@jsonforms/core": "3.0.0-beta.4",
"@jsonforms/vue2": "3.0.0-beta.4",
- "@jsonforms/vue2-vuetify": "3.0.0-beta.4",
+ "@jsonforms/vue2-vuetify": "3.0.0-beta.4.1",
"@vue/composition-api": "^1.4.3",
"core-js": "^3.9.1",
"json-refs": "^3.0.15",
@@ -21,8 +21,8 @@
"vuex": "^3.4.0"
},
"devDependencies": {
- "@babel/plugin-proposal-optional-chaining": "^7.16.7",
"@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.7",
+ "@babel/plugin-proposal-optional-chaining": "^7.16.7",
"@typescript-eslint/eslint-plugin": "^4.18.0",
"@typescript-eslint/parser": "^4.18.0",
"@vue/cli-plugin-babel": "~4.5.0",
diff --git a/packages/vue2-vuetify/package.json b/packages/vue2-vuetify/package.json
index e579c26d8d..bde4ecfe3b 100644
--- a/packages/vue2-vuetify/package.json
+++ b/packages/vue2-vuetify/package.json
@@ -1,6 +1,6 @@
{
"name": "@jsonforms/vue2-vuetify",
- "version": "3.0.0-beta.4",
+ "version": "3.0.0-beta.4.1",
"description": "Vue 2 Vuetify renderers for JSON Forms",
"repository": "https://github.com/eclipsesource/jsonforms-vuetify-renderers",
"bugs": "https://github.com/eclipsesource/jsonforms/issues",
From f6701d5ea0e5628efb92658e589d1050ff736950 Mon Sep 17 00:00:00 2001
From: Krasimir Chobantonov
Date: Thu, 30 Jun 2022 23:03:25 -0400
Subject: [PATCH 041/185] fix - npm run watch
---
packages/vue2-vuetify/babel.config.js | 9 ++++++++-
1 file changed, 8 insertions(+), 1 deletion(-)
diff --git a/packages/vue2-vuetify/babel.config.js b/packages/vue2-vuetify/babel.config.js
index 493d815d04..58a5936745 100644
--- a/packages/vue2-vuetify/babel.config.js
+++ b/packages/vue2-vuetify/babel.config.js
@@ -1,4 +1,11 @@
-const devPresets = ['@vue/cli-plugin-babel/preset'];
+const devPresets = [
+ [
+ '@vue/cli-plugin-babel/preset',
+ {
+ useBuiltIns: false,
+ },
+ ],
+];
const buildPresets = ['@babel/preset-env', '@babel/preset-typescript'];
module.exports = {
presets: process.env.NODE_ENV === 'production' ? buildPresets : devPresets,
From 0c1082cb07a90ffcfd4f2f6b5005cb85695d7567 Mon Sep 17 00:00:00 2001
From: Krasimir Chobantonov
Date: Mon, 25 Jul 2022 06:56:41 -0400
Subject: [PATCH 042/185] Add form-only view to example app
When specifying the query parameter 'view=form-only' the example app will only
present the example form.
---
.../example/src/layouts/default/index.vue | 9 +-
.../example/src/views/example/Example.vue | 350 ++++++++++--------
2 files changed, 206 insertions(+), 153 deletions(-)
diff --git a/packages/example/src/layouts/default/index.vue b/packages/example/src/layouts/default/index.vue
index d3395efc56..a898bec791 100644
--- a/packages/example/src/layouts/default/index.vue
+++ b/packages/example/src/layouts/default/index.vue
@@ -1,8 +1,8 @@
-
+
-
+
@@ -17,5 +17,10 @@ export default {
DefaultDrawer: () => import('./Drawer'),
DefaultView: () => import('./View'),
},
+ computed: {
+ formonly(): boolean {
+ return this.$route.query?.view === 'form-only';
+ },
+ },
};
diff --git a/packages/example/src/views/example/Example.vue b/packages/example/src/views/example/Example.vue
index d001fcda30..0f74728733 100644
--- a/packages/example/src/views/example/Example.vue
+++ b/packages/example/src/views/example/Example.vue
@@ -1,155 +1,200 @@
-
-
-
- {{ example.title }}
-
-
- Demo
-
- Schema
- UI Schema
- Data
-
-
-
-
-
-
-
-
- Schema
-
-
-
-
- mdi-reload
-
-
- {{ `Reload Example Schema` }}
-
-
-
-
- mdi-content-save
-
-
- {{ `Apply Change To Example Schema` }}
-
-
-
-
-
-
-
-
-
-
-
- UI Schema
-
-
-
-
- mdi-reload
-
-
- {{ `Reload Example UI Schema` }}
-
-
-
-
- mdi-content-save
-
-
- {{ `Apply Change To Example UI Schema` }}
-
-
-
-
-
-
-
-
-
-
-
- Data
-
-
-
-
- mdi-reload
-
-
- {{ `Reload Example Data` }}
-
-
-
-
- mdi-content-save
-
-
- {{ `Apply Change To Example Data` }}
-
-
-
-
-
-
-
-
-
-
-
- {{ snackbarText }}
-
-
- Close
-
-
-
-
+
+
+
+
+ {{ example.title }}
+
+
+ Demo
+
+ Schema
+ UI Schema
+ Data
+
+
+
+
+ JSONForm
+
+
+
+
+ mdi-dock-window
+
+
+ {{ `Show JsonForm Only` }}
+
+
+
+
+
+
+
+
+
+
+
+ Schema
+
+
+
+
+ mdi-reload
+
+
+ {{ `Reload Example Schema` }}
+
+
+
+
+ mdi-content-save
+
+
+ {{ `Apply Change To Example Schema` }}
+
+
+
+
+
+
+
+
+
+
+
+ UI Schema
+
+
+
+
+ mdi-reload
+
+
+ {{ `Reload Example UI Schema` }}
+
+
+
+
+ mdi-content-save
+
+
+ {{ `Apply Change To Example UI Schema` }}
+
+
+
+
+
+
+
+
+
+
+
+ Data
+
+
+
+
+ mdi-reload
+
+
+ {{ `Reload Example Data` }}
+
+
+
+
+ mdi-content-save
+
+
+ {{ `Apply Change To Example Data` }}
+
+
+
+
+
+
+
+
+
+
+
+ {{ snackbarText }}
+
+ Close
+
+
+
+
+
+
+
+
diff --git a/packages/vue2-vuetify/src/controls/TimeControlRenderer.vue b/packages/vue2-vuetify/src/controls/TimeControlRenderer.vue
index 9279c2ea95..27b0ceac90 100644
--- a/packages/vue2-vuetify/src/controls/TimeControlRenderer.vue
+++ b/packages/vue2-vuetify/src/controls/TimeControlRenderer.vue
@@ -5,43 +5,105 @@
:isFocused="isFocused"
:appliedOptions="appliedOptions"
>
-
+
+
+
+ $clear
+
+
+
+
+ {{ pickerIcon }}
+
+
+ {{ clearLabel }}
+
+
+ {{ cancelLabel }}
+
+ {
+ onPickerChange($refs.picker.genValue());
+ showMenu = false;
+ }
+ "
+ >
+ {{ okLabel }}
+
+
+
+
+
diff --git a/packages/example/src/examples/custom-renderer/data.json b/packages/example/src/examples/custom-renderer/data.json
new file mode 100644
index 0000000000..00273e39b3
--- /dev/null
+++ b/packages/example/src/examples/custom-renderer/data.json
@@ -0,0 +1,8 @@
+{
+ "exampleArray": [
+ {
+ "choices": ["This", "is", "an", "example"],
+ "name": "Hi there"
+ }
+ ]
+}
diff --git a/packages/example/src/examples/custom-renderer/index.ts b/packages/example/src/examples/custom-renderer/index.ts
new file mode 100644
index 0000000000..2fc09072ee
--- /dev/null
+++ b/packages/example/src/examples/custom-renderer/index.ts
@@ -0,0 +1,16 @@
+import schema from './schema.json';
+import uischema from './uischema.json';
+import data from './data.json';
+import { entry as customArrayRendererEntry } from './CustomArrayRenderer.vue';
+import {
+ UISchemaElement,
+ JsonSchema,
+ JsonFormsRendererRegistryEntry,
+} from '@jsonforms/core';
+
+export const input: {
+ schema: JsonSchema;
+ uischema: UISchemaElement;
+ data: any;
+ renderers: JsonFormsRendererRegistryEntry[];
+} = { schema, uischema, data, renderers: [customArrayRendererEntry] };
diff --git a/packages/example/src/examples/custom-renderer/schema.json b/packages/example/src/examples/custom-renderer/schema.json
new file mode 100644
index 0000000000..25c7f52d3e
--- /dev/null
+++ b/packages/example/src/examples/custom-renderer/schema.json
@@ -0,0 +1,23 @@
+{
+ "type": "object",
+ "properties": {
+ "exampleArray": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 3
+ },
+ "choices": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/packages/example/src/examples/custom-renderer/uischema.json b/packages/example/src/examples/custom-renderer/uischema.json
new file mode 100644
index 0000000000..8f5b6bcc8f
--- /dev/null
+++ b/packages/example/src/examples/custom-renderer/uischema.json
@@ -0,0 +1,13 @@
+{
+ "type": "HorizontalLayout",
+ "elements": [
+ {
+ "type": "Control",
+ "label": {
+ "text": "Example Array",
+ "show": true
+ },
+ "scope": "#/properties/exampleArray"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/packages/example/src/examples/index.ts b/packages/example/src/examples/index.ts
index b18aa1f77b..0a670d9f26 100644
--- a/packages/example/src/examples/index.ts
+++ b/packages/example/src/examples/index.ts
@@ -10,6 +10,7 @@ import { input as categorizationStepper } from './categorization-stepper';
import { input as categorizationStepperNav } from './categorization-stepper-nav';
import { input as control } from './control';
import { input as controlOptions } from './control-options';
+import { input as customRenderer } from './custom-renderer';
import { input as enumExample } from './enum';
import { input as dateExample } from './date';
import { input as timeExample } from './time';
@@ -107,6 +108,11 @@ export const examples = [
title: 'Categorization Stepper With Navigation',
input: categorizationStepperNav,
},
+ {
+ id: 'custom-renderer',
+ title: 'Custom Renderer',
+ input: customRenderer,
+ },
{
id: 'horizontal-layout',
title: 'Horizontal Layout',
diff --git a/packages/example/src/shims-vue.d.ts b/packages/example/src/shims-vue.d.ts
index 8f6f410263..0f6bf2520c 100644
--- a/packages/example/src/shims-vue.d.ts
+++ b/packages/example/src/shims-vue.d.ts
@@ -1,4 +1,5 @@
declare module '*.vue' {
import Vue from 'vue';
export default Vue;
+ export const entry;
}
diff --git a/packages/example/src/store/modules/app.ts b/packages/example/src/store/modules/app.ts
index 27ae2906e7..d59d333fed 100644
--- a/packages/example/src/store/modules/app.ts
+++ b/packages/example/src/store/modules/app.ts
@@ -22,6 +22,7 @@ const state: AppState = {
breakHorizontal: false,
initCollapsed: false,
hideAvatar: false,
+ hideArraySummaryValidation: false,
},
renderers: extendedVuetifyRenderers,
cells: extendedVuetifyRenderers,
diff --git a/packages/example/src/store/modules/types.ts b/packages/example/src/store/modules/types.ts
index 8533b16821..1df35b031c 100644
--- a/packages/example/src/store/modules/types.ts
+++ b/packages/example/src/store/modules/types.ts
@@ -20,6 +20,7 @@ export interface AppState {
initCollapsed: boolean;
breakHorizontal: false | string;
hideAvatar: boolean;
+ hideArraySummaryValidation: boolean;
};
renderers: JsonFormsRendererRegistryEntry[];
cells: JsonFormsCellRendererRegistryEntry[];
diff --git a/packages/example/src/views/example/Example.vue b/packages/example/src/views/example/Example.vue
index 0f74728733..1a159cde16 100644
--- a/packages/example/src/views/example/Example.vue
+++ b/packages/example/src/views/example/Example.vue
@@ -36,17 +36,19 @@
-
+
+
+
@@ -182,18 +184,20 @@
-
+
+
+
@@ -215,6 +219,7 @@ import {
getMonacoModelForUri,
} from '@/core/jsonSchemaValidation';
import { Example } from '@/core/types';
+import type { JsonFormsRendererRegistryEntry } from '@jsonforms/core';
const myStyles = mergeStyles(defaultStyles, {
control: { root: 'my-control' },
@@ -238,6 +243,9 @@ export default {
},
computed: {
renderers: sync('app/jsonforms@renderers'),
+ allRenderers(): JsonFormsRendererRegistryEntry[] {
+ return (this.example?.input.renderers ?? []).concat(this.renderers);
+ },
cells: sync('app/jsonforms@cells'),
config: sync('app/jsonforms@config'),
validationMode: sync('app/jsonforms@validationMode'),
@@ -280,6 +288,7 @@ export default {
schema: example.input.schema,
uischema: example.input.uischema,
data: example.input.data,
+ renderers: example.input.renderers,
},
};
this.updateMonacoModels(this.example);
diff --git a/packages/vue2-vuetify/src/layouts/ArrayLayoutRenderer.vue b/packages/vue2-vuetify/src/layouts/ArrayLayoutRenderer.vue
index a3ae968d69..b3016cefe5 100644
--- a/packages/vue2-vuetify/src/layouts/ArrayLayoutRenderer.vue
+++ b/packages/vue2-vuetify/src/layouts/ArrayLayoutRenderer.vue
@@ -1,44 +1,56 @@
-
+
{{
computedLabel
}}
-
-
-
-
- mdi-plus
-
-
- {{ `Add to ${control.label}` }}
-
+
+
+
+
+ mdi-plus
+
+
+ {{ translatedLabels.add }}
+
+
-
+
-
+
-
+
- {{
+
+ {{
index + 1
}}
@@ -77,7 +89,7 @@
{{ childLabelForIndex(index) }}
- Move Up
+ {{ translatedLabels.moveUp }}
@@ -141,7 +153,7 @@
elevation="0"
small
class="v-expansion-panel-header__icon"
- aria-label="Delete"
+ :aria-label="translatedLabels.delete"
:class="styles.arrayList.itemDelete"
:disabled="
!control.enabled ||
@@ -155,7 +167,7 @@
mdi-delete
- Delete
+ {{ translatedLabels.delete }}
@@ -177,8 +189,21 @@
No data
-
+
+
+
+
+
+
- Delete {{ childLabelForIndex(suggestToDelete) || 'element' }}?
+ {{ translatedLabels.dialogTitle }}
- The element will be deleted.
+ {{ translatedLabels.dialogText }}
- Cancel
+
+ {{ translatedLabels.dialogCancel }}
- Delete
+ {{ translatedLabels.dialogConfirm }}
@@ -225,6 +254,7 @@ import {
Resolve,
JsonSchema,
getControlPath,
+ getI18nKey,
} from '@jsonforms/core';
import { defineComponent } from 'vue';
import {
@@ -233,7 +263,12 @@ import {
useJsonFormsArrayControl,
RendererProps,
} from '@jsonforms/vue2';
-import { useNested, useVuetifyArrayControl } from '../util';
+import {
+ useNested,
+ useVuetifyArrayControl,
+ useTranslator,
+ i18nDefaultMessages,
+} from '../util';
import {
VCard,
VCardActions,
@@ -260,6 +295,8 @@ import { ErrorObject } from 'ajv';
import { computed, ref } from 'vue';
import merge from 'lodash/merge';
+type I18nArrayLayoutKey = keyof typeof i18nDefaultMessages.arraylayout;
+
const controlRenderer = defineComponent({
name: 'array-layout-renderer',
components: {
@@ -303,14 +340,25 @@ const controlRenderer = defineComponent({
const suggestToDelete = ref(null);
// indicate to our child renderers that we are increasing the "nested" level
useNested('array');
+ const t = useTranslator();
return {
...control,
currentlyExpanded,
expansionPanelsProps,
suggestToDelete,
+ t,
};
},
computed: {
+ addDisabled(): boolean {
+ return (
+ !this.control.enabled ||
+ (this.appliedOptions.restrict &&
+ this.arraySchema !== undefined &&
+ this.arraySchema.maxItems !== undefined &&
+ this.control.data.length >= this.arraySchema.maxItems)
+ );
+ },
noData(): boolean {
return !this.control.data || this.control.data.length === 0;
},
@@ -335,6 +383,29 @@ const controlRenderer = defineComponent({
hideAvatar(): boolean {
return !!this.appliedOptions.hideAvatar;
},
+ translatedLabels(): { [key in I18nArrayLayoutKey]: string } {
+ const elementToDeleteText = this.childLabelForIndex(this.suggestToDelete);
+ return {
+ add: this.translateLabel('add'),
+ delete: this.translateLabel('delete'),
+ moveUp: this.translateLabel('moveUp'),
+ moveDown: this.translateLabel('moveDown'),
+ dialogTitle: this.translateLabel(
+ 'dialogTitle',
+ {
+ element: elementToDeleteText,
+ },
+ (message) =>
+ message.replace(
+ /\{\{\s?element\s?\}\}/,
+ elementToDeleteText || 'element'
+ )
+ ),
+ dialogText: this.translateLabel('dialogText'),
+ dialogCancel: this.translateLabel('dialogCancel'),
+ dialogConfirm: this.translateLabel('dialogConfirm'),
+ };
+ },
},
methods: {
composePaths,
@@ -356,8 +427,10 @@ const controlRenderer = defineComponent({
event.stopPropagation();
this.moveDown?.(this.control.path, toMove)();
},
- removeItemsClick(toDelete: number[]): void {
- this.removeItems?.(this.control.path, toDelete)();
+ removeItemsClick(toDelete: number[] | null): void {
+ if (toDelete !== null) {
+ this.removeItems?.(this.control.path, toDelete)();
+ }
},
childErrors(index: number): ErrorObject[] {
return this.control.childErrors.filter((e) => {
@@ -367,6 +440,34 @@ const controlRenderer = defineComponent({
);
});
},
+ translateLabel(
+ labelType: I18nArrayLayoutKey,
+ additionalContext: Record | undefined = undefined,
+ transformMessage: (message: string) => string = (text) => text
+ ): string {
+ const i18nKey = getI18nKey(
+ this.arraySchema,
+ this.control.uischema,
+ this.control.path,
+ labelType
+ );
+ const context = {
+ schema: this.control.schema,
+ uischema: this.control.uischema,
+ path: this.control.path,
+ data: this.data,
+ ...additionalContext,
+ };
+ const translation = this.t(i18nKey, undefined, context);
+ if (translation !== undefined) {
+ return translation;
+ }
+ return this.t(
+ `arraylayout.${labelType}`,
+ transformMessage(i18nDefaultMessages.arraylayout[labelType]),
+ context
+ );
+ },
},
});
@@ -382,4 +483,7 @@ export const entry: JsonFormsRendererRegistryEntry = {
.notranslate {
transform: none !important;
}
+/deep/ .v-toolbar__content {
+ padding-left: 0;
+}
diff --git a/packages/vue2-vuetify/src/layouts/index.ts b/packages/vue2-vuetify/src/layouts/index.ts
index ef057a6c9e..7c74b03b63 100644
--- a/packages/vue2-vuetify/src/layouts/index.ts
+++ b/packages/vue2-vuetify/src/layouts/index.ts
@@ -10,8 +10,17 @@ import { entry as categorizationStepperRendererEntry } from './CategorizationSte
import { entry as groupRendererEntry } from './GroupRenderer.vue';
import { entry as horizontalLayoutRendererEntry } from './HorizontalLayoutRenderer.vue';
import { entry as verticalLayoutRendererEntry } from './VerticalLayoutRenderer.vue';
-import { default as VerticalLayoutRenderer } from './VerticalLayoutRenderer.vue';
+export {
+ arrayLayoutRendererEntry,
+ categorizationRendererEntry,
+ categorizationStepperRendererEntry,
+ groupRendererEntry,
+ horizontalLayoutRendererEntry,
+ verticalLayoutRendererEntry,
+};
+
+import { default as VerticalLayoutRenderer } from './VerticalLayoutRenderer.vue';
export { default as ArrayLayoutRenderer } from './ArrayLayoutRenderer.vue';
export { default as CategorizationRenderer } from './CategorizationRenderer.vue';
export { default as CategorizationStepperRenderer } from './CategorizationStepperRenderer.vue';
diff --git a/packages/vue2-vuetify/src/styles/defaultStyles.ts b/packages/vue2-vuetify/src/styles/defaultStyles.ts
index cbc658335c..c70743aa34 100644
--- a/packages/vue2-vuetify/src/styles/defaultStyles.ts
+++ b/packages/vue2-vuetify/src/styles/defaultStyles.ts
@@ -23,6 +23,7 @@ export const defaultStyles: Styles = {
arrayList: {
root: 'array-list',
toolbar: 'array-list-toolbar',
+ validationIcon: 'array-list-validation',
addButton: 'array-list-add',
label: 'array-list-label',
noData: 'array-list-no-data',
diff --git a/packages/vue2-vuetify/src/styles/styles.ts b/packages/vue2-vuetify/src/styles/styles.ts
index 2b1e43ab6e..d3c434e88b 100644
--- a/packages/vue2-vuetify/src/styles/styles.ts
+++ b/packages/vue2-vuetify/src/styles/styles.ts
@@ -37,10 +37,13 @@ export interface Styles {
arrayList: {
root?: string;
toolbar?: string;
+ validationIcon?: string;
+ container?: string;
addButton?: string;
label?: string;
noData?: string;
item?: string;
+ itemContainer?: string;
itemHeader?: string;
itemLabel?: string;
itemContent?: string;
diff --git a/packages/vue2-vuetify/src/util/composition.ts b/packages/vue2-vuetify/src/util/composition.ts
index dcb598bd94..5bb526acb2 100644
--- a/packages/vue2-vuetify/src/util/composition.ts
+++ b/packages/vue2-vuetify/src/util/composition.ts
@@ -189,7 +189,10 @@ export const useVuetifyArrayControl = (
return props && isPlainObject(props) ? props : {};
};
- const childLabelForIndex = (index: number) => {
+ const childLabelForIndex = (index: number | null) => {
+ if (index === null) {
+ return '';
+ }
const childLabelProp =
input.control.value.uischema.options?.childLabelProp ??
getFirstPrimitiveProp(input.control.value.schema);
diff --git a/packages/vue2-vuetify/src/util/i18nDefaultMessages.ts b/packages/vue2-vuetify/src/util/i18nDefaultMessages.ts
new file mode 100644
index 0000000000..a9d88508ae
--- /dev/null
+++ b/packages/vue2-vuetify/src/util/i18nDefaultMessages.ts
@@ -0,0 +1,12 @@
+export const i18nDefaultMessages = {
+ arraylayout: {
+ add: 'Add',
+ delete: 'Delete',
+ moveUp: 'Move Up',
+ moveDown: 'Move Down',
+ dialogTitle: 'Delete {{ element }}?',
+ dialogText: 'The element will be deleted.',
+ dialogConfirm: 'Delete',
+ dialogCancel: 'Cancel',
+ },
+};
diff --git a/packages/vue2-vuetify/src/util/index.ts b/packages/vue2-vuetify/src/util/index.ts
index 3f367a8dee..dbe6cb42e0 100644
--- a/packages/vue2-vuetify/src/util/index.ts
+++ b/packages/vue2-vuetify/src/util/index.ts
@@ -2,3 +2,4 @@ export * from './options';
export * from './composition';
export * from './validator';
export * from './datejs';
+export * from './i18nDefaultMessages';
From 35157299e608f4f36d7a81693bb6e4ea7bc1e473 Mon Sep 17 00:00:00 2001
From: Stefan Dirix
Date: Mon, 22 Aug 2022 13:22:26 +0200
Subject: [PATCH 052/185] Update to JSON Forms 3.0.0-rc.1
---
packages/example/package.json | 4 ++--
packages/vue2-vuetify/package.json | 8 ++++----
2 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/packages/example/package.json b/packages/example/package.json
index 7678f47582..a953a50e10 100644
--- a/packages/example/package.json
+++ b/packages/example/package.json
@@ -8,8 +8,8 @@
"clean": "rimraf dist"
},
"dependencies": {
- "@jsonforms/core": "3.0.0-rc.0",
- "@jsonforms/vue2": "3.0.0-rc.0",
+ "@jsonforms/core": "3.0.0-rc.1",
+ "@jsonforms/vue2": "3.0.0-rc.1",
"@jsonforms/vue2-vuetify": "3.0.0-rc.0",
"core-js": "^3.9.1",
"json-refs": "^3.0.15",
diff --git a/packages/vue2-vuetify/package.json b/packages/vue2-vuetify/package.json
index 38535d4372..f791a8b0e8 100644
--- a/packages/vue2-vuetify/package.json
+++ b/packages/vue2-vuetify/package.json
@@ -48,8 +48,8 @@
"v-mask": "^2.3.0"
},
"peerDependencies": {
- "@jsonforms/core": "3.0.0-rc.0",
- "@jsonforms/vue2": "3.0.0-rc.0",
+ "@jsonforms/core": "3.0.0-rc.1",
+ "@jsonforms/vue2": "3.0.0-rc.1",
"@mdi/font": "^5.9.55",
"vue": "^2.7.0",
"vuetify": "^2.4.0"
@@ -58,8 +58,8 @@
"@babel/core": "^7.14.6",
"@babel/preset-env": "^7.14.7",
"@babel/preset-typescript": "^7.14.5",
- "@jsonforms/core": "3.0.0-rc.0",
- "@jsonforms/vue2": "3.0.0-rc.0",
+ "@jsonforms/core": "3.0.0-rc.1",
+ "@jsonforms/vue2": "3.0.0-rc.1",
"@mdi/font": "^5.9.55",
"@rollup/plugin-babel": "^5.3.0",
"@rollup/plugin-node-resolve": "^9.0.0",
From 8399853879741b3935e9cb11ed45a5ed83addf2b Mon Sep 17 00:00:00 2001
From: Stefan Dirix
Date: Mon, 22 Aug 2022 13:45:09 +0200
Subject: [PATCH 053/185] v3.0.0-rc.1
---
packages/example/package.json | 2 +-
packages/vue2-vuetify/package.json | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/packages/example/package.json b/packages/example/package.json
index a953a50e10..3a56639ecd 100644
--- a/packages/example/package.json
+++ b/packages/example/package.json
@@ -10,7 +10,7 @@
"dependencies": {
"@jsonforms/core": "3.0.0-rc.1",
"@jsonforms/vue2": "3.0.0-rc.1",
- "@jsonforms/vue2-vuetify": "3.0.0-rc.0",
+ "@jsonforms/vue2-vuetify": "3.0.0-rc.1",
"core-js": "^3.9.1",
"json-refs": "^3.0.15",
"monaco-editor": "^0.26.0",
diff --git a/packages/vue2-vuetify/package.json b/packages/vue2-vuetify/package.json
index f791a8b0e8..b986885606 100644
--- a/packages/vue2-vuetify/package.json
+++ b/packages/vue2-vuetify/package.json
@@ -1,6 +1,6 @@
{
"name": "@jsonforms/vue2-vuetify",
- "version": "3.0.0-rc.0",
+ "version": "3.0.0-rc.1",
"description": "Vue 2 Vuetify renderers for JSON Forms",
"repository": "https://github.com/eclipsesource/jsonforms-vuetify-renderers",
"bugs": "https://github.com/eclipsesource/jsonforms/issues",
From 07cf6ca39585da78f832b5be89e3497ca6f89885 Mon Sep 17 00:00:00 2001
From: Krasimir Chobantonov
Date: Thu, 20 Oct 2022 08:37:03 -0400
Subject: [PATCH 054/185] Allow falsy values as allowed values for enums (#73)
---
packages/vue2-vuetify/src/controls/EnumControlRenderer.vue | 5 ++---
.../vue2-vuetify/src/controls/OneOfEnumControlRenderer.vue | 5 ++---
.../src/extended/AutocompleteEnumControlRenderer.vue | 2 +-
.../src/extended/AutocompleteOneOfEnumControlRenderer.vue | 2 +-
packages/vue2-vuetify/src/layouts/ArrayLayoutRenderer.vue | 2 +-
5 files changed, 7 insertions(+), 9 deletions(-)
diff --git a/packages/vue2-vuetify/src/controls/EnumControlRenderer.vue b/packages/vue2-vuetify/src/controls/EnumControlRenderer.vue
index daf96bb19a..1c67fe75b3 100644
--- a/packages/vue2-vuetify/src/controls/EnumControlRenderer.vue
+++ b/packages/vue2-vuetify/src/controls/EnumControlRenderer.vue
@@ -64,9 +64,8 @@ const controlRenderer = defineComponent({
...rendererProps(),
},
setup(props: RendererProps) {
- return useVuetifyControl(
- useJsonFormsEnumControl(props),
- (value) => value || undefined
+ return useVuetifyControl(useJsonFormsEnumControl(props), (value) =>
+ value !== null ? value : undefined
);
},
});
diff --git a/packages/vue2-vuetify/src/controls/OneOfEnumControlRenderer.vue b/packages/vue2-vuetify/src/controls/OneOfEnumControlRenderer.vue
index 980ff76f77..f7181f85e2 100644
--- a/packages/vue2-vuetify/src/controls/OneOfEnumControlRenderer.vue
+++ b/packages/vue2-vuetify/src/controls/OneOfEnumControlRenderer.vue
@@ -64,9 +64,8 @@ const controlRenderer = defineComponent({
...rendererProps(),
},
setup(props: RendererProps) {
- return useVuetifyControl(
- useJsonFormsOneOfEnumControl(props),
- (value) => value || undefined
+ return useVuetifyControl(useJsonFormsOneOfEnumControl(props), (value) =>
+ value !== null ? value : undefined
);
},
});
diff --git a/packages/vue2-vuetify/src/extended/AutocompleteEnumControlRenderer.vue b/packages/vue2-vuetify/src/extended/AutocompleteEnumControlRenderer.vue
index 5f4604026b..03da309256 100644
--- a/packages/vue2-vuetify/src/extended/AutocompleteEnumControlRenderer.vue
+++ b/packages/vue2-vuetify/src/extended/AutocompleteEnumControlRenderer.vue
@@ -91,7 +91,7 @@ const controlRenderer = defineComponent({
setup(props: RendererProps) {
return useVuetifyControl(
useJsonFormsEnumControl(props),
- (value) => value || undefined,
+ (value) => (value !== null ? value : undefined),
300
);
},
diff --git a/packages/vue2-vuetify/src/extended/AutocompleteOneOfEnumControlRenderer.vue b/packages/vue2-vuetify/src/extended/AutocompleteOneOfEnumControlRenderer.vue
index 9602a07395..31463cbade 100644
--- a/packages/vue2-vuetify/src/extended/AutocompleteOneOfEnumControlRenderer.vue
+++ b/packages/vue2-vuetify/src/extended/AutocompleteOneOfEnumControlRenderer.vue
@@ -91,7 +91,7 @@ const controlRenderer = defineComponent({
setup(props: RendererProps) {
return useVuetifyControl(
useJsonFormsOneOfEnumControl(props),
- (value) => value || undefined,
+ (value) => (value !== null ? value : undefined),
300
);
},
diff --git a/packages/vue2-vuetify/src/layouts/ArrayLayoutRenderer.vue b/packages/vue2-vuetify/src/layouts/ArrayLayoutRenderer.vue
index b3016cefe5..ba3332541c 100644
--- a/packages/vue2-vuetify/src/layouts/ArrayLayoutRenderer.vue
+++ b/packages/vue2-vuetify/src/layouts/ArrayLayoutRenderer.vue
@@ -455,7 +455,7 @@ const controlRenderer = defineComponent({
schema: this.control.schema,
uischema: this.control.uischema,
path: this.control.path,
- data: this.data,
+ data: this.control.data,
...additionalContext,
};
const translation = this.t(i18nKey, undefined, context);
From 55d0871bb848af55a9bcc77f12e8d50637a79348 Mon Sep 17 00:00:00 2001
From: Krasimir Chobantonov
Date: Fri, 21 Oct 2022 09:47:56 -0400
Subject: [PATCH 055/185] Fix renderers' data length checks for undefined data
(#82)
Co-authored-by: Lucas Koehler
---
.../src/additional/ListWithDetailRenderer.vue | 14 ++++++--------
.../src/complex/ArrayControlRenderer.vue | 14 ++++++--------
.../src/layouts/ArrayLayoutRenderer.vue | 15 +++++++--------
3 files changed, 19 insertions(+), 24 deletions(-)
diff --git a/packages/vue2-vuetify/src/additional/ListWithDetailRenderer.vue b/packages/vue2-vuetify/src/additional/ListWithDetailRenderer.vue
index f968d05827..057865ae81 100644
--- a/packages/vue2-vuetify/src/additional/ListWithDetailRenderer.vue
+++ b/packages/vue2-vuetify/src/additional/ListWithDetailRenderer.vue
@@ -32,7 +32,7 @@
(appliedOptions.restrict &&
arraySchema !== undefined &&
arraySchema.maxItems !== undefined &&
- control.data.length >= arraySchema.maxItems)
+ dataLength >= arraySchema.maxItems)
"
>
mdi-plus
@@ -43,7 +43,7 @@
-
+
No data
@@ -130,9 +130,7 @@
small
class="ma-0"
aria-label="Move down"
- :disabled="
- index >= control.data.length - 1 || !control.enabled
- "
+ :disabled="index >= dataLength - 1 || !control.enabled"
:class="styles.listWithDetail.itemMoveDown"
@click.native="moveDownClick($event, index)"
>
@@ -160,7 +158,7 @@
(appliedOptions.restrict &&
arraySchema !== undefined &&
arraySchema.minItems !== undefined &&
- control.data.length <= arraySchema.minItems)
+ dataLength <= arraySchema.minItems)
"
>
mdi-delete
@@ -282,8 +280,8 @@ const controlRenderer = defineComponent({
};
},
computed: {
- noData(): boolean {
- return !this.control.data || this.control.data.length === 0;
+ dataLength(): number {
+ return this.control.data ? this.control.data.length : 0;
},
foundUISchema(): UISchemaElement {
return findUISchema(
diff --git a/packages/vue2-vuetify/src/complex/ArrayControlRenderer.vue b/packages/vue2-vuetify/src/complex/ArrayControlRenderer.vue
index 7d04ad5375..89effc71f9 100644
--- a/packages/vue2-vuetify/src/complex/ArrayControlRenderer.vue
+++ b/packages/vue2-vuetify/src/complex/ArrayControlRenderer.vue
@@ -26,7 +26,7 @@
(appliedOptions.restrict &&
arraySchema !== undefined &&
arraySchema.maxItems !== undefined &&
- control.data.length >= arraySchema.maxItems)
+ dataLength >= arraySchema.maxItems)
"
@click="addButtonClick"
>
@@ -122,9 +122,7 @@
elevation="0"
small
aria-label="Move down"
- :disabled="
- index >= control.data.length - 1 || !control.enabled
- "
+ :disabled="index >= dataLength - 1 || !control.enabled"
:class="styles.arrayList.itemMoveDown"
@click.native="moveDownClick($event, index)"
>
@@ -148,7 +146,7 @@
(appliedOptions.restrict &&
arraySchema !== undefined &&
arraySchema.minItems !== undefined &&
- control.data.length <= arraySchema.minItems)
+ dataLength <= arraySchema.minItems)
"
@click.native="removeItemsClick($event, [index])"
>
@@ -163,7 +161,7 @@
-
+
No data
@@ -247,8 +245,8 @@ const controlRenderer = defineComponent({
this.control.rootSchema
);
},
- noData(): boolean {
- return !this.control.data || this.control.data.length === 0;
+ dataLength(): number {
+ return this.control.data ? this.control.data.length : 0;
},
},
methods: {
diff --git a/packages/vue2-vuetify/src/layouts/ArrayLayoutRenderer.vue b/packages/vue2-vuetify/src/layouts/ArrayLayoutRenderer.vue
index ba3332541c..85772848b7 100644
--- a/packages/vue2-vuetify/src/layouts/ArrayLayoutRenderer.vue
+++ b/packages/vue2-vuetify/src/layouts/ArrayLayoutRenderer.vue
@@ -131,8 +131,7 @@
class="v-expansion-panel-header__icon"
:aria-label="translatedLabels.moveDown"
:disabled="
- index >= control.data.length - 1 ||
- !control.enabled
+ index >= dataLength - 1 || !control.enabled
"
:class="styles.arrayList.itemMoveDown"
@click.native="moveDownClick($event, index)"
@@ -160,7 +159,7 @@
(appliedOptions.restrict &&
arraySchema !== undefined &&
arraySchema.minItems !== undefined &&
- control.data.length <= arraySchema.minItems)
+ dataLength <= arraySchema.minItems)
"
@click.stop.native="suggestToDelete = index"
>
@@ -187,7 +186,7 @@
-
+
No data
@@ -356,11 +355,11 @@ const controlRenderer = defineComponent({
(this.appliedOptions.restrict &&
this.arraySchema !== undefined &&
this.arraySchema.maxItems !== undefined &&
- this.control.data.length >= this.arraySchema.maxItems)
+ this.dataLength >= this.arraySchema.maxItems)
);
},
- noData(): boolean {
- return !this.control.data || this.control.data.length === 0;
+ dataLength(): number {
+ return this.control.data ? this.control.data.length : 0;
},
foundUISchema(): UISchemaElement {
return findUISchema(
@@ -416,7 +415,7 @@ const controlRenderer = defineComponent({
createDefaultValue(this.control.schema)
)();
if (!this.appliedOptions.collapseNewItems && this.control.data?.length) {
- this.currentlyExpanded = this.control.data.length - 1;
+ this.currentlyExpanded = this.dataLength - 1;
}
},
moveUpClick(event: Event, toMove: number): void {
From 3c2848bda95e254f84782a14ffefbdc247ae5137 Mon Sep 17 00:00:00 2001
From: Krasimir Chobantonov
Date: Fri, 21 Oct 2022 09:57:04 -0400
Subject: [PATCH 056/185] Add masked string renderer (#78)
Adds new renderer StringMaskControl allowing to specify an input and display mask for strings.
Implements #77
---
.../src/examples/control-options/data.json | 24 +-
.../src/examples/control-options/schema.json | 29 +-
.../examples/control-options/uischema.json | 42 ++-
.../controls/StringMaskControlRenderer.vue | 286 ++++++++++++++++++
packages/vue2-vuetify/src/controls/index.ts | 3 +
.../src/layouts/HorizontalLayoutRenderer.vue | 2 +-
.../src/layouts/VerticalLayoutRenderer.vue | 3 +-
7 files changed, 378 insertions(+), 11 deletions(-)
create mode 100644 packages/vue2-vuetify/src/controls/StringMaskControlRenderer.vue
diff --git a/packages/example/src/examples/control-options/data.json b/packages/example/src/examples/control-options/data.json
index 33d610fb2e..3996f033a2 100644
--- a/packages/example/src/examples/control-options/data.json
+++ b/packages/example/src/examples/control-options/data.json
@@ -3,5 +3,25 @@
"slider": 4,
"trimText": "abcdefg",
"restrictText": "abcde",
- "toggle": false
-}
\ No newline at end of file
+ "toggle": false,
+ "phone": "1115554444888",
+ "formattedPhone": "(333)555-4444",
+ "placeholderInfo": [
+ {
+ "placeholder": "#",
+ "format": "Number (0-9)"
+ },
+ {
+ "placeholder": "A",
+ "format": "Letter in any case (a-z,A-Z)"
+ },
+ {
+ "placeholder": "N",
+ "format": "Number or letter (a-z,A-Z,0-9)"
+ },
+ {
+ "placeholder": "X",
+ "format": "Any symbol"
+ }
+ ]
+}
diff --git a/packages/example/src/examples/control-options/schema.json b/packages/example/src/examples/control-options/schema.json
index cbbc462e9f..7e4cdc4580 100644
--- a/packages/example/src/examples/control-options/schema.json
+++ b/packages/example/src/examples/control-options/schema.json
@@ -32,10 +32,29 @@
"toggle": {
"type": "boolean",
"description": "The \"toggle\" option renders boolean values as a toggle."
+ },
+ "phone": {
+ "type": "string",
+ "pattern": "^[0-9]{13}$"
+ },
+ "formattedPhone": {
+ "type": "string",
+ "pattern": "^\\([0-9]{3}\\)-[0-9]{3}-[0-9]{4}$"
+ },
+ "placeholderInfo": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "placeholder": {
+ "type": "string"
+ },
+ "format": {
+ "type": "string"
+ }
+ }
+ }
}
},
- "required": [
- "hideRequiredAsterisk",
- "restrictText"
- ]
-}
\ No newline at end of file
+ "required": ["hideRequiredAsterisk", "restrictText", "phone"]
+}
diff --git a/packages/example/src/examples/control-options/uischema.json b/packages/example/src/examples/control-options/uischema.json
index 81f7a85a01..b2a82f2b75 100644
--- a/packages/example/src/examples/control-options/uischema.json
+++ b/packages/example/src/examples/control-options/uischema.json
@@ -50,6 +50,46 @@
"options": {
"toggle": true
}
+ },
+ {
+ "type": "GroupLayout",
+ "name": "Masked input",
+ "elements": [
+ {
+ "type": "Label",
+ "text": "Supported default mask replacers: (If you place value null then it will ignore the default)"
+ },
+ {
+ "type": "Control",
+ "scope": "#/properties/placeholderInfo",
+ "options": {
+ "readonly": true
+ }
+ }
+ ]
+ },
+ {
+ "type": "Control",
+ "scope": "#/properties/phone",
+ "label": "Phone (format not stored)",
+ "options": {
+ "mask": "(SSS) SSS - SSSS #SSS",
+ "maskReplacers": {
+ "S": "\\d",
+ "#": null
+ }
+ }
+ },
+ {
+ "type": "Control",
+ "scope": "#/properties/formattedPhone",
+ "label": "Phone (format is stored)",
+ "options": {
+ "placeholder": "(###)-###-####",
+ "mask": "(###)-###-####",
+ "returnMaskedValue": true
+
+ }
}
]
-}
\ No newline at end of file
+}
diff --git a/packages/vue2-vuetify/src/controls/StringMaskControlRenderer.vue b/packages/vue2-vuetify/src/controls/StringMaskControlRenderer.vue
new file mode 100644
index 0000000000..8c31636f9f
--- /dev/null
+++ b/packages/vue2-vuetify/src/controls/StringMaskControlRenderer.vue
@@ -0,0 +1,286 @@
+
+
+
+
+
+
+
+
+
diff --git a/packages/vue2-vuetify/src/controls/index.ts b/packages/vue2-vuetify/src/controls/index.ts
index 4dffea3e58..b610731f89 100644
--- a/packages/vue2-vuetify/src/controls/index.ts
+++ b/packages/vue2-vuetify/src/controls/index.ts
@@ -17,6 +17,7 @@ export { default as PasswordControlRenderer } from './PasswordControlRenderer.vu
export { default as RadioGroupControlRenderer } from './RadioGroupControlRenderer.vue';
export { default as SliderControlRenderer } from './SliderControlRenderer.vue';
export { default as StringControlRenderer } from './StringControlRenderer.vue';
+export { default as StringMaskControlRenderer } from './StringMaskControlRenderer.vue';
export { default as TimeControlRenderer } from './TimeControlRenderer.vue';
import { entry as anyOfStringOrEnumControlRendererEntry } from './AnyOfStringOrEnumControlRenderer.vue';
@@ -34,6 +35,7 @@ import { entry as passwordControlRendererEntry } from './PasswordControlRenderer
import { entry as radioGroupControlRendererEntry } from './RadioGroupControlRenderer.vue';
import { entry as sliderControlRendererEntry } from './SliderControlRenderer.vue';
import { entry as stringControlRendererEntry } from './StringControlRenderer.vue';
+import { entry as stringMaskControlRendererEntry } from './StringMaskControlRenderer.vue';
import { entry as timeControlRendererEntry } from './TimeControlRenderer.vue';
export const controlRenderers = [
@@ -52,5 +54,6 @@ export const controlRenderers = [
radioGroupControlRendererEntry,
sliderControlRendererEntry,
stringControlRendererEntry,
+ stringMaskControlRendererEntry,
timeControlRendererEntry,
];
diff --git a/packages/vue2-vuetify/src/layouts/HorizontalLayoutRenderer.vue b/packages/vue2-vuetify/src/layouts/HorizontalLayoutRenderer.vue
index f7c8cc1c42..1752f8968e 100644
--- a/packages/vue2-vuetify/src/layouts/HorizontalLayoutRenderer.vue
+++ b/packages/vue2-vuetify/src/layouts/HorizontalLayoutRenderer.vue
@@ -1,7 +1,7 @@
diff --git a/packages/vue2-vuetify/src/layouts/VerticalLayoutRenderer.vue b/packages/vue2-vuetify/src/layouts/VerticalLayoutRenderer.vue
index 2e79d5b74d..4be8e16b25 100644
--- a/packages/vue2-vuetify/src/layouts/VerticalLayoutRenderer.vue
+++ b/packages/vue2-vuetify/src/layouts/VerticalLayoutRenderer.vue
@@ -2,13 +2,12 @@
Date: Wed, 26 Oct 2022 06:08:21 -0400
Subject: [PATCH 057/185] Update Demo with i18n support and add enum label
translation (#76)
Fixes #75
---
packages/example/src/components/DemoForm.vue | 11 +-
packages/example/src/components/Settings.vue | 2 +
packages/example/src/core/types.ts | 1 +
packages/example/src/examples/basic/i18n.json | 126 ++++++++++++++++++
packages/example/src/examples/basic/index.ts | 4 +-
packages/example/src/examples/main/i18n.json | 103 ++++++++++++++
packages/example/src/examples/main/index.ts | 4 +-
packages/example/src/i18n/i18n.ts | 101 +++-----------
.../example/src/views/example/Example.vue | 94 +++++++++++++
.../src/controls/EnumControlRenderer.vue | 18 ++-
.../src/controls/OneOfEnumControlRenderer.vue | 20 +--
.../AutocompleteEnumControlRenderer.vue | 19 +--
.../AutocompleteOneOfEnumControlRenderer.vue | 19 +--
packages/vue2-vuetify/src/util/composition.ts | 6 +-
14 files changed, 405 insertions(+), 123 deletions(-)
create mode 100644 packages/example/src/examples/basic/i18n.json
create mode 100644 packages/example/src/examples/main/i18n.json
diff --git a/packages/example/src/components/DemoForm.vue b/packages/example/src/components/DemoForm.vue
index 868a66b42d..e8d2de47eb 100644
--- a/packages/example/src/components/DemoForm.vue
+++ b/packages/example/src/components/DemoForm.vue
@@ -121,7 +121,7 @@ export default {
} as ResolvedSchema,
i18n: {
locale: this.locale,
- translate: createTranslator(this.locale),
+ translate: createTranslator(this.locale, this.example?.input?.i18n),
} as JsonFormsI18nState,
};
},
@@ -130,12 +130,19 @@ export default {
deep: true,
handler(newExample: Example, oldExample: Example): void {
this.resolveSchema(newExample.input.schema);
+ this.i18n.translate = createTranslator(
+ this.locale,
+ newExample?.input?.i18n as any
+ );
},
},
locale(newLocale: string): void {
console.log('LOCALE SWITCH', newLocale);
this.i18n.locale = newLocale;
- this.i18n.translate = createTranslator(newLocale);
+ this.i18n.translate = createTranslator(
+ newLocale,
+ this.example?.input?.i18n as any
+ );
},
},
mounted() {
diff --git a/packages/example/src/components/Settings.vue b/packages/example/src/components/Settings.vue
index e49da38a39..91449757e2 100644
--- a/packages/example/src/components/Settings.vue
+++ b/packages/example/src/components/Settings.vue
@@ -298,6 +298,8 @@ export default {
locales: [
{ text: 'English (en)', value: 'en' },
{ text: 'German (de)', value: 'de' },
+ { text: 'Bulgarian (bg)', value: 'bg' },
+ { text: 'Browser Language', value: navigator.language },
],
breakHorizontals: [
{ text: 'None', value: false },
diff --git a/packages/example/src/core/types.ts b/packages/example/src/core/types.ts
index 74a0b8e2e6..c118c62259 100644
--- a/packages/example/src/core/types.ts
+++ b/packages/example/src/core/types.ts
@@ -11,6 +11,7 @@ export type Example = {
schema?: JsonSchema;
uischema?: UISchemaElement;
data: Record;
+ i18n?: Record;
renderers?: JsonFormsRendererRegistryEntry[];
};
};
diff --git a/packages/example/src/examples/basic/i18n.json b/packages/example/src/examples/basic/i18n.json
new file mode 100644
index 0000000000..711ea65596
--- /dev/null
+++ b/packages/example/src/examples/basic/i18n.json
@@ -0,0 +1,126 @@
+{
+ "en": {
+ "name": {
+ "label": "Name",
+ "description": "The name of the person"
+ },
+ "vegetarian": {
+ "label": "Vegetarian",
+ "description": "Whether the person is a vegetarian"
+ },
+ "birth": {
+ "label": "Birth Date",
+ "description": ""
+ },
+ "nationality": {
+ "label": "Nationality",
+ "description": ""
+ },
+ "personal-data": {
+ "age": {
+ "label": "Age"
+ },
+ "driving": {
+ "label": "Driving Skill",
+ "description": "Indicating experience level"
+ }
+ },
+ "height": {
+ "label": "Height"
+ },
+ "occupation": {
+ "label": "Occupation",
+ "description": ""
+ },
+ "postal-code": {
+ "label": "Postal Code"
+ },
+ "error": {
+ "required": "field is required"
+ }
+ },
+ "de": {
+ "name": {
+ "label": "Name",
+ "description": "Der Name der Person"
+ },
+ "vegetarian": {
+ "label": "Vegetarier",
+ "description": "Isst die Person vegetarisch?"
+ },
+ "birth": {
+ "label": "Geburtsdatum",
+ "description": ""
+ },
+ "nationality": {
+ "label": "Nationalität",
+ "description": "",
+ "Other": "Andere"
+ },
+ "personal-data": {
+ "age": {
+ "label": "Alter"
+ },
+ "driving": {
+ "label": "Fahrkenntnisse",
+ "description": "Fahrerfahrung der Person"
+ }
+ },
+ "height": {
+ "label": "Größe"
+ },
+ "occupation": {
+ "label": "Beruf",
+ "description": ""
+ },
+ "postal-code": {
+ "label": "Postleitzahl"
+ },
+ "error": {
+ "required": "Pflichtfeld"
+ },
+ "Additional Information": "Zusätzliche Informationen"
+ },
+ "bg": {
+ "name": {
+ "label": "Име",
+ "description": "Името на лицето"
+ },
+ "vegetarian": {
+ "label": "Вегетарианец",
+ "description": "Дали човекът е вегетарианец"
+ },
+ "birth": {
+ "label": "Рождена дата",
+ "description": ""
+ },
+ "nationality": {
+ "label": "Националност",
+ "description": ""
+ },
+ "personal-data": {
+ "age": {
+ "label": "Възраст",
+ "description": "Моля, въведете вашата възраст."
+ },
+ "driving": {
+ "label": "Шофьорски умения",
+ "description": "Показва ниво на опит"
+ }
+ },
+ "height": {
+ "label": "Височина"
+ },
+ "occupation": {
+ "label": "Професия",
+ "description": ""
+ },
+ "postal-code": {
+ "label": "Пощенски код"
+ },
+ "error": {
+ "required": "полето е задължително"
+ },
+ "Additional Information": "Допълнителна информация"
+ }
+}
diff --git a/packages/example/src/examples/basic/index.ts b/packages/example/src/examples/basic/index.ts
index 8f5e656657..b942ddffd8 100644
--- a/packages/example/src/examples/basic/index.ts
+++ b/packages/example/src/examples/basic/index.ts
@@ -1,10 +1,12 @@
import schema from './schema.json';
import uischema from './uischema.json';
import data from './data.json';
+import i18n from './i18n.json';
import { UISchemaElement, JsonSchema } from '@jsonforms/core';
export const input: {
schema: JsonSchema;
uischema: UISchemaElement;
data: any;
-} = { schema, uischema, data };
+ i18n: any;
+} = { schema, uischema, data, i18n };
diff --git a/packages/example/src/examples/main/i18n.json b/packages/example/src/examples/main/i18n.json
new file mode 100644
index 0000000000..ba06b21bfc
--- /dev/null
+++ b/packages/example/src/examples/main/i18n.json
@@ -0,0 +1,103 @@
+{
+ "en": {
+ "firstName": {
+ "label": "First Name",
+ "description": "First name of the person"
+ },
+ "lastName": {
+ "label": "Last Name",
+ "description": "Last name of the person"
+ },
+ "age": {
+ "label": "Age",
+ "description": "Person's age",
+ "error": {
+ "required": "Age is required"
+ }
+ },
+ "gender": {
+ "label": "Gender",
+ "description": "Gender of the person"
+ },
+ "height": {
+ "label": "Height",
+ "description": "Height of the person"
+ },
+ "dateOfBirth": {
+ "label": "Birth Date",
+ "description": "Birth date of the person"
+ },
+ "committer": {
+ "label": "Committer"
+ },
+ "address": {
+ "street": {
+ "label": "Street",
+ "description": "Shipping street address"
+ },
+ "streetnumber": {
+ "label": "Street Number",
+ "description": "Shipping street number"
+ },
+ "postalCode": {
+ "label": "Postal Code",
+ "description": "Shipping postal code"
+ },
+ "city": {
+ "label": "City",
+ "description": "Shipping city"
+ }
+ }
+ },
+ "bg": {
+ "firstName": {
+ "label": "Първо име",
+ "description": "Първо име на лицето"
+ },
+ "lastName": {
+ "label": "Фамилия",
+ "description": "Фамилия на лицето"
+ },
+ "age": {
+ "label": "Възраст",
+ "description": "Възраст на лицето",
+ "error": {
+ "required": "Изисква се възраст"
+ }
+ },
+ "gender": {
+ "label": "Пол",
+ "description": "Пол на лицето"
+ },
+ "height": {
+ "label": "Височина",
+ "description": "Височина на лицето"
+ },
+ "dateOfBirth": {
+ "label": "Рождена дата",
+ "description": "Рождена дата на лицето"
+ },
+ "committer": {
+ "label": "деятел"
+ },
+ "address": {
+ "street": {
+ "label": "Улица",
+ "description": "Улица за доставка"
+ },
+ "streetnumber": {
+ "label": "Номер на улица",
+ "description": "Номер на улицата за доставка"
+ },
+ "postalCode": {
+ "label": "Пощенски код",
+ "description": "Пощенски код за доставка"
+ },
+ "city": {
+ "label": "Град",
+ "description": "Град за доставка"
+ }
+ },
+ "Address for Shipping T-Shirt": "Адрес за доставка на тениска"
+ }
+}
diff --git a/packages/example/src/examples/main/index.ts b/packages/example/src/examples/main/index.ts
index 8f5e656657..b942ddffd8 100644
--- a/packages/example/src/examples/main/index.ts
+++ b/packages/example/src/examples/main/index.ts
@@ -1,10 +1,12 @@
import schema from './schema.json';
import uischema from './uischema.json';
import data from './data.json';
+import i18n from './i18n.json';
import { UISchemaElement, JsonSchema } from '@jsonforms/core';
export const input: {
schema: JsonSchema;
uischema: UISchemaElement;
data: any;
-} = { schema, uischema, data };
+ i18n: any;
+} = { schema, uischema, data, i18n };
diff --git a/packages/example/src/i18n/i18n.ts b/packages/example/src/i18n/i18n.ts
index 92ec02ad7d..74bc46e0f3 100644
--- a/packages/example/src/i18n/i18n.ts
+++ b/packages/example/src/i18n/i18n.ts
@@ -1,91 +1,20 @@
import get from 'lodash/get';
-const en = {
- name: {
- label: 'Name',
- description: 'The name of the person',
- },
- vegetarian: {
- label: 'Vegetarian',
- description: 'Wether the person is a vegetarian',
- },
- birth: {
- label: 'Birth Date',
- description: '',
- },
- nationality: {
- label: 'Nationality',
- description: '',
- },
- 'personal-data': {
- age: {
- label: 'Age',
- },
- driving: {
- label: 'Driving Skill',
- description: 'Indicating experience level',
- },
- },
- height: {
- label: 'Height',
- },
- occupation: {
- label: 'Occupation',
- description: '',
- },
- 'postal-code': {
- label: 'Postal Code',
- },
- error: {
- required: 'field is required',
- },
-};
-
-const de = {
- name: {
- label: 'Name',
- description: 'Der Name der Person',
- },
- vegetarian: {
- label: 'Vegetarier',
- description: 'Isst die Person vegetarisch?',
- },
- birth: {
- label: 'Geburtsdatum',
- description: '',
- },
- nationality: {
- label: 'Nationalität',
- description: '',
- Other: 'Andere',
- },
- 'personal-data': {
- age: {
- label: 'Alter',
- },
- driving: {
- label: 'Fahrkenntnisse',
- description: 'Fahrerfahrung der Person',
- },
- },
- height: {
- label: 'Größe',
- },
- occupation: {
- label: 'Beruf',
- description: '',
- },
- 'postal-code': {
- label: 'Postleitzahl',
- },
- error: {
- required: 'Pflichtfeld',
- },
- 'Additional Information': 'Zusätzliche Informationen',
-};
-
export const createTranslator =
- (locale: 'en' | 'de') =>
+ (locale: string, translations?: Record) =>
(key: string, defaultMessage: string | undefined): string | undefined => {
- return get(locale === 'en' ? en : de, key) ?? defaultMessage;
+ if (!translations) {
+ return defaultMessage;
+ }
+
+ let localeTranslations = translations[locale];
+ if (!localeTranslations) {
+ // if specific locale like en-US is not available then use more generic like us
+ const dashIndex = locale.indexOf('-');
+ localeTranslations =
+ dashIndex > 0
+ ? translations[locale.substring(0, dashIndex)]
+ : translations['en'];
+ }
+ return get(localeTranslations, key) ?? defaultMessage;
};
diff --git a/packages/example/src/views/example/Example.vue b/packages/example/src/views/example/Example.vue
index 1a159cde16..3a51fd703b 100644
--- a/packages/example/src/views/example/Example.vue
+++ b/packages/example/src/views/example/Example.vue
@@ -11,6 +11,7 @@
Schema
UI Schema
Data
+ Internationalization
@@ -173,6 +174,44 @@
>
+
+
+
+
+ Internationalization
+
+
+
+
+ mdi-reload
+
+
+ {{ `Reload Example Internationalization` }}
+
+
+
+
+ mdi-content-save
+
+
+ {{ `Apply Change To Example Data` }}
+
+
+
+
+
+
+
@@ -254,6 +293,7 @@ export default {
monacoSchemaModel: sync('app/monaco@schemaModel'),
monacoUiSchemaModel: sync('app/monaco@uischemaModel'),
monacoDataModel: sync('app/monaco@dataModel'),
+ monacoI18NModel: sync('app/monaco@i18nModel'),
locale: sync('app/jsonforms@locale'),
formonly(): boolean {
return this.$route.query?.view === 'form-only';
@@ -288,6 +328,7 @@ export default {
schema: example.input.schema,
uischema: example.input.uischema,
data: example.input.data,
+ i18n: example.input.i18n,
renderers: example.input.renderers,
},
};
@@ -422,6 +463,49 @@ export default {
}
}
},
+ reloadMonacoI18N() {
+ const example = find(
+ this.examples,
+ (example) => example.id === this.$route.params.id
+ );
+
+ if (example) {
+ this.$store.set(
+ 'app/monaco@i18nModel',
+ getMonacoModelForUri(
+ monaco.Uri.parse(this.toI18NUri(example.id)),
+ example.input.i18n
+ ? JSON.stringify(example.input.i18n, null, 2)
+ : ''
+ )
+ );
+ this.toast('Original example i18n loaded. Apply it to take effect.');
+ }
+ },
+ saveMonacoI18N() {
+ const model = this.monacoI18NModel as monaco.editor.ITextModel;
+ const example = this.example;
+
+ if (model && example) {
+ // do not check for monaco errors just if this is valid JSON becase we want to see when we have validation errors
+
+ const modelValue = model.getValue();
+ if (modelValue) {
+ let newJson: Record | undefined = undefined;
+
+ try {
+ newJson = JSON.parse(modelValue);
+ } catch (error) {
+ this.toast(`Error: ${error}`);
+ }
+
+ if (newJson) {
+ example.input.i18n = newJson;
+ this.toast('New i18n applied');
+ }
+ }
+ }
+ },
registerValidations(editor: EditorApi) {
configureJsonSchemaValidation(editor, ['*.schema.json']);
configureUISchemaValidation(editor, ['*.uischema.json']);
@@ -467,6 +551,13 @@ export default {
example.input.data ? JSON.stringify(example.input.data, null, 2) : ''
)
);
+ this.$store.set(
+ 'app/monaco@i18nModel',
+ getMonacoModelForUri(
+ monaco.Uri.parse(this.toI18NUri(example.id)),
+ example.input.i18n ? JSON.stringify(example.input.i18n, null, 2) : ''
+ )
+ );
},
toSchemaUri(id: string): string {
return `${id}.schema.json`;
@@ -477,6 +568,9 @@ export default {
toDataUri(id: string): string {
return `${id}.data.json`;
},
+ toI18NUri(id: string): string {
+ return `${id}.i18n.json`;
+ },
toast(message: string): void {
this.snackbar = true;
this.snackbarText = message;
diff --git a/packages/vue2-vuetify/src/controls/EnumControlRenderer.vue b/packages/vue2-vuetify/src/controls/EnumControlRenderer.vue
index 1c67fe75b3..e1c640b243 100644
--- a/packages/vue2-vuetify/src/controls/EnumControlRenderer.vue
+++ b/packages/vue2-vuetify/src/controls/EnumControlRenderer.vue
@@ -21,7 +21,7 @@
:clearable="hover"
:value="control.data"
:items="control.options"
- item-text="label"
+ :item-text="(item) => t(item.label, item.label)"
item-value="value"
v-bind="vuetifyProps('v-select')"
@change="onChange"
@@ -35,19 +35,19 @@
+
+
diff --git a/packages/example/src/core/jsonschema/specification/uischema.json b/packages/example/src/core/jsonschema/specification/uischema.json
index 95de2305c4..724ce6db07 100644
--- a/packages/example/src/core/jsonschema/specification/uischema.json
+++ b/packages/example/src/core/jsonschema/specification/uischema.json
@@ -298,7 +298,7 @@
"scope": {
"type": "string",
"$id": "#scope",
- "pattern": "^#\\/properties\\/{1}"
+ "pattern": "^#$|^#\\/$|^#\\/properties\\/{1}"
},
"options": {
"type": "object",
diff --git a/packages/example/src/core/types.ts b/packages/example/src/core/types.ts
index c118c62259..95b1d2945f 100644
--- a/packages/example/src/core/types.ts
+++ b/packages/example/src/core/types.ts
@@ -10,7 +10,7 @@ export type Example = {
input: {
schema?: JsonSchema;
uischema?: UISchemaElement;
- data: Record;
+ data: string | number | boolean | any[] | Record;
i18n?: Record;
renderers?: JsonFormsRendererRegistryEntry[];
};
diff --git a/packages/example/src/examples/additionalProperties/data.json b/packages/example/src/examples/additionalProperties/data.json
new file mode 100644
index 0000000000..25b1bcd008
--- /dev/null
+++ b/packages/example/src/examples/additionalProperties/data.json
@@ -0,0 +1,15 @@
+{
+ "propertiesString": "data",
+ "string": "string value",
+ "number": 10.2,
+ "integer": 11,
+ "object": {
+ "prop1": "prop 1 value"
+ },
+ "boolean": true,
+ "stringArray": ["value1", "value2"],
+ "numberArray": [12.2],
+ "integerArray": [33],
+ "objectArray": [{ "prop1": "prop1 val" }, {}],
+ "booleanArray": [false, true]
+}
diff --git a/packages/example/src/examples/additionalProperties/i18n.json b/packages/example/src/examples/additionalProperties/i18n.json
new file mode 100644
index 0000000000..e2b88ae2e3
--- /dev/null
+++ b/packages/example/src/examples/additionalProperties/i18n.json
@@ -0,0 +1,16 @@
+{
+ "en": {
+ "root": {
+ "additionalProperties": {
+ "title": "Additional Properties",
+ "newProperty": {
+ "placeholder": "New Property"
+ },
+ "btn": {
+ "add": "Add to ${additionalProperties.title}",
+ "delete": "Delete from ${additionalProperties.title}"
+ }
+ }
+ }
+ }
+}
diff --git a/packages/example/src/examples/additionalProperties/index.ts b/packages/example/src/examples/additionalProperties/index.ts
new file mode 100644
index 0000000000..b942ddffd8
--- /dev/null
+++ b/packages/example/src/examples/additionalProperties/index.ts
@@ -0,0 +1,12 @@
+import schema from './schema.json';
+import uischema from './uischema.json';
+import data from './data.json';
+import i18n from './i18n.json';
+import { UISchemaElement, JsonSchema } from '@jsonforms/core';
+
+export const input: {
+ schema: JsonSchema;
+ uischema: UISchemaElement;
+ data: any;
+ i18n: any;
+} = { schema, uischema, data, i18n };
diff --git a/packages/example/src/examples/additionalProperties/schema.json b/packages/example/src/examples/additionalProperties/schema.json
new file mode 100644
index 0000000000..65b4dcc299
--- /dev/null
+++ b/packages/example/src/examples/additionalProperties/schema.json
@@ -0,0 +1,74 @@
+{
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "type": "object",
+ "properties": {
+ "propertiesString": {
+ "type": "string"
+ }
+ },
+ "propertyNames": {
+ "minLength": 2
+ },
+ "patternProperties": {
+ "^string$": {
+ "type": "string"
+ },
+ "^number$": {
+ "type": "number"
+ },
+ "^integer$": {
+ "type": "integer"
+ },
+ "^object$": {
+ "type": "object",
+ "properties": {
+ "prop1": {
+ "type": "string"
+ }
+ }
+ },
+ "^boolean$": {
+ "type": "boolean"
+ },
+ "^stringArray$": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "^numberArray$": {
+ "type": "array",
+ "items": {
+ "type": "number"
+ }
+ },
+ "^integerArray$": {
+ "type": "array",
+ "items": {
+ "type": "integer"
+ }
+ },
+ "^objectArray$": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "prop1": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "^booleanArray$": {
+ "type": "array",
+ "items": {
+ "type": "boolean"
+ }
+ }
+ },
+ "additionalProperties": {
+ "type": "string",
+ "title": "Additional Properties"
+ },
+ "maxProperties": 15
+}
diff --git a/packages/example/src/examples/additionalProperties/uischema.json b/packages/example/src/examples/additionalProperties/uischema.json
new file mode 100644
index 0000000000..1ebfebb423
--- /dev/null
+++ b/packages/example/src/examples/additionalProperties/uischema.json
@@ -0,0 +1,4 @@
+{
+ "type": "Control",
+ "scope": "#/"
+}
diff --git a/packages/example/src/examples/allOf-with-props/data.json b/packages/example/src/examples/allOf-with-props/data.json
new file mode 100644
index 0000000000..5bd1d45b5b
--- /dev/null
+++ b/packages/example/src/examples/allOf-with-props/data.json
@@ -0,0 +1,7 @@
+{
+ "addressOrUser": {
+ "street_address": "1600 Pennsylvania Avenue NW",
+ "city": "Washington",
+ "state": "DC"
+ }
+}
\ No newline at end of file
diff --git a/packages/example/src/examples/allOf-with-props/index.ts b/packages/example/src/examples/allOf-with-props/index.ts
new file mode 100644
index 0000000000..fa4555232c
--- /dev/null
+++ b/packages/example/src/examples/allOf-with-props/index.ts
@@ -0,0 +1,9 @@
+import schema from './schema.json';
+import data from './data.json';
+import { UISchemaElement, JsonSchema } from '@jsonforms/core';
+
+export const input: {
+ schema: JsonSchema;
+ uischema?: UISchemaElement;
+ data: any;
+} = { schema, uischema: undefined, data };
diff --git a/packages/example/src/examples/allOf-with-props/schema.json b/packages/example/src/examples/allOf-with-props/schema.json
new file mode 100644
index 0000000000..6d41773bbb
--- /dev/null
+++ b/packages/example/src/examples/allOf-with-props/schema.json
@@ -0,0 +1,47 @@
+{
+ "definitions": {
+ "address": {
+ "type": "object",
+ "title": "Address",
+ "properties": {
+ "street_address": {
+ "type": "string"
+ },
+ "city": {
+ "type": "string"
+ },
+ "state": {
+ "type": "string"
+ }
+ },
+ "required": ["street_address", "city", "state"]
+ },
+ "user": {
+ "type": "object",
+ "title": "User",
+ "properties": {
+ "name": {
+ "type": "string"
+ },
+ "mail": {
+ "type": "string"
+ }
+ },
+ "required": ["name", "mail"]
+ }
+ },
+ "type": "object",
+ "properties": {
+ "label": {
+ "type": "string"
+ }
+ },
+ "allOf": [
+ {
+ "$ref": "#/definitions/address"
+ },
+ {
+ "$ref": "#/definitions/user"
+ }
+ ]
+}
diff --git a/packages/example/src/examples/anyOf-with-props/data.json b/packages/example/src/examples/anyOf-with-props/data.json
new file mode 100644
index 0000000000..5bd1d45b5b
--- /dev/null
+++ b/packages/example/src/examples/anyOf-with-props/data.json
@@ -0,0 +1,7 @@
+{
+ "addressOrUser": {
+ "street_address": "1600 Pennsylvania Avenue NW",
+ "city": "Washington",
+ "state": "DC"
+ }
+}
\ No newline at end of file
diff --git a/packages/example/src/examples/anyOf-with-props/index.ts b/packages/example/src/examples/anyOf-with-props/index.ts
new file mode 100644
index 0000000000..fa4555232c
--- /dev/null
+++ b/packages/example/src/examples/anyOf-with-props/index.ts
@@ -0,0 +1,9 @@
+import schema from './schema.json';
+import data from './data.json';
+import { UISchemaElement, JsonSchema } from '@jsonforms/core';
+
+export const input: {
+ schema: JsonSchema;
+ uischema?: UISchemaElement;
+ data: any;
+} = { schema, uischema: undefined, data };
diff --git a/packages/example/src/examples/anyOf-with-props/schema.json b/packages/example/src/examples/anyOf-with-props/schema.json
new file mode 100644
index 0000000000..02fe1d5c95
--- /dev/null
+++ b/packages/example/src/examples/anyOf-with-props/schema.json
@@ -0,0 +1,47 @@
+{
+ "definitions": {
+ "address": {
+ "type": "object",
+ "title": "Address",
+ "properties": {
+ "street_address": {
+ "type": "string"
+ },
+ "city": {
+ "type": "string"
+ },
+ "state": {
+ "type": "string"
+ }
+ },
+ "required": ["street_address", "city", "state"]
+ },
+ "user": {
+ "type": "object",
+ "title": "User",
+ "properties": {
+ "name": {
+ "type": "string"
+ },
+ "mail": {
+ "type": "string"
+ }
+ },
+ "required": ["name", "mail"]
+ }
+ },
+ "type": "object",
+ "properties": {
+ "label": {
+ "type": "string"
+ }
+ },
+ "anyOf": [
+ {
+ "$ref": "#/definitions/address"
+ },
+ {
+ "$ref": "#/definitions/user"
+ }
+ ]
+}
diff --git a/packages/example/src/examples/control-options/uischema.json b/packages/example/src/examples/control-options/uischema.json
index b2a82f2b75..e97b8d9a1a 100644
--- a/packages/example/src/examples/control-options/uischema.json
+++ b/packages/example/src/examples/control-options/uischema.json
@@ -52,8 +52,8 @@
}
},
{
- "type": "GroupLayout",
- "name": "Masked input",
+ "type": "Group",
+ "label": "Masked input",
"elements": [
{
"type": "Label",
@@ -88,7 +88,6 @@
"placeholder": "(###)-###-####",
"mask": "(###)-###-####",
"returnMaskedValue": true
-
}
}
]
diff --git a/packages/example/src/examples/index.ts b/packages/example/src/examples/index.ts
index 0a670d9f26..d887864dd7 100644
--- a/packages/example/src/examples/index.ts
+++ b/packages/example/src/examples/index.ts
@@ -1,5 +1,7 @@
import { input as allOf } from './allOf';
+import { input as allOfWithProps } from './allOf-with-props';
import { input as anyOf } from './anyOf';
+import { input as anyOfWithProps } from './anyOf-with-props';
import { input as anyOfSimple } from './anyOf-simple';
import { input as array } from './array';
import { input as arrayRestrict } from './array-restrict';
@@ -33,10 +35,13 @@ import { input as noUISchema } from './no-ui-schema';
import { input as object } from './object';
import { input as objectNested } from './object-nested';
import { input as oneOf } from './oneOf';
+import { input as oneOfWithProps } from './oneOf-with-props';
+import { input as oneOfTab } from './oneOf-tab';
import { input as oneOfRecursive } from './oneOf-recursive';
import { input as radio } from './radio';
import { input as radioGroup } from './radio-group';
import { input as rootObject } from './root-object';
+import { input as additionalProperties } from './additionalProperties';
import { input as rule } from './rule';
import { input as verticalLayout } from './vertical-layout';
import { input as huge } from './huge';
@@ -198,6 +203,11 @@ export const examples = [
title: 'Root Object',
input: rootObject,
},
+ {
+ id: 'additional-properties',
+ title: 'Additional Properties',
+ input: additionalProperties,
+ },
{
id: 'no-ui-schema',
title: 'Generate UI Schema',
@@ -213,6 +223,16 @@ export const examples = [
title: 'Combinators oneOf',
input: oneOf,
},
+ {
+ id: 'one-of-with-props',
+ title: 'Combinators oneOf with props',
+ input: oneOfWithProps,
+ },
+ {
+ id: 'one-of-tab',
+ title: 'Combinators oneOf tab',
+ input: oneOfTab,
+ },
{
id: 'one-of-recursive',
title: 'Combinators oneOf recursive',
@@ -223,6 +243,11 @@ export const examples = [
title: 'Combinators anyOf',
input: anyOf,
},
+ {
+ id: 'any-of-with-props',
+ title: 'Combinators anyOf with props',
+ input: anyOfWithProps,
+ },
{
id: 'any-of-simple',
title: 'Combinators anyOf simple',
@@ -233,6 +258,11 @@ export const examples = [
title: 'Combinators allOf',
input: allOf,
},
+ {
+ id: 'all-of-with-props',
+ title: 'Combinators allOf with props',
+ input: allOfWithProps,
+ },
{
id: 'list-with-details',
title: 'List With Details',
diff --git a/packages/example/src/examples/oneOf-tab/data.json b/packages/example/src/examples/oneOf-tab/data.json
new file mode 100644
index 0000000000..0967ef424b
--- /dev/null
+++ b/packages/example/src/examples/oneOf-tab/data.json
@@ -0,0 +1 @@
+{}
diff --git a/packages/example/src/examples/oneOf-tab/index.ts b/packages/example/src/examples/oneOf-tab/index.ts
new file mode 100644
index 0000000000..8f5e656657
--- /dev/null
+++ b/packages/example/src/examples/oneOf-tab/index.ts
@@ -0,0 +1,10 @@
+import schema from './schema.json';
+import uischema from './uischema.json';
+import data from './data.json';
+import { UISchemaElement, JsonSchema } from '@jsonforms/core';
+
+export const input: {
+ schema: JsonSchema;
+ uischema: UISchemaElement;
+ data: any;
+} = { schema, uischema, data };
diff --git a/packages/example/src/examples/oneOf-tab/schema.json b/packages/example/src/examples/oneOf-tab/schema.json
new file mode 100644
index 0000000000..95564846cd
--- /dev/null
+++ b/packages/example/src/examples/oneOf-tab/schema.json
@@ -0,0 +1,46 @@
+{
+ "definitions": {
+ "address": {
+ "type": "object",
+ "title": "Address",
+ "properties": {
+ "street_address": {
+ "type": "string"
+ },
+ "city": {
+ "type": "string"
+ },
+ "state": {
+ "type": "string"
+ }
+ },
+ "required": ["street_address", "city", "state"]
+ },
+ "user": {
+ "type": "object",
+ "title": "User",
+ "properties": {
+ "name": {
+ "type": "string"
+ },
+ "mail": {
+ "type": "string"
+ }
+ },
+ "required": ["name", "mail"]
+ }
+ },
+ "type": "object",
+ "properties": {
+ "addressOrUser": {
+ "oneOf": [
+ {
+ "$ref": "#/definitions/address"
+ },
+ {
+ "$ref": "#/definitions/user"
+ }
+ ]
+ }
+ }
+}
diff --git a/packages/example/src/examples/oneOf-tab/uischema.json b/packages/example/src/examples/oneOf-tab/uischema.json
new file mode 100644
index 0000000000..6518f454e2
--- /dev/null
+++ b/packages/example/src/examples/oneOf-tab/uischema.json
@@ -0,0 +1,13 @@
+{
+ "type": "VerticalLayout",
+ "elements": [
+ {
+ "type": "Control",
+ "label": "Basic Information",
+ "scope": "#/properties/addressOrUser",
+ "options": {
+ "variant": "tab"
+ }
+ }
+ ]
+}
diff --git a/packages/example/src/examples/oneOf-with-props/data.json b/packages/example/src/examples/oneOf-with-props/data.json
new file mode 100644
index 0000000000..0967ef424b
--- /dev/null
+++ b/packages/example/src/examples/oneOf-with-props/data.json
@@ -0,0 +1 @@
+{}
diff --git a/packages/example/src/examples/oneOf-with-props/index.ts b/packages/example/src/examples/oneOf-with-props/index.ts
new file mode 100644
index 0000000000..bfb0d8cc49
--- /dev/null
+++ b/packages/example/src/examples/oneOf-with-props/index.ts
@@ -0,0 +1,11 @@
+import schema from './schema.json';
+import data from './data.json';
+import { UISchemaElement, JsonSchema } from '@jsonforms/core';
+
+const uischema = undefined;
+
+export const input: {
+ schema: JsonSchema;
+ uischema?: UISchemaElement;
+ data: any;
+} = { schema, uischema, data };
diff --git a/packages/example/src/examples/oneOf-with-props/schema.json b/packages/example/src/examples/oneOf-with-props/schema.json
new file mode 100644
index 0000000000..b6fb694354
--- /dev/null
+++ b/packages/example/src/examples/oneOf-with-props/schema.json
@@ -0,0 +1,47 @@
+{
+ "definitions": {
+ "address": {
+ "type": "object",
+ "title": "Address",
+ "properties": {
+ "street_address": {
+ "type": "string"
+ },
+ "city": {
+ "type": "string"
+ },
+ "state": {
+ "type": "string"
+ }
+ },
+ "required": ["street_address", "city", "state"]
+ },
+ "user": {
+ "type": "object",
+ "title": "User",
+ "properties": {
+ "name": {
+ "type": "string"
+ },
+ "mail": {
+ "type": "string"
+ }
+ },
+ "required": ["name", "mail"]
+ }
+ },
+ "type": "object",
+ "properties": {
+ "label": {
+ "type": "string"
+ }
+ },
+ "oneOf": [
+ {
+ "$ref": "#/definitions/address"
+ },
+ {
+ "$ref": "#/definitions/user"
+ }
+ ]
+}
diff --git a/packages/example/src/examples/oneOf/data.json b/packages/example/src/examples/oneOf/data.json
index 200e28ad03..0967ef424b 100644
--- a/packages/example/src/examples/oneOf/data.json
+++ b/packages/example/src/examples/oneOf/data.json
@@ -1,3 +1 @@
-{
- "addressOrUser": {}
-}
\ No newline at end of file
+{}
diff --git a/packages/example/src/i18n/i18n.ts b/packages/example/src/i18n/i18n.ts
index 74bc46e0f3..f7af747e09 100644
--- a/packages/example/src/i18n/i18n.ts
+++ b/packages/example/src/i18n/i18n.ts
@@ -1,20 +1,51 @@
+import { Translator } from '@jsonforms/core';
import get from 'lodash/get';
+import template from 'lodash/template';
+import memoize from 'lodash/memoize';
-export const createTranslator =
- (locale: string, translations?: Record) =>
- (key: string, defaultMessage: string | undefined): string | undefined => {
- if (!translations) {
- return defaultMessage;
- }
+export const createTranslator = (
+ locale: string,
+ translations?: Record
+): Translator => {
+ let localeTranslations = translations ? translations[locale] : undefined;
+
+ if (!localeTranslations && translations) {
+ const dashIndex = locale.indexOf('-');
+ localeTranslations =
+ dashIndex > 0 ? translations[locale.substring(0, dashIndex)] : undefined;
+ }
- let localeTranslations = translations[locale];
- if (!localeTranslations) {
- // if specific locale like en-US is not available then use more generic like us
- const dashIndex = locale.indexOf('-');
- localeTranslations =
- dashIndex > 0
- ? translations[locale.substring(0, dashIndex)]
- : translations['en'];
+ const translate = (
+ id: string,
+ defaultMessage: string | undefined,
+ values?: any
+ ): string | undefined => {
+ if (!localeTranslations) return defaultMessage;
+
+ const message = get(localeTranslations, id);
+ if (message && values) {
+ return translateWithParams(message, values) ?? defaultMessage;
}
- return get(localeTranslations, key) ?? defaultMessage;
+ return message ?? defaultMessage;
};
+
+ return translate as Translator;
+};
+
+const translateWithParams = memoize(templateToMessage);
+
+function templateToMessage(
+ templateMessage: string,
+ params: Record = {}
+): string {
+ const compiled = template(templateMessage, {
+ interpolate: /\${([\s\S]+?)}/g, // ${myVar}
+ });
+
+ try {
+ return compiled(params);
+ } catch (e) {
+ console.log(`Unable to generate message from template: ${templateMessage}`);
+ return templateMessage;
+ }
+}
diff --git a/packages/example/src/store/modules/app.ts b/packages/example/src/store/modules/app.ts
index d59d333fed..2f27877649 100644
--- a/packages/example/src/store/modules/app.ts
+++ b/packages/example/src/store/modules/app.ts
@@ -3,9 +3,10 @@ import { make } from 'vuex-pathify';
import { AppState } from './types';
import { RootState } from '../types';
import { Module } from 'vuex';
-import { createAjv, extendedVuetifyRenderers } from '@jsonforms/vue2-vuetify';
+import { extendedVuetifyRenderers } from '@jsonforms/vue2-vuetify';
+import { createAjv } from '../validate/validate';
-const ajv = createAjv({ useDefaults: true });
+const ajv = createAjv();
// Data
const state: AppState = {
diff --git a/packages/example/src/store/modules/types.ts b/packages/example/src/store/modules/types.ts
index 1df35b031c..b6408bb31c 100644
--- a/packages/example/src/store/modules/types.ts
+++ b/packages/example/src/store/modules/types.ts
@@ -21,6 +21,7 @@ export interface AppState {
breakHorizontal: false | string;
hideAvatar: boolean;
hideArraySummaryValidation: boolean;
+ vuetify?: Record;
};
renderers: JsonFormsRendererRegistryEntry[];
cells: JsonFormsCellRendererRegistryEntry[];
diff --git a/packages/example/src/store/validate/dynamicDefaults.ts b/packages/example/src/store/validate/dynamicDefaults.ts
new file mode 100644
index 0000000000..5ab7b34305
--- /dev/null
+++ b/packages/example/src/store/validate/dynamicDefaults.ts
@@ -0,0 +1,149 @@
+import dayjs, { UnitType } from 'dayjs';
+import customParsingPlugin from 'dayjs/plugin/customParseFormat';
+import durationPlugin from 'dayjs/plugin/duration';
+import timezonePlugin from 'dayjs/plugin/timezone'; // dependent on utc plugin
+import utcPlugin from 'dayjs/plugin/utc';
+
+// required for the custom save formats in the date, time and date-time pickers
+dayjs.extend(customParsingPlugin);
+dayjs.extend(utcPlugin);
+dayjs.extend(timezonePlugin);
+dayjs.extend(durationPlugin);
+
+export const dynamic = (args: any) => {
+ let func: string | undefined = undefined;
+ if (args?.func && typeof args.func === 'string') {
+ func = args?.func;
+ }
+
+ if (func) {
+ try {
+ const fn = new Function(
+ 'args',
+ `const func = ${func}; return func(args);`
+ );
+ return () => {
+ try {
+ return fn(args);
+ } catch (e) {
+ console.error(`Error at dynamicDefaults 'dynamic': ${e}`);
+ }
+ };
+ } catch (e) {
+ console.error(`Error at dynamicDefaults 'dynamic': ${e}`);
+ }
+ }
+
+ throw new Error(`missing argument 'func' for dynamicDefaults func 'dynamic'`);
+};
+
+export const searchParams = (args: any) => {
+ let paramName: string | undefined = undefined;
+ if (args?.param && typeof args.param === 'string') {
+ paramName = args?.param;
+ }
+
+ const url: URL = new URL(window.location.href);
+ const params: URLSearchParams = url.searchParams;
+
+ let result: string | undefined = undefined;
+ if (paramName) {
+ if (params.has(paramName)) {
+ result = params.get(paramName)!;
+ } else {
+ // try from the hash #
+ const hash = url.hash;
+ const index = hash.indexOf('?');
+ if (index > 0 && index < hash.length - 1) {
+ const hashSearchParams = new URLSearchParams(hash.substring(index + 1));
+ if (hashSearchParams.has(paramName)) {
+ result = hashSearchParams.get(paramName)!;
+ }
+ }
+ }
+ }
+
+ return () => result;
+};
+
+export const datetimeOffset = (args: any) => {
+ const dateTime = nowOffset(args);
+ let result: string | undefined = undefined;
+
+ if (dateTime.isValid()) {
+ const datetimeLocalFormat = 'YYYY-MM-DDTHH:mm:ss.SSS';
+
+ result = dateTime.local().format(datetimeLocalFormat);
+ }
+
+ return () => result;
+};
+
+export const timeOffset = (args: any) => {
+ const dateTime = nowOffset(args);
+ let result: string | undefined = undefined;
+
+ if (dateTime.isValid()) {
+ const datetimeLocalFormat = 'HH:mm:ss.SSS';
+
+ result = dateTime.local().format(datetimeLocalFormat);
+ }
+
+ return () => result;
+};
+
+export const dateOffset = (args: any) => {
+ const date = nowOffset(args);
+ let result: string | undefined = undefined;
+
+ if (date.isValid()) {
+ result = date.local().format('YYYY-MM-DD');
+ }
+
+ return () => result;
+};
+
+export const dateUnit = (args: any) => {
+ const date = nowOffset(args);
+ let result: number | undefined = undefined;
+
+ if (date.isValid()) {
+ let unit: UnitType = 'millisecond';
+ if (args?.unit && typeof args.unit === 'string') {
+ unit = args?.unit;
+ }
+
+ result = date.local().get(unit);
+ }
+
+ return () => result;
+};
+
+const nowOffset = (args: any) => {
+ let duration: string | undefined = undefined;
+ if (args?.duration && typeof args.duration === 'string') {
+ duration = args?.duration;
+ }
+ let date: string | Date | undefined = new Date();
+ if (args?.date && typeof args.date === 'string') {
+ if (args.date !== 'now') {
+ // only assign if not the string now
+ date = args?.date;
+ }
+ }
+ let operation: 'add' | 'substract' = 'add';
+ if (args?.op && args.op === 'substract') {
+ operation = 'substract';
+ }
+
+ let dateObj = dayjs(date);
+
+ if (dateObj.isValid() && duration) {
+ const offset = dayjs.duration(duration);
+
+ dateObj =
+ operation == 'add' ? dateObj.add(offset) : dateObj.subtract(offset);
+ }
+
+ return dateObj;
+};
diff --git a/packages/example/src/store/validate/keywords.ts b/packages/example/src/store/validate/keywords.ts
new file mode 100644
index 0000000000..bc4701fe6a
--- /dev/null
+++ b/packages/example/src/store/validate/keywords.ts
@@ -0,0 +1,30 @@
+import Ajv from 'ajv';
+import keywords from 'ajv-keywords';
+import dynamicDefaults from 'ajv-keywords/dist/definitions/dynamicDefaults';
+import tranform from './transform';
+
+import {
+ dateOffset,
+ datetimeOffset,
+ dateUnit,
+ dynamic,
+ searchParams,
+ timeOffset,
+} from './dynamicDefaults';
+
+export const ajvKeywords = (ajv: Ajv) => {
+ keywords(ajv);
+
+ // add custom transform to be able to use more transformation functions since the transform keyword is not extensible as the dynamicDefaults
+ ajv.removeKeyword('transform');
+ ajv.addKeyword(tranform());
+
+ // register new dynamic defaults
+ (dynamicDefaults.DEFAULTS as any).dynamic = dynamic;
+ (dynamicDefaults.DEFAULTS as any).searchParams = searchParams;
+ (dynamicDefaults.DEFAULTS as any).datetime = datetimeOffset;
+ (dynamicDefaults.DEFAULTS as any).date = dateOffset;
+ (dynamicDefaults.DEFAULTS as any).time = timeOffset;
+
+ (dynamicDefaults.DEFAULTS as any).dateUnit = dateUnit;
+};
diff --git a/packages/example/src/store/validate/transform.ts b/packages/example/src/store/validate/transform.ts
new file mode 100644
index 0000000000..c5e713f6f1
--- /dev/null
+++ b/packages/example/src/store/validate/transform.ts
@@ -0,0 +1,120 @@
+import type {
+ CodeKeywordDefinition,
+ AnySchemaObject,
+ KeywordCxt,
+ Code,
+ Name,
+} from 'ajv';
+import { _, stringify, getProperty } from 'ajv/dist/compile/codegen';
+import capitalizeFn from 'lodash/capitalize';
+import startCaseFn from 'lodash/startCase';
+
+type TransformName =
+ | 'trimStart'
+ | 'trimEnd'
+ | 'trimLeft'
+ | 'trimRight'
+ | 'trim'
+ | 'toLowerCase'
+ | 'toUpperCase'
+ | 'toEnumCase'
+ | 'capitalize'
+ | 'startCase';
+
+interface TransformConfig {
+ hash: Record;
+}
+
+type Transform = (s: string, cfg?: TransformConfig) => string;
+
+const transform: { [key in TransformName]: Transform } = {
+ trimStart: (s) => s.trimStart(),
+ trimEnd: (s) => s.trimEnd(),
+ trimLeft: (s) => s.trimStart(),
+ trimRight: (s) => s.trimEnd(),
+ trim: (s) => s.trim(),
+ toLowerCase: (s) => s.toLowerCase(),
+ toUpperCase: (s) => s.toUpperCase(),
+ toEnumCase: (s, cfg) => cfg?.hash[configKey(s)] || s,
+ capitalize: (s) => capitalizeFn(s),
+ startCase: (s) => startCaseFn(s),
+};
+
+const getDef: (() => CodeKeywordDefinition) & {
+ transform: typeof transform;
+} = Object.assign(_getDef, { transform });
+
+function _getDef(): CodeKeywordDefinition {
+ return {
+ keyword: 'transform',
+ schemaType: 'array',
+ before: 'enum',
+ code(cxt: KeywordCxt) {
+ const { gen, data, schema, parentSchema, it } = cxt;
+ const { parentData, parentDataProperty } = it;
+ const tNames: string[] = schema;
+ if (!tNames.length) return;
+ let cfg: Name | undefined;
+ if (tNames.includes('toEnumCase')) {
+ const config = getEnumCaseCfg(parentSchema);
+ cfg = gen.scopeValue('obj', { ref: config, code: stringify(config) });
+ }
+ gen.if(
+ _`typeof ${data} == "string" && ${parentData} !== undefined`,
+ () => {
+ gen.assign(data, transformExpr(tNames.slice()));
+ gen.assign(_`${parentData}[${parentDataProperty}]`, data);
+ }
+ );
+
+ function transformExpr(ts: string[]): Code {
+ if (!ts.length) return data;
+ const t = ts.pop() as string;
+ if (!(t in transform))
+ throw new Error(`transform: unknown transformation ${t}`);
+ const func = gen.scopeValue('func', {
+ ref: transform[t as TransformName],
+ code: _`require("ajv-keywords/dist/definitions/transform").transform${getProperty(
+ t
+ )}`,
+ });
+ const arg = transformExpr(ts);
+ return cfg && t === 'toEnumCase'
+ ? _`${func}(${arg}, ${cfg})`
+ : _`${func}(${arg})`;
+ }
+ },
+ metaSchema: {
+ type: 'array',
+ items: { type: 'string', enum: Object.keys(transform) },
+ },
+ };
+}
+
+function getEnumCaseCfg(parentSchema: AnySchemaObject): TransformConfig {
+ // build hash table to enum values
+ const cfg: TransformConfig = { hash: {} };
+
+ // requires `enum` in the same schema as transform
+ if (!parentSchema.enum)
+ throw new Error('transform: "toEnumCase" requires "enum"');
+ for (const v of parentSchema.enum) {
+ if (typeof v !== 'string') continue;
+ const k = configKey(v);
+ // requires all `enum` values have unique keys
+ if (cfg.hash[k]) {
+ throw new Error(
+ 'transform: "toEnumCase" requires all lowercased "enum" values to be unique'
+ );
+ }
+ cfg.hash[k] = v;
+ }
+
+ return cfg;
+}
+
+function configKey(s: string): string {
+ return s.toLowerCase();
+}
+
+export default getDef;
diff --git a/packages/example/src/store/validate/validate.ts b/packages/example/src/store/validate/validate.ts
new file mode 100644
index 0000000000..6674357a60
--- /dev/null
+++ b/packages/example/src/store/validate/validate.ts
@@ -0,0 +1,16 @@
+import { Options } from 'ajv';
+import { createAjv as createDefaultAjv } from '@jsonforms/vue2-vuetify';
+import { ajvKeywords } from './keywords';
+
+export const createAjv = () => {
+ const options: Options = {
+ useDefaults: true,
+ $data: true,
+ discriminator: true,
+ };
+
+ const ajv = createDefaultAjv(options);
+ ajvKeywords(ajv);
+
+ return ajv;
+};
diff --git a/packages/example/src/views/example/Example.vue b/packages/example/src/views/example/Example.vue
index 3a51fd703b..00e0f60253 100644
--- a/packages/example/src/views/example/Example.vue
+++ b/packages/example/src/views/example/Example.vue
@@ -6,7 +6,12 @@
{{ example.title }}
- Demo
+ Demo
Schema
UI Schema
@@ -245,20 +250,26 @@ import { examples } from '@/examples';
import { find } from 'lodash';
import { sync } from 'vuex-pathify';
-import { mergeStyles, defaultStyles } from '@jsonforms/vue2-vuetify';
-import { JsonFormsChangeEvent } from '@jsonforms/vue2';
-import MonacoEditor from '@/components/MonacoEditor.vue';
import DemoForm from '@/components/DemoForm.vue';
-import * as monaco from 'monaco-editor/esm/vs/editor/editor.api';
+import MonacoEditor from '@/components/MonacoEditor.vue';
import {
+ configureDataValidation,
configureJsonSchemaValidation,
configureUISchemaValidation,
- configureDataValidation,
EditorApi,
getMonacoModelForUri,
} from '@/core/jsonSchemaValidation';
import { Example } from '@/core/types';
import type { JsonFormsRendererRegistryEntry } from '@jsonforms/core';
+import { JsonFormsChangeEvent } from '@jsonforms/vue2';
+import {
+ defaultStyles,
+ mergeStyles,
+ ValidationIcon,
+} from '@jsonforms/vue2-vuetify';
+import { ErrorObject } from 'ajv';
+import cloneDeep from 'lodash/cloneDeep';
+import * as monaco from 'monaco-editor/esm/vs/editor/editor.api';
const myStyles = mergeStyles(defaultStyles, {
control: { root: 'my-control' },
@@ -269,12 +280,16 @@ export default {
components: {
MonacoEditor,
DemoForm,
+ ValidationIcon,
},
data() {
return {
activeTab: 0,
examples,
example: undefined,
+ errors: undefined as
+ | ErrorObject, unknown>[]
+ | undefined,
snackbar: false,
snackbarText: '',
snackbarTimeout: 3000,
@@ -318,20 +333,11 @@ export default {
event.data ? JSON.stringify(event.data, null, 2) : ''
)
);
+ this.errors = event.errors;
},
setExample(example: Example): void {
if (example) {
- this.example = {
- id: example.id,
- title: example.title,
- input: {
- schema: example.input.schema,
- uischema: example.input.uischema,
- data: example.input.data,
- i18n: example.input.i18n,
- renderers: example.input.renderers,
- },
- };
+ this.example = cloneDeep(example);
this.updateMonacoModels(this.example);
}
},
@@ -366,11 +372,12 @@ export default {
.filter((d) => d.options.className === 'squiggly-error')
.map((e) => e).length > 0;
- const modelValue = model.getValue();
- if (modelValue && !hasError) {
- const newJson: Record = JSON.parse(modelValue);
- example.input.schema = newJson;
-
+ const modelValue = model.getValue().trim();
+ if (!hasError) {
+ const newJson: Record = modelValue
+ ? JSON.parse(modelValue)
+ : undefined;
+ this.$set(example.input, 'schema', newJson);
this.toast('New schema applied');
} else if (hasError) {
this.toast('Error: schema is invalid');
@@ -410,10 +417,13 @@ export default {
.filter((d) => d.options.className === 'squiggly-error')
.map((e) => e).length > 0;
- const modelValue = model.getValue();
- if (modelValue && !hasError) {
- const newJson: Record = JSON.parse(modelValue);
- example.input.uischema = newJson;
+ const modelValue = model.getValue().trim();
+ if (!hasError) {
+ const newJson: Record = modelValue
+ ? JSON.parse(modelValue)
+ : undefined;
+
+ this.$set(example.input, 'uischema', newJson);
this.toast('New UI schema applied');
} else if (hasError) {
this.toast('Error: UI schema is invalid');
@@ -446,7 +456,7 @@ export default {
if (model && example) {
// do not check for monaco errors just if this is valid JSON becase we want to see when we have validation errors
- const modelValue = model.getValue();
+ const modelValue = model.getValue().trim();
if (modelValue) {
let newJson: Record | undefined = undefined;
@@ -457,7 +467,7 @@ export default {
}
if (newJson) {
- example.input.data = newJson;
+ this.$set(example.input, 'data', newJson);
this.toast('New data applied');
}
}
@@ -487,22 +497,23 @@ export default {
const example = this.example;
if (model && example) {
- // do not check for monaco errors just if this is valid JSON becase we want to see when we have validation errors
-
- const modelValue = model.getValue();
- if (modelValue) {
- let newJson: Record | undefined = undefined;
+ // TODO: is there a better way how to get errors including the error message from monaco editor ?
+ const hasError =
+ model
+ .getAllDecorations()
+ .filter((d) => d.options.className === 'squiggly-error')
+ .map((e) => e).length > 0;
- try {
- newJson = JSON.parse(modelValue);
- } catch (error) {
- this.toast(`Error: ${error}`);
- }
+ const modelValue = model.getValue().trim();
+ if (!hasError) {
+ const newJson: Record[] = modelValue
+ ? JSON.parse(modelValue)
+ : undefined;
- if (newJson) {
- example.input.i18n = newJson;
- this.toast('New i18n applied');
- }
+ this.$set(example.input, 'i18n', newJson);
+ this.toast('New i18n applied');
+ } else if (hasError) {
+ this.toast('Error: i18n is invalid');
}
}
},
diff --git a/packages/vue2-vuetify/README.md b/packages/vue2-vuetify/README.md
index 2cb5688854..a7d934d2ad 100644
--- a/packages/vue2-vuetify/README.md
+++ b/packages/vue2-vuetify/README.md
@@ -56,6 +56,7 @@ export default defineComponent({
},
});
+
+
+
```
As JSON Forms uses the Composition API you need to use at least Vue 2.7.
diff --git a/packages/vue2-vuetify/package.json b/packages/vue2-vuetify/package.json
index 834410c39c..d0decfc636 100644
--- a/packages/vue2-vuetify/package.json
+++ b/packages/vue2-vuetify/package.json
@@ -84,6 +84,7 @@
"rimraf": "^3.0.2",
"rollup": "^2.52.8",
"rollup-plugin-cleanup": "^3.2.1",
+ "rollup-plugin-styles": "^4.0.0",
"rollup-plugin-typescript2": "^0.30.0",
"rollup-plugin-visualizer": "^5.5.2",
"rollup-plugin-vue": "^5.1.9",
diff --git a/packages/vue2-vuetify/rollup.config.js b/packages/vue2-vuetify/rollup.config.js
index cf45856481..fe33208dbd 100644
--- a/packages/vue2-vuetify/rollup.config.js
+++ b/packages/vue2-vuetify/rollup.config.js
@@ -4,6 +4,7 @@ import typescript from 'rollup-plugin-typescript2';
import resolve from '@rollup/plugin-node-resolve';
import cleanup from 'rollup-plugin-cleanup';
import visualizer from 'rollup-plugin-visualizer';
+import styles from 'rollup-plugin-styles';
import packageJson from './package.json';
@@ -26,13 +27,17 @@ const buildFormats = [
file: packageJson.module,
format: 'esm',
sourcemap: true,
+ assetFileNames: '[name][extname]',
},
plugins: [
resolve({
extensions: ['.js', '.jsx', '.ts', '.tsx', '.vue'],
}),
+ styles({
+ mode: ['extract'],
+ }),
vue({
- css: true,
+ css: false,
template: {
isProduction: true,
},
@@ -59,13 +64,17 @@ const buildFormats = [
file: packageJson.main,
format: 'cjs',
sourcemap: true,
+ assetFileNames: '[name][extname]',
},
plugins: [
resolve({
extensions: ['.js', '.jsx', '.ts', '.tsx', '.vue'],
}),
+ styles({
+ mode: ['extract'],
+ }),
vue({
- css: true,
+ css: false,
template: {
isProduction: true,
},
diff --git a/packages/vue2-vuetify/src/complex/AllOfRenderer.vue b/packages/vue2-vuetify/src/complex/AllOfRenderer.vue
index 74de4f5736..8bebb12914 100644
--- a/packages/vue2-vuetify/src/complex/AllOfRenderer.vue
+++ b/packages/vue2-vuetify/src/complex/AllOfRenderer.vue
@@ -11,16 +11,23 @@
/>
-
+
+
+
+
@@ -44,11 +51,13 @@ import {
} from '@jsonforms/vue2';
import { defineComponent } from 'vue';
import { useVuetifyControl } from '../util';
+import { CombinatorProperties } from './components';
const controlRenderer = defineComponent({
name: 'all-of-renderer',
components: {
DispatchRenderer,
+ CombinatorProperties,
},
props: {
...rendererProps(),
@@ -65,7 +74,7 @@ const controlRenderer = defineComponent({
);
},
allOfRenderInfos(): CombinatorSubSchemaRenderInfo[] {
- return createCombinatorRenderInfos(
+ const result = createCombinatorRenderInfos(
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
this.control.schema.allOf!,
this.control.rootSchema,
@@ -74,6 +83,8 @@ const controlRenderer = defineComponent({
this.control.path,
this.control.uischemas
);
+
+ return result.filter((info) => info.uischema);
},
},
});
diff --git a/packages/vue2-vuetify/src/complex/AnyOfRenderer.vue b/packages/vue2-vuetify/src/complex/AnyOfRenderer.vue
index e993753d15..2302e45c76 100644
--- a/packages/vue2-vuetify/src/complex/AnyOfRenderer.vue
+++ b/packages/vue2-vuetify/src/complex/AnyOfRenderer.vue
@@ -79,7 +79,7 @@ const controlRenderer = defineComponent({
},
computed: {
anyOfRenderInfos(): CombinatorSubSchemaRenderInfo[] {
- return createCombinatorRenderInfos(
+ const result = createCombinatorRenderInfos(
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
this.control.schema.anyOf!,
this.control.rootSchema,
@@ -88,6 +88,7 @@ const controlRenderer = defineComponent({
this.control.path,
this.control.uischemas
);
+ return result.filter((info) => info.uischema);
},
},
});
diff --git a/packages/vue2-vuetify/src/complex/ObjectRenderer.vue b/packages/vue2-vuetify/src/complex/ObjectRenderer.vue
index 16ee82f7f3..9ecad0c8ca 100644
--- a/packages/vue2-vuetify/src/complex/ObjectRenderer.vue
+++ b/packages/vue2-vuetify/src/complex/ObjectRenderer.vue
@@ -9,6 +9,10 @@
:renderers="control.renderers"
:cells="control.cells"
/>
+
@@ -23,21 +27,24 @@ import {
rankWith,
UISchemaElement,
} from '@jsonforms/core';
-import isEmpty from 'lodash/isEmpty';
-import cloneDeep from 'lodash/cloneDeep';
import {
DispatchRenderer,
rendererProps,
RendererProps,
useJsonFormsControlWithDetail,
} from '@jsonforms/vue2';
+import cloneDeep from 'lodash/cloneDeep';
+import isEmpty from 'lodash/isEmpty';
+import isObject from 'lodash/isObject';
import { defineComponent } from 'vue';
import { useNested, useVuetifyControl } from '../util';
+import { AdditionalProperties } from './components';
const controlRenderer = defineComponent({
name: 'object-renderer',
components: {
DispatchRenderer,
+ AdditionalProperties,
},
props: {
...rendererProps(),
@@ -47,10 +54,26 @@ const controlRenderer = defineComponent({
const nested = useNested('object');
return {
...control,
+ input: control,
nested,
};
},
computed: {
+ hasAdditionalProperties(): boolean {
+ return (
+ !isEmpty(this.control.schema.patternProperties) ||
+ isObject(this.control.schema.additionalProperties)
+ // do not support - additionalProperties === true - since then the type should be any and we won't know what kind of renderer we should use for new properties
+ );
+ },
+ showAdditionalProperties(): boolean {
+ const showAdditionalProperties =
+ this.control.uischema.options?.showAdditionalProperties;
+ return (
+ showAdditionalProperties === undefined ||
+ showAdditionalProperties === true
+ );
+ },
detailUiSchema(): UISchemaElement {
const uiSchemaGenerator = () => {
const uiSchema = Generate.uiSchema(this.control.schema, 'Group');
diff --git a/packages/vue2-vuetify/src/complex/OneOfRenderer.vue b/packages/vue2-vuetify/src/complex/OneOfRenderer.vue
index bbcdfdbcf8..01270ce0c6 100644
--- a/packages/vue2-vuetify/src/complex/OneOfRenderer.vue
+++ b/packages/vue2-vuetify/src/complex/OneOfRenderer.vue
@@ -6,40 +6,47 @@
:path="path"
/>
-
-
- {{ oneOfRenderInfo.label }}
-
-
-
-
-
-
-
-
+
+
+
+
Clear form?
- Your data will be cleared if you navigate away from this tab. Do you
- want to proceed?
+ Your data will be cleared if you select this new option. Do you want
+ to proceed?
@@ -55,13 +62,13 @@
diff --git a/packages/vue2-vuetify/src/complex/components/AdditionalProperties.vue b/packages/vue2-vuetify/src/complex/components/AdditionalProperties.vue
new file mode 100644
index 0000000000..ab87a3d9f4
--- /dev/null
+++ b/packages/vue2-vuetify/src/complex/components/AdditionalProperties.vue
@@ -0,0 +1,489 @@
+
+
+
+
+ {{ additionalPropertiesTitle }}
+
+
+
+
+
+
+
+
+
+ mdi-plus
+
+
+ {{ addToLabel }}
+
+
+
+
+
+
+
+
+
+
+
+ mdi-delete
+
+
+ {{ deleteLabel }}
+
+
+
+
+
+
+
diff --git a/packages/vue2-vuetify/src/complex/components/CombinatorProperties.vue b/packages/vue2-vuetify/src/complex/components/CombinatorProperties.vue
index 625771a79c..423189a6f7 100644
--- a/packages/vue2-vuetify/src/complex/components/CombinatorProperties.vue
+++ b/packages/vue2-vuetify/src/complex/components/CombinatorProperties.vue
@@ -16,7 +16,7 @@ import { DispatchRenderer } from '@jsonforms/vue2';
interface CombinatorProps {
schema: JsonSchema;
- combinatorKeyword: 'oneOf' | 'anyOf';
+ combinatorKeyword: 'oneOf' | 'anyOf' | 'allOf';
path: string;
}
@@ -31,7 +31,7 @@ export default defineComponent({
required: true,
},
combinatorKeyword: {
- type: String as PropType<'oneOf' | 'anyOf'>,
+ type: String as PropType<'oneOf' | 'anyOf' | 'allOf'>,
required: true,
},
path: {
diff --git a/packages/vue2-vuetify/src/complex/components/index.ts b/packages/vue2-vuetify/src/complex/components/index.ts
index 31f2572e93..ec1377281d 100644
--- a/packages/vue2-vuetify/src/complex/components/index.ts
+++ b/packages/vue2-vuetify/src/complex/components/index.ts
@@ -1 +1,2 @@
export { default as CombinatorProperties } from './CombinatorProperties.vue';
+export { default as AdditionalProperties } from './AdditionalProperties.vue';
diff --git a/packages/vue2-vuetify/src/complex/index.ts b/packages/vue2-vuetify/src/complex/index.ts
index 4fc25c031c..8fd4788f8f 100644
--- a/packages/vue2-vuetify/src/complex/index.ts
+++ b/packages/vue2-vuetify/src/complex/index.ts
@@ -4,6 +4,7 @@ export { default as ArrayControlRenderer } from './ArrayControlRenderer.vue';
export { default as EnumArrayRenderer } from './EnumArrayRenderer.vue';
export { default as ObjectRenderer } from './ObjectRenderer.vue';
export { default as OneOfRenderer } from './OneOfRenderer.vue';
+export { default as OneOfTabRenderer } from './OneOfTabRenderer.vue';
import { entry as allOfRendererEntry } from './AllOfRenderer.vue';
import { entry as anyOfRendererEntry } from './AnyOfRenderer.vue';
@@ -11,6 +12,7 @@ import { entry as arrayControlRendererEntry } from './ArrayControlRenderer.vue';
import { entry as enumArrayRendererEntry } from './EnumArrayRenderer.vue';
import { entry as objectRendererEntry } from './ObjectRenderer.vue';
import { entry as oneOfRendererEntry } from './OneOfRenderer.vue';
+import { entry as oneOfTabRendererEntry } from './OneOfTabRenderer.vue';
export const complexRenderers = [
allOfRendererEntry,
@@ -19,4 +21,5 @@ export const complexRenderers = [
enumArrayRendererEntry,
objectRendererEntry,
oneOfRendererEntry,
+ oneOfTabRendererEntry,
];
diff --git a/packages/vue2-vuetify/src/controls/DateControlRenderer.vue b/packages/vue2-vuetify/src/controls/DateControlRenderer.vue
index 9e92038d51..07fdecc77d 100644
--- a/packages/vue2-vuetify/src/controls/DateControlRenderer.vue
+++ b/packages/vue2-vuetify/src/controls/DateControlRenderer.vue
@@ -26,7 +26,9 @@
@blur="isFocused = false"
>
- $clear
+ $clear
{{ pickerIcon }}
@@ -155,9 +158,19 @@ const controlRenderer = defineComponent({
: true;
},
pickerIcon(): string {
- return typeof this.appliedOptions.pickerIcon == 'string'
- ? this.appliedOptions.pickerIcon
- : 'mdi-calendar';
+ if (typeof this.appliedOptions.pickerIcon === 'string') {
+ return this.appliedOptions.pickerIcon;
+ }
+
+ if (this.pickerType === 'year') {
+ return 'mdi-alpha-y-box-outline';
+ }
+
+ if (this.pickerType === 'month') {
+ return 'mdi-calendar-month';
+ }
+
+ return 'mdi-calendar';
},
dateFormat(): string {
return typeof this.appliedOptions.dateFormat == 'string'
@@ -176,8 +189,8 @@ const controlRenderer = defineComponent({
...JSON_SCHEMA_DATE_FORMATS,
];
},
- pickerType(): string {
- if (!this.dateFormat.includes('M')) {
+ pickerType(): 'date' | 'month' | 'year' {
+ if (!this.dateFormat.includes('M') && !this.dateFormat.includes('D')) {
return 'year';
}
if (!this.dateFormat.includes('D')) {
@@ -227,14 +240,19 @@ const controlRenderer = defineComponent({
},
inputValue(): string | undefined {
const value = this.control.data;
- const date = parseDateTime(value, this.formats);
+ const date = parseDateTime(
+ typeof value === 'number' ? value.toString() : value,
+ this.formats
+ );
return date ? date.format(this.dateFormat) : value;
},
pickerValue: {
get(): string | undefined {
const value = this.control.data;
-
- const date = parseDateTime(value, this.formats);
+ const date = parseDateTime(
+ typeof value === 'number' ? value.toString() : value,
+ this.formats
+ );
// show only valid values
return date ? date.format('YYYY-MM-DD') : undefined;
},
@@ -272,15 +290,36 @@ const controlRenderer = defineComponent({
methods: {
onInputChange(value: string): void {
const date = parseDateTime(value, this.dateFormat);
- const newdata = date ? date.format(this.dateSaveFormat) : value;
+ let newdata: string | number = date
+ ? date.format(this.dateSaveFormat)
+ : value;
+ // if only numbers and the target is number type then convert (this will support when we want year as an integer/number)
+ if (
+ (this.control.schema.type === 'integer' ||
+ this.control.schema.type === 'number') &&
+ /^[\d]*$/.test(newdata)
+ ) {
+ newdata = parseInt(value, 10) || newdata;
+ }
if (this.adaptValue(newdata) !== this.control.data) {
// only invoke onChange when values are different since v-mask is also listening on input which lead to loop
- this.onChange(date ? date.format(this.dateSaveFormat) : value);
+ this.onChange(newdata);
}
},
onPickerChange(value: string): void {
const date = parseDateTime(value, 'YYYY-MM-DD');
- this.onChange(date ? date.format(this.dateSaveFormat) : value);
+ let newdata: string | number = date
+ ? date.format(this.dateSaveFormat)
+ : value;
+ // check if is is only year and the target type is number or integer
+ if (
+ (this.control.schema.type === 'integer' ||
+ this.control.schema.type === 'number') &&
+ /^[\d]*$/.test(newdata)
+ ) {
+ newdata = parseInt(value, 10) || newdata;
+ }
+ this.onChange(newdata);
},
clear(): void {
this.mask = undefined;
diff --git a/packages/vue2-vuetify/src/controls/DateTimeControlRenderer.vue b/packages/vue2-vuetify/src/controls/DateTimeControlRenderer.vue
index 07d849e2e2..b6029209a5 100644
--- a/packages/vue2-vuetify/src/controls/DateTimeControlRenderer.vue
+++ b/packages/vue2-vuetify/src/controls/DateTimeControlRenderer.vue
@@ -26,7 +26,9 @@
@blur="isFocused = false"
>
- $clear
+ $clear
{{ pickerIcon }}
diff --git a/packages/vue2-vuetify/src/controls/IntegerControlRenderer.vue b/packages/vue2-vuetify/src/controls/IntegerControlRenderer.vue
index c88ab77e87..2c41856607 100644
--- a/packages/vue2-vuetify/src/controls/IntegerControlRenderer.vue
+++ b/packages/vue2-vuetify/src/controls/IntegerControlRenderer.vue
@@ -5,25 +5,28 @@
:isFocused="isFocused"
:appliedOptions="appliedOptions"
>
-
+
+
+
@@ -34,7 +37,7 @@ import {
rankWith,
isIntegerControl,
} from '@jsonforms/core';
-import { defineComponent } from 'vue';
+import { defineComponent, ref, unref } from 'vue';
import {
rendererProps,
useJsonFormsControl,
@@ -42,29 +45,58 @@ import {
} from '@jsonforms/vue2';
import { default as ControlWrapper } from './ControlWrapper.vue';
import { useVuetifyControl } from '../util';
-import { VTextField } from 'vuetify/lib';
+import { VHover, VTextField } from 'vuetify/lib';
+
+const NUMBER_REGEX_TEST = /^[+-]?\d+([.]\d+)?([eE][+-]?\d+)?$/;
const controlRenderer = defineComponent({
name: 'integer-control-renderer',
components: {
ControlWrapper,
+ VHover,
VTextField,
},
props: {
...rendererProps(),
},
setup(props: RendererProps) {
- return useVuetifyControl(
- useJsonFormsControl(props),
- (value) => parseInt(value, 10) || undefined,
- 300
- );
+ const adaptValue = (value: any) =>
+ typeof value === 'number' ? value : value || undefined;
+ const input = useVuetifyControl(useJsonFormsControl(props), adaptValue);
+
+ // preserve the value as it was typed by the user - for example when the user type very long number if we rely on the control.data to return back the actual data then the string could appear with exponent form and etc.
+ // otherwise while typing the string in the input can suddenly change
+ const inputValue = ref((unref(input.control).data as string) || '');
+ return { ...input, adaptValue, inputValue };
},
computed: {
step(): number {
const options: any = this.appliedOptions;
return options.step ?? 1;
},
+ allowUnsafeInteger(): boolean {
+ return this.appliedOptions.allowUnsafeInteger;
+ },
+ },
+ methods: {
+ onInputChange(value: string): void {
+ this.inputValue = value;
+ this.onChange(this.toNumberOrString(value));
+ },
+ toNumberOrString(value: string): number | string {
+ // have a regex test before parseFloat to make sure that invalid input won't be ignored and will lead to errors, parseFloat will parse invalid input such 7.22m6 as 7.22
+ if (NUMBER_REGEX_TEST.test(value)) {
+ const num = Number.parseFloat(value);
+ if (
+ Number.isFinite(num) &&
+ (this.allowUnsafeInteger || Number.isSafeInteger(num))
+ ) {
+ // return the parsed number only if it is not NaN or Infinite and it is safe integer (no potential lost of precision otherwise the input will show one value while the data will have different value ) or allowUnsafeInteger options is true
+ return num;
+ }
+ }
+ return value;
+ },
},
});
diff --git a/packages/vue2-vuetify/src/controls/NumberControlRenderer.vue b/packages/vue2-vuetify/src/controls/NumberControlRenderer.vue
index 8dd7c8bc8b..ccd6155746 100644
--- a/packages/vue2-vuetify/src/controls/NumberControlRenderer.vue
+++ b/packages/vue2-vuetify/src/controls/NumberControlRenderer.vue
@@ -5,25 +5,28 @@
:isFocused="isFocused"
:appliedOptions="appliedOptions"
>
-
+
+
+
@@ -34,7 +37,7 @@ import {
rankWith,
isNumberControl,
} from '@jsonforms/core';
-import { defineComponent } from 'vue';
+import { defineComponent, ref, unref } from 'vue';
import {
rendererProps,
useJsonFormsControl,
@@ -42,23 +45,29 @@ import {
} from '@jsonforms/vue2';
import { default as ControlWrapper } from './ControlWrapper.vue';
import { useVuetifyControl } from '../util';
-import { VTextField } from 'vuetify/lib';
+import { VHover, VTextField } from 'vuetify/lib';
+
+const NUMBER_REGEX_TEST = /^[+-]?\d+([.]\d+)?([eE][+-]?\d+)?$/;
const controlRenderer = defineComponent({
name: 'number-control-renderer',
components: {
ControlWrapper,
+ VHover,
VTextField,
},
props: {
...rendererProps(),
},
setup(props: RendererProps) {
- return useVuetifyControl(
- useJsonFormsControl(props),
- (value) => parseFloat(value) || undefined,
- 300
- );
+ const adaptValue = (value: any) =>
+ typeof value === 'number' ? value : value || undefined;
+ const input = useVuetifyControl(useJsonFormsControl(props), adaptValue);
+
+ // preserve the value as it was typed by the user - for example when the user type very long number if we rely on the control.data to return back the actual data then the string could appear with exponent form and etc.
+ // otherwise while typing the string in the input can suddenly change
+ const inputValue = ref((unref(input.control).data as string) || '');
+ return { ...input, adaptValue, inputValue };
},
computed: {
step(): number {
@@ -66,6 +75,43 @@ const controlRenderer = defineComponent({
return options.step ?? 0.1;
},
},
+ methods: {
+ onInputChange(value: string): void {
+ this.inputValue = value;
+ const result = this.toNumberOrString(value);
+ if (typeof result === 'number') {
+ // if user entered 5675.4444444444444444444444444444444 but the actual data is 5675.444444444444 then sync the input with what the data represents and try to preserve the format
+ const inputStringIsInExponentForm =
+ this.inputValue.includes('E') || this.inputValue.includes('e');
+
+ const numberAsString = inputStringIsInExponentForm
+ ? result.toExponential()
+ : result.toPrecision();
+
+ const numberIsInExponentForm =
+ numberAsString.includes('E') || numberAsString.includes('e');
+
+ if (
+ this.inputValue !== numberAsString &&
+ inputStringIsInExponentForm === numberIsInExponentForm // only change the input if both the user input and the string representation of the number are in the same form
+ ) {
+ this.$nextTick(() => (this.inputValue = numberAsString));
+ }
+ }
+ this.onChange(result);
+ },
+ toNumberOrString(value: string): number | string {
+ // have a regex test before parseFloat to make sure that invalid input won't be ignored and will lead to errors, parseFloat will parse invalid input such 7.22m6 as 7.22
+ if (NUMBER_REGEX_TEST.test(value)) {
+ const num = Number.parseFloat(value);
+ if (Number.isFinite(num)) {
+ // return the parsed number only if it is not NaN or Infinite
+ return num;
+ }
+ }
+ return value;
+ },
+ },
});
export default controlRenderer;
diff --git a/packages/vue2-vuetify/src/controls/TimeControlRenderer.vue b/packages/vue2-vuetify/src/controls/TimeControlRenderer.vue
index 6c3f9d36d7..226bb95c43 100644
--- a/packages/vue2-vuetify/src/controls/TimeControlRenderer.vue
+++ b/packages/vue2-vuetify/src/controls/TimeControlRenderer.vue
@@ -27,7 +27,9 @@
@blur="isFocused = false"
>
- $clear
+ $clear
{{ pickerIcon }}
diff --git a/packages/vue2-vuetify/src/layouts/ArrayLayoutRenderer.vue b/packages/vue2-vuetify/src/layouts/ArrayLayoutRenderer.vue
index 85772848b7..c8cdba42be 100644
--- a/packages/vue2-vuetify/src/layouts/ArrayLayoutRenderer.vue
+++ b/packages/vue2-vuetify/src/layouts/ArrayLayoutRenderer.vue
@@ -255,7 +255,7 @@ import {
getControlPath,
getI18nKey,
} from '@jsonforms/core';
-import { defineComponent } from 'vue';
+import { defineComponent, computed, ref } from 'vue';
import {
DispatchRenderer,
rendererProps,
@@ -291,7 +291,6 @@ import {
} from 'vuetify/lib';
import { ValidationIcon, ValidationBadge } from '../controls/components/index';
import { ErrorObject } from 'ajv';
-import { computed, ref } from 'vue';
import merge from 'lodash/merge';
type I18nArrayLayoutKey = keyof typeof i18nDefaultMessages.arraylayout;
diff --git a/packages/vue2-vuetify/src/util/composition.ts b/packages/vue2-vuetify/src/util/composition.ts
index f6d6333426..140c6d7825 100644
--- a/packages/vue2-vuetify/src/util/composition.ts
+++ b/packages/vue2-vuetify/src/util/composition.ts
@@ -12,9 +12,8 @@ import merge from 'lodash/merge';
import get from 'lodash/get';
import isPlainObject from 'lodash/isPlainObject';
import { useStyles } from '../styles';
-import { computed, ComputedRef, inject, ref } from 'vue';
+import { computed, ComputedRef, inject, ref, provide } from 'vue';
import Ajv from 'ajv';
-import { provide } from 'vue';
export const useControlAppliedOptions = (
input: I
From 6365d678b745475eda1d86085b8c39565018819f Mon Sep 17 00:00:00 2001
From: Stefan Dirix
Date: Mon, 12 Dec 2022 09:50:19 +0100
Subject: [PATCH 063/185] Update to JSON Forms 3.1.0-alpha.0
---
packages/example/package.json | 4 ++--
packages/vue2-vuetify/package.json | 8 ++++----
2 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/packages/example/package.json b/packages/example/package.json
index 6d8dc211cc..2d5875bbe0 100644
--- a/packages/example/package.json
+++ b/packages/example/package.json
@@ -8,8 +8,8 @@
"clean": "rimraf dist"
},
"dependencies": {
- "@jsonforms/core": "3.0.0",
- "@jsonforms/vue2": "3.0.0",
+ "@jsonforms/core": "3.1.0-alpha.0",
+ "@jsonforms/vue2": "3.1.0-alpha.0",
"@jsonforms/vue2-vuetify": "3.0.0",
"core-js": "^3.9.1",
"json-refs": "^3.0.15",
diff --git a/packages/vue2-vuetify/package.json b/packages/vue2-vuetify/package.json
index d0decfc636..c38f5c3bf3 100644
--- a/packages/vue2-vuetify/package.json
+++ b/packages/vue2-vuetify/package.json
@@ -48,8 +48,8 @@
"v-mask": "^2.3.0"
},
"peerDependencies": {
- "@jsonforms/core": "3.0.0",
- "@jsonforms/vue2": "3.0.0",
+ "@jsonforms/core": "3.1.0-alpha.0",
+ "@jsonforms/vue2": "3.1.0-alpha.0",
"@mdi/font": "^5.9.55",
"vue": "^2.7.0",
"vuetify": "^2.4.0"
@@ -58,8 +58,8 @@
"@babel/core": "^7.14.6",
"@babel/preset-env": "^7.14.7",
"@babel/preset-typescript": "^7.14.5",
- "@jsonforms/core": "3.0.0",
- "@jsonforms/vue2": "3.0.0",
+ "@jsonforms/core": "3.1.0-alpha.0",
+ "@jsonforms/vue2": "3.1.0-alpha.0",
"@mdi/font": "^5.9.55",
"@rollup/plugin-babel": "^5.3.0",
"@rollup/plugin-node-resolve": "^9.0.0",
From 4d55c96d3bc6562c704cd55959ef1af4eafe9ecb Mon Sep 17 00:00:00 2001
From: Stefan Dirix
Date: Mon, 12 Dec 2022 09:53:58 +0100
Subject: [PATCH 064/185] v3.1.0-alpha.0
---
packages/example/package.json | 6 +++---
packages/vue2-vuetify/package.json | 2 +-
2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/packages/example/package.json b/packages/example/package.json
index 2d5875bbe0..b1ff19123d 100644
--- a/packages/example/package.json
+++ b/packages/example/package.json
@@ -1,6 +1,6 @@
{
"name": "example",
- "version": "0.1.0",
+ "version": "3.1.0-alpha.0",
"private": true,
"scripts": {
"build": "vue-cli-service build",
@@ -10,10 +10,10 @@
"dependencies": {
"@jsonforms/core": "3.1.0-alpha.0",
"@jsonforms/vue2": "3.1.0-alpha.0",
- "@jsonforms/vue2-vuetify": "3.0.0",
+ "@jsonforms/vue2-vuetify": "3.1.0-alpha.0",
+ "ajv-keywords": "^5.1.0",
"core-js": "^3.9.1",
"json-refs": "^3.0.15",
- "ajv-keywords": "^5.1.0",
"monaco-editor": "^0.26.0",
"vue": "^2.7.0",
"vue-router": "^3.2.0",
diff --git a/packages/vue2-vuetify/package.json b/packages/vue2-vuetify/package.json
index c38f5c3bf3..1dca4abc13 100644
--- a/packages/vue2-vuetify/package.json
+++ b/packages/vue2-vuetify/package.json
@@ -1,6 +1,6 @@
{
"name": "@jsonforms/vue2-vuetify",
- "version": "3.0.0",
+ "version": "3.1.0-alpha.0",
"description": "Vue 2 Vuetify renderers for JSON Forms",
"repository": "https://github.com/eclipsesource/jsonforms-vuetify-renderers",
"bugs": "https://github.com/eclipsesource/jsonforms/issues",
From ac363c2044c3d345e02631fcd3b50417acc0aa77 Mon Sep 17 00:00:00 2001
From: Stefan Dirix
Date: Mon, 3 Apr 2023 09:01:34 +0200
Subject: [PATCH 065/185] Update environment to Vue 3 and Vuetify 3
Also renames the vue2-vuetify package to vue-vuetify
---
packages/example/package.json | 49 +++++++-------
.../.eslintrc.js | 0
.../.prettierrc.js | 0
.../{vue2-vuetify => vue-vuetify}/README.md | 0
.../babel.config.js | 0
.../jest.config.js | 0
.../package.json | 66 +++++++++----------
.../rollup.config.mjs} | 4 +-
packages/vue-vuetify/shims-vue.d.ts | 6 ++
.../shims-vuetify.d.ts | 0
.../src/additional/LabelRenderer.vue | 0
.../src/additional/ListWithDetailRenderer.vue | 0
.../src/additional/index.ts | 0
.../src/array/index.ts | 0
.../src/complex/AllOfRenderer.vue | 0
.../src/complex/AnyOfRenderer.vue | 0
.../src/complex/ArrayControlRenderer.vue | 0
.../src/complex/EnumArrayRenderer.vue | 0
.../src/complex/ObjectRenderer.vue | 0
.../src/complex/OneOfRenderer.vue | 0
.../src/complex/OneOfTabRenderer.vue | 0
.../components/AdditionalProperties.vue | 0
.../components/CombinatorProperties.vue | 0
.../src/complex/components/index.ts | 0
.../src/complex/index.ts | 0
.../AnyOfStringOrEnumControlRenderer.vue | 0
.../src/controls/BooleanControlRenderer.vue | 0
.../controls/BooleanToggleControlRenderer.vue | 0
.../src/controls/ControlWrapper.vue | 0
.../src/controls/DateControlRenderer.vue | 0
.../src/controls/DateTimeControlRenderer.vue | 0
.../src/controls/EnumControlRenderer.vue | 0
.../src/controls/IntegerControlRenderer.vue | 0
.../controls/MultiStringControlRenderer.vue | 0
.../src/controls/NumberControlRenderer.vue | 0
.../src/controls/OneOfEnumControlRenderer.vue | 0
.../OneOfRadioGroupControlRenderer.vue | 0
.../src/controls/PasswordControlRenderer.vue | 0
.../controls/RadioGroupControlRenderer.vue | 0
.../src/controls/SliderControlRenderer.vue | 0
.../src/controls/StringControlRenderer.vue | 0
.../controls/StringMaskControlRenderer.vue | 0
.../src/controls/TimeControlRenderer.vue | 0
.../controls/components/ValidationBadge.vue | 0
.../controls/components/ValidationIcon.vue | 0
.../src/controls/components/index.ts | 0
.../controls/directives/DisabledIconFocus.ts | 0
.../src/controls/directives/index.ts | 0
.../src/controls/index.ts | 0
.../AutocompleteEnumControlRenderer.vue | 0
.../AutocompleteOneOfEnumControlRenderer.vue | 0
.../src/extended/index.ts | 0
.../src/index.ts | 0
.../src/layouts/ArrayLayoutRenderer.vue | 0
.../src/layouts/CategorizationRenderer.vue | 0
.../layouts/CategorizationStepperRenderer.vue | 0
.../src/layouts/GroupRenderer.vue | 0
.../src/layouts/HorizontalLayoutRenderer.vue | 0
.../src/layouts/VerticalLayoutRenderer.vue | 0
.../src/layouts/index.ts | 0
.../src/renderers.ts | 0
.../src/styles/defaultStyles.ts | 0
.../src/styles/index.ts | 0
.../src/styles/styles.ts | 0
.../src/styles/util.ts | 0
.../src/util/composition.ts | 0
.../src/util/datejs.ts | 0
.../src/util/i18nDefaultMessages.ts | 0
.../src/util/index.ts | 0
.../src/util/options.ts | 0
.../src/util/validator.ts | 0
.../tests/index.ts | 0
.../unit/additional/LabelRenderer.spec.ts | 0
.../__snapshots__/LabelRenderer.spec.ts.snap | 0
.../controls/BooleanControlRenderer.spec.ts | 0
.../unit/controls/DateControlRenderer.spec.ts | 0
.../controls/DateTimeControlRenderer.spec.ts | 0
.../unit/controls/EnumControlRenderer.spec.ts | 0
.../controls/IntegerControlRenderer.spec.ts | 0
.../MultiStringControlRenderer.spec.ts | 0
.../controls/NumberControlRenderer.spec.ts | 0
.../controls/OneOfEnumControlRenderer.spec.ts | 0
.../controls/StringControlRenderer.spec.ts | 0
.../unit/controls/TimeControlRenderer.spec.ts | 0
.../BooleanControlRenderer.spec.ts.snap | 0
.../DateControlRenderer.spec.ts.snap | 0
.../DateTimeControlRenderer.spec.ts.snap | 0
.../EnumControlRenderer.spec.ts.snap | 0
.../IntegerControlRenderer.spec.ts.snap | 0
.../MultiStringControlRenderer.spec.ts.snap | 0
.../NumberControlRenderer.spec.ts.snap | 0
.../OneOfEnumControlRenderer.spec.ts.snap | 0
.../StringControlRenderer.spec.ts.snap | 0
.../TimeControlRenderer.spec.ts.snap | 0
.../tests/unit/util/TestComponent.vue | 0
.../tests/unit/util/index.ts | 0
.../tests/unit/util/util.ts | 0
.../tsconfig.compile.json | 0
.../tsconfig.json | 0
packages/vue2-vuetify/shims-v-mask.d.ts | 8 ---
packages/vue2-vuetify/shims-vue.d.ts | 5 --
101 files changed, 62 insertions(+), 76 deletions(-)
rename packages/{vue2-vuetify => vue-vuetify}/.eslintrc.js (100%)
rename packages/{vue2-vuetify => vue-vuetify}/.prettierrc.js (100%)
rename packages/{vue2-vuetify => vue-vuetify}/README.md (100%)
rename packages/{vue2-vuetify => vue-vuetify}/babel.config.js (100%)
rename packages/{vue2-vuetify => vue-vuetify}/jest.config.js (100%)
rename packages/{vue2-vuetify => vue-vuetify}/package.json (55%)
rename packages/{vue2-vuetify/rollup.config.js => vue-vuetify/rollup.config.mjs} (95%)
create mode 100644 packages/vue-vuetify/shims-vue.d.ts
rename packages/{vue2-vuetify => vue-vuetify}/shims-vuetify.d.ts (100%)
rename packages/{vue2-vuetify => vue-vuetify}/src/additional/LabelRenderer.vue (100%)
rename packages/{vue2-vuetify => vue-vuetify}/src/additional/ListWithDetailRenderer.vue (100%)
rename packages/{vue2-vuetify => vue-vuetify}/src/additional/index.ts (100%)
rename packages/{vue2-vuetify => vue-vuetify}/src/array/index.ts (100%)
rename packages/{vue2-vuetify => vue-vuetify}/src/complex/AllOfRenderer.vue (100%)
rename packages/{vue2-vuetify => vue-vuetify}/src/complex/AnyOfRenderer.vue (100%)
rename packages/{vue2-vuetify => vue-vuetify}/src/complex/ArrayControlRenderer.vue (100%)
rename packages/{vue2-vuetify => vue-vuetify}/src/complex/EnumArrayRenderer.vue (100%)
rename packages/{vue2-vuetify => vue-vuetify}/src/complex/ObjectRenderer.vue (100%)
rename packages/{vue2-vuetify => vue-vuetify}/src/complex/OneOfRenderer.vue (100%)
rename packages/{vue2-vuetify => vue-vuetify}/src/complex/OneOfTabRenderer.vue (100%)
rename packages/{vue2-vuetify => vue-vuetify}/src/complex/components/AdditionalProperties.vue (100%)
rename packages/{vue2-vuetify => vue-vuetify}/src/complex/components/CombinatorProperties.vue (100%)
rename packages/{vue2-vuetify => vue-vuetify}/src/complex/components/index.ts (100%)
rename packages/{vue2-vuetify => vue-vuetify}/src/complex/index.ts (100%)
rename packages/{vue2-vuetify => vue-vuetify}/src/controls/AnyOfStringOrEnumControlRenderer.vue (100%)
rename packages/{vue2-vuetify => vue-vuetify}/src/controls/BooleanControlRenderer.vue (100%)
rename packages/{vue2-vuetify => vue-vuetify}/src/controls/BooleanToggleControlRenderer.vue (100%)
rename packages/{vue2-vuetify => vue-vuetify}/src/controls/ControlWrapper.vue (100%)
rename packages/{vue2-vuetify => vue-vuetify}/src/controls/DateControlRenderer.vue (100%)
rename packages/{vue2-vuetify => vue-vuetify}/src/controls/DateTimeControlRenderer.vue (100%)
rename packages/{vue2-vuetify => vue-vuetify}/src/controls/EnumControlRenderer.vue (100%)
rename packages/{vue2-vuetify => vue-vuetify}/src/controls/IntegerControlRenderer.vue (100%)
rename packages/{vue2-vuetify => vue-vuetify}/src/controls/MultiStringControlRenderer.vue (100%)
rename packages/{vue2-vuetify => vue-vuetify}/src/controls/NumberControlRenderer.vue (100%)
rename packages/{vue2-vuetify => vue-vuetify}/src/controls/OneOfEnumControlRenderer.vue (100%)
rename packages/{vue2-vuetify => vue-vuetify}/src/controls/OneOfRadioGroupControlRenderer.vue (100%)
rename packages/{vue2-vuetify => vue-vuetify}/src/controls/PasswordControlRenderer.vue (100%)
rename packages/{vue2-vuetify => vue-vuetify}/src/controls/RadioGroupControlRenderer.vue (100%)
rename packages/{vue2-vuetify => vue-vuetify}/src/controls/SliderControlRenderer.vue (100%)
rename packages/{vue2-vuetify => vue-vuetify}/src/controls/StringControlRenderer.vue (100%)
rename packages/{vue2-vuetify => vue-vuetify}/src/controls/StringMaskControlRenderer.vue (100%)
rename packages/{vue2-vuetify => vue-vuetify}/src/controls/TimeControlRenderer.vue (100%)
rename packages/{vue2-vuetify => vue-vuetify}/src/controls/components/ValidationBadge.vue (100%)
rename packages/{vue2-vuetify => vue-vuetify}/src/controls/components/ValidationIcon.vue (100%)
rename packages/{vue2-vuetify => vue-vuetify}/src/controls/components/index.ts (100%)
rename packages/{vue2-vuetify => vue-vuetify}/src/controls/directives/DisabledIconFocus.ts (100%)
rename packages/{vue2-vuetify => vue-vuetify}/src/controls/directives/index.ts (100%)
rename packages/{vue2-vuetify => vue-vuetify}/src/controls/index.ts (100%)
rename packages/{vue2-vuetify => vue-vuetify}/src/extended/AutocompleteEnumControlRenderer.vue (100%)
rename packages/{vue2-vuetify => vue-vuetify}/src/extended/AutocompleteOneOfEnumControlRenderer.vue (100%)
rename packages/{vue2-vuetify => vue-vuetify}/src/extended/index.ts (100%)
rename packages/{vue2-vuetify => vue-vuetify}/src/index.ts (100%)
rename packages/{vue2-vuetify => vue-vuetify}/src/layouts/ArrayLayoutRenderer.vue (100%)
rename packages/{vue2-vuetify => vue-vuetify}/src/layouts/CategorizationRenderer.vue (100%)
rename packages/{vue2-vuetify => vue-vuetify}/src/layouts/CategorizationStepperRenderer.vue (100%)
rename packages/{vue2-vuetify => vue-vuetify}/src/layouts/GroupRenderer.vue (100%)
rename packages/{vue2-vuetify => vue-vuetify}/src/layouts/HorizontalLayoutRenderer.vue (100%)
rename packages/{vue2-vuetify => vue-vuetify}/src/layouts/VerticalLayoutRenderer.vue (100%)
rename packages/{vue2-vuetify => vue-vuetify}/src/layouts/index.ts (100%)
rename packages/{vue2-vuetify => vue-vuetify}/src/renderers.ts (100%)
rename packages/{vue2-vuetify => vue-vuetify}/src/styles/defaultStyles.ts (100%)
rename packages/{vue2-vuetify => vue-vuetify}/src/styles/index.ts (100%)
rename packages/{vue2-vuetify => vue-vuetify}/src/styles/styles.ts (100%)
rename packages/{vue2-vuetify => vue-vuetify}/src/styles/util.ts (100%)
rename packages/{vue2-vuetify => vue-vuetify}/src/util/composition.ts (100%)
rename packages/{vue2-vuetify => vue-vuetify}/src/util/datejs.ts (100%)
rename packages/{vue2-vuetify => vue-vuetify}/src/util/i18nDefaultMessages.ts (100%)
rename packages/{vue2-vuetify => vue-vuetify}/src/util/index.ts (100%)
rename packages/{vue2-vuetify => vue-vuetify}/src/util/options.ts (100%)
rename packages/{vue2-vuetify => vue-vuetify}/src/util/validator.ts (100%)
rename packages/{vue2-vuetify => vue-vuetify}/tests/index.ts (100%)
rename packages/{vue2-vuetify => vue-vuetify}/tests/unit/additional/LabelRenderer.spec.ts (100%)
rename packages/{vue2-vuetify => vue-vuetify}/tests/unit/additional/__snapshots__/LabelRenderer.spec.ts.snap (100%)
rename packages/{vue2-vuetify => vue-vuetify}/tests/unit/controls/BooleanControlRenderer.spec.ts (100%)
rename packages/{vue2-vuetify => vue-vuetify}/tests/unit/controls/DateControlRenderer.spec.ts (100%)
rename packages/{vue2-vuetify => vue-vuetify}/tests/unit/controls/DateTimeControlRenderer.spec.ts (100%)
rename packages/{vue2-vuetify => vue-vuetify}/tests/unit/controls/EnumControlRenderer.spec.ts (100%)
rename packages/{vue2-vuetify => vue-vuetify}/tests/unit/controls/IntegerControlRenderer.spec.ts (100%)
rename packages/{vue2-vuetify => vue-vuetify}/tests/unit/controls/MultiStringControlRenderer.spec.ts (100%)
rename packages/{vue2-vuetify => vue-vuetify}/tests/unit/controls/NumberControlRenderer.spec.ts (100%)
rename packages/{vue2-vuetify => vue-vuetify}/tests/unit/controls/OneOfEnumControlRenderer.spec.ts (100%)
rename packages/{vue2-vuetify => vue-vuetify}/tests/unit/controls/StringControlRenderer.spec.ts (100%)
rename packages/{vue2-vuetify => vue-vuetify}/tests/unit/controls/TimeControlRenderer.spec.ts (100%)
rename packages/{vue2-vuetify => vue-vuetify}/tests/unit/controls/__snapshots__/BooleanControlRenderer.spec.ts.snap (100%)
rename packages/{vue2-vuetify => vue-vuetify}/tests/unit/controls/__snapshots__/DateControlRenderer.spec.ts.snap (100%)
rename packages/{vue2-vuetify => vue-vuetify}/tests/unit/controls/__snapshots__/DateTimeControlRenderer.spec.ts.snap (100%)
rename packages/{vue2-vuetify => vue-vuetify}/tests/unit/controls/__snapshots__/EnumControlRenderer.spec.ts.snap (100%)
rename packages/{vue2-vuetify => vue-vuetify}/tests/unit/controls/__snapshots__/IntegerControlRenderer.spec.ts.snap (100%)
rename packages/{vue2-vuetify => vue-vuetify}/tests/unit/controls/__snapshots__/MultiStringControlRenderer.spec.ts.snap (100%)
rename packages/{vue2-vuetify => vue-vuetify}/tests/unit/controls/__snapshots__/NumberControlRenderer.spec.ts.snap (100%)
rename packages/{vue2-vuetify => vue-vuetify}/tests/unit/controls/__snapshots__/OneOfEnumControlRenderer.spec.ts.snap (100%)
rename packages/{vue2-vuetify => vue-vuetify}/tests/unit/controls/__snapshots__/StringControlRenderer.spec.ts.snap (100%)
rename packages/{vue2-vuetify => vue-vuetify}/tests/unit/controls/__snapshots__/TimeControlRenderer.spec.ts.snap (100%)
rename packages/{vue2-vuetify => vue-vuetify}/tests/unit/util/TestComponent.vue (100%)
rename packages/{vue2-vuetify => vue-vuetify}/tests/unit/util/index.ts (100%)
rename packages/{vue2-vuetify => vue-vuetify}/tests/unit/util/util.ts (100%)
rename packages/{vue2-vuetify => vue-vuetify}/tsconfig.compile.json (100%)
rename packages/{vue2-vuetify => vue-vuetify}/tsconfig.json (100%)
delete mode 100644 packages/vue2-vuetify/shims-v-mask.d.ts
delete mode 100644 packages/vue2-vuetify/shims-vue.d.ts
diff --git a/packages/example/package.json b/packages/example/package.json
index b1ff19123d..7e91c0b436 100644
--- a/packages/example/package.json
+++ b/packages/example/package.json
@@ -9,40 +9,37 @@
},
"dependencies": {
"@jsonforms/core": "3.1.0-alpha.0",
- "@jsonforms/vue2": "3.1.0-alpha.0",
- "@jsonforms/vue2-vuetify": "3.1.0-alpha.0",
+ "@jsonforms/vue": "3.1.0-alpha.0",
+ "@jsonforms/vue-vuetify": "3.1.0-alpha.0",
"ajv-keywords": "^5.1.0",
"core-js": "^3.9.1",
"json-refs": "^3.0.15",
"monaco-editor": "^0.26.0",
- "vue": "^2.7.0",
- "vue-router": "^3.2.0",
- "vuetify": "^2.4.0",
- "vuex": "^3.4.0"
+ "vue": "^3.2.47",
+ "vue-router": "^4.1.6",
+ "vuetify": "^3.1.12",
+ "vuex": "^4.1.0"
},
"devDependencies": {
- "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.7",
- "@babel/plugin-proposal-optional-chaining": "^7.16.7",
- "@typescript-eslint/eslint-plugin": "^4.18.0",
- "@typescript-eslint/parser": "^4.18.0",
- "@vue/cli-plugin-babel": "~4.5.18",
- "@vue/cli-plugin-eslint": "~4.5.18",
- "@vue/cli-plugin-typescript": "~4.5.18",
- "@vue/cli-service": "~4.5.18",
- "@vue/eslint-config-prettier": "^6.0.0",
- "@vue/eslint-config-typescript": "^7.0.0",
- "eslint": "^6.7.2",
- "eslint-plugin-prettier": "^3.3.1",
- "eslint-plugin-vue": "^6.2.2",
+ "@typescript-eslint/eslint-plugin": "^5.4.0",
+ "@typescript-eslint/parser": "^5.4.0",
+ "@vue/cli-plugin-babel": "~5.0.8",
+ "@vue/cli-plugin-eslint": "~5.0.8",
+ "@vue/cli-plugin-typescript": "~5.0.8",
+ "@vue/cli-service": "~5.0.0",
+ "@vue/eslint-config-prettier": "^7.1.0",
+ "@vue/eslint-config-typescript": "^11.0.0",
+ "eslint": "^8.37.0",
+ "eslint-plugin-prettier": "^4.0.0",
+ "eslint-plugin-vue": "^9.10.0",
"monaco-editor-webpack-plugin": "^4.1.1",
- "prettier": "^2.2.1",
- "rimraf": "^3.0.2",
+ "prettier": "^2.8.7",
+ "rimraf": "^4.4.1",
"sass": "~1.32.0",
"sass-loader": "^10.0.0",
- "typescript": "~4.1.5",
- "vue-cli-plugin-vuetify": "~2.4.2",
- "vue-template-compiler": "^2.7.0",
- "vuetify-loader": "^1.7.0",
- "vuex-pathify": "^1.4.5"
+ "typescript": "~4.5.5",
+ "vue-cli-plugin-vuetify": "~2.5.8",
+ "webpack-plugin-vuetify": "^2.0.1",
+ "vuex-pathify": "^3.0.0-beta"
}
}
diff --git a/packages/vue2-vuetify/.eslintrc.js b/packages/vue-vuetify/.eslintrc.js
similarity index 100%
rename from packages/vue2-vuetify/.eslintrc.js
rename to packages/vue-vuetify/.eslintrc.js
diff --git a/packages/vue2-vuetify/.prettierrc.js b/packages/vue-vuetify/.prettierrc.js
similarity index 100%
rename from packages/vue2-vuetify/.prettierrc.js
rename to packages/vue-vuetify/.prettierrc.js
diff --git a/packages/vue2-vuetify/README.md b/packages/vue-vuetify/README.md
similarity index 100%
rename from packages/vue2-vuetify/README.md
rename to packages/vue-vuetify/README.md
diff --git a/packages/vue2-vuetify/babel.config.js b/packages/vue-vuetify/babel.config.js
similarity index 100%
rename from packages/vue2-vuetify/babel.config.js
rename to packages/vue-vuetify/babel.config.js
diff --git a/packages/vue2-vuetify/jest.config.js b/packages/vue-vuetify/jest.config.js
similarity index 100%
rename from packages/vue2-vuetify/jest.config.js
rename to packages/vue-vuetify/jest.config.js
diff --git a/packages/vue2-vuetify/package.json b/packages/vue-vuetify/package.json
similarity index 55%
rename from packages/vue2-vuetify/package.json
rename to packages/vue-vuetify/package.json
index 1dca4abc13..640691bb33 100644
--- a/packages/vue2-vuetify/package.json
+++ b/packages/vue-vuetify/package.json
@@ -1,7 +1,7 @@
{
- "name": "@jsonforms/vue2-vuetify",
+ "name": "@jsonforms/vue-vuetify",
"version": "3.1.0-alpha.0",
- "description": "Vue 2 Vuetify renderers for JSON Forms",
+ "description": "Vue Vuetify renderers for JSON Forms",
"repository": "https://github.com/eclipsesource/jsonforms-vuetify-renderers",
"bugs": "https://github.com/eclipsesource/jsonforms/issues",
"homepage": "http://jsonforms.io/",
@@ -28,8 +28,8 @@
"layout",
"customization"
],
- "main": "lib/jsonforms-vue2-vuetify.cjs.js",
- "module": "lib/jsonforms-vue2-vuetify.esm.js",
+ "main": "lib/jsonforms-vue-vuetify.cjs.js",
+ "module": "lib/jsonforms-vue-vuetify.esm.js",
"typings": "lib/index.d.ts",
"files": [
"lib",
@@ -37,61 +37,57 @@
],
"scripts": {
"prebuild": "rimraf lib",
- "build": "cross-env NODE_ENV=production rollup --config rollup.config.js",
+ "build": "cross-env NODE_ENV=production rollup --config rollup.config.mjs",
"watch": "rollup --watch --config rollup.config.js",
"test": "vue-cli-service test:unit"
},
"dependencies": {
"ajv": "^8.6.1",
"dayjs": "^1.10.6",
- "lodash": "^4.17.15",
- "v-mask": "^2.3.0"
+ "lodash": "^4.17.15"
},
"peerDependencies": {
"@jsonforms/core": "3.1.0-alpha.0",
- "@jsonforms/vue2": "3.1.0-alpha.0",
- "@mdi/font": "^5.9.55",
- "vue": "^2.7.0",
- "vuetify": "^2.4.0"
+ "@jsonforms/vue": "3.1.0-alpha.0",
+ "@mdi/font": "^7.0.96",
+ "vue": "^3.2.47",
+ "vuetify": "^3.1.12"
},
"devDependencies": {
"@babel/core": "^7.14.6",
"@babel/preset-env": "^7.14.7",
"@babel/preset-typescript": "^7.14.5",
"@jsonforms/core": "3.1.0-alpha.0",
- "@jsonforms/vue2": "3.1.0-alpha.0",
- "@mdi/font": "^5.9.55",
- "@rollup/plugin-babel": "^5.3.0",
- "@rollup/plugin-node-resolve": "^9.0.0",
+ "@jsonforms/vue": "3.1.0-alpha.0",
+ "@mdi/font": "^7.0.96",
+ "@rollup/plugin-babel": "^6.0.3",
+ "@rollup/plugin-node-resolve": "^15.0.1",
"@types/jest": "^28.1.1",
"@types/lodash": "^4.14.172",
- "@typescript-eslint/eslint-plugin": "^4.18.0",
- "@typescript-eslint/parser": "^4.18.0",
- "@vue/cli-plugin-unit-jest": "~4.5.18",
- "@vue/cli-service": "~4.5.18",
- "@vue/eslint-config-prettier": "^6.0.0",
- "@vue/eslint-config-typescript": "^7.0.0",
- "@vue/test-utils": "^1.3.0",
+ "@typescript-eslint/eslint-plugin": "^5.4.0",
+ "@typescript-eslint/parser": "^5.4.0",
+ "@vue/cli-plugin-unit-jest": "^5.0.0",
+ "@vue/cli-service": "~5.0.0",
+ "@vue/eslint-config-prettier": "^7.1.0",
+ "@vue/eslint-config-typescript": "^11.0.0",
+ "@vue/test-utils": "^2.3.2",
"ajv": "^8.6.1",
"core-js": "^3.9.1",
"cross-env": "^7.0.2",
- "eslint": "^6.7.2",
- "eslint-plugin-prettier": "^3.3.1",
- "eslint-plugin-vue": "^6.2.2",
+ "eslint": "^8.37.0",
+ "eslint-plugin-prettier": "^4.0.0",
+ "eslint-plugin-vue": "^9.10.0",
"jest": "^28.1.1",
- "jest-serializer-html": "^7.0.0",
- "prettier": "^2.2.1",
- "rimraf": "^3.0.2",
- "rollup": "^2.52.8",
+ "prettier": "^2.8.7",
+ "rimraf": "^4.4.1",
+ "rollup": "^3.20.2",
"rollup-plugin-cleanup": "^3.2.1",
"rollup-plugin-styles": "^4.0.0",
"rollup-plugin-typescript2": "^0.30.0",
"rollup-plugin-visualizer": "^5.5.2",
- "rollup-plugin-vue": "^5.1.9",
- "typescript": "~4.1.5",
- "vue": "^2.7.0",
- "vue-jest": "^3.0.7",
- "vue-template-compiler": "^2.7.0",
- "vuetify": "^2.4.0"
+ "rollup-plugin-vue": "^6.0.0",
+ "typescript": "~4.5.5",
+ "vue": "^3.2.47",
+ "vuetify": "^3.1.12"
}
}
diff --git a/packages/vue2-vuetify/rollup.config.js b/packages/vue-vuetify/rollup.config.mjs
similarity index 95%
rename from packages/vue2-vuetify/rollup.config.js
rename to packages/vue-vuetify/rollup.config.mjs
index fe33208dbd..ce5e8985be 100644
--- a/packages/vue2-vuetify/rollup.config.js
+++ b/packages/vue-vuetify/rollup.config.mjs
@@ -3,10 +3,10 @@ import babel from '@rollup/plugin-babel';
import typescript from 'rollup-plugin-typescript2';
import resolve from '@rollup/plugin-node-resolve';
import cleanup from 'rollup-plugin-cleanup';
-import visualizer from 'rollup-plugin-visualizer';
+import { visualizer } from 'rollup-plugin-visualizer';
import styles from 'rollup-plugin-styles';
-import packageJson from './package.json';
+import packageJson from './package.json' assert { type: 'json' };
const baseConfig = {
input: 'src/index.ts',
diff --git a/packages/vue-vuetify/shims-vue.d.ts b/packages/vue-vuetify/shims-vue.d.ts
new file mode 100644
index 0000000000..0a4c9aa0d8
--- /dev/null
+++ b/packages/vue-vuetify/shims-vue.d.ts
@@ -0,0 +1,6 @@
+declare module '*.vue' {
+ import type { DefineComponent } from 'vue';
+ const component: DefineComponent<{}, {}, any>;
+ export default component;
+ export const entry;
+}
diff --git a/packages/vue2-vuetify/shims-vuetify.d.ts b/packages/vue-vuetify/shims-vuetify.d.ts
similarity index 100%
rename from packages/vue2-vuetify/shims-vuetify.d.ts
rename to packages/vue-vuetify/shims-vuetify.d.ts
diff --git a/packages/vue2-vuetify/src/additional/LabelRenderer.vue b/packages/vue-vuetify/src/additional/LabelRenderer.vue
similarity index 100%
rename from packages/vue2-vuetify/src/additional/LabelRenderer.vue
rename to packages/vue-vuetify/src/additional/LabelRenderer.vue
diff --git a/packages/vue2-vuetify/src/additional/ListWithDetailRenderer.vue b/packages/vue-vuetify/src/additional/ListWithDetailRenderer.vue
similarity index 100%
rename from packages/vue2-vuetify/src/additional/ListWithDetailRenderer.vue
rename to packages/vue-vuetify/src/additional/ListWithDetailRenderer.vue
diff --git a/packages/vue2-vuetify/src/additional/index.ts b/packages/vue-vuetify/src/additional/index.ts
similarity index 100%
rename from packages/vue2-vuetify/src/additional/index.ts
rename to packages/vue-vuetify/src/additional/index.ts
diff --git a/packages/vue2-vuetify/src/array/index.ts b/packages/vue-vuetify/src/array/index.ts
similarity index 100%
rename from packages/vue2-vuetify/src/array/index.ts
rename to packages/vue-vuetify/src/array/index.ts
diff --git a/packages/vue2-vuetify/src/complex/AllOfRenderer.vue b/packages/vue-vuetify/src/complex/AllOfRenderer.vue
similarity index 100%
rename from packages/vue2-vuetify/src/complex/AllOfRenderer.vue
rename to packages/vue-vuetify/src/complex/AllOfRenderer.vue
diff --git a/packages/vue2-vuetify/src/complex/AnyOfRenderer.vue b/packages/vue-vuetify/src/complex/AnyOfRenderer.vue
similarity index 100%
rename from packages/vue2-vuetify/src/complex/AnyOfRenderer.vue
rename to packages/vue-vuetify/src/complex/AnyOfRenderer.vue
diff --git a/packages/vue2-vuetify/src/complex/ArrayControlRenderer.vue b/packages/vue-vuetify/src/complex/ArrayControlRenderer.vue
similarity index 100%
rename from packages/vue2-vuetify/src/complex/ArrayControlRenderer.vue
rename to packages/vue-vuetify/src/complex/ArrayControlRenderer.vue
diff --git a/packages/vue2-vuetify/src/complex/EnumArrayRenderer.vue b/packages/vue-vuetify/src/complex/EnumArrayRenderer.vue
similarity index 100%
rename from packages/vue2-vuetify/src/complex/EnumArrayRenderer.vue
rename to packages/vue-vuetify/src/complex/EnumArrayRenderer.vue
diff --git a/packages/vue2-vuetify/src/complex/ObjectRenderer.vue b/packages/vue-vuetify/src/complex/ObjectRenderer.vue
similarity index 100%
rename from packages/vue2-vuetify/src/complex/ObjectRenderer.vue
rename to packages/vue-vuetify/src/complex/ObjectRenderer.vue
diff --git a/packages/vue2-vuetify/src/complex/OneOfRenderer.vue b/packages/vue-vuetify/src/complex/OneOfRenderer.vue
similarity index 100%
rename from packages/vue2-vuetify/src/complex/OneOfRenderer.vue
rename to packages/vue-vuetify/src/complex/OneOfRenderer.vue
diff --git a/packages/vue2-vuetify/src/complex/OneOfTabRenderer.vue b/packages/vue-vuetify/src/complex/OneOfTabRenderer.vue
similarity index 100%
rename from packages/vue2-vuetify/src/complex/OneOfTabRenderer.vue
rename to packages/vue-vuetify/src/complex/OneOfTabRenderer.vue
diff --git a/packages/vue2-vuetify/src/complex/components/AdditionalProperties.vue b/packages/vue-vuetify/src/complex/components/AdditionalProperties.vue
similarity index 100%
rename from packages/vue2-vuetify/src/complex/components/AdditionalProperties.vue
rename to packages/vue-vuetify/src/complex/components/AdditionalProperties.vue
diff --git a/packages/vue2-vuetify/src/complex/components/CombinatorProperties.vue b/packages/vue-vuetify/src/complex/components/CombinatorProperties.vue
similarity index 100%
rename from packages/vue2-vuetify/src/complex/components/CombinatorProperties.vue
rename to packages/vue-vuetify/src/complex/components/CombinatorProperties.vue
diff --git a/packages/vue2-vuetify/src/complex/components/index.ts b/packages/vue-vuetify/src/complex/components/index.ts
similarity index 100%
rename from packages/vue2-vuetify/src/complex/components/index.ts
rename to packages/vue-vuetify/src/complex/components/index.ts
diff --git a/packages/vue2-vuetify/src/complex/index.ts b/packages/vue-vuetify/src/complex/index.ts
similarity index 100%
rename from packages/vue2-vuetify/src/complex/index.ts
rename to packages/vue-vuetify/src/complex/index.ts
diff --git a/packages/vue2-vuetify/src/controls/AnyOfStringOrEnumControlRenderer.vue b/packages/vue-vuetify/src/controls/AnyOfStringOrEnumControlRenderer.vue
similarity index 100%
rename from packages/vue2-vuetify/src/controls/AnyOfStringOrEnumControlRenderer.vue
rename to packages/vue-vuetify/src/controls/AnyOfStringOrEnumControlRenderer.vue
diff --git a/packages/vue2-vuetify/src/controls/BooleanControlRenderer.vue b/packages/vue-vuetify/src/controls/BooleanControlRenderer.vue
similarity index 100%
rename from packages/vue2-vuetify/src/controls/BooleanControlRenderer.vue
rename to packages/vue-vuetify/src/controls/BooleanControlRenderer.vue
diff --git a/packages/vue2-vuetify/src/controls/BooleanToggleControlRenderer.vue b/packages/vue-vuetify/src/controls/BooleanToggleControlRenderer.vue
similarity index 100%
rename from packages/vue2-vuetify/src/controls/BooleanToggleControlRenderer.vue
rename to packages/vue-vuetify/src/controls/BooleanToggleControlRenderer.vue
diff --git a/packages/vue2-vuetify/src/controls/ControlWrapper.vue b/packages/vue-vuetify/src/controls/ControlWrapper.vue
similarity index 100%
rename from packages/vue2-vuetify/src/controls/ControlWrapper.vue
rename to packages/vue-vuetify/src/controls/ControlWrapper.vue
diff --git a/packages/vue2-vuetify/src/controls/DateControlRenderer.vue b/packages/vue-vuetify/src/controls/DateControlRenderer.vue
similarity index 100%
rename from packages/vue2-vuetify/src/controls/DateControlRenderer.vue
rename to packages/vue-vuetify/src/controls/DateControlRenderer.vue
diff --git a/packages/vue2-vuetify/src/controls/DateTimeControlRenderer.vue b/packages/vue-vuetify/src/controls/DateTimeControlRenderer.vue
similarity index 100%
rename from packages/vue2-vuetify/src/controls/DateTimeControlRenderer.vue
rename to packages/vue-vuetify/src/controls/DateTimeControlRenderer.vue
diff --git a/packages/vue2-vuetify/src/controls/EnumControlRenderer.vue b/packages/vue-vuetify/src/controls/EnumControlRenderer.vue
similarity index 100%
rename from packages/vue2-vuetify/src/controls/EnumControlRenderer.vue
rename to packages/vue-vuetify/src/controls/EnumControlRenderer.vue
diff --git a/packages/vue2-vuetify/src/controls/IntegerControlRenderer.vue b/packages/vue-vuetify/src/controls/IntegerControlRenderer.vue
similarity index 100%
rename from packages/vue2-vuetify/src/controls/IntegerControlRenderer.vue
rename to packages/vue-vuetify/src/controls/IntegerControlRenderer.vue
diff --git a/packages/vue2-vuetify/src/controls/MultiStringControlRenderer.vue b/packages/vue-vuetify/src/controls/MultiStringControlRenderer.vue
similarity index 100%
rename from packages/vue2-vuetify/src/controls/MultiStringControlRenderer.vue
rename to packages/vue-vuetify/src/controls/MultiStringControlRenderer.vue
diff --git a/packages/vue2-vuetify/src/controls/NumberControlRenderer.vue b/packages/vue-vuetify/src/controls/NumberControlRenderer.vue
similarity index 100%
rename from packages/vue2-vuetify/src/controls/NumberControlRenderer.vue
rename to packages/vue-vuetify/src/controls/NumberControlRenderer.vue
diff --git a/packages/vue2-vuetify/src/controls/OneOfEnumControlRenderer.vue b/packages/vue-vuetify/src/controls/OneOfEnumControlRenderer.vue
similarity index 100%
rename from packages/vue2-vuetify/src/controls/OneOfEnumControlRenderer.vue
rename to packages/vue-vuetify/src/controls/OneOfEnumControlRenderer.vue
diff --git a/packages/vue2-vuetify/src/controls/OneOfRadioGroupControlRenderer.vue b/packages/vue-vuetify/src/controls/OneOfRadioGroupControlRenderer.vue
similarity index 100%
rename from packages/vue2-vuetify/src/controls/OneOfRadioGroupControlRenderer.vue
rename to packages/vue-vuetify/src/controls/OneOfRadioGroupControlRenderer.vue
diff --git a/packages/vue2-vuetify/src/controls/PasswordControlRenderer.vue b/packages/vue-vuetify/src/controls/PasswordControlRenderer.vue
similarity index 100%
rename from packages/vue2-vuetify/src/controls/PasswordControlRenderer.vue
rename to packages/vue-vuetify/src/controls/PasswordControlRenderer.vue
diff --git a/packages/vue2-vuetify/src/controls/RadioGroupControlRenderer.vue b/packages/vue-vuetify/src/controls/RadioGroupControlRenderer.vue
similarity index 100%
rename from packages/vue2-vuetify/src/controls/RadioGroupControlRenderer.vue
rename to packages/vue-vuetify/src/controls/RadioGroupControlRenderer.vue
diff --git a/packages/vue2-vuetify/src/controls/SliderControlRenderer.vue b/packages/vue-vuetify/src/controls/SliderControlRenderer.vue
similarity index 100%
rename from packages/vue2-vuetify/src/controls/SliderControlRenderer.vue
rename to packages/vue-vuetify/src/controls/SliderControlRenderer.vue
diff --git a/packages/vue2-vuetify/src/controls/StringControlRenderer.vue b/packages/vue-vuetify/src/controls/StringControlRenderer.vue
similarity index 100%
rename from packages/vue2-vuetify/src/controls/StringControlRenderer.vue
rename to packages/vue-vuetify/src/controls/StringControlRenderer.vue
diff --git a/packages/vue2-vuetify/src/controls/StringMaskControlRenderer.vue b/packages/vue-vuetify/src/controls/StringMaskControlRenderer.vue
similarity index 100%
rename from packages/vue2-vuetify/src/controls/StringMaskControlRenderer.vue
rename to packages/vue-vuetify/src/controls/StringMaskControlRenderer.vue
diff --git a/packages/vue2-vuetify/src/controls/TimeControlRenderer.vue b/packages/vue-vuetify/src/controls/TimeControlRenderer.vue
similarity index 100%
rename from packages/vue2-vuetify/src/controls/TimeControlRenderer.vue
rename to packages/vue-vuetify/src/controls/TimeControlRenderer.vue
diff --git a/packages/vue2-vuetify/src/controls/components/ValidationBadge.vue b/packages/vue-vuetify/src/controls/components/ValidationBadge.vue
similarity index 100%
rename from packages/vue2-vuetify/src/controls/components/ValidationBadge.vue
rename to packages/vue-vuetify/src/controls/components/ValidationBadge.vue
diff --git a/packages/vue2-vuetify/src/controls/components/ValidationIcon.vue b/packages/vue-vuetify/src/controls/components/ValidationIcon.vue
similarity index 100%
rename from packages/vue2-vuetify/src/controls/components/ValidationIcon.vue
rename to packages/vue-vuetify/src/controls/components/ValidationIcon.vue
diff --git a/packages/vue2-vuetify/src/controls/components/index.ts b/packages/vue-vuetify/src/controls/components/index.ts
similarity index 100%
rename from packages/vue2-vuetify/src/controls/components/index.ts
rename to packages/vue-vuetify/src/controls/components/index.ts
diff --git a/packages/vue2-vuetify/src/controls/directives/DisabledIconFocus.ts b/packages/vue-vuetify/src/controls/directives/DisabledIconFocus.ts
similarity index 100%
rename from packages/vue2-vuetify/src/controls/directives/DisabledIconFocus.ts
rename to packages/vue-vuetify/src/controls/directives/DisabledIconFocus.ts
diff --git a/packages/vue2-vuetify/src/controls/directives/index.ts b/packages/vue-vuetify/src/controls/directives/index.ts
similarity index 100%
rename from packages/vue2-vuetify/src/controls/directives/index.ts
rename to packages/vue-vuetify/src/controls/directives/index.ts
diff --git a/packages/vue2-vuetify/src/controls/index.ts b/packages/vue-vuetify/src/controls/index.ts
similarity index 100%
rename from packages/vue2-vuetify/src/controls/index.ts
rename to packages/vue-vuetify/src/controls/index.ts
diff --git a/packages/vue2-vuetify/src/extended/AutocompleteEnumControlRenderer.vue b/packages/vue-vuetify/src/extended/AutocompleteEnumControlRenderer.vue
similarity index 100%
rename from packages/vue2-vuetify/src/extended/AutocompleteEnumControlRenderer.vue
rename to packages/vue-vuetify/src/extended/AutocompleteEnumControlRenderer.vue
diff --git a/packages/vue2-vuetify/src/extended/AutocompleteOneOfEnumControlRenderer.vue b/packages/vue-vuetify/src/extended/AutocompleteOneOfEnumControlRenderer.vue
similarity index 100%
rename from packages/vue2-vuetify/src/extended/AutocompleteOneOfEnumControlRenderer.vue
rename to packages/vue-vuetify/src/extended/AutocompleteOneOfEnumControlRenderer.vue
diff --git a/packages/vue2-vuetify/src/extended/index.ts b/packages/vue-vuetify/src/extended/index.ts
similarity index 100%
rename from packages/vue2-vuetify/src/extended/index.ts
rename to packages/vue-vuetify/src/extended/index.ts
diff --git a/packages/vue2-vuetify/src/index.ts b/packages/vue-vuetify/src/index.ts
similarity index 100%
rename from packages/vue2-vuetify/src/index.ts
rename to packages/vue-vuetify/src/index.ts
diff --git a/packages/vue2-vuetify/src/layouts/ArrayLayoutRenderer.vue b/packages/vue-vuetify/src/layouts/ArrayLayoutRenderer.vue
similarity index 100%
rename from packages/vue2-vuetify/src/layouts/ArrayLayoutRenderer.vue
rename to packages/vue-vuetify/src/layouts/ArrayLayoutRenderer.vue
diff --git a/packages/vue2-vuetify/src/layouts/CategorizationRenderer.vue b/packages/vue-vuetify/src/layouts/CategorizationRenderer.vue
similarity index 100%
rename from packages/vue2-vuetify/src/layouts/CategorizationRenderer.vue
rename to packages/vue-vuetify/src/layouts/CategorizationRenderer.vue
diff --git a/packages/vue2-vuetify/src/layouts/CategorizationStepperRenderer.vue b/packages/vue-vuetify/src/layouts/CategorizationStepperRenderer.vue
similarity index 100%
rename from packages/vue2-vuetify/src/layouts/CategorizationStepperRenderer.vue
rename to packages/vue-vuetify/src/layouts/CategorizationStepperRenderer.vue
diff --git a/packages/vue2-vuetify/src/layouts/GroupRenderer.vue b/packages/vue-vuetify/src/layouts/GroupRenderer.vue
similarity index 100%
rename from packages/vue2-vuetify/src/layouts/GroupRenderer.vue
rename to packages/vue-vuetify/src/layouts/GroupRenderer.vue
diff --git a/packages/vue2-vuetify/src/layouts/HorizontalLayoutRenderer.vue b/packages/vue-vuetify/src/layouts/HorizontalLayoutRenderer.vue
similarity index 100%
rename from packages/vue2-vuetify/src/layouts/HorizontalLayoutRenderer.vue
rename to packages/vue-vuetify/src/layouts/HorizontalLayoutRenderer.vue
diff --git a/packages/vue2-vuetify/src/layouts/VerticalLayoutRenderer.vue b/packages/vue-vuetify/src/layouts/VerticalLayoutRenderer.vue
similarity index 100%
rename from packages/vue2-vuetify/src/layouts/VerticalLayoutRenderer.vue
rename to packages/vue-vuetify/src/layouts/VerticalLayoutRenderer.vue
diff --git a/packages/vue2-vuetify/src/layouts/index.ts b/packages/vue-vuetify/src/layouts/index.ts
similarity index 100%
rename from packages/vue2-vuetify/src/layouts/index.ts
rename to packages/vue-vuetify/src/layouts/index.ts
diff --git a/packages/vue2-vuetify/src/renderers.ts b/packages/vue-vuetify/src/renderers.ts
similarity index 100%
rename from packages/vue2-vuetify/src/renderers.ts
rename to packages/vue-vuetify/src/renderers.ts
diff --git a/packages/vue2-vuetify/src/styles/defaultStyles.ts b/packages/vue-vuetify/src/styles/defaultStyles.ts
similarity index 100%
rename from packages/vue2-vuetify/src/styles/defaultStyles.ts
rename to packages/vue-vuetify/src/styles/defaultStyles.ts
diff --git a/packages/vue2-vuetify/src/styles/index.ts b/packages/vue-vuetify/src/styles/index.ts
similarity index 100%
rename from packages/vue2-vuetify/src/styles/index.ts
rename to packages/vue-vuetify/src/styles/index.ts
diff --git a/packages/vue2-vuetify/src/styles/styles.ts b/packages/vue-vuetify/src/styles/styles.ts
similarity index 100%
rename from packages/vue2-vuetify/src/styles/styles.ts
rename to packages/vue-vuetify/src/styles/styles.ts
diff --git a/packages/vue2-vuetify/src/styles/util.ts b/packages/vue-vuetify/src/styles/util.ts
similarity index 100%
rename from packages/vue2-vuetify/src/styles/util.ts
rename to packages/vue-vuetify/src/styles/util.ts
diff --git a/packages/vue2-vuetify/src/util/composition.ts b/packages/vue-vuetify/src/util/composition.ts
similarity index 100%
rename from packages/vue2-vuetify/src/util/composition.ts
rename to packages/vue-vuetify/src/util/composition.ts
diff --git a/packages/vue2-vuetify/src/util/datejs.ts b/packages/vue-vuetify/src/util/datejs.ts
similarity index 100%
rename from packages/vue2-vuetify/src/util/datejs.ts
rename to packages/vue-vuetify/src/util/datejs.ts
diff --git a/packages/vue2-vuetify/src/util/i18nDefaultMessages.ts b/packages/vue-vuetify/src/util/i18nDefaultMessages.ts
similarity index 100%
rename from packages/vue2-vuetify/src/util/i18nDefaultMessages.ts
rename to packages/vue-vuetify/src/util/i18nDefaultMessages.ts
diff --git a/packages/vue2-vuetify/src/util/index.ts b/packages/vue-vuetify/src/util/index.ts
similarity index 100%
rename from packages/vue2-vuetify/src/util/index.ts
rename to packages/vue-vuetify/src/util/index.ts
diff --git a/packages/vue2-vuetify/src/util/options.ts b/packages/vue-vuetify/src/util/options.ts
similarity index 100%
rename from packages/vue2-vuetify/src/util/options.ts
rename to packages/vue-vuetify/src/util/options.ts
diff --git a/packages/vue2-vuetify/src/util/validator.ts b/packages/vue-vuetify/src/util/validator.ts
similarity index 100%
rename from packages/vue2-vuetify/src/util/validator.ts
rename to packages/vue-vuetify/src/util/validator.ts
diff --git a/packages/vue2-vuetify/tests/index.ts b/packages/vue-vuetify/tests/index.ts
similarity index 100%
rename from packages/vue2-vuetify/tests/index.ts
rename to packages/vue-vuetify/tests/index.ts
diff --git a/packages/vue2-vuetify/tests/unit/additional/LabelRenderer.spec.ts b/packages/vue-vuetify/tests/unit/additional/LabelRenderer.spec.ts
similarity index 100%
rename from packages/vue2-vuetify/tests/unit/additional/LabelRenderer.spec.ts
rename to packages/vue-vuetify/tests/unit/additional/LabelRenderer.spec.ts
diff --git a/packages/vue2-vuetify/tests/unit/additional/__snapshots__/LabelRenderer.spec.ts.snap b/packages/vue-vuetify/tests/unit/additional/__snapshots__/LabelRenderer.spec.ts.snap
similarity index 100%
rename from packages/vue2-vuetify/tests/unit/additional/__snapshots__/LabelRenderer.spec.ts.snap
rename to packages/vue-vuetify/tests/unit/additional/__snapshots__/LabelRenderer.spec.ts.snap
diff --git a/packages/vue2-vuetify/tests/unit/controls/BooleanControlRenderer.spec.ts b/packages/vue-vuetify/tests/unit/controls/BooleanControlRenderer.spec.ts
similarity index 100%
rename from packages/vue2-vuetify/tests/unit/controls/BooleanControlRenderer.spec.ts
rename to packages/vue-vuetify/tests/unit/controls/BooleanControlRenderer.spec.ts
diff --git a/packages/vue2-vuetify/tests/unit/controls/DateControlRenderer.spec.ts b/packages/vue-vuetify/tests/unit/controls/DateControlRenderer.spec.ts
similarity index 100%
rename from packages/vue2-vuetify/tests/unit/controls/DateControlRenderer.spec.ts
rename to packages/vue-vuetify/tests/unit/controls/DateControlRenderer.spec.ts
diff --git a/packages/vue2-vuetify/tests/unit/controls/DateTimeControlRenderer.spec.ts b/packages/vue-vuetify/tests/unit/controls/DateTimeControlRenderer.spec.ts
similarity index 100%
rename from packages/vue2-vuetify/tests/unit/controls/DateTimeControlRenderer.spec.ts
rename to packages/vue-vuetify/tests/unit/controls/DateTimeControlRenderer.spec.ts
diff --git a/packages/vue2-vuetify/tests/unit/controls/EnumControlRenderer.spec.ts b/packages/vue-vuetify/tests/unit/controls/EnumControlRenderer.spec.ts
similarity index 100%
rename from packages/vue2-vuetify/tests/unit/controls/EnumControlRenderer.spec.ts
rename to packages/vue-vuetify/tests/unit/controls/EnumControlRenderer.spec.ts
diff --git a/packages/vue2-vuetify/tests/unit/controls/IntegerControlRenderer.spec.ts b/packages/vue-vuetify/tests/unit/controls/IntegerControlRenderer.spec.ts
similarity index 100%
rename from packages/vue2-vuetify/tests/unit/controls/IntegerControlRenderer.spec.ts
rename to packages/vue-vuetify/tests/unit/controls/IntegerControlRenderer.spec.ts
diff --git a/packages/vue2-vuetify/tests/unit/controls/MultiStringControlRenderer.spec.ts b/packages/vue-vuetify/tests/unit/controls/MultiStringControlRenderer.spec.ts
similarity index 100%
rename from packages/vue2-vuetify/tests/unit/controls/MultiStringControlRenderer.spec.ts
rename to packages/vue-vuetify/tests/unit/controls/MultiStringControlRenderer.spec.ts
diff --git a/packages/vue2-vuetify/tests/unit/controls/NumberControlRenderer.spec.ts b/packages/vue-vuetify/tests/unit/controls/NumberControlRenderer.spec.ts
similarity index 100%
rename from packages/vue2-vuetify/tests/unit/controls/NumberControlRenderer.spec.ts
rename to packages/vue-vuetify/tests/unit/controls/NumberControlRenderer.spec.ts
diff --git a/packages/vue2-vuetify/tests/unit/controls/OneOfEnumControlRenderer.spec.ts b/packages/vue-vuetify/tests/unit/controls/OneOfEnumControlRenderer.spec.ts
similarity index 100%
rename from packages/vue2-vuetify/tests/unit/controls/OneOfEnumControlRenderer.spec.ts
rename to packages/vue-vuetify/tests/unit/controls/OneOfEnumControlRenderer.spec.ts
diff --git a/packages/vue2-vuetify/tests/unit/controls/StringControlRenderer.spec.ts b/packages/vue-vuetify/tests/unit/controls/StringControlRenderer.spec.ts
similarity index 100%
rename from packages/vue2-vuetify/tests/unit/controls/StringControlRenderer.spec.ts
rename to packages/vue-vuetify/tests/unit/controls/StringControlRenderer.spec.ts
diff --git a/packages/vue2-vuetify/tests/unit/controls/TimeControlRenderer.spec.ts b/packages/vue-vuetify/tests/unit/controls/TimeControlRenderer.spec.ts
similarity index 100%
rename from packages/vue2-vuetify/tests/unit/controls/TimeControlRenderer.spec.ts
rename to packages/vue-vuetify/tests/unit/controls/TimeControlRenderer.spec.ts
diff --git a/packages/vue2-vuetify/tests/unit/controls/__snapshots__/BooleanControlRenderer.spec.ts.snap b/packages/vue-vuetify/tests/unit/controls/__snapshots__/BooleanControlRenderer.spec.ts.snap
similarity index 100%
rename from packages/vue2-vuetify/tests/unit/controls/__snapshots__/BooleanControlRenderer.spec.ts.snap
rename to packages/vue-vuetify/tests/unit/controls/__snapshots__/BooleanControlRenderer.spec.ts.snap
diff --git a/packages/vue2-vuetify/tests/unit/controls/__snapshots__/DateControlRenderer.spec.ts.snap b/packages/vue-vuetify/tests/unit/controls/__snapshots__/DateControlRenderer.spec.ts.snap
similarity index 100%
rename from packages/vue2-vuetify/tests/unit/controls/__snapshots__/DateControlRenderer.spec.ts.snap
rename to packages/vue-vuetify/tests/unit/controls/__snapshots__/DateControlRenderer.spec.ts.snap
diff --git a/packages/vue2-vuetify/tests/unit/controls/__snapshots__/DateTimeControlRenderer.spec.ts.snap b/packages/vue-vuetify/tests/unit/controls/__snapshots__/DateTimeControlRenderer.spec.ts.snap
similarity index 100%
rename from packages/vue2-vuetify/tests/unit/controls/__snapshots__/DateTimeControlRenderer.spec.ts.snap
rename to packages/vue-vuetify/tests/unit/controls/__snapshots__/DateTimeControlRenderer.spec.ts.snap
diff --git a/packages/vue2-vuetify/tests/unit/controls/__snapshots__/EnumControlRenderer.spec.ts.snap b/packages/vue-vuetify/tests/unit/controls/__snapshots__/EnumControlRenderer.spec.ts.snap
similarity index 100%
rename from packages/vue2-vuetify/tests/unit/controls/__snapshots__/EnumControlRenderer.spec.ts.snap
rename to packages/vue-vuetify/tests/unit/controls/__snapshots__/EnumControlRenderer.spec.ts.snap
diff --git a/packages/vue2-vuetify/tests/unit/controls/__snapshots__/IntegerControlRenderer.spec.ts.snap b/packages/vue-vuetify/tests/unit/controls/__snapshots__/IntegerControlRenderer.spec.ts.snap
similarity index 100%
rename from packages/vue2-vuetify/tests/unit/controls/__snapshots__/IntegerControlRenderer.spec.ts.snap
rename to packages/vue-vuetify/tests/unit/controls/__snapshots__/IntegerControlRenderer.spec.ts.snap
diff --git a/packages/vue2-vuetify/tests/unit/controls/__snapshots__/MultiStringControlRenderer.spec.ts.snap b/packages/vue-vuetify/tests/unit/controls/__snapshots__/MultiStringControlRenderer.spec.ts.snap
similarity index 100%
rename from packages/vue2-vuetify/tests/unit/controls/__snapshots__/MultiStringControlRenderer.spec.ts.snap
rename to packages/vue-vuetify/tests/unit/controls/__snapshots__/MultiStringControlRenderer.spec.ts.snap
diff --git a/packages/vue2-vuetify/tests/unit/controls/__snapshots__/NumberControlRenderer.spec.ts.snap b/packages/vue-vuetify/tests/unit/controls/__snapshots__/NumberControlRenderer.spec.ts.snap
similarity index 100%
rename from packages/vue2-vuetify/tests/unit/controls/__snapshots__/NumberControlRenderer.spec.ts.snap
rename to packages/vue-vuetify/tests/unit/controls/__snapshots__/NumberControlRenderer.spec.ts.snap
diff --git a/packages/vue2-vuetify/tests/unit/controls/__snapshots__/OneOfEnumControlRenderer.spec.ts.snap b/packages/vue-vuetify/tests/unit/controls/__snapshots__/OneOfEnumControlRenderer.spec.ts.snap
similarity index 100%
rename from packages/vue2-vuetify/tests/unit/controls/__snapshots__/OneOfEnumControlRenderer.spec.ts.snap
rename to packages/vue-vuetify/tests/unit/controls/__snapshots__/OneOfEnumControlRenderer.spec.ts.snap
diff --git a/packages/vue2-vuetify/tests/unit/controls/__snapshots__/StringControlRenderer.spec.ts.snap b/packages/vue-vuetify/tests/unit/controls/__snapshots__/StringControlRenderer.spec.ts.snap
similarity index 100%
rename from packages/vue2-vuetify/tests/unit/controls/__snapshots__/StringControlRenderer.spec.ts.snap
rename to packages/vue-vuetify/tests/unit/controls/__snapshots__/StringControlRenderer.spec.ts.snap
diff --git a/packages/vue2-vuetify/tests/unit/controls/__snapshots__/TimeControlRenderer.spec.ts.snap b/packages/vue-vuetify/tests/unit/controls/__snapshots__/TimeControlRenderer.spec.ts.snap
similarity index 100%
rename from packages/vue2-vuetify/tests/unit/controls/__snapshots__/TimeControlRenderer.spec.ts.snap
rename to packages/vue-vuetify/tests/unit/controls/__snapshots__/TimeControlRenderer.spec.ts.snap
diff --git a/packages/vue2-vuetify/tests/unit/util/TestComponent.vue b/packages/vue-vuetify/tests/unit/util/TestComponent.vue
similarity index 100%
rename from packages/vue2-vuetify/tests/unit/util/TestComponent.vue
rename to packages/vue-vuetify/tests/unit/util/TestComponent.vue
diff --git a/packages/vue2-vuetify/tests/unit/util/index.ts b/packages/vue-vuetify/tests/unit/util/index.ts
similarity index 100%
rename from packages/vue2-vuetify/tests/unit/util/index.ts
rename to packages/vue-vuetify/tests/unit/util/index.ts
diff --git a/packages/vue2-vuetify/tests/unit/util/util.ts b/packages/vue-vuetify/tests/unit/util/util.ts
similarity index 100%
rename from packages/vue2-vuetify/tests/unit/util/util.ts
rename to packages/vue-vuetify/tests/unit/util/util.ts
diff --git a/packages/vue2-vuetify/tsconfig.compile.json b/packages/vue-vuetify/tsconfig.compile.json
similarity index 100%
rename from packages/vue2-vuetify/tsconfig.compile.json
rename to packages/vue-vuetify/tsconfig.compile.json
diff --git a/packages/vue2-vuetify/tsconfig.json b/packages/vue-vuetify/tsconfig.json
similarity index 100%
rename from packages/vue2-vuetify/tsconfig.json
rename to packages/vue-vuetify/tsconfig.json
diff --git a/packages/vue2-vuetify/shims-v-mask.d.ts b/packages/vue2-vuetify/shims-v-mask.d.ts
deleted file mode 100644
index 96f69e8a03..0000000000
--- a/packages/vue2-vuetify/shims-v-mask.d.ts
+++ /dev/null
@@ -1,8 +0,0 @@
-declare module 'v-mask' {
- export {
- plugin as default,
- plugin as VueMaskPlugin,
- filter as VueMaskFilter,
- directive as VueMaskDirective,
- };
-}
diff --git a/packages/vue2-vuetify/shims-vue.d.ts b/packages/vue2-vuetify/shims-vue.d.ts
deleted file mode 100644
index 0f6bf2520c..0000000000
--- a/packages/vue2-vuetify/shims-vue.d.ts
+++ /dev/null
@@ -1,5 +0,0 @@
-declare module '*.vue' {
- import Vue from 'vue';
- export default Vue;
- export const entry;
-}
From 02d8b2c0aec49fe9268b2509aeaf6082182a8285 Mon Sep 17 00:00:00 2001
From: Stefan Dirix
Date: Mon, 3 Apr 2023 09:07:54 +0200
Subject: [PATCH 066/185] Adapt vue-vuetify to Vue 3 and Vuetify 3
- switch to @jsonforms/vue
- import Vuetify components from 'vuetify/components' instead of 'vuetify/lib'
- replace 'VExpansionPanelHeader/Content' with 'VExpansionPanelTitle/Text'
- replace 'VTabsItem/s' with 'VWindow/Item'
- replace 'VSimpleTable' with 'VTable'
- replace ':value' and '@input' with 'model-value' and '@update:model-value'
- replace ':item-text' with ':item-title' for lists
- remove date/time pickers
- remove mask integration including mask renderer
- remove ListWithDetail renderer for now
- adapt DisabledIconFocus for Vue 3
- replace outdated rollup-plugin-styles with rollup-plugin-css-only
- update rollup-plugin-typescript2
- adapt Vue target
---
packages/vue-vuetify/.eslintrc.js | 2 +-
packages/vue-vuetify/package.json | 4 +-
packages/vue-vuetify/rollup.config.mjs | 13 ++--
packages/vue-vuetify/shims-vuetify.d.ts | 4 --
.../src/additional/LabelRenderer.vue | 4 +-
.../src/additional/ListWithDetailRenderer.vue | 12 ++--
packages/vue-vuetify/src/additional/index.ts | 6 +-
.../vue-vuetify/src/complex/AllOfRenderer.vue | 2 +-
.../vue-vuetify/src/complex/AnyOfRenderer.vue | 16 ++---
.../src/complex/ArrayControlRenderer.vue | 20 +++---
.../src/complex/EnumArrayRenderer.vue | 4 +-
.../src/complex/ObjectRenderer.vue | 2 +-
.../vue-vuetify/src/complex/OneOfRenderer.vue | 6 +-
.../src/complex/OneOfTabRenderer.vue | 20 +++---
.../components/AdditionalProperties.vue | 4 +-
.../components/CombinatorProperties.vue | 2 +-
.../AnyOfStringOrEnumControlRenderer.vue | 6 +-
.../src/controls/BooleanControlRenderer.vue | 6 +-
.../controls/BooleanToggleControlRenderer.vue | 6 +-
.../src/controls/DateControlRenderer.vue | 26 ++++----
.../src/controls/DateTimeControlRenderer.vue | 62 +++++++++----------
.../src/controls/EnumControlRenderer.vue | 8 +--
.../src/controls/IntegerControlRenderer.vue | 8 +--
.../controls/MultiStringControlRenderer.vue | 8 +--
.../src/controls/NumberControlRenderer.vue | 8 +--
.../src/controls/OneOfEnumControlRenderer.vue | 8 +--
.../OneOfRadioGroupControlRenderer.vue | 8 +--
.../src/controls/PasswordControlRenderer.vue | 8 +--
.../controls/RadioGroupControlRenderer.vue | 8 +--
.../src/controls/SliderControlRenderer.vue | 6 +-
.../src/controls/StringControlRenderer.vue | 13 ++--
.../controls/StringMaskControlRenderer.vue | 4 +-
.../src/controls/TimeControlRenderer.vue | 22 +++----
.../controls/components/ValidationBadge.vue | 2 +-
.../controls/components/ValidationIcon.vue | 2 +-
.../controls/directives/DisabledIconFocus.ts | 2 +-
packages/vue-vuetify/src/controls/index.ts | 6 +-
.../AutocompleteEnumControlRenderer.vue | 14 ++---
.../AutocompleteOneOfEnumControlRenderer.vue | 14 ++---
.../src/layouts/ArrayLayoutRenderer.vue | 28 ++++-----
.../src/layouts/CategorizationRenderer.vue | 34 +++++-----
.../layouts/CategorizationStepperRenderer.vue | 13 ++--
.../vue-vuetify/src/layouts/GroupRenderer.vue | 4 +-
.../src/layouts/HorizontalLayoutRenderer.vue | 6 +-
.../src/layouts/VerticalLayoutRenderer.vue | 4 +-
packages/vue-vuetify/src/layouts/index.ts | 8 +--
.../tests/unit/util/TestComponent.vue | 4 +-
packages/vue-vuetify/tsconfig.json | 21 ++-----
48 files changed, 238 insertions(+), 260 deletions(-)
delete mode 100644 packages/vue-vuetify/shims-vuetify.d.ts
diff --git a/packages/vue-vuetify/.eslintrc.js b/packages/vue-vuetify/.eslintrc.js
index 5cd67b8765..d2afcdca38 100644
--- a/packages/vue-vuetify/.eslintrc.js
+++ b/packages/vue-vuetify/.eslintrc.js
@@ -8,7 +8,7 @@ module.exports = {
'eslint:recommended',
'@vue/typescript/recommended',
'@vue/prettier',
- '@vue/prettier/@typescript-eslint',
+ '@vue/eslint-config-prettier',
],
parserOptions: {
ecmaVersion: 2020,
diff --git a/packages/vue-vuetify/package.json b/packages/vue-vuetify/package.json
index 640691bb33..74265421ce 100644
--- a/packages/vue-vuetify/package.json
+++ b/packages/vue-vuetify/package.json
@@ -82,8 +82,8 @@
"rimraf": "^4.4.1",
"rollup": "^3.20.2",
"rollup-plugin-cleanup": "^3.2.1",
- "rollup-plugin-styles": "^4.0.0",
- "rollup-plugin-typescript2": "^0.30.0",
+ "rollup-plugin-css-only": "^4.3.0",
+ "rollup-plugin-typescript2": "^0.34.1",
"rollup-plugin-visualizer": "^5.5.2",
"rollup-plugin-vue": "^6.0.0",
"typescript": "~4.5.5",
diff --git a/packages/vue-vuetify/rollup.config.mjs b/packages/vue-vuetify/rollup.config.mjs
index ce5e8985be..08119551e9 100644
--- a/packages/vue-vuetify/rollup.config.mjs
+++ b/packages/vue-vuetify/rollup.config.mjs
@@ -4,7 +4,7 @@ import typescript from 'rollup-plugin-typescript2';
import resolve from '@rollup/plugin-node-resolve';
import cleanup from 'rollup-plugin-cleanup';
import { visualizer } from 'rollup-plugin-visualizer';
-import styles from 'rollup-plugin-styles';
+import css from 'rollup-plugin-css-only';
import packageJson from './package.json' assert { type: 'json' };
@@ -14,7 +14,7 @@ const baseConfig = {
...Object.keys(packageJson.dependencies),
...Object.keys(packageJson.peerDependencies),
/^lodash\/.*/,
- 'vuetify/lib',
+ 'vuetify/components',
'@mdi/font',
/^dayjs\/.*/,
],
@@ -33,8 +33,8 @@ const buildFormats = [
resolve({
extensions: ['.js', '.jsx', '.ts', '.tsx', '.vue'],
}),
- styles({
- mode: ['extract'],
+ css({
+ output: `${packageJson.module.split('/')[1].split('.')[0]}.esm.css`,
}),
vue({
css: false,
@@ -70,8 +70,8 @@ const buildFormats = [
resolve({
extensions: ['.js', '.jsx', '.ts', '.tsx', '.vue'],
}),
- styles({
- mode: ['extract'],
+ css({
+ output: `${packageJson.module.split('/')[1].split('.')[0]}.cjs.css`,
}),
vue({
css: false,
@@ -95,6 +95,7 @@ const buildFormats = [
babelHelpers: 'bundled',
}),
cleanup({ extensions: ['js', 'ts', 'jsx', 'tsx', 'vue'] }),
+ css(),
],
},
];
diff --git a/packages/vue-vuetify/shims-vuetify.d.ts b/packages/vue-vuetify/shims-vuetify.d.ts
deleted file mode 100644
index d46f853907..0000000000
--- a/packages/vue-vuetify/shims-vuetify.d.ts
+++ /dev/null
@@ -1,4 +0,0 @@
-declare module 'vuetify/lib/framework' {
- import Vuetify from 'vuetify';
- export default Vuetify;
-}
diff --git a/packages/vue-vuetify/src/additional/LabelRenderer.vue b/packages/vue-vuetify/src/additional/LabelRenderer.vue
index 4e07b36eae..163385ff8e 100644
--- a/packages/vue-vuetify/src/additional/LabelRenderer.vue
+++ b/packages/vue-vuetify/src/additional/LabelRenderer.vue
@@ -21,8 +21,8 @@ import {
rendererProps,
RendererProps,
useJsonFormsLabel,
-} from '@jsonforms/vue2';
-import { VLabel } from 'vuetify/lib';
+} from '@jsonforms/vue';
+import { VLabel } from 'vuetify/components';
import { useVuetifyLabel } from '../util';
const labelRenderer = defineComponent({
diff --git a/packages/vue-vuetify/src/additional/ListWithDetailRenderer.vue b/packages/vue-vuetify/src/additional/ListWithDetailRenderer.vue
index 057865ae81..2b8a791cef 100644
--- a/packages/vue-vuetify/src/additional/ListWithDetailRenderer.vue
+++ b/packages/vue-vuetify/src/additional/ListWithDetailRenderer.vue
@@ -210,7 +210,7 @@ import {
rendererProps,
RendererProps,
useJsonFormsArrayControl,
-} from '@jsonforms/vue2';
+} from '@jsonforms/vue';
import { useVuetifyArrayControl } from '../util';
import {
VList,
@@ -232,10 +232,10 @@ import {
VSpacer,
VExpansionPanels,
VExpansionPanel,
- VExpansionPanelHeader,
- VExpansionPanelContent,
+ VExpansionPanelTitle,
+ VExpansionPanelText,
VVirtualScroll,
-} from 'vuetify/lib';
+} from 'vuetify/components';
import { ValidationIcon, ValidationBadge } from '../controls/components/index';
import { ErrorObject } from 'ajv';
@@ -261,8 +261,8 @@ const controlRenderer = defineComponent({
VSpacer,
VExpansionPanels,
VExpansionPanel,
- VExpansionPanelHeader,
- VExpansionPanelContent,
+ VExpansionPanelTitle,
+ VExpansionPanelText,
VContainer,
VVirtualScroll,
ValidationIcon,
diff --git a/packages/vue-vuetify/src/additional/index.ts b/packages/vue-vuetify/src/additional/index.ts
index 8ae994c211..873c9e179a 100644
--- a/packages/vue-vuetify/src/additional/index.ts
+++ b/packages/vue-vuetify/src/additional/index.ts
@@ -1,10 +1,10 @@
export { default as LabelRenderer } from './LabelRenderer.vue';
-export { default as ListWithDetailRenderer } from './ListWithDetailRenderer.vue';
+// export { default as ListWithDetailRenderer } from './ListWithDetailRenderer.vue';
import { entry as labelRendererEntry } from './LabelRenderer.vue';
-import { entry as listWithDetailRendererEntry } from './ListWithDetailRenderer.vue';
+// import { entry as listWithDetailRendererEntry } from './ListWithDetailRenderer.vue';
export const additionalRenderers = [
labelRendererEntry,
- listWithDetailRendererEntry,
+ // listWithDetailRendererEntry,
];
diff --git a/packages/vue-vuetify/src/complex/AllOfRenderer.vue b/packages/vue-vuetify/src/complex/AllOfRenderer.vue
index 8bebb12914..09dd980743 100644
--- a/packages/vue-vuetify/src/complex/AllOfRenderer.vue
+++ b/packages/vue-vuetify/src/complex/AllOfRenderer.vue
@@ -48,7 +48,7 @@ import {
rendererProps,
RendererProps,
useJsonFormsAllOfControl,
-} from '@jsonforms/vue2';
+} from '@jsonforms/vue';
import { defineComponent } from 'vue';
import { useVuetifyControl } from '../util';
import { CombinatorProperties } from './components';
diff --git a/packages/vue-vuetify/src/complex/AnyOfRenderer.vue b/packages/vue-vuetify/src/complex/AnyOfRenderer.vue
index 2302e45c76..8521f71c16 100644
--- a/packages/vue-vuetify/src/complex/AnyOfRenderer.vue
+++ b/packages/vue-vuetify/src/complex/AnyOfRenderer.vue
@@ -15,8 +15,8 @@
-
-
+
@@ -29,8 +29,8 @@
:cells="control.cells"
:enabled="control.enabled"
/>
-
-
+
+
@@ -48,8 +48,8 @@ import {
rendererProps,
RendererProps,
useJsonFormsAnyOfControl,
-} from '@jsonforms/vue2';
-import { VTabs, VTab, VTabsItems, VTabItem } from 'vuetify/lib';
+} from '@jsonforms/vue';
+import { VTabs, VTab, VWindow, VWindowItem } from 'vuetify/components';
import { defineComponent, ref } from 'vue';
import { useVuetifyControl } from '../util';
import { CombinatorProperties } from './components';
@@ -61,8 +61,8 @@ const controlRenderer = defineComponent({
CombinatorProperties,
VTabs,
VTab,
- VTabsItems,
- VTabItem,
+ VWindow,
+ VWindowItem,
},
props: {
...rendererProps(),
diff --git a/packages/vue-vuetify/src/complex/ArrayControlRenderer.vue b/packages/vue-vuetify/src/complex/ArrayControlRenderer.vue
index 89effc71f9..4d6efa5f2b 100644
--- a/packages/vue-vuetify/src/complex/ArrayControlRenderer.vue
+++ b/packages/vue-vuetify/src/complex/ArrayControlRenderer.vue
@@ -40,7 +40,7 @@
-
+
-
+
@@ -189,7 +189,7 @@ import {
rendererProps,
useJsonFormsArrayControl,
RendererProps,
-} from '@jsonforms/vue2';
+} from '@jsonforms/vue';
import { useVuetifyArrayControl } from '../util';
import {
VCard,
@@ -205,8 +205,8 @@ import {
VBtn,
VAvatar,
VSpacer,
- VSimpleTable,
-} from 'vuetify/lib';
+ VTable,
+} from 'vuetify/components';
import { ValidationIcon, ValidationBadge } from '../controls/components/index';
const controlRenderer = defineComponent({
@@ -229,7 +229,7 @@ const controlRenderer = defineComponent({
VContainer,
ValidationIcon,
ValidationBadge,
- VSimpleTable,
+ VTable,
},
props: {
...rendererProps(),
@@ -305,21 +305,21 @@ export const entry: JsonFormsRendererRegistryEntry = {
+ -->
diff --git a/packages/vue-vuetify/src/controls/EnumControlRenderer.vue b/packages/vue-vuetify/src/controls/EnumControlRenderer.vue
index e1c640b243..567b7aaacd 100644
--- a/packages/vue-vuetify/src/controls/EnumControlRenderer.vue
+++ b/packages/vue-vuetify/src/controls/EnumControlRenderer.vue
@@ -19,9 +19,9 @@
:required="control.required"
:error-messages="control.errors"
:clearable="hover"
- :value="control.data"
+ :model-value="control.data"
:items="control.options"
- :item-text="(item) => t(item.label, item.label)"
+ :item-title="(item) => t(item.label, item.label)"
item-value="value"
v-bind="vuetifyProps('v-select')"
@change="onChange"
@@ -43,9 +43,9 @@ import {
rendererProps,
RendererProps,
useJsonFormsEnumControl,
-} from '@jsonforms/vue2';
+} from '@jsonforms/vue';
import { defineComponent } from 'vue';
-import { VHover, VSelect } from 'vuetify/lib';
+import { VHover, VSelect } from 'vuetify/components';
import { useTranslator, useVuetifyControl } from '../util';
import { default as ControlWrapper } from './ControlWrapper.vue';
import { DisabledIconFocus } from './directives';
diff --git a/packages/vue-vuetify/src/controls/IntegerControlRenderer.vue b/packages/vue-vuetify/src/controls/IntegerControlRenderer.vue
index 2c41856607..b7ee88e001 100644
--- a/packages/vue-vuetify/src/controls/IntegerControlRenderer.vue
+++ b/packages/vue-vuetify/src/controls/IntegerControlRenderer.vue
@@ -19,10 +19,10 @@
:persistent-hint="persistentHint()"
:required="control.required"
:error-messages="control.errors"
- :value="inputValue"
+ :model-value="inputValue"
:clearable="hover"
v-bind="vuetifyProps('v-text-field')"
- @input="onInputChange"
+ @update:model-value="onInputChange"
@focus="isFocused = true"
@blur="isFocused = false"
>
@@ -42,10 +42,10 @@ import {
rendererProps,
useJsonFormsControl,
RendererProps,
-} from '@jsonforms/vue2';
+} from '@jsonforms/vue';
import { default as ControlWrapper } from './ControlWrapper.vue';
import { useVuetifyControl } from '../util';
-import { VHover, VTextField } from 'vuetify/lib';
+import { VHover, VTextField } from 'vuetify/components';
const NUMBER_REGEX_TEST = /^[+-]?\d+([.]\d+)?([eE][+-]?\d+)?$/;
diff --git a/packages/vue-vuetify/src/controls/MultiStringControlRenderer.vue b/packages/vue-vuetify/src/controls/MultiStringControlRenderer.vue
index 47e89334b1..3e6f573eb4 100644
--- a/packages/vue-vuetify/src/controls/MultiStringControlRenderer.vue
+++ b/packages/vue-vuetify/src/controls/MultiStringControlRenderer.vue
@@ -18,7 +18,7 @@
:persistent-hint="persistentHint()"
:required="control.required"
:error-messages="control.errors"
- :value="control.data"
+ :model-value="control.data"
:maxlength="
appliedOptions.restrict ? control.schema.maxLength : undefined
"
@@ -30,7 +30,7 @@
:clearable="hover"
multi-line
v-bind="vuetifyProps('v-textarea')"
- @input="onChange"
+ @update:model-value="onChange"
@focus="isFocused = true"
@blur="isFocused = false"
/>
@@ -52,10 +52,10 @@ import {
rendererProps,
useJsonFormsControl,
RendererProps,
-} from '@jsonforms/vue2';
+} from '@jsonforms/vue';
import { default as ControlWrapper } from './ControlWrapper.vue';
import { useVuetifyControl } from '../util';
-import { VHover, VTextarea } from 'vuetify/lib';
+import { VHover, VTextarea } from 'vuetify/components';
import { DisabledIconFocus } from './directives';
const controlRenderer = defineComponent({
diff --git a/packages/vue-vuetify/src/controls/NumberControlRenderer.vue b/packages/vue-vuetify/src/controls/NumberControlRenderer.vue
index ccd6155746..ed66e6884d 100644
--- a/packages/vue-vuetify/src/controls/NumberControlRenderer.vue
+++ b/packages/vue-vuetify/src/controls/NumberControlRenderer.vue
@@ -19,10 +19,10 @@
:persistent-hint="persistentHint()"
:required="control.required"
:error-messages="control.errors"
- :value="inputValue"
+ :model-value="inputValue"
:clearable="hover"
v-bind="vuetifyProps('v-text-field')"
- @input="onInputChange"
+ @update:model-value="onInputChange"
@focus="isFocused = true"
@blur="isFocused = false"
>
@@ -42,10 +42,10 @@ import {
rendererProps,
useJsonFormsControl,
RendererProps,
-} from '@jsonforms/vue2';
+} from '@jsonforms/vue';
import { default as ControlWrapper } from './ControlWrapper.vue';
import { useVuetifyControl } from '../util';
-import { VHover, VTextField } from 'vuetify/lib';
+import { VHover, VTextField } from 'vuetify/components';
const NUMBER_REGEX_TEST = /^[+-]?\d+([.]\d+)?([eE][+-]?\d+)?$/;
diff --git a/packages/vue-vuetify/src/controls/OneOfEnumControlRenderer.vue b/packages/vue-vuetify/src/controls/OneOfEnumControlRenderer.vue
index c9f3ee6046..08b883ef2c 100644
--- a/packages/vue-vuetify/src/controls/OneOfEnumControlRenderer.vue
+++ b/packages/vue-vuetify/src/controls/OneOfEnumControlRenderer.vue
@@ -19,9 +19,9 @@
:required="control.required"
:error-messages="control.errors"
:clearable="hover"
- :value="control.data"
+ :model-value="control.data"
:items="control.options"
- :item-text="(item) => t(item.label, item.label)"
+ :item-title="(item) => t(item.label, item.label)"
item-value="value"
v-bind="vuetifyProps('v-select')"
@change="onChange"
@@ -43,9 +43,9 @@ import {
rendererProps,
RendererProps,
useJsonFormsOneOfEnumControl,
-} from '@jsonforms/vue2';
+} from '@jsonforms/vue';
import { defineComponent } from 'vue';
-import { VHover, VSelect } from 'vuetify/lib';
+import { VHover, VSelect } from 'vuetify/components';
import { useTranslator, useVuetifyControl } from '../util';
import { default as ControlWrapper } from './ControlWrapper.vue';
import { DisabledIconFocus } from './directives';
diff --git a/packages/vue-vuetify/src/controls/OneOfRadioGroupControlRenderer.vue b/packages/vue-vuetify/src/controls/OneOfRadioGroupControlRenderer.vue
index 55393ad948..136ddafd35 100644
--- a/packages/vue-vuetify/src/controls/OneOfRadioGroupControlRenderer.vue
+++ b/packages/vue-vuetify/src/controls/OneOfRadioGroupControlRenderer.vue
@@ -19,7 +19,7 @@
:required="control.required"
:error-messages="control.errors"
v-bind="vuetifyProps('v-radio-group')"
- :value="control.data"
+ :model-value="control.data"
@change="onChange"
@focus="isFocused = true"
@blur="isFocused = false"
@@ -29,7 +29,7 @@
v-bind="vuetifyProps(`v-radio[${o.value}]`)"
:key="o.value"
:label="o.label"
- :value="o.value"
+ :model-value="o.value"
>
@@ -49,10 +49,10 @@ import {
rendererProps,
useJsonFormsOneOfEnumControl,
RendererProps,
-} from '@jsonforms/vue2';
+} from '@jsonforms/vue';
import { default as ControlWrapper } from './ControlWrapper.vue';
import { useVuetifyControl } from '../util';
-import { VRadioGroup, VRadio, VLabel } from 'vuetify/lib';
+import { VRadioGroup, VRadio, VLabel } from 'vuetify/components';
const controlRenderer = defineComponent({
name: 'oneof-radio-group-control-renderer',
diff --git a/packages/vue-vuetify/src/controls/PasswordControlRenderer.vue b/packages/vue-vuetify/src/controls/PasswordControlRenderer.vue
index 26d3dee1d8..dc0ad8da1d 100644
--- a/packages/vue-vuetify/src/controls/PasswordControlRenderer.vue
+++ b/packages/vue-vuetify/src/controls/PasswordControlRenderer.vue
@@ -19,7 +19,7 @@
:persistent-hint="persistentHint()"
:required="control.required"
:error-messages="control.errors"
- :value="control.data"
+ :model-value="control.data"
:maxlength="
appliedOptions.restrict ? control.schema.maxLength : undefined
"
@@ -29,7 +29,7 @@
: undefined
"
v-bind="vuetifyProps('v-text-field')"
- @input="onChange"
+ @update:model-value="onChange"
@focus="isFocused = true"
@blur="isFocused = false"
/>
@@ -50,10 +50,10 @@ import {
rendererProps,
useJsonFormsControl,
RendererProps,
-} from '@jsonforms/vue2';
+} from '@jsonforms/vue';
import { default as ControlWrapper } from './ControlWrapper.vue';
import { useVuetifyControl } from '../util';
-import { VTextField } from 'vuetify/lib';
+import { VTextField } from 'vuetify/components';
const controlRenderer = defineComponent({
name: 'password-control-renderer',
diff --git a/packages/vue-vuetify/src/controls/RadioGroupControlRenderer.vue b/packages/vue-vuetify/src/controls/RadioGroupControlRenderer.vue
index 23ecbb615a..1259c47aae 100644
--- a/packages/vue-vuetify/src/controls/RadioGroupControlRenderer.vue
+++ b/packages/vue-vuetify/src/controls/RadioGroupControlRenderer.vue
@@ -18,7 +18,7 @@
:persistent-hint="persistentHint()"
:required="control.required"
:error-messages="control.errors"
- :value="control.data"
+ :model-value="control.data"
v-bind="vuetifyProps('v-radio-group')"
@change="onChange"
@focus="isFocused = true"
@@ -29,7 +29,7 @@
v-bind="vuetifyProps(`v-radio[${o.value}]`)"
:key="o.value"
:label="o.label"
- :value="o.value"
+ :model-value="o.value"
>
@@ -49,10 +49,10 @@ import {
rendererProps,
useJsonFormsEnumControl,
RendererProps,
-} from '@jsonforms/vue2';
+} from '@jsonforms/vue';
import { default as ControlWrapper } from './ControlWrapper.vue';
import { useVuetifyControl } from '../util';
-import { VRadioGroup, VRadio, VLabel } from 'vuetify/lib';
+import { VRadioGroup, VRadio, VLabel } from 'vuetify/components';
const controlRenderer = defineComponent({
name: 'radio-group-control-renderer',
diff --git a/packages/vue-vuetify/src/controls/SliderControlRenderer.vue b/packages/vue-vuetify/src/controls/SliderControlRenderer.vue
index 1564853e28..d5b70c7e60 100644
--- a/packages/vue-vuetify/src/controls/SliderControlRenderer.vue
+++ b/packages/vue-vuetify/src/controls/SliderControlRenderer.vue
@@ -20,7 +20,7 @@
:persistent-hint="persistentHint()"
:required="control.required"
:error-messages="control.errors"
- :value="control.data"
+ :model-value="control.data"
v-bind="vuetifyProps('v-slider')"
@change="onChange"
@focus="isFocused = true"
@@ -41,10 +41,10 @@ import {
rendererProps,
useJsonFormsControl,
RendererProps,
-} from '@jsonforms/vue2';
+} from '@jsonforms/vue';
import { default as ControlWrapper } from './ControlWrapper.vue';
import { useVuetifyControl } from '../util';
-import { VSlider } from 'vuetify/lib';
+import { VSlider } from 'vuetify/components';
const controlRenderer = defineComponent({
name: 'slider-control-renderer',
diff --git a/packages/vue-vuetify/src/controls/StringControlRenderer.vue b/packages/vue-vuetify/src/controls/StringControlRenderer.vue
index f8c6dea189..37a158351c 100644
--- a/packages/vue-vuetify/src/controls/StringControlRenderer.vue
+++ b/packages/vue-vuetify/src/controls/StringControlRenderer.vue
@@ -28,17 +28,16 @@
: undefined
"
:clearable="hover"
- :value="control.data"
+ :model-value="control.data"
:items="suggestions"
hide-no-data
v-bind="vuetifyProps('v-combobox')"
- @input="onChange"
+ @update:model-value="onChange"
@focus="isFocused = true"
@blur="isFocused = false"
/>
@@ -80,10 +79,10 @@ import {
rendererProps,
useJsonFormsControl,
RendererProps,
-} from '@jsonforms/vue2';
+} from '@jsonforms/vue';
import { default as ControlWrapper } from './ControlWrapper.vue';
import { useVuetifyControl } from '../util';
-import { VHover, VTextField, VCombobox } from 'vuetify/lib';
+import { VHover, VTextField, VCombobox } from 'vuetify/components';
import { DisabledIconFocus } from './directives';
import isArray from 'lodash/isArray';
import every from 'lodash/every';
diff --git a/packages/vue-vuetify/src/controls/StringMaskControlRenderer.vue b/packages/vue-vuetify/src/controls/StringMaskControlRenderer.vue
index 8c31636f9f..89cac7f51c 100644
--- a/packages/vue-vuetify/src/controls/StringMaskControlRenderer.vue
+++ b/packages/vue-vuetify/src/controls/StringMaskControlRenderer.vue
@@ -51,11 +51,11 @@ import {
rendererProps,
RendererProps,
useJsonFormsControl,
-} from '@jsonforms/vue2';
+} from '@jsonforms/vue';
import isEmpty from 'lodash/isEmpty';
import { VueMaskPlugin } from 'v-mask';
import { defineComponent, DirectiveOptions, VNode, VNodeDirective } from 'vue';
-import { VHover, VTextField } from 'vuetify/lib';
+import { VHover, VTextField } from 'vuetify/components';
import { useVuetifyControl } from '../util';
import { default as ControlWrapper } from './ControlWrapper.vue';
import { DisabledIconFocus } from './directives';
diff --git a/packages/vue-vuetify/src/controls/TimeControlRenderer.vue b/packages/vue-vuetify/src/controls/TimeControlRenderer.vue
index 226bb95c43..64af6e58d2 100644
--- a/packages/vue-vuetify/src/controls/TimeControlRenderer.vue
+++ b/packages/vue-vuetify/src/controls/TimeControlRenderer.vue
@@ -21,8 +21,8 @@
v-bind="vuetifyProps('v-text-field')"
v-mask="mask"
v-on="onMenu"
- :value="inputValue"
- @input="onInputChange"
+ :model-value="inputValue"
+ @update:model-value="onInputChange"
@focus="isFocused = true"
@blur="isFocused = false"
>
@@ -46,7 +46,7 @@
{{ pickerIcon }}
-
{{ okLabel }}
+ -->
@@ -89,8 +89,8 @@ import {
rendererProps,
RendererProps,
useJsonFormsControl,
-} from '@jsonforms/vue2';
-import { VueMaskDirective as Mask } from 'v-mask';
+} from '@jsonforms/vue';
+// import { VueMaskDirective as Mask } from 'v-mask';
import {
VBtn,
VHover,
@@ -98,8 +98,8 @@ import {
VMenu,
VSpacer,
VTextField,
- VTimePicker,
-} from 'vuetify/lib';
+ // VTimePicker,
+} from 'vuetify/components';
import { parseDateTime, useTranslator, useVuetifyControl } from '../util';
import { default as ControlWrapper } from './ControlWrapper.vue';
import { DisabledIconFocus } from './directives';
@@ -126,12 +126,12 @@ const controlRenderer = defineComponent({
VHover,
VTextField,
VMenu,
- VTimePicker,
+ // VTimePicker,
VIcon,
VSpacer,
VBtn,
},
- directives: { DisabledIconFocus, Mask },
+ directives: { DisabledIconFocus },
props: {
...rendererProps(),
},
@@ -343,7 +343,7 @@ const controlRenderer = defineComponent({
let index = 0;
- let result: (string | RegExp)[] = [];
+ const result: (string | RegExp)[] = [];
for (const part of parts) {
if (!part || part === '') {
continue;
diff --git a/packages/vue-vuetify/src/controls/components/ValidationBadge.vue b/packages/vue-vuetify/src/controls/components/ValidationBadge.vue
index b119a58fbd..885b544f37 100644
--- a/packages/vue-vuetify/src/controls/components/ValidationBadge.vue
+++ b/packages/vue-vuetify/src/controls/components/ValidationBadge.vue
@@ -32,7 +32,7 @@
diff --git a/packages/example/src/components/DemoForm.vue b/packages/example/src/components/DemoForm.vue
index e8d2de47eb..73ac3de6e5 100644
--- a/packages/example/src/components/DemoForm.vue
+++ b/packages/example/src/components/DemoForm.vue
@@ -61,8 +61,7 @@ import {
JsonSchema,
JsonFormsI18nState,
} from '@jsonforms/core';
-import { JsonForms, JsonFormsChangeEvent } from '@jsonforms/vue2';
-import JsonRefs from 'json-refs';
+import { JsonForms, JsonFormsChangeEvent } from '@jsonforms/vue';
import { createTranslator } from '../i18n';
export default {
@@ -159,16 +158,18 @@ export default {
resolvedSchema.error = undefined;
if (schema) {
- JsonRefs.resolveRefs(schema).then(
- function (res) {
- resolvedSchema.schema = res.resolved;
- resolvedSchema.resolved = true;
- },
- function (err: Error) {
- resolvedSchema.resolved = true;
- resolvedSchema.error = err.message;
- }
- );
+ resolvedSchema.schema = schema;
+ resolvedSchema.resolved = true;
+ // JsonRefs.resolveRefs(schema).then(
+ // function (res) {
+ // resolvedSchema.schema = res.resolved;
+ // resolvedSchema.resolved = true;
+ // },
+ // function (err: Error) {
+ // resolvedSchema.resolved = true;
+ // resolvedSchema.error = err.message;
+ // }
+ // );
} else {
// nothing to resolve
resolvedSchema.resolved = true;
diff --git a/packages/example/src/components/Settings.vue b/packages/example/src/components/Settings.vue
index 91449757e2..7a4d60fe16 100644
--- a/packages/example/src/components/Settings.vue
+++ b/packages/example/src/components/Settings.vue
@@ -269,23 +269,25 @@
import { sync } from 'vuex-pathify';
export default {
- name: 'Settings',
- computed: {
- validationMode: sync('app/jsonforms@validationMode'),
- hideRequiredAsterisk: sync('app/jsonforms@config.hideRequiredAsterisk'),
- showUnfocusedDescription: sync(
- 'app/jsonforms@config.showUnfocusedDescription'
- ),
- restrict: sync('app/jsonforms@config.restrict'),
- collapseNewItems: sync('app/jsonforms@config.collapseNewItems'),
- initCollapsed: sync('app/jsonforms@config.initCollapsed'),
- breakHorizontal: sync('app/jsonforms@config.breakHorizontal'),
- readonly: sync('app/jsonforms@readonly'),
- locale: sync('app/jsonforms@locale'),
- hideAvatar: sync('app/jsonforms@config.hideAvatar'),
- hideArraySummaryValidation: sync(
- 'app/jsonforms@config.hideArraySummaryValidation'
- ),
+ name: 'AppSettings',
+ setup() {
+ return {
+ validationMode: sync('app/jsonforms@validationMode'),
+ hideRequiredAsterisk: sync('app/jsonforms@config.hideRequiredAsterisk'),
+ showUnfocusedDescription: sync(
+ 'app/jsonforms@config.showUnfocusedDescription'
+ ),
+ restrict: sync('app/jsonforms@config.restrict'),
+ collapseNewItems: sync('app/jsonforms@config.collapseNewItems'),
+ initCollapsed: sync('app/jsonforms@config.initCollapsed'),
+ breakHorizontal: sync('app/jsonforms@config.breakHorizontal'),
+ readonly: sync('app/jsonforms@readonly'),
+ locale: sync('app/jsonforms@locale'),
+ hideAvatar: sync('app/jsonforms@config.hideAvatar'),
+ hideArraySummaryValidation: sync(
+ 'app/jsonforms@config.hideArraySummaryValidation'
+ ),
+ };
},
data: function () {
return {
diff --git a/packages/example/src/examples/custom-renderer/CustomArrayRenderer.vue b/packages/example/src/examples/custom-renderer/CustomArrayRenderer.vue
index 456917eb3a..f2387e0ba1 100644
--- a/packages/example/src/examples/custom-renderer/CustomArrayRenderer.vue
+++ b/packages/example/src/examples/custom-renderer/CustomArrayRenderer.vue
@@ -28,12 +28,12 @@ import {
JsonFormsRendererRegistryEntry,
withIncreasedRank,
} from '@jsonforms/core';
-import { rendererProps } from '@jsonforms/vue2';
+import { rendererProps } from '@jsonforms/vue';
import {
ArrayLayoutRenderer,
arrayLayoutRendererEntry,
-} from '@jsonforms/vue2-vuetify';
-import { VTooltip, VIcon, VBtn } from 'vuetify/lib';
+} from '@jsonforms/vue-vuetify';
+import { VTooltip, VIcon, VBtn } from 'vuetify/components';
import { defineComponent } from 'vue';
const controlRenderer = defineComponent({
diff --git a/packages/example/src/layouts/default/AppBar.vue b/packages/example/src/layouts/default/AppBar.vue
index a13d5d8a6e..684d2e01bc 100644
--- a/packages/example/src/layouts/default/AppBar.vue
+++ b/packages/example/src/layouts/default/AppBar.vue
@@ -25,7 +25,7 @@
-
+
@@ -35,7 +35,7 @@
diff --git a/packages/example/src/layouts/default/View.vue b/packages/example/src/layouts/default/View.vue
index fe91fbcd34..e67ba3cfbd 100644
--- a/packages/example/src/layouts/default/View.vue
+++ b/packages/example/src/layouts/default/View.vue
@@ -1,8 +1,6 @@
-
-
-
+
diff --git a/packages/example/src/layouts/default/index.vue b/packages/example/src/layouts/default/index.vue
index a898bec791..2db067175d 100644
--- a/packages/example/src/layouts/default/index.vue
+++ b/packages/example/src/layouts/default/index.vue
@@ -9,13 +9,15 @@
diff --git a/packages/example/src/components/ThemeChanger.vue b/packages/example/src/components/ThemeChanger.vue
index cb843d3820..02f027f6bd 100644
--- a/packages/example/src/components/ThemeChanger.vue
+++ b/packages/example/src/components/ThemeChanger.vue
@@ -5,11 +5,16 @@
:nudge-width="200"
offset-y
>
-
+
-
-
- mdi-palette
+
+
+ mdi-palette
Theme Colors
@@ -38,11 +43,9 @@
:key="index"
>
-
-
- {{ theme.name }}
-
+
+ {{ theme.name }}
diff --git a/packages/example/src/core/types.ts b/packages/example/src/core/types.ts
index 95b1d2945f..7f864246fe 100644
--- a/packages/example/src/core/types.ts
+++ b/packages/example/src/core/types.ts
@@ -1,8 +1,4 @@
-import {
- UISchemaElement,
- JsonSchema,
- JsonFormsRendererRegistryEntry,
-} from '@jsonforms/core';
+import { UISchemaElement, JsonSchema } from '@jsonforms/core';
export type Example = {
id: string;
@@ -12,7 +8,6 @@ export type Example = {
uischema?: UISchemaElement;
data: string | number | boolean | any[] | Record;
i18n?: Record;
- renderers?: JsonFormsRendererRegistryEntry[];
};
};
diff --git a/packages/example/src/examples/control/data.json b/packages/example/src/examples/control/data.json
index 0a730f12e1..3595d7b56a 100644
--- a/packages/example/src/examples/control/data.json
+++ b/packages/example/src/examples/control/data.json
@@ -4,7 +4,7 @@
"number": 50.5,
"integer": 50,
"date": "2020-06-25",
- "time": "23:08:00Z",
+ "time": "23:08:00",
"dateTime": "2020-06-25T23:08:42+02:00",
"enum": "Two"
}
diff --git a/packages/example/src/examples/custom-renderer/CustomArrayRenderer.vue b/packages/example/src/examples/custom-renderer/CustomArrayRenderer.vue
index f2387e0ba1..2cd1acc900 100644
--- a/packages/example/src/examples/custom-renderer/CustomArrayRenderer.vue
+++ b/packages/example/src/examples/custom-renderer/CustomArrayRenderer.vue
@@ -3,12 +3,12 @@
{{ null }}
-
+
-
+
+
+
+
+ mdi-cog
+
+
+ Settings
+
+
@@ -35,18 +50,17 @@
diff --git a/packages/example/src/layouts/default/Drawer.vue b/packages/example/src/layouts/default/Drawer.vue
index d7845720d6..852cdb9f84 100644
--- a/packages/example/src/layouts/default/Drawer.vue
+++ b/packages/example/src/layouts/default/Drawer.vue
@@ -1,38 +1,31 @@
-
+
-
-
- Examples
- Vuetify Renderers
-
+
+ Examples
+ Vuetify Renderers
- {{ example.title }}
- {{ example.title }}
-
@@ -41,8 +34,9 @@
diff --git a/packages/example/src/layouts/default/View.vue b/packages/example/src/layouts/default/View.vue
index e67ba3cfbd..fc17d1cc9b 100644
--- a/packages/example/src/layouts/default/View.vue
+++ b/packages/example/src/layouts/default/View.vue
@@ -5,5 +5,7 @@
diff --git a/packages/example/src/layouts/default/index.vue b/packages/example/src/layouts/default/index.vue
index 2db067175d..758e0f0106 100644
--- a/packages/example/src/layouts/default/index.vue
+++ b/packages/example/src/layouts/default/index.vue
@@ -4,19 +4,23 @@
+
diff --git a/packages/example/src/main.ts b/packages/example/src/main.ts
index 977ef1c387..98ba824fdb 100644
--- a/packages/example/src/main.ts
+++ b/packages/example/src/main.ts
@@ -5,13 +5,4 @@ import store from './store';
import vuetify from './plugins/vuetify';
import './plugins';
-// Vue.config.productionTip = false;
-
createApp(App).use(store).use(router).use(vuetify).mount('#app');
-
-// new Vue({
-// router,
-// store,
-// vuetify,
-// render: (h) => h(App),
-// }).$mount('#app');
diff --git a/packages/example/src/store/modules/app.ts b/packages/example/src/store/modules/app.ts
index 869aeb1021..bd8572ef08 100644
--- a/packages/example/src/store/modules/app.ts
+++ b/packages/example/src/store/modules/app.ts
@@ -3,7 +3,6 @@ import { make } from 'vuex-pathify';
import { AppState } from './types';
import { RootState } from '../types';
import { Module } from 'vuex';
-import { extendedVuetifyRenderers } from '@jsonforms/vue-vuetify';
import { createAjv } from '../validate/validate';
const ajv = createAjv();
@@ -11,6 +10,7 @@ const ajv = createAjv();
// Data
const state: AppState = {
drawer: null,
+ settings: null,
jsonforms: {
readonly: false,
validationMode: 'ValidateAndShow',
@@ -25,9 +25,6 @@ const state: AppState = {
hideAvatar: false,
hideArraySummaryValidation: false,
},
- renderers: extendedVuetifyRenderers,
- cells: extendedVuetifyRenderers,
- ajv,
locale: 'en',
},
monaco: {
diff --git a/packages/example/src/store/modules/types.ts b/packages/example/src/store/modules/types.ts
index b6408bb31c..4da5c98249 100644
--- a/packages/example/src/store/modules/types.ts
+++ b/packages/example/src/store/modules/types.ts
@@ -1,13 +1,9 @@
-import {
- JsonFormsRendererRegistryEntry,
- JsonFormsCellRendererRegistryEntry,
-} from '@jsonforms/core';
import * as monaco from 'monaco-editor/esm/vs/editor/editor.api';
-import Ajv from 'ajv';
// declare your own store states
export interface AppState {
drawer: boolean | null;
+ settings: boolean | null;
jsonforms: {
readonly: boolean;
validationMode: 'ValidateAndShow' | 'ValidateAndHide' | 'NoValidation';
@@ -23,9 +19,6 @@ export interface AppState {
hideArraySummaryValidation: boolean;
vuetify?: Record;
};
- renderers: JsonFormsRendererRegistryEntry[];
- cells: JsonFormsCellRendererRegistryEntry[];
- ajv: Ajv;
locale: string;
};
monaco: {
diff --git a/packages/example/src/views/example/Example.vue b/packages/example/src/views/example/Example.vue
index 9db175aa1d..844e57d16a 100644
--- a/packages/example/src/views/example/Example.vue
+++ b/packages/example/src/views/example/Example.vue
@@ -1,245 +1,219 @@
-
-
- {{ example.title }}
-
-
- Demo
-
- Schema
- UI Schema
- Data
- Internationalization
-
-
-
-
- JSONForm
-
-
-
-
- mdi-dock-window
-
-
- {{ `Show JsonForm Only` }}
-
-
-
-
-
-
-
-
-
-
-
-
-
- Schema
-
-
-
-
- mdi-reload
-
-
- {{ `Reload Example Schema` }}
-
-
-
-
- mdi-content-save
-
-
- {{ `Apply Change To Example Schema` }}
-
-
-
-
-
-
-
-
-
-
-
- UI Schema
-
-
-
-
- mdi-reload
-
-
- {{ `Reload Example UI Schema` }}
-
-
-
-
- mdi-content-save
-
-
- {{ `Apply Change To Example UI Schema` }}
-
-
-
-
-
-
-
-
-
-
-
- Data
-
-
-
-
- mdi-reload
-
-
- {{ `Reload Example Data` }}
-
-
-
-
- mdi-content-save
-
-
- {{ `Apply Change To Example Data` }}
-
-
-
-
-
-
-
-
-
-
-
- Internationalization
-
-
-
-
- mdi-reload
-
-
- {{ `Reload Example Internationalization` }}
-
-
-
-
- mdi-content-save
-
-
- {{ `Apply Change To Example Data` }}
-
-
-
-
-
-
-
-
-
-
-
- {{ snackbarText }}
-
- Close
-
-
-
+
+ {{ example.title }}
+
+
+ Demo
+
+ Schema
+ UI Schema
+ Data
+ Internationalization
+
+
+
+
+
+
+
+ JSONForm
+
+
+
+
+ mdi-dock-window
+
+
+ {{ `Show JsonForm Only` }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Schema
+
+
+
+
+ mdi-reload
+
+
+ {{ `Reload Example Schema` }}
+
+
+
+
+ mdi-content-save
+
+
+ {{ `Apply Change To Example Schema` }}
+
+
+
+
+
+
+
+
+
+
+
+ UI Schema
+
+
+
+
+ mdi-reload
+
+
+ {{ `Reload Example UI Schema` }}
+
+
+
+
+ mdi-content-save
+
+
+ {{ `Apply Change To Example UI Schema` }}
+
+
+
+
+
+
+
+
+
+
+
+ Data
+
+
+
+
+ mdi-reload
+
+
+ {{ `Reload Example Data` }}
+
+
+
+
+ mdi-content-save
+
+
+ {{ `Apply Change To Example Data` }}
+
+
+
+
+
+
+
+
+
+
+
+ Internationalization
+
+
+
+
+ mdi-reload
+
+
+ {{ `Reload Example Internationalization` }}
+
+
+
+
+ mdi-content-save
+
+
+ {{ `Apply Change To Example Data` }}
+
+
+
+
+
+
+
+
+
+
+ {{ snackbarText }}
+
+ Close
+
+
@@ -270,6 +244,8 @@ import {
import { ErrorObject } from 'ajv';
import cloneDeep from 'lodash/cloneDeep';
import * as monaco from 'monaco-editor/esm/vs/editor/editor.api';
+import { createAjv } from '@/store/validate/validate';
+import { extendedVuetifyRenderers } from '@jsonforms/vue-vuetify';
const myStyles = mergeStyles(defaultStyles, {
control: { root: 'my-control' },
@@ -283,6 +259,9 @@ export default {
ValidationIcon,
},
data() {
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
+ // @ts-ignore
+ this.ajv = createAjv();
return {
activeTab: 0,
examples,
@@ -297,11 +276,8 @@ export default {
},
setup() {
return {
- renderers: sync('app/jsonforms@renderers'),
- cells: sync('app/jsonforms@cells'),
config: sync('app/jsonforms@config'),
validationMode: sync('app/jsonforms@validationMode'),
- ajv: sync('app/jsonforms@ajv'),
readonly: sync('app/jsonforms@readonly'),
monacoSchemaModel: sync('app/monaco@schemaModel'),
monacoUiSchemaModel: sync('app/monaco@uischemaModel'),
@@ -312,7 +288,9 @@ export default {
},
computed: {
allRenderers(): JsonFormsRendererRegistryEntry[] {
- return (this.example?.input.renderers ?? []).concat(this.renderers);
+ return Object.freeze(
+ (this.example?.input.renderers ?? []).concat(extendedVuetifyRenderers)
+ );
},
formonly(): boolean {
return this.$route.query?.view === 'form-only';
diff --git a/packages/vue-vuetify/package.json b/packages/vue-vuetify/package.json
index 74265421ce..bc97919003 100644
--- a/packages/vue-vuetify/package.json
+++ b/packages/vue-vuetify/package.json
@@ -38,7 +38,7 @@
"scripts": {
"prebuild": "rimraf lib",
"build": "cross-env NODE_ENV=production rollup --config rollup.config.mjs",
- "watch": "rollup --watch --config rollup.config.js",
+ "watch": "rollup --watch --config rollup.config.mjs",
"test": "vue-cli-service test:unit"
},
"dependencies": {
diff --git a/packages/vue-vuetify/src/additional/ListWithDetailRenderer.vue b/packages/vue-vuetify/src/additional/ListWithDetailRenderer.vue
index 2b8a791cef..2c17b3f225 100644
--- a/packages/vue-vuetify/src/additional/ListWithDetailRenderer.vue
+++ b/packages/vue-vuetify/src/additional/ListWithDetailRenderer.vue
@@ -17,14 +17,14 @@
-
+
-
- {{ childLabelForIndex(index) }}
-
- {{ childLabelForIndex(index) }}
-
-
-
+
+
+
+
+ {{ childLabelForIndex(index) }}
+
+ {{ childLabelForIndex(index) }}
+
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-->
diff --git a/packages/vue-vuetify/src/controls/EnumControlRenderer.vue b/packages/vue-vuetify/src/controls/EnumControlRenderer.vue
index 567b7aaacd..29945866e7 100644
--- a/packages/vue-vuetify/src/controls/EnumControlRenderer.vue
+++ b/packages/vue-vuetify/src/controls/EnumControlRenderer.vue
@@ -5,7 +5,7 @@
:isFocused="isFocused"
:appliedOptions="appliedOptions"
>
-
+
-
+
-
+
-
+
-
+
@@ -56,9 +56,9 @@ const controlRenderer = defineComponent({
...rendererProps(),
},
setup(props: RendererProps) {
- return useVuetifyControl(useJsonFormsControl(props), (value) =>
- Number(value)
- );
+ return useVuetifyControl(useJsonFormsControl(props), (value) => {
+ return Number(value);
+ });
},
});
diff --git a/packages/vue-vuetify/src/controls/StringControlRenderer.vue b/packages/vue-vuetify/src/controls/StringControlRenderer.vue
index 37a158351c..8b205480d7 100644
--- a/packages/vue-vuetify/src/controls/StringControlRenderer.vue
+++ b/packages/vue-vuetify/src/controls/StringControlRenderer.vue
@@ -5,7 +5,7 @@
:isFocused="isFocused"
:appliedOptions="appliedOptions"
>
-
+
-
+
-
-
-
- $clear
-
-
-
-
- {{ pickerIcon }}
-
-
-
-
-
-
+
+
@@ -81,436 +32,47 @@ import {
ControlElement,
isTimeControl,
JsonFormsRendererRegistryEntry,
- JsonSchema,
rankWith,
} from '@jsonforms/core';
-import { defineComponent, ref } from 'vue';
+import { defineComponent } from 'vue';
import {
rendererProps,
RendererProps,
useJsonFormsControl,
} from '@jsonforms/vue';
-// import { VueMaskDirective as Mask } from 'v-mask';
-import {
- VBtn,
- VHover,
- VIcon,
- VMenu,
- VSpacer,
- VTextField,
- // VTimePicker,
-} from 'vuetify/components';
-import { parseDateTime, useTranslator, useVuetifyControl } from '../util';
+import { VTextField } from 'vuetify/components';
+import { useVuetifyControl } from '../util';
import { default as ControlWrapper } from './ControlWrapper.vue';
-import { DisabledIconFocus } from './directives';
-
-const JSON_SCHEMA_TIME_FORMATS = [
- 'HH:mm:ss.SSSZ',
- 'HH:mm:ss.SSS',
- 'HH:mm:ssZ',
- 'HH:mm:ss',
-];
-// https://ajv.js.org/packages/ajv-formats.html#keywords-to-compare-values-formatmaximum-formatminimum-and-formatexclusivemaximum-formatexclusiveminimum
-type AjvMinMaxFormat = {
- formatMinimum?: string | { $data: any };
- formatExclusiveMinimum?: string | { $data: any };
- formatMaximum?: string | { $data: any };
- formatExclusiveMaximum?: string | { $data: any };
+/**
+ * AJV 'time' format expects HH:mm:ss while only returns HH:mm.
+ * Therefore we append ':00' when the seconds are missing.
+ */
+const appendSecondsIfNecessary = (value: unknown) => {
+ if (typeof value === 'string') {
+ const splitValue = value.split(':');
+ if (splitValue.length === 2) {
+ splitValue.push('00');
+ }
+ return splitValue.join(':');
+ }
+ return value;
};
const controlRenderer = defineComponent({
name: 'time-control-renderer',
components: {
ControlWrapper,
- VHover,
VTextField,
- VMenu,
- // VTimePicker,
- VIcon,
- VSpacer,
- VBtn,
},
- directives: { DisabledIconFocus },
props: {
...rendererProps(),
},
setup(props: RendererProps) {
- const t = useTranslator();
-
- const showMenu = ref(false);
- const mask = ref<((value: string) => (string | RegExp)[]) | undefined>(
- undefined
- );
-
- const adaptValue = (value: any) => value || undefined;
+ const adaptValue = (value: any) =>
+ appendSecondsIfNecessary(value) || undefined;
const control = useVuetifyControl(useJsonFormsControl(props), adaptValue);
- return { ...control, showMenu, mask, t, adaptValue };
- },
- watch: {
- isFocused(newFocus) {
- if (newFocus && this.applyMask) {
- this.mask = this.maskFunction.bind(this);
- } else {
- this.mask = undefined;
- }
- },
- },
- computed: {
- applyMask(): boolean {
- return typeof this.appliedOptions.mask == 'boolean'
- ? this.appliedOptions.mask
- : true;
- },
- pickerIcon(): string {
- return typeof this.appliedOptions.pickerIcon == 'string'
- ? this.appliedOptions.pickerIcon
- : 'mdi-clock-outline';
- },
- timeFormat(): string {
- return typeof this.appliedOptions.timeFormat == 'string'
- ? this.appliedOptions.timeFormat
- : this.ampm
- ? 'hh:mm a'
- : 'HH:mm';
- },
- timeSaveFormat(): string {
- return typeof this.appliedOptions.timeSaveFormat == 'string'
- ? this.appliedOptions.timeSaveFormat
- : 'HH:mm:ssZ';
- },
- formats(): string[] {
- return [
- this.timeSaveFormat,
- this.timeFormat,
- ...JSON_SCHEMA_TIME_FORMATS,
- ];
- },
- useSeconds(): boolean {
- return this.timeFormat.includes('s') ? true : false;
- },
- ampm(): boolean {
- return this.appliedOptions.ampm === true;
- },
- minTime(): string | undefined {
- if (typeof this.vuetifyProps('v-time-picker').min === 'string') {
- // prefer the vuetify option first
- return this.vuetifyProps('v-time-picker').min;
- }
-
- // provide min so that the browser can display the native component with only selections that are allowed.
- // Since the browser supports only min there is posibility for the user to select a date that is defined in the formatExclusiveMinimum but the ajv will catch that validation.
- const schema = this.control.schema as JsonSchema & AjvMinMaxFormat;
- if (typeof schema.formatMinimum === 'string') {
- // convert to what VTimePicker expects
- const time = parseDateTime(schema.formatMinimum, this.formats);
- return time
- ? this.useSeconds
- ? time.format('HH:mm:ss')
- : time.format('HH:mm')
- : schema.formatMinimum;
- } else if (typeof schema.formatExclusiveMinimum === 'string') {
- // convert to what VTimePicker expects
- let time = parseDateTime(schema.formatExclusiveMinimum, this.formats);
- if (time) {
- time = this.useSeconds
- ? time.add(1, 'second')
- : time.add(1, 'minute');
- }
- return time
- ? this.useSeconds
- ? time.format('HH:mm:ss')
- : time.format('HH:mm')
- : schema.formatExclusiveMinimum;
- }
- return undefined;
- },
- maxTime(): string | undefined {
- if (typeof this.vuetifyProps('v-time-picker').max === 'string') {
- // prefer the vuetify option first
- return this.vuetifyProps('v-time-picker').max;
- }
-
- // provide max so that the browser can display the native component with only selections that are allowed.
- // Since the browser supports only max there is posibility for the user to select a date that is defined in the formatExclusiveMaximum but the ajv will catch that validation.
- const schema = this.control.schema as JsonSchema & AjvMinMaxFormat;
- if (typeof schema.formatMaximum === 'string') {
- // convert to what VTimePicker expects
- const time = parseDateTime(schema.formatMaximum, this.formats);
- return time
- ? this.useSeconds
- ? time.format('HH:mm:ss')
- : time.format('HH:mm')
- : schema.formatMaximum;
- } else if (typeof schema.formatExclusiveMaximum === 'string') {
- // convert to what VTimePicker expects
- let time = parseDateTime(schema.formatExclusiveMaximum, this.formats);
- if (time) {
- time = this.useSeconds
- ? time.subtract(1, 'second')
- : time.subtract(1, 'minute');
- }
- return time
- ? this.useSeconds
- ? time.format('HH:mm:ss')
- : time.format('HH:mm')
- : schema.formatExclusiveMaximum;
- }
- return undefined;
- },
- inputValue(): string | undefined {
- const value = this.control.data;
- const time = parseDateTime(value, this.formats);
- return time ? time.format(this.timeFormat) : value;
- },
- pickerValue: {
- get(): string | undefined {
- const value = this.control.data;
-
- const time = parseDateTime(value, this.formats);
- // show only valid values
- return time
- ? this.useSeconds
- ? time.format('HH:mm:ss')
- : time.format('HH:mm')
- : undefined;
- },
- set(val: string) {
- this.onPickerChange(val);
- },
- },
- clearLabel(): string {
- const label =
- typeof this.appliedOptions.clearLabel == 'string'
- ? this.appliedOptions.clearLabel
- : 'Clear';
-
- return this.t(label, label);
- },
- cancelLabel(): string {
- const label =
- typeof this.appliedOptions.cancelLabel == 'string'
- ? this.appliedOptions.cancelLabel
- : 'Cancel';
-
- return this.t(label, label);
- },
- okLabel(): string {
- const label =
- typeof this.appliedOptions.okLabel == 'string'
- ? this.appliedOptions.okLabel
- : 'OK';
- return this.t(label, label);
- },
- showActions(): boolean {
- return this.appliedOptions.showActions === true;
- },
- },
- methods: {
- onInputChange(value: string): void {
- const time = parseDateTime(value, this.timeFormat);
- const newdata = time ? time.format(this.timeSaveFormat) : value;
- if (this.adaptValue(newdata) !== this.control.data) {
- // only invoke onChange when values are different since v-mask is also listening on input which lead to loop
- this.onChange(newdata);
- }
- },
- onPickerChange(value: string): void {
- const time = parseDateTime(value, this.useSeconds ? 'HH:mm:ss' : 'HH:mm');
- this.onChange(time ? time.format(this.timeSaveFormat) : value);
- },
- okHandler(): void {
- (this.$refs.menu as any).save(this.pickerValue);
- this.showMenu = false;
- },
- onMinute(): void {
- if (!this.showActions && !this.useSeconds) {
- this.okHandler();
- }
- },
- onSecond(): void {
- if (!this.showActions && this.useSeconds) {
- this.okHandler();
- }
- },
- clear(): void {
- this.mask = undefined;
- this.onChange(null);
- },
- maskFunction(value: string): (string | RegExp)[] {
- const format = this.timeFormat;
- const parts = format.split(/([^HhmsAaSZ]*)(hh?|HH?|mm?|ss?|a|A|SSS|Z)/);
-
- let index = 0;
-
- const result: (string | RegExp)[] = [];
- for (const part of parts) {
- if (!part || part === '') {
- continue;
- }
- if (index > value.length) {
- break;
- }
-
- if (part == 'H') {
- result.push(/[0-9]/);
- if (value.charAt(index) === '2') {
- if (
- value.charAt(index + 1) === '0' ||
- value.charAt(index + 1) === '1' ||
- value.charAt(index + 1) === '2' ||
- value.charAt(index + 1) === '3'
- ) {
- result.push(/[0-3]/);
- index += 1;
- } else if (value.charAt(index + 1) === '') {
- result.push(/[0-3]?/);
- }
- } else if (value.charAt(index) === '1') {
- if (
- value.charAt(index + 1) === '0' ||
- value.charAt(index + 1) === '1' ||
- value.charAt(index + 1) === '2' ||
- value.charAt(index + 1) === '3' ||
- value.charAt(index + 1) === '4' ||
- value.charAt(index + 1) === '5' ||
- value.charAt(index + 1) === '6' ||
- value.charAt(index + 1) === '7' ||
- value.charAt(index + 1) === '8' ||
- value.charAt(index + 1) === '9'
- ) {
- result.push(/[0-9]/);
- index += 1;
- } else if (value.charAt(index + 1) === '') {
- result.push(/[0-9]?/);
- }
- }
- index += 1;
- } else if (part == 'HH') {
- result.push(/[0-2]/);
- if (value.charAt(index) === '0' || value.charAt(index) === '1') {
- result.push(/[0-9]/);
- } else if (value.charAt(index) === '2') {
- result.push(/[0-3]/);
- }
- index += 2;
- } else if (part == 'h') {
- result.push(/[1-9]/);
- if (value.charAt(index) === '1') {
- if (
- value.charAt(index + 1) == '0' ||
- value.charAt(index + 1) == '1' ||
- value.charAt(index + 1) == '2'
- ) {
- result.push(/[0-2]/);
- index += 1;
- } else if (value.charAt(index + 1) === '') {
- result.push(/[0-2]?/);
- }
- }
- index += 1;
- } else if (part == 'hh') {
- result.push(/[0-1]/);
- result.push(value.charAt(index) === '0' ? /[1-9]/ : /[0-2]/);
- index += 2;
- } else if (part == 'm') {
- result.push(/[0-9]/);
- if (
- value.charAt(index) === '1' ||
- value.charAt(index) === '2' ||
- value.charAt(index) === '3' ||
- value.charAt(index) === '4' ||
- value.charAt(index) === '5'
- ) {
- if (
- value.charAt(index + 1) === '0' ||
- value.charAt(index + 1) === '1' ||
- value.charAt(index + 1) === '2' ||
- value.charAt(index + 1) === '3' ||
- value.charAt(index + 1) === '4' ||
- value.charAt(index + 1) === '5' ||
- value.charAt(index + 1) === '6' ||
- value.charAt(index + 1) === '7' ||
- value.charAt(index + 1) === '8' ||
- value.charAt(index + 1) === '9'
- ) {
- result.push(/[0-9]/);
- index += 1;
- } else if (value.charAt(index + 1) === '') {
- result.push(/[0-9]?/);
- }
- }
- index += 1;
- } else if (part == 'mm') {
- result.push(/[0-5]/);
- result.push(/[0-9]/);
- index += 2;
- } else if (part == 's') {
- result.push(/[0-9]/);
- if (
- value.charAt(index) === '1' ||
- value.charAt(index) === '2' ||
- value.charAt(index) === '3' ||
- value.charAt(index) === '4' ||
- value.charAt(index) === '5'
- ) {
- if (
- value.charAt(index + 1) === '0' ||
- value.charAt(index + 1) === '1' ||
- value.charAt(index + 1) === '2' ||
- value.charAt(index + 1) === '3' ||
- value.charAt(index + 1) === '4' ||
- value.charAt(index + 1) === '5' ||
- value.charAt(index + 1) === '6' ||
- value.charAt(index + 1) === '7' ||
- value.charAt(index + 1) === '8' ||
- value.charAt(index + 1) === '9'
- ) {
- result.push(/[0-9]/);
- index += 1;
- } else if (value.charAt(index + 1) === '') {
- result.push(/[0-9]?/);
- }
- }
- index += 1;
- } else if (part == 'ss') {
- result.push(/[0-5]/);
- result.push(/[0-9]/);
- index += 2;
- } else if (part == 'a') {
- result.push(/a|p/);
- result.push('m');
- index += 2;
- } else if (part == 'A') {
- result.push(/A|P/);
- result.push('M');
- index += 2;
- } else if (part == 'Z') {
- //GMT-12 to GMT+14
- result.push(/\+|-/);
- result.push(/[0-1]/);
- if (value.charAt(index + 1) === '0') {
- result.push(/[0-9]/);
- } else if (value.charAt(index + 1) === '1') {
- result.push(value.charAt(index) === '+' ? /[0-4]/ : /[0-2]/);
- }
- result.push(':');
- result.push(/[0-5]/);
- result.push(/[0-9]/);
- index += 6;
- } else if (part == 'SSS') {
- result.push(/[0-9]/);
- result.push(/[0-9]/);
- result.push(/[0-9]/);
- index += 3;
- } else {
- result.push(part);
- index += part.length;
- }
- }
-
- return result;
- },
+ return { ...control, adaptValue };
},
});
diff --git a/packages/vue-vuetify/src/controls/components/ValidationBadge.vue b/packages/vue-vuetify/src/controls/components/ValidationBadge.vue
index 885b544f37..741a0628e6 100644
--- a/packages/vue-vuetify/src/controls/components/ValidationBadge.vue
+++ b/packages/vue-vuetify/src/controls/components/ValidationBadge.vue
@@ -1,7 +1,7 @@
-
+
{{ errors.length }}
-
+
diff --git a/packages/vue-vuetify/src/extended/AutocompleteEnumControlRenderer.vue b/packages/vue-vuetify/src/extended/AutocompleteEnumControlRenderer.vue
index 1ba7328d0c..1300f44f7a 100644
--- a/packages/vue-vuetify/src/extended/AutocompleteEnumControlRenderer.vue
+++ b/packages/vue-vuetify/src/extended/AutocompleteEnumControlRenderer.vue
@@ -5,7 +5,7 @@
:isFocused="isFocused"
:appliedOptions="appliedOptions"
>
-
+
-
+
-
+
-
+
-
+
-
+
-
+
+
+
From 1d05beb6615d6924f6d5e20fa95258d7d3a634cc Mon Sep 17 00:00:00 2001
From: Stefan Dirix
Date: Mon, 26 Jun 2023 15:14:39 +0200
Subject: [PATCH 070/185] Update to JSON Forms 3.1.0
---
packages/example/package.json | 4 ++--
packages/vue-vuetify/package.json | 8 ++++----
packages/vue-vuetify/src/complex/AnyOfRenderer.vue | 2 +-
packages/vue-vuetify/src/complex/OneOfRenderer.vue | 2 +-
packages/vue-vuetify/src/complex/OneOfTabRenderer.vue | 2 +-
.../src/complex/components/AdditionalProperties.vue | 7 +++----
6 files changed, 12 insertions(+), 13 deletions(-)
diff --git a/packages/example/package.json b/packages/example/package.json
index 76dae6f33e..d838bfff2d 100644
--- a/packages/example/package.json
+++ b/packages/example/package.json
@@ -8,8 +8,8 @@
"clean": "rimraf dist"
},
"dependencies": {
- "@jsonforms/core": "3.1.0-alpha.0",
- "@jsonforms/vue": "3.1.0-alpha.0",
+ "@jsonforms/core": "3.1.0",
+ "@jsonforms/vue": "3.1.0",
"@jsonforms/vue-vuetify": "3.1.0-alpha.0",
"ajv-keywords": "^5.1.0",
"core-js": "^3.9.1",
diff --git a/packages/vue-vuetify/package.json b/packages/vue-vuetify/package.json
index bc97919003..c90eb9e5c2 100644
--- a/packages/vue-vuetify/package.json
+++ b/packages/vue-vuetify/package.json
@@ -47,8 +47,8 @@
"lodash": "^4.17.15"
},
"peerDependencies": {
- "@jsonforms/core": "3.1.0-alpha.0",
- "@jsonforms/vue": "3.1.0-alpha.0",
+ "@jsonforms/core": "3.1.0",
+ "@jsonforms/vue": "3.1.0",
"@mdi/font": "^7.0.96",
"vue": "^3.2.47",
"vuetify": "^3.1.12"
@@ -57,8 +57,8 @@
"@babel/core": "^7.14.6",
"@babel/preset-env": "^7.14.7",
"@babel/preset-typescript": "^7.14.5",
- "@jsonforms/core": "3.1.0-alpha.0",
- "@jsonforms/vue": "3.1.0-alpha.0",
+ "@jsonforms/core": "3.1.0",
+ "@jsonforms/vue": "3.1.0",
"@mdi/font": "^7.0.96",
"@rollup/plugin-babel": "^6.0.3",
"@rollup/plugin-node-resolve": "^15.0.1",
diff --git a/packages/vue-vuetify/src/complex/AnyOfRenderer.vue b/packages/vue-vuetify/src/complex/AnyOfRenderer.vue
index 8521f71c16..89d483a00d 100644
--- a/packages/vue-vuetify/src/complex/AnyOfRenderer.vue
+++ b/packages/vue-vuetify/src/complex/AnyOfRenderer.vue
@@ -69,7 +69,7 @@ const controlRenderer = defineComponent({
},
setup(props: RendererProps) {
const input = useJsonFormsAnyOfControl(props);
- const control = (input.control as any).value as typeof input.control;
+ const control = input.control.value;
const selectedIndex = ref(control.indexOfFittingSchema || 0);
return {
diff --git a/packages/vue-vuetify/src/complex/OneOfRenderer.vue b/packages/vue-vuetify/src/complex/OneOfRenderer.vue
index 2ea7295fd2..7c0403f1eb 100644
--- a/packages/vue-vuetify/src/complex/OneOfRenderer.vue
+++ b/packages/vue-vuetify/src/complex/OneOfRenderer.vue
@@ -116,7 +116,7 @@ const controlRenderer = defineComponent({
},
setup(props: RendererProps) {
const input = useJsonFormsOneOfControl(props);
- const control = (input.control as any).value as typeof input.control;
+ const control = input.control.value;
const selectedIndex = ref(control.indexOfFittingSchema);
const selectIndex = ref(selectedIndex.value);
diff --git a/packages/vue-vuetify/src/complex/OneOfTabRenderer.vue b/packages/vue-vuetify/src/complex/OneOfTabRenderer.vue
index f0d9118c56..4e8a21f4d3 100644
--- a/packages/vue-vuetify/src/complex/OneOfTabRenderer.vue
+++ b/packages/vue-vuetify/src/complex/OneOfTabRenderer.vue
@@ -111,7 +111,7 @@ const controlRenderer = defineComponent({
},
setup(props: RendererProps) {
const input = useJsonFormsOneOfControl(props);
- const control = (input.control as any).value as typeof input.control;
+ const control = input.control.value;
const selectedIndex = ref(control.indexOfFittingSchema || 0);
const tabIndex = ref(selectedIndex.value);
diff --git a/packages/vue-vuetify/src/complex/components/AdditionalProperties.vue b/packages/vue-vuetify/src/complex/components/AdditionalProperties.vue
index cd9248bc1a..b12b8cee46 100644
--- a/packages/vue-vuetify/src/complex/components/AdditionalProperties.vue
+++ b/packages/vue-vuetify/src/complex/components/AdditionalProperties.vue
@@ -99,7 +99,7 @@ import Ajv, { ValidateFunction } from 'ajv';
import get from 'lodash/get';
import isPlainObject from 'lodash/isPlainObject';
import startCase from 'lodash/startCase';
-import { defineComponent, PropType, Ref, ref } from 'vue';
+import { defineComponent, PropType, ref } from 'vue';
import {
VBtn,
VCard,
@@ -165,9 +165,8 @@ export default defineComponent({
},
},
setup(props) {
- const control = props.input.control as any as Ref<
- typeof props.input.control
- >;
+ // eslint-disable-next-line vue/no-setup-props-destructure
+ const control = props.input.control;
const reservedPropertyNames = Object.keys(
control.value.schema.properties || {}
);
From 920aa8113fe33586de39546320e426d3665338dd Mon Sep 17 00:00:00 2001
From: Stefan Dirix
Date: Mon, 26 Jun 2023 15:18:44 +0200
Subject: [PATCH 071/185] Adapt README for release
---
packages/vue-vuetify/README.md | 22 ++++++++++------------
1 file changed, 10 insertions(+), 12 deletions(-)
diff --git a/packages/vue-vuetify/README.md b/packages/vue-vuetify/README.md
index a7d934d2ad..d7fcbd4078 100644
--- a/packages/vue-vuetify/README.md
+++ b/packages/vue-vuetify/README.md
@@ -4,23 +4,23 @@ _Complex Forms in the blink of an eye_
JSON Forms eliminates the tedious task of writing fully-featured forms by hand by leveraging the capabilities of JSON, JSON Schema and Javascript.
-## Vue 2 Vuetify Renderers
+## Vue Vuetify Renderers
-This is the JSON Forms Vue 2 Vuetify renderers package which provides a Vuetify based renderer set for [JSON Forms Vue 2](https://github.com/eclipsesource/jsonforms/blob/master/packages/vue2/vue2).
+This is the JSON Forms Vue Vuetify renderers package which provides a Vuetify based renderer set for [JSON Forms Vue](https://github.com/eclipsesource/jsonforms/blob/master/packages/vue/vue).
### Quick start
-Install JSON Forms Core, Vue 2 and Vue 2 Vuetify Renderers.
+Install JSON Forms Core, Vue 3 and Vue 3 Vuetify Renderers.
```bash
-npm i --save @jsonforms/core @jsonforms/vue2 @jsonforms/vue2-vuetify
+npm i --save @jsonforms/core @jsonforms/vue @jsonforms/vue-vuetify
```
Also add the packages to the transpile dependencies in the `vue.config.js` file:
```js
module.exports = {
- transpileDependencies: ['@jsonforms/core', '@jsonforms/vue2', '@jsonforms/vue2-vuetify']
+ transpileDependencies: ['@jsonforms/core', '@jsonforms/vue', '@jsonforms/vue-vuetify']
}
```
@@ -28,8 +28,8 @@ Use the `json-forms` component for each form you want to render and hand over th
```vue
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/vue-vuetify/dev/assets/JsonFormsLogo.vue b/packages/vue-vuetify/dev/assets/JsonFormsLogo.vue
new file mode 100644
index 0000000000..fb6f408e11
--- /dev/null
+++ b/packages/vue-vuetify/dev/assets/JsonFormsLogo.vue
@@ -0,0 +1,61 @@
+
+
+ JSONForms Logo
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/vue-vuetify/dev/assets/VuetifyLogo.vue b/packages/vue-vuetify/dev/assets/VuetifyLogo.vue
new file mode 100644
index 0000000000..cbb684eb25
--- /dev/null
+++ b/packages/vue-vuetify/dev/assets/VuetifyLogo.vue
@@ -0,0 +1,113 @@
+
+
+ Vuetify Logo
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/vue-vuetify/example-app/src/assets/logo.png b/packages/vue-vuetify/dev/assets/logo.png
similarity index 100%
rename from packages/vue-vuetify/example-app/src/assets/logo.png
rename to packages/vue-vuetify/dev/assets/logo.png
diff --git a/packages/vue-vuetify/example-app/src/assets/logo.svg b/packages/vue-vuetify/dev/assets/logo.svg
similarity index 100%
rename from packages/vue-vuetify/example-app/src/assets/logo.svg
rename to packages/vue-vuetify/dev/assets/logo.svg
diff --git a/packages/vue-vuetify/dev/components/ExampleAppBar.vue b/packages/vue-vuetify/dev/components/ExampleAppBar.vue
new file mode 100644
index 0000000000..fe05ff7e1c
--- /dev/null
+++ b/packages/vue-vuetify/dev/components/ExampleAppBar.vue
@@ -0,0 +1,64 @@
+
+
+
+
+
+
+
+
+ JSON Forms
+
+
+
+
+
+
+
+
+
+ $formOnly
+
+
+ {{
+ appStore.formOnly ? `Show Form Wrapper` : `Hide Form Wrapper`
+ }}
+
+
+
+
+
+
+
+ $settings
+
+
+ Settings
+
+
+
+
+
+
+
diff --git a/packages/vue-vuetify/dev/components/ExampleDrawer.vue b/packages/vue-vuetify/dev/components/ExampleDrawer.vue
new file mode 100644
index 0000000000..6c7378a1ee
--- /dev/null
+++ b/packages/vue-vuetify/dev/components/ExampleDrawer.vue
@@ -0,0 +1,38 @@
+
+
+
+
+
+
+
+
+ Examples
+ Vuetify Renderers
+
+
+
+
+
+
+ {{
+ example.label
+ }}
+
+
+
+
diff --git a/packages/vue-vuetify/dev/components/ExampleForm.vue b/packages/vue-vuetify/dev/components/ExampleForm.vue
new file mode 100644
index 0000000000..546f9b5132
--- /dev/null
+++ b/packages/vue-vuetify/dev/components/ExampleForm.vue
@@ -0,0 +1,137 @@
+
+
+
+
+
+
+
+
+ Resolving Schema Refs
+
+
+
+
+
+
+
+
+ {{ resolvedSchema.error }}
+
+
+
+
+
+
diff --git a/packages/vue-vuetify/example-app/src/components/Settings.vue b/packages/vue-vuetify/dev/components/ExampleSettings.vue
similarity index 56%
rename from packages/vue-vuetify/example-app/src/components/Settings.vue
rename to packages/vue-vuetify/dev/components/ExampleSettings.vue
index 610db12010..660cb81f4b 100644
--- a/packages/vue-vuetify/example-app/src/components/Settings.vue
+++ b/packages/vue-vuetify/dev/components/ExampleSettings.vue
@@ -1,7 +1,65 @@
+
+
@@ -9,7 +67,7 @@
Settings
-
+
$close
@@ -22,7 +80,7 @@
Light
- mdi-weather-sunny
+ $light
Dark
- mdi-weather-night
+ $dark
@@ -52,7 +110,7 @@
LTR
- mdi-format-textdirection-l-to-r
+ $ltr
RTL
- mdi-format-textdirection-r-to-l
+ $rtl
@@ -86,8 +144,10 @@
outlined
persistent-hint
dense
- v-model="validationMode"
+ v-model="appStore.jsonforms.validationMode"
:items="validationModes"
+ item-title="text"
+ item-value="value"
>
@@ -96,15 +156,74 @@
- Locale (Mostly in basic example)
+ Locale
+
+
+
+
+
+
+
+ Blueprints (need browser reload)
+
+
+
+
+
+
+
+
+
+
+ Variants
+
+
+
+
+
+
+
+
+
+
+ Icon Set (need browser reload)
+
+
+
@@ -119,7 +238,7 @@
@@ -133,7 +252,7 @@
@@ -147,7 +266,7 @@
@@ -162,7 +281,7 @@
@@ -176,7 +295,7 @@
@@ -190,7 +309,7 @@
@@ -204,7 +323,7 @@
@@ -218,7 +337,7 @@
@@ -227,74 +346,24 @@
-
-
- Break horizontal layouts
-
-
-
-
-
+
+
+
+
+
+
+ Whether the errors will be displayed for not touched controls
+
+
+
-
-
diff --git a/packages/vue-vuetify/dev/components/MonacoEditor.vue b/packages/vue-vuetify/dev/components/MonacoEditor.vue
new file mode 100644
index 0000000000..e1b3db466f
--- /dev/null
+++ b/packages/vue-vuetify/dev/components/MonacoEditor.vue
@@ -0,0 +1,137 @@
+
+
+
+
+
diff --git a/packages/vue-vuetify/dev/components/ThemeChanger.vue b/packages/vue-vuetify/dev/components/ThemeChanger.vue
new file mode 100644
index 0000000000..9979c7c0bd
--- /dev/null
+++ b/packages/vue-vuetify/dev/components/ThemeChanger.vue
@@ -0,0 +1,96 @@
+
+
+
+
+
+
+
+
+ $palette
+
+
+ Theme Colors
+
+
+
+ {{ currentTheme.current.value.dark ? 'Dark' : 'Light' }} Theme
+ Colors
+
+
+
+ $close
+
+
+
+
+
+
+
+
+
+
+ {{ theme.name }}
+
+
+ $complete
+
+
+
+
+
+ {{ key }}
+
+
+
+
+
+
diff --git a/packages/vue-vuetify/example-app/src/core/jsonSchemaValidation.ts b/packages/vue-vuetify/dev/core/jsonSchemaValidation.ts
similarity index 74%
rename from packages/vue-vuetify/example-app/src/core/jsonSchemaValidation.ts
rename to packages/vue-vuetify/dev/core/jsonSchemaValidation.ts
index b2f7971508..763b54a529 100644
--- a/packages/vue-vuetify/example-app/src/core/jsonSchemaValidation.ts
+++ b/packages/vue-vuetify/dev/core/jsonSchemaValidation.ts
@@ -1,11 +1,9 @@
-import editorApi from 'monaco-editor/esm/vs/editor/editor.api';
-import * as monaco from 'monaco-editor/esm/vs/editor/editor.api';
-import { JsonSchema } from '@jsonforms/core';
+import type { JsonSchema } from '@jsonforms/core';
+import monaco, { type MonacoApi } from './monaco';
+import isEqual from 'lodash/isEqual';
import { jsonSchemaDraft7, ruleSchema, uiSchema } from '../core/jsonschema';
-export type EditorApi = typeof editorApi;
-
/**
* Register a new schema for the Json language, if it isn't already registered.
* Schemas are identified by their uri and fileMatch rule, so that they don't
@@ -16,12 +14,12 @@ export type EditorApi = typeof editorApi;
* Schemas to register
*/
export const addSchema = (
- editor: EditorApi,
+ editor: MonacoApi,
schemas: {
uri: string;
fileMatch?: string[];
schema?: JsonSchema;
- }[]
+ }[],
): void => {
const registeredSchemas =
editor.languages.json.jsonDefaults.diagnosticsOptions.schemas;
@@ -38,15 +36,26 @@ export const addSchema = (
for (const schema of schemas) {
const fileMatch = schema.fileMatch;
- const gridSchema = registeredSchemas.find(
+ const existingSchemaIndex = registeredSchemas.findIndex(
(registeredSchema) =>
- registeredSchema.fileMatch === fileMatch &&
- registeredSchema.uri === schema.uri
+ isEqual(registeredSchema.fileMatch, fileMatch) &&
+ isEqual(registeredSchema.uri, schema.uri),
);
- if (!gridSchema) {
+ if (existingSchemaIndex !== -1) {
+ registeredSchemas[existingSchemaIndex] = { ...schema };
+ } else {
registeredSchemas.push({ ...schema });
}
}
+
+ editor.languages.json.jsonDefaults.setDiagnosticsOptions({
+ validate: true,
+ allowComments: false,
+ enableSchemaRequest: false,
+ schemaRequest: 'warning',
+ schemaValidation: 'error',
+ schemas: [...registeredSchemas],
+ });
}
};
@@ -54,8 +63,8 @@ export const addSchema = (
* Configures the Monaco Editor to validate the input against JSON Schema Draft 7.
*/
export const configureJsonSchemaValidation = (
- editor: EditorApi,
- fileMatch: string[]
+ editor: MonacoApi,
+ fileMatch: string[],
): void => {
/** Note that the Monaco Editor only supports JSON Schema Draft 7 itself,
* so if we also want to support a later standard we still have to formalize
@@ -67,8 +76,8 @@ export const configureJsonSchemaValidation = (
* Configures the Monaco Editor to validate the input against the UI Schema meta-schema.
*/
export const configureUISchemaValidation = (
- editor: EditorApi,
- fileMatch: string[]
+ editor: MonacoApi,
+ fileMatch: string[],
): void => {
/** Note that the Monaco Editor only supports JSON Schema Draft 7 itself,
* so if we also want to support a later standard we still have to formalize
@@ -84,10 +93,10 @@ export const configureUISchemaValidation = (
* Configures the Monaco Editor to validate the input against JSON Schema model schema.
*/
export const configureDataValidation = (
- editor: EditorApi,
+ editor: MonacoApi,
uri: string,
fileMatch: string,
- schema: JsonSchema
+ schema: JsonSchema,
): void => {
/** Note that the Monaco Editor only supports JSON Schema Draft 7 itself,
* so if we also want to support a later standard we still have to formalize
@@ -97,8 +106,8 @@ export const configureDataValidation = (
export const getMonacoModelForUri = (
modelUri: monaco.Uri,
- initialValue: string | undefined
-): editorApi.editor.ITextModel => {
+ initialValue: string | undefined,
+): monaco.editor.ITextModel => {
const value = initialValue ?? '';
let model = monaco.editor.getModel(modelUri);
if (model) {
diff --git a/packages/vue-vuetify/example-app/src/core/jsonschema/index.ts b/packages/vue-vuetify/dev/core/jsonschema/index.ts
similarity index 83%
rename from packages/vue-vuetify/example-app/src/core/jsonschema/index.ts
rename to packages/vue-vuetify/dev/core/jsonschema/index.ts
index d18aeb107f..860caf4f26 100644
--- a/packages/vue-vuetify/example-app/src/core/jsonschema/index.ts
+++ b/packages/vue-vuetify/dev/core/jsonschema/index.ts
@@ -1,11 +1,11 @@
+import type { JsonSchema } from '@jsonforms/core';
import rule from './specification/rule.json';
import schema from './specification/schema.json';
import uischema from './specification/uischema.json';
-import { JsonSchema } from '@jsonforms/core';
export const jsonSchemaDraft7 = {
uri: 'http://json-schema.org/draft-07/schema',
- schema: schema as JsonSchema,
+ schema: schema as any as JsonSchema,
};
export const uiSchema = {
diff --git a/packages/vue-vuetify/example-app/src/core/jsonschema/specification/rule.json b/packages/vue-vuetify/dev/core/jsonschema/specification/rule.json
similarity index 100%
rename from packages/vue-vuetify/example-app/src/core/jsonschema/specification/rule.json
rename to packages/vue-vuetify/dev/core/jsonschema/specification/rule.json
diff --git a/packages/vue-vuetify/example-app/src/core/jsonschema/specification/schema.json b/packages/vue-vuetify/dev/core/jsonschema/specification/schema.json
similarity index 100%
rename from packages/vue-vuetify/example-app/src/core/jsonschema/specification/schema.json
rename to packages/vue-vuetify/dev/core/jsonschema/specification/schema.json
diff --git a/packages/vue-vuetify/example-app/src/core/jsonschema/specification/uischema.json b/packages/vue-vuetify/dev/core/jsonschema/specification/uischema.json
similarity index 100%
rename from packages/vue-vuetify/example-app/src/core/jsonschema/specification/uischema.json
rename to packages/vue-vuetify/dev/core/jsonschema/specification/uischema.json
diff --git a/packages/vue-vuetify/dev/core/monaco.ts b/packages/vue-vuetify/dev/core/monaco.ts
new file mode 100644
index 0000000000..f6e156efc1
--- /dev/null
+++ b/packages/vue-vuetify/dev/core/monaco.ts
@@ -0,0 +1,16 @@
+import * as monaco from 'monaco-editor';
+
+import editorWorker from 'monaco-editor/esm/vs/editor/editor.worker?worker';
+import jsonWorker from 'monaco-editor/esm/vs/language/json/json.worker?worker';
+
+self.MonacoEnvironment = {
+ getWorker(_, label) {
+ if (label === 'json') {
+ return new jsonWorker();
+ }
+ return new editorWorker();
+ },
+};
+
+export default monaco;
+export type MonacoApi = typeof monaco;
diff --git a/packages/vue-vuetify/dev/env.d.ts b/packages/vue-vuetify/dev/env.d.ts
new file mode 100644
index 0000000000..11f02fe2a0
--- /dev/null
+++ b/packages/vue-vuetify/dev/env.d.ts
@@ -0,0 +1 @@
+///
diff --git a/packages/vue-vuetify/dev/examples/index.ts b/packages/vue-vuetify/dev/examples/index.ts
new file mode 100644
index 0000000000..c9736d7286
--- /dev/null
+++ b/packages/vue-vuetify/dev/examples/index.ts
@@ -0,0 +1,5 @@
+import { getExamples } from '../../../examples';
+
+const examples = getExamples();
+
+export default examples;
diff --git a/packages/vue-vuetify/dev/icons/fa.ts b/packages/vue-vuetify/dev/icons/fa.ts
new file mode 100644
index 0000000000..55eba56571
--- /dev/null
+++ b/packages/vue-vuetify/dev/icons/fa.ts
@@ -0,0 +1,16 @@
+import type { ExampleIconAliases } from './icons';
+
+const aliases: ExampleIconAliases = {
+ dark: 'fas fa-moon',
+ light: 'fas fa-sun',
+ ltr: 'fas fa-align-left',
+ rtl: 'fas fa-align-right',
+ palette: 'fas fa-palette',
+ settings: 'fas fa-gear',
+ formatText: 'fas fa-text',
+ formOnly: 'fas fa-window-restore',
+ reload: 'fas fa-rotate-right',
+ save: 'fas fa-floppy-disk',
+};
+
+export { aliases };
diff --git a/packages/vue-vuetify/dev/icons/icons.ts b/packages/vue-vuetify/dev/icons/icons.ts
new file mode 100644
index 0000000000..5fac9b13a9
--- /dev/null
+++ b/packages/vue-vuetify/dev/icons/icons.ts
@@ -0,0 +1,14 @@
+import type { IconValue } from '../../src/icons/icons';
+
+export interface ExampleIconAliases {
+ dark: IconValue;
+ light: IconValue;
+ ltr: IconValue;
+ rtl: IconValue;
+ palette: IconValue;
+ settings: IconValue;
+ formatText: IconValue;
+ formOnly: IconValue;
+ reload: IconValue;
+ save: IconValue;
+}
diff --git a/packages/vue-vuetify/dev/icons/mdi.ts b/packages/vue-vuetify/dev/icons/mdi.ts
new file mode 100644
index 0000000000..dd95b370bd
--- /dev/null
+++ b/packages/vue-vuetify/dev/icons/mdi.ts
@@ -0,0 +1,16 @@
+import type { ExampleIconAliases } from './icons';
+
+const aliases: ExampleIconAliases = {
+ dark: 'mdi-weather-night',
+ light: 'mdi-weather-sunny',
+ ltr: 'mdi-format-pilcrow-arrow-right',
+ rtl: 'mdi-format-pilcrow-arrow-left',
+ palette: 'mdi-palette',
+ settings: 'mdi-cog',
+ formatText: 'mdi-format-text',
+ formOnly: 'mdi-dock-window',
+ reload: 'mdi-reload',
+ save: 'mdi-content-save',
+};
+
+export { aliases };
diff --git a/packages/vue-vuetify/dev/main.ts b/packages/vue-vuetify/dev/main.ts
new file mode 100644
index 0000000000..454f3b9d56
--- /dev/null
+++ b/packages/vue-vuetify/dev/main.ts
@@ -0,0 +1,5 @@
+import { createApp } from 'vue';
+import App from './App.vue';
+import buildVuetify from './plugins/vuetify';
+
+createApp(App).use(buildVuetify()).mount('#app');
diff --git a/packages/vue-vuetify/dev/plugins/vuetify.ts b/packages/vue-vuetify/dev/plugins/vuetify.ts
new file mode 100644
index 0000000000..07c26095c3
--- /dev/null
+++ b/packages/vue-vuetify/dev/plugins/vuetify.ts
@@ -0,0 +1,278 @@
+import { createVuetify, type Blueprint, type ThemeDefinition } from 'vuetify';
+import { md1, md2, md3 } from 'vuetify/blueprints';
+
+import '@fortawesome/fontawesome-free/css/all.css';
+import '@mdi/font/css/materialdesignicons.css';
+
+import { bg, de, en } from 'vuetify/locale';
+import 'vuetify/styles';
+// just make sure that the locales are loaded
+
+import dayjs from 'dayjs';
+import { watch } from 'vue';
+import { fa, aliases as faAliases } from 'vuetify/iconsets/fa';
+import { mdi, aliases as mdiAliases } from 'vuetify/iconsets/mdi';
+import { mdiIconAliases, faIconAliases } from '../../src/icons';
+import { aliases as appFaAliases } from '../icons/fa';
+import { aliases as appMdiAliases } from '../icons/mdi';
+import { useAppStore } from '../store';
+
+export function getCustomThemes(blueprint: string) {
+ const getThemeColors = (blueprint: string) => {
+ switch (blueprint) {
+ case 'md1':
+ return (md1.theme as any).themes.light.colors;
+ case 'md2':
+ return (md2.theme as any).themes.light.colors;
+ default:
+ return (md3.theme as any).themes.light.colors;
+ }
+ };
+
+ const customThemes: (ThemeDefinition & { name: string })[] = [
+ {
+ name: 'light',
+ dark: false,
+ colors: getThemeColors(blueprint),
+ },
+ {
+ name: 'dark',
+ dark: true,
+ colors: {
+ primary: '#2196F3',
+ secondary: '#54B6B2',
+ error: '#CF6679',
+ info: '#2196F3',
+ success: '#4CAF50',
+ warning: '#FB8C00',
+ },
+ },
+ {
+ name: 'Basil',
+ dark: false,
+ colors: {
+ primary: '#356859',
+ secondary: '#FD5523',
+ accent: '#37966F',
+ info: '#356859',
+ },
+ },
+ {
+ name: 'Crane',
+ dark: false,
+ colors: {
+ primary: '#5D1049',
+ secondary: '#E30425',
+ accent: '#4E0D3A',
+ info: '#5D1049',
+ },
+ },
+ {
+ name: 'Fortnightly',
+ dark: false,
+ colors: {
+ primary: '#6B38FB',
+ secondary: '#6B38FB',
+ info: '#6B38FB',
+ },
+ },
+ {
+ name: 'Owl',
+ dark: false,
+ colors: {
+ primary: '#FFDE03',
+ secondary: '#0336FF',
+ accent: '#FF0266',
+ info: '#FFDE03',
+ },
+ },
+ {
+ name: 'Shrine',
+ dark: false,
+ colors: {
+ primary: '#FEDBD0',
+ secondary: '#FEEAE6',
+ accent: '#442C2E',
+ info: '#FEDBD0',
+ },
+ },
+ ];
+
+ return customThemes;
+}
+
+function toIconSetAliases(iconset: string) {
+ // we can add vue-vuetify icons setoverrides here if needed or use the default provided base on the iconset
+
+ if (iconset === 'fa') {
+ // override vuetify calendar to use fa-regular calendar instead of fa-solid
+ return {
+ ...{ ...faAliases, ...{ calendar: 'far fa-calendar' } },
+ ...faIconAliases,
+ ...appFaAliases,
+ };
+ }
+
+ // default
+ return { ...mdiAliases, ...mdiIconAliases, ...appMdiAliases };
+}
+
+function toBlueprint(value: string): Blueprint {
+ if (value === 'md1') {
+ return md1;
+ }
+ if (value === 'md2') {
+ return md2;
+ }
+ if (value === 'md3') {
+ return md3;
+ }
+ // default
+ return md1;
+}
+
+function createVuetifyInstance(
+ dark: boolean,
+ blueprint: string,
+ variant: string,
+ iconset: string,
+ locale: string,
+) {
+ const defaults = variant
+ ? {
+ VField: {
+ variant: variant,
+ },
+ VTextField: {
+ variant: variant,
+ },
+ VCombobox: {
+ variant: variant,
+ },
+ VSelect: {
+ variant: variant,
+ },
+ VAutocomplete: {
+ variant: variant,
+ },
+ VTextarea: {
+ variant: variant,
+ },
+ VNumberInput: {
+ variant: variant,
+ },
+ VDateInput: {
+ variant: variant,
+ },
+ VCheckbox: { color: 'primary' },
+ }
+ : {
+ VCheckbox: { color: 'primary' },
+ };
+
+ dayjs.locale(locale);
+
+ return createVuetify({
+ blueprint: toBlueprint(blueprint),
+ locale: {
+ locale: locale,
+ fallback: 'en',
+ messages: { en, bg, de },
+ },
+ icons: {
+ defaultSet: iconset, // Set the default icon set
+ sets: {
+ mdi,
+ fa,
+ },
+ aliases: toIconSetAliases(iconset),
+ },
+ theme: {
+ defaultTheme: dark ? 'dark' : 'light',
+ themes: getCustomThemes(blueprint).reduce(
+ (acc: Record, current) => {
+ acc[current.name] = current;
+ return acc;
+ },
+ {},
+ ),
+ },
+ defaults: defaults,
+ });
+}
+
+export function buildVuetify() {
+ const appStore = useAppStore();
+ const vuetify = createVuetifyInstance(
+ appStore.dark,
+ appStore.blueprint,
+ appStore.variant,
+ appStore.iconset,
+ appStore.jsonforms.locale,
+ );
+
+ watch(
+ () => appStore.jsonforms.locale,
+ (locale: string) => {
+ vuetify.locale.current.value = locale;
+ dayjs.locale(locale);
+ },
+ );
+
+ // Watch for changes in the variant and update Vuetify
+ watch(
+ () => appStore.variant,
+ (variant: string) => {
+ if (variant) {
+ vuetify.defaults.value = {
+ ...vuetify.defaults.value,
+ VField: {
+ ...vuetify.defaults.value?.VField,
+ variant: variant,
+ },
+ VTextField: {
+ ...vuetify.defaults.value?.VTextField,
+ variant: variant,
+ },
+ VCombobox: {
+ ...vuetify.defaults.value?.VCombobox,
+ variant: variant,
+ },
+ VSelect: {
+ ...vuetify.defaults.value?.VSelect,
+ variant: variant,
+ },
+ VAutocomplete: {
+ ...vuetify.defaults.value?.VAutocomplete,
+ variant: variant,
+ },
+ VTextarea: {
+ ...vuetify.defaults.value?.VTextarea,
+ variant: variant,
+ },
+ VNumberInput: {
+ ...vuetify.defaults.value?.VNumberInput,
+ variant: variant,
+ },
+ VDateInput: {
+ ...vuetify.defaults.value?.VDateInput,
+ variant: variant,
+ },
+ };
+ } else {
+ delete vuetify.defaults.value?.VField?.variant;
+ delete vuetify.defaults.value?.VTextField?.variant;
+ delete vuetify.defaults.value?.VCombobox?.variant;
+ delete vuetify.defaults.value?.VSelect?.variant;
+ delete vuetify.defaults.value?.VAutocomplete?.variant;
+ delete vuetify.defaults.value?.VTextarea?.variant;
+ delete vuetify.defaults.value?.VNumberInput?.variant;
+ delete vuetify.defaults.value?.VDateInput?.variant;
+ }
+ },
+ );
+
+ return vuetify;
+}
+
+export default buildVuetify;
diff --git a/packages/vue-vuetify/dev/store/index.ts b/packages/vue-vuetify/dev/store/index.ts
new file mode 100644
index 0000000000..cacfe6a4bd
--- /dev/null
+++ b/packages/vue-vuetify/dev/store/index.ts
@@ -0,0 +1,111 @@
+import type { ValidationMode } from '@jsonforms/core';
+import { reactive, ref, watch } from 'vue';
+
+const appstore = reactive({
+ exampleName: useHistoryHash(''),
+ rtl: false,
+ formOnly: false,
+ dark: useLocalStorage('vuetify-example-dark', false),
+ theme: useLocalStorage('vuetify-example-theme', 'light'),
+ drawer: true,
+ settings: false,
+ variant: useLocalStorage('vuetify-example-variant', ''),
+ iconset: useLocalStorage('vuetify-example-iconset', 'mdi'),
+ blueprint: useLocalStorage('vuetify-example-blueprint', 'md1'),
+ jsonforms: {
+ readonly: false,
+ validationMode: 'ValidateAndShow' as ValidationMode,
+ config: {
+ restrict: true,
+ trim: false,
+ showUnfocusedDescription: false,
+ hideRequiredAsterisk: true,
+ collapseNewItems: false,
+ breakHorizontal: false,
+ initCollapsed: false,
+ hideAvatar: false,
+ hideArraySummaryValidation: false,
+ enableFilterErrorsBeforeTouch: false,
+ vuetify: {},
+ },
+ locale: useLocalStorage('vuetify-example-locale', 'en'),
+ },
+});
+
+export const useAppStore = () => {
+ return appstore;
+};
+
+export function useHistoryHash(initialValue: string) {
+ const data = ref(initialValue);
+
+ // Function to update data based on URL hash
+ const updateDataFromHash = () => {
+ const hash = window.location.hash.slice(1);
+ if (hash) {
+ try {
+ data.value = decodeURIComponent(hash);
+ } catch (error) {
+ console.error('Error parsing hash:', error);
+ }
+ }
+ };
+
+ // Update data from URL hash on component mount
+ updateDataFromHash();
+
+ watch(
+ data,
+ (newValue) => {
+ const encodedData = encodeURIComponent(newValue);
+ window.history.replaceState(null, '', `#${encodedData}`);
+ },
+ { deep: true },
+ );
+
+ return data;
+}
+
+export function useLocalStorage(
+ key: string,
+ initialValue: string | boolean | number | Record,
+) {
+ // Read from localStorage
+ const storedValueAsString = localStorage.getItem(key);
+
+ let storedValue;
+ if (storedValueAsString) {
+ if (typeof initialValue === 'string') {
+ storedValue = storedValueAsString;
+ } else if (typeof initialValue === 'number') {
+ storedValue = parseFloat(storedValueAsString);
+ } else if (typeof initialValue === 'boolean') {
+ storedValue = storedValueAsString === 'true';
+ } else {
+ storedValue = JSON.parse(storedValueAsString);
+ }
+ }
+
+ const data = ref(storedValue ?? initialValue);
+
+ // Watch for changes to data and update localStorage
+ watch(
+ data,
+ (newValue) => {
+ if (newValue === undefined || newValue === null) {
+ localStorage.removeItem(key);
+ } else if (
+ typeof newValue === 'string' ||
+ typeof newValue === 'boolean' ||
+ typeof newValue === 'number'
+ ) {
+ localStorage.setItem(key, newValue + '');
+ } else {
+ localStorage.setItem(key, JSON.stringify(newValue));
+ }
+ },
+ { deep: true },
+ );
+
+ return data;
+}
diff --git a/packages/vue-vuetify/example-app/src/store/validate/dynamicDefaults.ts b/packages/vue-vuetify/dev/validate/dynamicDefaults.ts
similarity index 97%
rename from packages/vue-vuetify/example-app/src/store/validate/dynamicDefaults.ts
rename to packages/vue-vuetify/dev/validate/dynamicDefaults.ts
index 5ab7b34305..5252f9027d 100644
--- a/packages/vue-vuetify/example-app/src/store/validate/dynamicDefaults.ts
+++ b/packages/vue-vuetify/dev/validate/dynamicDefaults.ts
@@ -1,4 +1,4 @@
-import dayjs, { UnitType } from 'dayjs';
+import dayjs, { type UnitType } from 'dayjs';
import customParsingPlugin from 'dayjs/plugin/customParseFormat';
import durationPlugin from 'dayjs/plugin/duration';
import timezonePlugin from 'dayjs/plugin/timezone'; // dependent on utc plugin
@@ -20,7 +20,7 @@ export const dynamic = (args: any) => {
try {
const fn = new Function(
'args',
- `const func = ${func}; return func(args);`
+ `const func = ${func}; return func(args);`,
);
return () => {
try {
diff --git a/packages/vue-vuetify/example-app/src/store/validate/validate.ts b/packages/vue-vuetify/dev/validate/index.ts
similarity index 52%
rename from packages/vue-vuetify/example-app/src/store/validate/validate.ts
rename to packages/vue-vuetify/dev/validate/index.ts
index dd3e0e495b..c454e69279 100644
--- a/packages/vue-vuetify/example-app/src/store/validate/validate.ts
+++ b/packages/vue-vuetify/dev/validate/index.ts
@@ -1,5 +1,6 @@
-import { Options } from 'ajv';
-import { createAjv as createDefaultAjv } from '@jsonforms/vue-vuetify';
+import type { Options } from 'ajv';
+import { markRaw } from 'vue';
+import { createAjv as createDefaultAjv } from '../../src';
import { ajvKeywords } from './keywords';
export const createAjv = () => {
@@ -12,5 +13,6 @@ export const createAjv = () => {
const ajv = createDefaultAjv(options);
ajvKeywords(ajv);
- return ajv;
+ // when ajv is used in component properties do not make it reactive
+ return markRaw(ajv);
};
diff --git a/packages/vue-vuetify/example-app/src/store/validate/keywords.ts b/packages/vue-vuetify/dev/validate/keywords.ts
similarity index 100%
rename from packages/vue-vuetify/example-app/src/store/validate/keywords.ts
rename to packages/vue-vuetify/dev/validate/keywords.ts
diff --git a/packages/vue-vuetify/example-app/src/store/validate/transform.ts b/packages/vue-vuetify/dev/validate/transform.ts
similarity index 96%
rename from packages/vue-vuetify/example-app/src/store/validate/transform.ts
rename to packages/vue-vuetify/dev/validate/transform.ts
index c5e713f6f1..d0c4bfb81c 100644
--- a/packages/vue-vuetify/example-app/src/store/validate/transform.ts
+++ b/packages/vue-vuetify/dev/validate/transform.ts
@@ -1,11 +1,11 @@
import type {
- CodeKeywordDefinition,
AnySchemaObject,
- KeywordCxt,
Code,
+ CodeKeywordDefinition,
+ KeywordCxt,
Name,
} from 'ajv';
-import { _, stringify, getProperty } from 'ajv/dist/compile/codegen';
+import { _, getProperty, stringify } from 'ajv/dist/compile/codegen';
import capitalizeFn from 'lodash/capitalize';
import startCaseFn from 'lodash/startCase';
@@ -64,7 +64,7 @@ function _getDef(): CodeKeywordDefinition {
() => {
gen.assign(data, transformExpr(tNames.slice()));
gen.assign(_`${parentData}[${parentDataProperty}]`, data);
- }
+ },
);
function transformExpr(ts: string[]): Code {
@@ -75,7 +75,7 @@ function _getDef(): CodeKeywordDefinition {
const func = gen.scopeValue('func', {
ref: transform[t as TransformName],
code: _`require("ajv-keywords/dist/definitions/transform").transform${getProperty(
- t
+ t,
)}`,
});
const arg = transformExpr(ts);
@@ -104,7 +104,7 @@ function getEnumCaseCfg(parentSchema: AnySchemaObject): TransformConfig {
// requires all `enum` values have unique keys
if (cfg.hash[k]) {
throw new Error(
- 'transform: "toEnumCase" requires all lowercased "enum" values to be unique'
+ 'transform: "toEnumCase" requires all lowercased "enum" values to be unique',
);
}
cfg.hash[k] = v;
diff --git a/packages/vue-vuetify/dev/views/ExampleView.vue b/packages/vue-vuetify/dev/views/ExampleView.vue
new file mode 100644
index 0000000000..c93eb9420d
--- /dev/null
+++ b/packages/vue-vuetify/dev/views/ExampleView.vue
@@ -0,0 +1,540 @@
+
+
+
+
+
+
+ {{ example.label }}
+
+
+ Demo
+
+ Schema
+ UI Schema
+ Data
+
+
+
+
+
+
+
+
+ JSONForm
+
+
+ handleAction(action)"
+ >{{ action.label }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Schema
+
+
+
+
+ $reload
+
+
+ {{ `Reload Example Schema` }}
+
+
+
+
+ $save
+
+
+ {{ `Apply Change To Example Schema` }}
+
+
+
+
+
+
+
+
+
+
+
+ UI Schema
+
+
+
+
+ $reload
+
+
+ {{ `Reload Example UI Schema` }}
+
+
+
+
+ $save
+
+
+ {{ `Apply Change To Example UI Schema` }}
+
+
+
+
+
+
+
+
+
+
+
+ Data
+
+
+
+
+ $reload
+
+
+ {{ `Reload Example Data` }}
+
+
+
+
+ $save
+
+
+ {{ `Apply Change To Example Data` }}
+
+
+
+
+
+
+
+
+
+ TODO
+
+
+
+
+
+
+ {{ snackbarText }}
+
+ Close
+
+
+
+
+
+
+
+
diff --git a/packages/vue-vuetify/example-app/src/views/home/Home.vue b/packages/vue-vuetify/dev/views/HomeView.vue
similarity index 66%
rename from packages/vue-vuetify/example-app/src/views/home/Home.vue
rename to packages/vue-vuetify/dev/views/HomeView.vue
index ffc6b07348..487e0e244d 100644
--- a/packages/vue-vuetify/example-app/src/views/home/Home.vue
+++ b/packages/vue-vuetify/dev/views/HomeView.vue
@@ -1,19 +1,18 @@
+
+
-
-
-
-
+
+
Welcome to JSON Forms Vue 3 Vuetify
+ More Forms. Less Code.
For help and collaboration with other JSON Forms developers,
@@ -26,9 +25,3 @@
-
-
diff --git a/packages/vue-vuetify/example-app/.browserslistrc b/packages/vue-vuetify/example-app/.browserslistrc
deleted file mode 100644
index 214388fe43..0000000000
--- a/packages/vue-vuetify/example-app/.browserslistrc
+++ /dev/null
@@ -1,3 +0,0 @@
-> 1%
-last 2 versions
-not dead
diff --git a/packages/vue-vuetify/example-app/.eslintignore b/packages/vue-vuetify/example-app/.eslintignore
deleted file mode 100644
index 5cfc5c5119..0000000000
--- a/packages/vue-vuetify/example-app/.eslintignore
+++ /dev/null
@@ -1,3 +0,0 @@
-# Make sure eslint does not check the output files of our renderer set
-../*
-!/*
diff --git a/packages/vue-vuetify/example-app/.eslintrc.js b/packages/vue-vuetify/example-app/.eslintrc.js
deleted file mode 100644
index ecbec231d5..0000000000
--- a/packages/vue-vuetify/example-app/.eslintrc.js
+++ /dev/null
@@ -1,20 +0,0 @@
-module.exports = {
- root: true,
- env: {
- node: true,
- },
- extends: [
- 'plugin:vue/essential',
- 'eslint:recommended',
- '@vue/typescript/recommended',
- '@vue/prettier',
- '@vue/eslint-config-prettier',
- ],
- parserOptions: {
- ecmaVersion: 2020,
- },
- rules: {
- 'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
- 'no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
- },
-};
diff --git a/packages/vue-vuetify/example-app/.gitignore b/packages/vue-vuetify/example-app/.gitignore
deleted file mode 100644
index 403adbc1e5..0000000000
--- a/packages/vue-vuetify/example-app/.gitignore
+++ /dev/null
@@ -1,23 +0,0 @@
-.DS_Store
-node_modules
-/dist
-
-
-# local env files
-.env.local
-.env.*.local
-
-# Log files
-npm-debug.log*
-yarn-debug.log*
-yarn-error.log*
-pnpm-debug.log*
-
-# Editor directories and files
-.idea
-.vscode
-*.suo
-*.ntvs*
-*.njsproj
-*.sln
-*.sw?
diff --git a/packages/vue-vuetify/example-app/.prettierrc.js b/packages/vue-vuetify/example-app/.prettierrc.js
deleted file mode 100644
index 59c570866f..0000000000
--- a/packages/vue-vuetify/example-app/.prettierrc.js
+++ /dev/null
@@ -1,4 +0,0 @@
-module.exports = {
- jsxSingleQuote: true,
- singleQuote: true,
-}
diff --git a/packages/vue-vuetify/example-app/README.md b/packages/vue-vuetify/example-app/README.md
deleted file mode 100644
index 768282fb9b..0000000000
--- a/packages/vue-vuetify/example-app/README.md
+++ /dev/null
@@ -1,10 +0,0 @@
-# JSON Forms Vuetify renderer set example app
-
-## Prerequsites
-
-- Build the JSON Forms Vuetify renderer set
-
-## Scripts
-
-- `npm run serve` to start the application
-- `npm run build` to build the application
diff --git a/packages/vue-vuetify/example-app/babel.config.js b/packages/vue-vuetify/example-app/babel.config.js
deleted file mode 100644
index 078c0056ff..0000000000
--- a/packages/vue-vuetify/example-app/babel.config.js
+++ /dev/null
@@ -1,3 +0,0 @@
-module.exports = {
- presets: ['@vue/cli-plugin-babel/preset'],
-};
diff --git a/packages/vue-vuetify/example-app/package.json b/packages/vue-vuetify/example-app/package.json
deleted file mode 100644
index 2c17361b0c..0000000000
--- a/packages/vue-vuetify/example-app/package.json
+++ /dev/null
@@ -1,45 +0,0 @@
-{
- "name": "example",
- "version": "3.3.0-preview.0",
- "private": true,
- "scripts": {
- "build": "vue-cli-service build",
- "serve": "vue-cli-service serve",
- "clean": "rimraf dist"
- },
- "dependencies": {
- "@jsonforms/core": "3.3.0",
- "@jsonforms/vue": "3.3.0",
- "@jsonforms/vue-vuetify": "3.3.0-preview.0",
- "ajv-keywords": "^5.1.0",
- "core-js": "^3.9.1",
- "json-refs": "^3.0.15",
- "monaco-editor": "^0.38.0",
- "vue": "^3.2.47",
- "vue-router": "^4.1.6",
- "vuetify": "^3.1.12",
- "vuex": "^4.1.0"
- },
- "devDependencies": {
- "@typescript-eslint/eslint-plugin": "^5.4.0",
- "@typescript-eslint/parser": "^5.4.0",
- "@vue/cli-plugin-babel": "~5.0.8",
- "@vue/cli-plugin-eslint": "~5.0.8",
- "@vue/cli-plugin-typescript": "~5.0.8",
- "@vue/cli-service": "~5.0.0",
- "@vue/eslint-config-prettier": "^7.1.0",
- "@vue/eslint-config-typescript": "^11.0.0",
- "eslint": "^8.37.0",
- "eslint-plugin-prettier": "^4.0.0",
- "eslint-plugin-vue": "^9.10.0",
- "monaco-editor-webpack-plugin": "^7.0.1",
- "prettier": "^2.8.7",
- "rimraf": "^4.4.1",
- "sass": "~1.32.0",
- "sass-loader": "^10.0.0",
- "typescript": "~4.7.4",
- "vue-cli-plugin-vuetify": "~2.5.8",
- "vuex-pathify": "^3.0.0-beta",
- "webpack-plugin-vuetify": "^2.0.1"
- }
-}
diff --git a/packages/vue-vuetify/example-app/public/favicon.ico b/packages/vue-vuetify/example-app/public/favicon.ico
deleted file mode 100644
index df36fcfb72584e00488330b560ebcf34a41c64c2..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 4286
zcmds*O-Phc6o&64GDVCEQHxsW(p4>LW*W<827=Unuo8sGpRux(DN@jWP-e29Wl%wj
zY84_aq9}^Am9-cWTD5GGEo#+5Fi2wX_P*bo+xO!)p*7B;iKlbFd(U~_d(U?#hLj56
zPhFkj-|A6~Qk#@g^#D^U0XT1cu=c-vu1+SElX9NR;kzAUV(q0|dl0|%h|dI$%VICy
zJnu2^L*Te9JrJMGh%-P79CL0}dq92RGU6gI{v2~|)p}sG5x0U*z<8U;Ij*hB9z?ei
z@g6Xq-pDoPl=MANPiR7%172VA%r)kevtV-_5H*QJKFmd;8yA$98zCxBZYXTNZ#QFk2(TX0;Y2dt&WitL#$96|gJY=3xX
zpCoi|YNzgO3R`f@IiEeSmKrPSf#h#Qd<$%Ej^RIeeYfsxhPMOG`S`Pz8q``=511zm
zAm)MX5AV^5xIWPyEu7u>qYs?pn$I4nL9J!=K=SGlKLXpE<5x+2cDTXq?brj?n6sp=
zphe9;_JHf40^9~}9i08r{XM$7HB!`{Ys~TK0kx<}ZQng`UPvH*11|q7&l9?@FQz;8
zx!=3<4seY*%=OlbCbcae?5^V_}*K>Uo6ZWV8mTyE^B=DKy7-sdLYkR5Z?paTgK-zyIkKjIcpyO
z{+uIt&YSa_$QnN_@t~L014dyK(fOOo+W*MIxbA6Ndgr=Y!f#Tokqv}n<7-9qfHkc3
z=>a|HWqcX8fzQCT=dqVbogRq!-S>H%yA{1w#2Pn;=e>JiEj7Hl;zdt-2f+j2%DeVD
zsW0Ab)ZK@0cIW%W7z}H{&~yGhn~D;aiP4=;m-HCo`BEI+Kd6
z={Xwx{T%b6i9IjI)Ls)S{-*mq<@~R{?$}ZKjf;^k75i_}(2MXt}^SEBVg7AI@28
zo_uPg2V)_e-`2Ois=PYoe%9u*n9({PFR)OnHJPi{dNx>KxD#iCLfl2vQGDitKtN>z|-AdCN|$jTFDg0m3O`WLD4_s#$S
diff --git a/packages/vue-vuetify/example-app/public/index.html b/packages/vue-vuetify/example-app/public/index.html
deleted file mode 100644
index 97a935b72b..0000000000
--- a/packages/vue-vuetify/example-app/public/index.html
+++ /dev/null
@@ -1,19 +0,0 @@
-
-
-
-
-
-
-
- JSON Forms Vue 3 Vuetify example
-
-
-
-
-
- We're sorry but the JSON Forms Vue 3 Vuetify example doesn't work properly without JavaScript enabled. Please enable it to continue.
-
-
-
-
-
diff --git a/packages/vue-vuetify/example-app/src/App.vue b/packages/vue-vuetify/example-app/src/App.vue
deleted file mode 100644
index e09bb70d60..0000000000
--- a/packages/vue-vuetify/example-app/src/App.vue
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
-
-
-
-
-
diff --git a/packages/vue-vuetify/example-app/src/assets/jsonforms.svg b/packages/vue-vuetify/example-app/src/assets/jsonforms.svg
deleted file mode 100644
index 774d78bc5f..0000000000
--- a/packages/vue-vuetify/example-app/src/assets/jsonforms.svg
+++ /dev/null
@@ -1,17 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/packages/vue-vuetify/example-app/src/assets/vuetify.svg b/packages/vue-vuetify/example-app/src/assets/vuetify.svg
deleted file mode 100644
index 9096175280..0000000000
--- a/packages/vue-vuetify/example-app/src/assets/vuetify.svg
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
-
- Artboard 46
-
-
-
-
-
\ No newline at end of file
diff --git a/packages/vue-vuetify/example-app/src/components/DemoForm.vue b/packages/vue-vuetify/example-app/src/components/DemoForm.vue
deleted file mode 100644
index f0b6aae852..0000000000
--- a/packages/vue-vuetify/example-app/src/components/DemoForm.vue
+++ /dev/null
@@ -1,174 +0,0 @@
-
-
-
-
-
-
- Resolving Schema Refs
-
-
-
-
-
-
-
-
- {{ resolvedSchema.error }}
-
-
-
-
-
-
-
-
diff --git a/packages/vue-vuetify/example-app/src/components/MonacoEditor.vue b/packages/vue-vuetify/example-app/src/components/MonacoEditor.vue
deleted file mode 100644
index a058683034..0000000000
--- a/packages/vue-vuetify/example-app/src/components/MonacoEditor.vue
+++ /dev/null
@@ -1,179 +0,0 @@
-
-
-
-
-
diff --git a/packages/vue-vuetify/example-app/src/components/ThemeChanger.vue b/packages/vue-vuetify/example-app/src/components/ThemeChanger.vue
deleted file mode 100644
index 02f027f6bd..0000000000
--- a/packages/vue-vuetify/example-app/src/components/ThemeChanger.vue
+++ /dev/null
@@ -1,202 +0,0 @@
-
-
-
-
-
-
- mdi-palette
-
-
- Theme Colors
-
-
-
- Theme Colors
-
-
-
- $close
-
-
-
-
-
-
-
-
-
-
- {{ theme.name }}
-
-
- mdi-check
-
-
-
-
-
- {{ key }}
-
-
-
- {{ key }}
-
-
-
-
-
-
-
-
-
diff --git a/packages/vue-vuetify/example-app/src/core/types.ts b/packages/vue-vuetify/example-app/src/core/types.ts
deleted file mode 100644
index 7f864246fe..0000000000
--- a/packages/vue-vuetify/example-app/src/core/types.ts
+++ /dev/null
@@ -1,18 +0,0 @@
-import { UISchemaElement, JsonSchema } from '@jsonforms/core';
-
-export type Example = {
- id: string;
- title: string;
- input: {
- schema?: JsonSchema;
- uischema?: UISchemaElement;
- data: string | number | boolean | any[] | Record;
- i18n?: Record;
- };
-};
-
-export type ResolvedSchema = {
- schema?: JsonSchema;
- resolved: boolean;
- error?: string;
-};
diff --git a/packages/vue-vuetify/example-app/src/examples/additionalProperties/data.json b/packages/vue-vuetify/example-app/src/examples/additionalProperties/data.json
deleted file mode 100644
index 25b1bcd008..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/additionalProperties/data.json
+++ /dev/null
@@ -1,15 +0,0 @@
-{
- "propertiesString": "data",
- "string": "string value",
- "number": 10.2,
- "integer": 11,
- "object": {
- "prop1": "prop 1 value"
- },
- "boolean": true,
- "stringArray": ["value1", "value2"],
- "numberArray": [12.2],
- "integerArray": [33],
- "objectArray": [{ "prop1": "prop1 val" }, {}],
- "booleanArray": [false, true]
-}
diff --git a/packages/vue-vuetify/example-app/src/examples/additionalProperties/i18n.json b/packages/vue-vuetify/example-app/src/examples/additionalProperties/i18n.json
deleted file mode 100644
index e2b88ae2e3..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/additionalProperties/i18n.json
+++ /dev/null
@@ -1,16 +0,0 @@
-{
- "en": {
- "root": {
- "additionalProperties": {
- "title": "Additional Properties",
- "newProperty": {
- "placeholder": "New Property"
- },
- "btn": {
- "add": "Add to ${additionalProperties.title}",
- "delete": "Delete from ${additionalProperties.title}"
- }
- }
- }
- }
-}
diff --git a/packages/vue-vuetify/example-app/src/examples/additionalProperties/index.ts b/packages/vue-vuetify/example-app/src/examples/additionalProperties/index.ts
deleted file mode 100644
index b942ddffd8..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/additionalProperties/index.ts
+++ /dev/null
@@ -1,12 +0,0 @@
-import schema from './schema.json';
-import uischema from './uischema.json';
-import data from './data.json';
-import i18n from './i18n.json';
-import { UISchemaElement, JsonSchema } from '@jsonforms/core';
-
-export const input: {
- schema: JsonSchema;
- uischema: UISchemaElement;
- data: any;
- i18n: any;
-} = { schema, uischema, data, i18n };
diff --git a/packages/vue-vuetify/example-app/src/examples/additionalProperties/schema.json b/packages/vue-vuetify/example-app/src/examples/additionalProperties/schema.json
deleted file mode 100644
index 65b4dcc299..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/additionalProperties/schema.json
+++ /dev/null
@@ -1,74 +0,0 @@
-{
- "$schema": "http://json-schema.org/draft-07/schema#",
- "type": "object",
- "properties": {
- "propertiesString": {
- "type": "string"
- }
- },
- "propertyNames": {
- "minLength": 2
- },
- "patternProperties": {
- "^string$": {
- "type": "string"
- },
- "^number$": {
- "type": "number"
- },
- "^integer$": {
- "type": "integer"
- },
- "^object$": {
- "type": "object",
- "properties": {
- "prop1": {
- "type": "string"
- }
- }
- },
- "^boolean$": {
- "type": "boolean"
- },
- "^stringArray$": {
- "type": "array",
- "items": {
- "type": "string"
- }
- },
- "^numberArray$": {
- "type": "array",
- "items": {
- "type": "number"
- }
- },
- "^integerArray$": {
- "type": "array",
- "items": {
- "type": "integer"
- }
- },
- "^objectArray$": {
- "type": "array",
- "items": {
- "type": "object",
- "properties": {
- "prop1": {
- "type": "string"
- }
- }
- }
- },
- "^booleanArray$": {
- "type": "array",
- "items": {
- "type": "boolean"
- }
- }
- },
- "additionalProperties": {
- "type": "string",
- "title": "Additional Properties"
- },
- "maxProperties": 15
-}
diff --git a/packages/vue-vuetify/example-app/src/examples/additionalProperties/uischema.json b/packages/vue-vuetify/example-app/src/examples/additionalProperties/uischema.json
deleted file mode 100644
index 1ebfebb423..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/additionalProperties/uischema.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{
- "type": "Control",
- "scope": "#/"
-}
diff --git a/packages/vue-vuetify/example-app/src/examples/allOf-with-props/data.json b/packages/vue-vuetify/example-app/src/examples/allOf-with-props/data.json
deleted file mode 100644
index 5bd1d45b5b..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/allOf-with-props/data.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "addressOrUser": {
- "street_address": "1600 Pennsylvania Avenue NW",
- "city": "Washington",
- "state": "DC"
- }
-}
\ No newline at end of file
diff --git a/packages/vue-vuetify/example-app/src/examples/allOf-with-props/index.ts b/packages/vue-vuetify/example-app/src/examples/allOf-with-props/index.ts
deleted file mode 100644
index fa4555232c..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/allOf-with-props/index.ts
+++ /dev/null
@@ -1,9 +0,0 @@
-import schema from './schema.json';
-import data from './data.json';
-import { UISchemaElement, JsonSchema } from '@jsonforms/core';
-
-export const input: {
- schema: JsonSchema;
- uischema?: UISchemaElement;
- data: any;
-} = { schema, uischema: undefined, data };
diff --git a/packages/vue-vuetify/example-app/src/examples/allOf-with-props/schema.json b/packages/vue-vuetify/example-app/src/examples/allOf-with-props/schema.json
deleted file mode 100644
index 6d41773bbb..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/allOf-with-props/schema.json
+++ /dev/null
@@ -1,47 +0,0 @@
-{
- "definitions": {
- "address": {
- "type": "object",
- "title": "Address",
- "properties": {
- "street_address": {
- "type": "string"
- },
- "city": {
- "type": "string"
- },
- "state": {
- "type": "string"
- }
- },
- "required": ["street_address", "city", "state"]
- },
- "user": {
- "type": "object",
- "title": "User",
- "properties": {
- "name": {
- "type": "string"
- },
- "mail": {
- "type": "string"
- }
- },
- "required": ["name", "mail"]
- }
- },
- "type": "object",
- "properties": {
- "label": {
- "type": "string"
- }
- },
- "allOf": [
- {
- "$ref": "#/definitions/address"
- },
- {
- "$ref": "#/definitions/user"
- }
- ]
-}
diff --git a/packages/vue-vuetify/example-app/src/examples/allOf/data.json b/packages/vue-vuetify/example-app/src/examples/allOf/data.json
deleted file mode 100644
index 5bd1d45b5b..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/allOf/data.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "addressOrUser": {
- "street_address": "1600 Pennsylvania Avenue NW",
- "city": "Washington",
- "state": "DC"
- }
-}
\ No newline at end of file
diff --git a/packages/vue-vuetify/example-app/src/examples/allOf/index.ts b/packages/vue-vuetify/example-app/src/examples/allOf/index.ts
deleted file mode 100644
index 8f5e656657..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/allOf/index.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import schema from './schema.json';
-import uischema from './uischema.json';
-import data from './data.json';
-import { UISchemaElement, JsonSchema } from '@jsonforms/core';
-
-export const input: {
- schema: JsonSchema;
- uischema: UISchemaElement;
- data: any;
-} = { schema, uischema, data };
diff --git a/packages/vue-vuetify/example-app/src/examples/allOf/schema.json b/packages/vue-vuetify/example-app/src/examples/allOf/schema.json
deleted file mode 100644
index c128998f52..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/allOf/schema.json
+++ /dev/null
@@ -1,53 +0,0 @@
-{
- "definitions": {
- "address": {
- "type": "object",
- "title": "Address",
- "properties": {
- "street_address": {
- "type": "string"
- },
- "city": {
- "type": "string"
- },
- "state": {
- "type": "string"
- }
- },
- "required": [
- "street_address",
- "city",
- "state"
- ]
- },
- "user": {
- "type": "object",
- "title": "User",
- "properties": {
- "name": {
- "type": "string"
- },
- "mail": {
- "type": "string"
- }
- },
- "required": [
- "name",
- "mail"
- ]
- }
- },
- "type": "object",
- "properties": {
- "addressOrUser": {
- "allOf": [
- {
- "$ref": "#/definitions/address"
- },
- {
- "$ref": "#/definitions/user"
- }
- ]
- }
- }
-}
\ No newline at end of file
diff --git a/packages/vue-vuetify/example-app/src/examples/allOf/uischema.json b/packages/vue-vuetify/example-app/src/examples/allOf/uischema.json
deleted file mode 100644
index 8120bed021..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/allOf/uischema.json
+++ /dev/null
@@ -1,10 +0,0 @@
-{
- "type": "VerticalLayout",
- "elements": [
- {
- "type": "Control",
- "label": "Basic Information",
- "scope": "#/properties/addressOrUser"
- }
- ]
-}
\ No newline at end of file
diff --git a/packages/vue-vuetify/example-app/src/examples/anyOf-simple/data.json b/packages/vue-vuetify/example-app/src/examples/anyOf-simple/data.json
deleted file mode 100644
index abdd5202bd..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/anyOf-simple/data.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "foo": "foo"
-}
diff --git a/packages/vue-vuetify/example-app/src/examples/anyOf-simple/index.ts b/packages/vue-vuetify/example-app/src/examples/anyOf-simple/index.ts
deleted file mode 100644
index 190d6b2aef..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/anyOf-simple/index.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import schema from './schema.json';
-import data from './data.json';
-import { UISchemaElement, JsonSchema } from '@jsonforms/core';
-
-const uischema = undefined;
-export const input: {
- schema: JsonSchema;
- uischema: UISchemaElement | undefined;
- data: any;
-} = { schema, uischema, data };
diff --git a/packages/vue-vuetify/example-app/src/examples/anyOf-simple/schema.json b/packages/vue-vuetify/example-app/src/examples/anyOf-simple/schema.json
deleted file mode 100644
index 0b7020ff9b..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/anyOf-simple/schema.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{
- "type": "object",
- "properties": {
- "foo": {
- "anyOf": [
- {
- "type": "string"
- },
- {
- "enum": [
- "foo",
- "bar"
- ]
- }
- ]
- }
- }
-}
\ No newline at end of file
diff --git a/packages/vue-vuetify/example-app/src/examples/anyOf-with-props/data.json b/packages/vue-vuetify/example-app/src/examples/anyOf-with-props/data.json
deleted file mode 100644
index 5bd1d45b5b..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/anyOf-with-props/data.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "addressOrUser": {
- "street_address": "1600 Pennsylvania Avenue NW",
- "city": "Washington",
- "state": "DC"
- }
-}
\ No newline at end of file
diff --git a/packages/vue-vuetify/example-app/src/examples/anyOf-with-props/index.ts b/packages/vue-vuetify/example-app/src/examples/anyOf-with-props/index.ts
deleted file mode 100644
index fa4555232c..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/anyOf-with-props/index.ts
+++ /dev/null
@@ -1,9 +0,0 @@
-import schema from './schema.json';
-import data from './data.json';
-import { UISchemaElement, JsonSchema } from '@jsonforms/core';
-
-export const input: {
- schema: JsonSchema;
- uischema?: UISchemaElement;
- data: any;
-} = { schema, uischema: undefined, data };
diff --git a/packages/vue-vuetify/example-app/src/examples/anyOf-with-props/schema.json b/packages/vue-vuetify/example-app/src/examples/anyOf-with-props/schema.json
deleted file mode 100644
index 02fe1d5c95..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/anyOf-with-props/schema.json
+++ /dev/null
@@ -1,47 +0,0 @@
-{
- "definitions": {
- "address": {
- "type": "object",
- "title": "Address",
- "properties": {
- "street_address": {
- "type": "string"
- },
- "city": {
- "type": "string"
- },
- "state": {
- "type": "string"
- }
- },
- "required": ["street_address", "city", "state"]
- },
- "user": {
- "type": "object",
- "title": "User",
- "properties": {
- "name": {
- "type": "string"
- },
- "mail": {
- "type": "string"
- }
- },
- "required": ["name", "mail"]
- }
- },
- "type": "object",
- "properties": {
- "label": {
- "type": "string"
- }
- },
- "anyOf": [
- {
- "$ref": "#/definitions/address"
- },
- {
- "$ref": "#/definitions/user"
- }
- ]
-}
diff --git a/packages/vue-vuetify/example-app/src/examples/anyOf/data.json b/packages/vue-vuetify/example-app/src/examples/anyOf/data.json
deleted file mode 100644
index 5bd1d45b5b..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/anyOf/data.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "addressOrUser": {
- "street_address": "1600 Pennsylvania Avenue NW",
- "city": "Washington",
- "state": "DC"
- }
-}
\ No newline at end of file
diff --git a/packages/vue-vuetify/example-app/src/examples/anyOf/index.ts b/packages/vue-vuetify/example-app/src/examples/anyOf/index.ts
deleted file mode 100644
index 8f5e656657..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/anyOf/index.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import schema from './schema.json';
-import uischema from './uischema.json';
-import data from './data.json';
-import { UISchemaElement, JsonSchema } from '@jsonforms/core';
-
-export const input: {
- schema: JsonSchema;
- uischema: UISchemaElement;
- data: any;
-} = { schema, uischema, data };
diff --git a/packages/vue-vuetify/example-app/src/examples/anyOf/schema.json b/packages/vue-vuetify/example-app/src/examples/anyOf/schema.json
deleted file mode 100644
index 58c1d49a93..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/anyOf/schema.json
+++ /dev/null
@@ -1,53 +0,0 @@
-{
- "definitions": {
- "address": {
- "type": "object",
- "title": "Address",
- "properties": {
- "street_address": {
- "type": "string"
- },
- "city": {
- "type": "string"
- },
- "state": {
- "type": "string"
- }
- },
- "required": [
- "street_address",
- "city",
- "state"
- ]
- },
- "user": {
- "type": "object",
- "title": "User",
- "properties": {
- "name": {
- "type": "string"
- },
- "mail": {
- "type": "string"
- }
- },
- "required": [
- "name",
- "mail"
- ]
- }
- },
- "type": "object",
- "properties": {
- "addressOrUser": {
- "anyOf": [
- {
- "$ref": "#/definitions/address"
- },
- {
- "$ref": "#/definitions/user"
- }
- ]
- }
- }
-}
\ No newline at end of file
diff --git a/packages/vue-vuetify/example-app/src/examples/anyOf/uischema.json b/packages/vue-vuetify/example-app/src/examples/anyOf/uischema.json
deleted file mode 100644
index 8120bed021..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/anyOf/uischema.json
+++ /dev/null
@@ -1,10 +0,0 @@
-{
- "type": "VerticalLayout",
- "elements": [
- {
- "type": "Control",
- "label": "Basic Information",
- "scope": "#/properties/addressOrUser"
- }
- ]
-}
\ No newline at end of file
diff --git a/packages/vue-vuetify/example-app/src/examples/array-restrict/data.json b/packages/vue-vuetify/example-app/src/examples/array-restrict/data.json
deleted file mode 100644
index e5bbc2be94..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/array-restrict/data.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
- "comments": [
- {
- "date": "2001-09-11",
- "message": "This is an example message"
- },
- {
- "date": "2021-08-13",
- "message": "Get ready for booohay"
- }
- ]
-}
\ No newline at end of file
diff --git a/packages/vue-vuetify/example-app/src/examples/array-restrict/index.ts b/packages/vue-vuetify/example-app/src/examples/array-restrict/index.ts
deleted file mode 100644
index 8f5e656657..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/array-restrict/index.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import schema from './schema.json';
-import uischema from './uischema.json';
-import data from './data.json';
-import { UISchemaElement, JsonSchema } from '@jsonforms/core';
-
-export const input: {
- schema: JsonSchema;
- uischema: UISchemaElement;
- data: any;
-} = { schema, uischema, data };
diff --git a/packages/vue-vuetify/example-app/src/examples/array-restrict/schema.json b/packages/vue-vuetify/example-app/src/examples/array-restrict/schema.json
deleted file mode 100644
index d6f69d1e6e..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/array-restrict/schema.json
+++ /dev/null
@@ -1,30 +0,0 @@
-{
- "type": "object",
- "properties": {
- "comments": {
- "type": "array",
- "items": {
- "type": "object",
- "properties": {
- "date": {
- "type": "string",
- "format": "date"
- },
- "message": {
- "type": "string",
- "maxLength": 5
- },
- "enum": {
- "type": "string",
- "enum": [
- "foo",
- "bar"
- ]
- }
- }
- },
- "minItems": 1,
- "maxItems": 5
- }
- }
-}
\ No newline at end of file
diff --git a/packages/vue-vuetify/example-app/src/examples/array-restrict/uischema.json b/packages/vue-vuetify/example-app/src/examples/array-restrict/uischema.json
deleted file mode 100644
index de35615924..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/array-restrict/uischema.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
- "type": "VerticalLayout",
- "elements": [
- {
- "type": "Control",
- "scope": "#/properties/comments",
- "options": {
- "restrict": true
- }
- }
- ]
-}
\ No newline at end of file
diff --git a/packages/vue-vuetify/example-app/src/examples/array-with-reorder/data.json b/packages/vue-vuetify/example-app/src/examples/array-with-reorder/data.json
deleted file mode 100644
index 56c748e10a..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/array-with-reorder/data.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{
- "comments": [
- {
- "date": "2001-09-11",
- "message": "This is an example message",
- "enum": "foo"
- },
- {
- "date": "2021-08-13",
- "message": "Get ready for booohay",
- "enum": "bar"
- }
- ]
-}
\ No newline at end of file
diff --git a/packages/vue-vuetify/example-app/src/examples/array-with-reorder/index.ts b/packages/vue-vuetify/example-app/src/examples/array-with-reorder/index.ts
deleted file mode 100644
index 8f5e656657..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/array-with-reorder/index.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import schema from './schema.json';
-import uischema from './uischema.json';
-import data from './data.json';
-import { UISchemaElement, JsonSchema } from '@jsonforms/core';
-
-export const input: {
- schema: JsonSchema;
- uischema: UISchemaElement;
- data: any;
-} = { schema, uischema, data };
diff --git a/packages/vue-vuetify/example-app/src/examples/array-with-reorder/schema.json b/packages/vue-vuetify/example-app/src/examples/array-with-reorder/schema.json
deleted file mode 100644
index b2ac7ce43b..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/array-with-reorder/schema.json
+++ /dev/null
@@ -1,28 +0,0 @@
-{
- "type": "object",
- "properties": {
- "comments": {
- "type": "array",
- "items": {
- "type": "object",
- "properties": {
- "date": {
- "type": "string",
- "format": "date"
- },
- "message": {
- "type": "string",
- "maxLength": 5
- },
- "enum": {
- "type": "string",
- "enum": [
- "foo",
- "bar"
- ]
- }
- }
- }
- }
- }
-}
\ No newline at end of file
diff --git a/packages/vue-vuetify/example-app/src/examples/array-with-reorder/uischema.json b/packages/vue-vuetify/example-app/src/examples/array-with-reorder/uischema.json
deleted file mode 100644
index 2cda531b49..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/array-with-reorder/uischema.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
- "type": "VerticalLayout",
- "elements": [
- {
- "type": "Control",
- "scope": "#/properties/comments",
- "options": {
- "showSortButtons": true
- }
- }
- ]
-}
\ No newline at end of file
diff --git a/packages/vue-vuetify/example-app/src/examples/array/data.json b/packages/vue-vuetify/example-app/src/examples/array/data.json
deleted file mode 100644
index e5bbc2be94..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/array/data.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
- "comments": [
- {
- "date": "2001-09-11",
- "message": "This is an example message"
- },
- {
- "date": "2021-08-13",
- "message": "Get ready for booohay"
- }
- ]
-}
\ No newline at end of file
diff --git a/packages/vue-vuetify/example-app/src/examples/array/index.ts b/packages/vue-vuetify/example-app/src/examples/array/index.ts
deleted file mode 100644
index 8f5e656657..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/array/index.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import schema from './schema.json';
-import uischema from './uischema.json';
-import data from './data.json';
-import { UISchemaElement, JsonSchema } from '@jsonforms/core';
-
-export const input: {
- schema: JsonSchema;
- uischema: UISchemaElement;
- data: any;
-} = { schema, uischema, data };
diff --git a/packages/vue-vuetify/example-app/src/examples/array/schema.json b/packages/vue-vuetify/example-app/src/examples/array/schema.json
deleted file mode 100644
index b2ac7ce43b..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/array/schema.json
+++ /dev/null
@@ -1,28 +0,0 @@
-{
- "type": "object",
- "properties": {
- "comments": {
- "type": "array",
- "items": {
- "type": "object",
- "properties": {
- "date": {
- "type": "string",
- "format": "date"
- },
- "message": {
- "type": "string",
- "maxLength": 5
- },
- "enum": {
- "type": "string",
- "enum": [
- "foo",
- "bar"
- ]
- }
- }
- }
- }
- }
-}
\ No newline at end of file
diff --git a/packages/vue-vuetify/example-app/src/examples/array/uischema.json b/packages/vue-vuetify/example-app/src/examples/array/uischema.json
deleted file mode 100644
index 4e78aae2bc..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/array/uischema.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
- "type": "VerticalLayout",
- "elements": [
- {
- "type": "Control",
- "scope": "#/properties/comments"
- }
- ]
-}
\ No newline at end of file
diff --git a/packages/vue-vuetify/example-app/src/examples/basic/data.json b/packages/vue-vuetify/example-app/src/examples/basic/data.json
deleted file mode 100644
index 59a6d43787..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/basic/data.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
- "name": "John Doe",
- "vegetarian": false,
- "birthDate": "1985-06-02",
- "personalData": {
- "age": 34
- },
- "postalCode": "12345"
-}
\ No newline at end of file
diff --git a/packages/vue-vuetify/example-app/src/examples/basic/i18n.json b/packages/vue-vuetify/example-app/src/examples/basic/i18n.json
deleted file mode 100644
index 711ea65596..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/basic/i18n.json
+++ /dev/null
@@ -1,126 +0,0 @@
-{
- "en": {
- "name": {
- "label": "Name",
- "description": "The name of the person"
- },
- "vegetarian": {
- "label": "Vegetarian",
- "description": "Whether the person is a vegetarian"
- },
- "birth": {
- "label": "Birth Date",
- "description": ""
- },
- "nationality": {
- "label": "Nationality",
- "description": ""
- },
- "personal-data": {
- "age": {
- "label": "Age"
- },
- "driving": {
- "label": "Driving Skill",
- "description": "Indicating experience level"
- }
- },
- "height": {
- "label": "Height"
- },
- "occupation": {
- "label": "Occupation",
- "description": ""
- },
- "postal-code": {
- "label": "Postal Code"
- },
- "error": {
- "required": "field is required"
- }
- },
- "de": {
- "name": {
- "label": "Name",
- "description": "Der Name der Person"
- },
- "vegetarian": {
- "label": "Vegetarier",
- "description": "Isst die Person vegetarisch?"
- },
- "birth": {
- "label": "Geburtsdatum",
- "description": ""
- },
- "nationality": {
- "label": "Nationalität",
- "description": "",
- "Other": "Andere"
- },
- "personal-data": {
- "age": {
- "label": "Alter"
- },
- "driving": {
- "label": "Fahrkenntnisse",
- "description": "Fahrerfahrung der Person"
- }
- },
- "height": {
- "label": "Größe"
- },
- "occupation": {
- "label": "Beruf",
- "description": ""
- },
- "postal-code": {
- "label": "Postleitzahl"
- },
- "error": {
- "required": "Pflichtfeld"
- },
- "Additional Information": "Zusätzliche Informationen"
- },
- "bg": {
- "name": {
- "label": "Име",
- "description": "Името на лицето"
- },
- "vegetarian": {
- "label": "Вегетарианец",
- "description": "Дали човекът е вегетарианец"
- },
- "birth": {
- "label": "Рождена дата",
- "description": ""
- },
- "nationality": {
- "label": "Националност",
- "description": ""
- },
- "personal-data": {
- "age": {
- "label": "Възраст",
- "description": "Моля, въведете вашата възраст."
- },
- "driving": {
- "label": "Шофьорски умения",
- "description": "Показва ниво на опит"
- }
- },
- "height": {
- "label": "Височина"
- },
- "occupation": {
- "label": "Професия",
- "description": ""
- },
- "postal-code": {
- "label": "Пощенски код"
- },
- "error": {
- "required": "полето е задължително"
- },
- "Additional Information": "Допълнителна информация"
- }
-}
diff --git a/packages/vue-vuetify/example-app/src/examples/basic/index.ts b/packages/vue-vuetify/example-app/src/examples/basic/index.ts
deleted file mode 100644
index b942ddffd8..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/basic/index.ts
+++ /dev/null
@@ -1,12 +0,0 @@
-import schema from './schema.json';
-import uischema from './uischema.json';
-import data from './data.json';
-import i18n from './i18n.json';
-import { UISchemaElement, JsonSchema } from '@jsonforms/core';
-
-export const input: {
- schema: JsonSchema;
- uischema: UISchemaElement;
- data: any;
- i18n: any;
-} = { schema, uischema, data, i18n };
diff --git a/packages/vue-vuetify/example-app/src/examples/basic/schema.json b/packages/vue-vuetify/example-app/src/examples/basic/schema.json
deleted file mode 100644
index 9ca98a942f..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/basic/schema.json
+++ /dev/null
@@ -1,57 +0,0 @@
-{
- "type": "object",
- "properties": {
- "name": {
- "type": "string",
- "minLength": 3,
- "description": "Please enter your name",
- "i18n": "name"
- },
- "vegetarian": {
- "type": "boolean",
- "i18n": "vegetarian"
- },
- "birthDate": {
- "type": "string",
- "format": "date",
- "i18n": "birth"
- },
- "nationality": {
- "type": "string",
- "enum": ["DE", "IT", "JP", "US", "RU", "Other"],
- "i18n": "nationality"
- },
- "personalData": {
- "type": "object",
- "properties": {
- "age": {
- "type": "integer",
- "description": "Please enter your age.",
- "i18n": "personal-data.age"
- },
- "height": {
- "type": "number",
- "i18n": "height"
- },
- "drivingSkill": {
- "type": "number",
- "maximum": 10,
- "minimum": 1,
- "default": 7,
- "i18n": "personal-data.driving"
- }
- },
- "required": ["age", "height"]
- },
- "occupation": {
- "type": "string",
- "i18n": "occupation"
- },
- "postalCode": {
- "type": "string",
- "maxLength": 5,
- "i18n": "postal-code"
- }
- },
- "required": ["occupation", "nationality"]
-}
diff --git a/packages/vue-vuetify/example-app/src/examples/basic/uischema.json b/packages/vue-vuetify/example-app/src/examples/basic/uischema.json
deleted file mode 100644
index 5112fe3532..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/basic/uischema.json
+++ /dev/null
@@ -1,55 +0,0 @@
-{
- "type": "VerticalLayout",
- "elements": [
- {
- "type": "HorizontalLayout",
- "elements": [
- {
- "type": "Control",
- "scope": "#/properties/name"
- },
- {
- "type": "Control",
- "scope": "#/properties/personalData/properties/age"
- },
- {
- "type": "Control",
- "scope": "#/properties/birthDate"
- }
- ]
- },
- {
- "type": "Label",
- "text": "Additional Information"
- },
- {
- "type": "HorizontalLayout",
- "elements": [
- {
- "type": "Control",
- "scope": "#/properties/personalData/properties/height"
- },
- {
- "type": "Control",
- "scope": "#/properties/nationality"
- },
- {
- "type": "Control",
- "scope": "#/properties/occupation",
- "options": {
- "suggestion": [
- "Accountant",
- "Engineer",
- "Freelancer",
- "Journalism",
- "Physician",
- "Student",
- "Teacher",
- "Other"
- ]
- }
- }
- ]
- }
- ]
-}
diff --git a/packages/vue-vuetify/example-app/src/examples/categorization-stepper-nav/data.json b/packages/vue-vuetify/example-app/src/examples/categorization-stepper-nav/data.json
deleted file mode 100644
index e62c2f35d5..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/categorization-stepper-nav/data.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{
- "provideAddress": true,
- "vegetarian": false
-}
\ No newline at end of file
diff --git a/packages/vue-vuetify/example-app/src/examples/categorization-stepper-nav/index.ts b/packages/vue-vuetify/example-app/src/examples/categorization-stepper-nav/index.ts
deleted file mode 100644
index 8f5e656657..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/categorization-stepper-nav/index.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import schema from './schema.json';
-import uischema from './uischema.json';
-import data from './data.json';
-import { UISchemaElement, JsonSchema } from '@jsonforms/core';
-
-export const input: {
- schema: JsonSchema;
- uischema: UISchemaElement;
- data: any;
-} = { schema, uischema, data };
diff --git a/packages/vue-vuetify/example-app/src/examples/categorization-stepper-nav/schema.json b/packages/vue-vuetify/example-app/src/examples/categorization-stepper-nav/schema.json
deleted file mode 100644
index dbb0480dff..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/categorization-stepper-nav/schema.json
+++ /dev/null
@@ -1,77 +0,0 @@
-{
- "type": "object",
- "properties": {
- "firstName": {
- "type": "string",
- "minLength": 3,
- "description": "Please enter your first name"
- },
- "secondName": {
- "type": "string",
- "minLength": 3,
- "description": "Please enter your second name"
- },
- "vegetarian": {
- "type": "boolean"
- },
- "birthDate": {
- "type": "string",
- "format": "date",
- "description": "Please enter your birth date."
- },
- "nationality": {
- "type": "string",
- "enum": [
- "DE",
- "IT",
- "JP",
- "US",
- "RU",
- "Other"
- ]
- },
- "provideAddress": {
- "type": "boolean"
- },
- "address": {
- "type": "object",
- "properties": {
- "street": {
- "type": "string"
- },
- "streetNumber": {
- "type": "string"
- },
- "city": {
- "type": "string"
- },
- "postalCode": {
- "type": "string",
- "maxLength": 5
- }
- }
- },
- "vegetarianOptions": {
- "type": "object",
- "properties": {
- "vegan": {
- "type": "boolean"
- },
- "favoriteVegetable": {
- "type": "string",
- "enum": [
- "Tomato",
- "Potato",
- "Salad",
- "Aubergine",
- "Cucumber",
- "Other"
- ]
- },
- "otherFavoriteVegetable": {
- "type": "string"
- }
- }
- }
- }
-}
\ No newline at end of file
diff --git a/packages/vue-vuetify/example-app/src/examples/categorization-stepper-nav/uischema.json b/packages/vue-vuetify/example-app/src/examples/categorization-stepper-nav/uischema.json
deleted file mode 100644
index 1509ace578..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/categorization-stepper-nav/uischema.json
+++ /dev/null
@@ -1,126 +0,0 @@
-{
- "type": "Categorization",
- "elements": [
- {
- "type": "Category",
- "label": "Basic Information",
- "elements": [
- {
- "type": "HorizontalLayout",
- "elements": [
- {
- "type": "Control",
- "scope": "#/properties/firstName"
- },
- {
- "type": "Control",
- "scope": "#/properties/secondName"
- }
- ]
- },
- {
- "type": "HorizontalLayout",
- "elements": [
- {
- "type": "Control",
- "scope": "#/properties/birthDate"
- },
- {
- "type": "Control",
- "scope": "#/properties/nationality"
- }
- ]
- },
- {
- "type": "Control",
- "scope": "#/properties/provideAddress"
- },
- {
- "type": "Control",
- "scope": "#/properties/vegetarian"
- }
- ]
- },
- {
- "type": "Category",
- "label": "Address",
- "elements": [
- {
- "type": "HorizontalLayout",
- "elements": [
- {
- "type": "Control",
- "scope": "#/properties/address/properties/street"
- },
- {
- "type": "Control",
- "scope": "#/properties/address/properties/streetNumber"
- }
- ]
- },
- {
- "type": "HorizontalLayout",
- "elements": [
- {
- "type": "Control",
- "scope": "#/properties/address/properties/city"
- },
- {
- "type": "Control",
- "scope": "#/properties/address/properties/postalCode"
- }
- ]
- }
- ],
- "rule": {
- "effect": "SHOW",
- "condition": {
- "scope": "#/properties/provideAddress",
- "schema": {
- "const": true
- }
- }
- }
- },
- {
- "type": "Category",
- "label": "Additional",
- "elements": [
- {
- "type": "Control",
- "scope": "#/properties/vegetarianOptions/properties/vegan"
- },
- {
- "type": "Control",
- "scope": "#/properties/vegetarianOptions/properties/favoriteVegetable"
- },
- {
- "type": "Control",
- "scope": "#/properties/vegetarianOptions/properties/otherFavoriteVegetable",
- "rule": {
- "effect": "SHOW",
- "condition": {
- "scope": "#/properties/vegetarianOptions/properties/favoriteVegetable",
- "schema": {
- "const": "Other"
- }
- }
- }
- }
- ],
- "rule": {
- "effect": "SHOW",
- "condition": {
- "scope": "#/properties/vegetarian",
- "schema": {
- "const": true
- }
- }
- }
- }
- ],
- "options": {
- "variant": "stepper",
- "showNavButtons": true
- }
-}
\ No newline at end of file
diff --git a/packages/vue-vuetify/example-app/src/examples/categorization-stepper/data.json b/packages/vue-vuetify/example-app/src/examples/categorization-stepper/data.json
deleted file mode 100644
index e62c2f35d5..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/categorization-stepper/data.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{
- "provideAddress": true,
- "vegetarian": false
-}
\ No newline at end of file
diff --git a/packages/vue-vuetify/example-app/src/examples/categorization-stepper/index.ts b/packages/vue-vuetify/example-app/src/examples/categorization-stepper/index.ts
deleted file mode 100644
index 8f5e656657..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/categorization-stepper/index.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import schema from './schema.json';
-import uischema from './uischema.json';
-import data from './data.json';
-import { UISchemaElement, JsonSchema } from '@jsonforms/core';
-
-export const input: {
- schema: JsonSchema;
- uischema: UISchemaElement;
- data: any;
-} = { schema, uischema, data };
diff --git a/packages/vue-vuetify/example-app/src/examples/categorization-stepper/schema.json b/packages/vue-vuetify/example-app/src/examples/categorization-stepper/schema.json
deleted file mode 100644
index dbb0480dff..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/categorization-stepper/schema.json
+++ /dev/null
@@ -1,77 +0,0 @@
-{
- "type": "object",
- "properties": {
- "firstName": {
- "type": "string",
- "minLength": 3,
- "description": "Please enter your first name"
- },
- "secondName": {
- "type": "string",
- "minLength": 3,
- "description": "Please enter your second name"
- },
- "vegetarian": {
- "type": "boolean"
- },
- "birthDate": {
- "type": "string",
- "format": "date",
- "description": "Please enter your birth date."
- },
- "nationality": {
- "type": "string",
- "enum": [
- "DE",
- "IT",
- "JP",
- "US",
- "RU",
- "Other"
- ]
- },
- "provideAddress": {
- "type": "boolean"
- },
- "address": {
- "type": "object",
- "properties": {
- "street": {
- "type": "string"
- },
- "streetNumber": {
- "type": "string"
- },
- "city": {
- "type": "string"
- },
- "postalCode": {
- "type": "string",
- "maxLength": 5
- }
- }
- },
- "vegetarianOptions": {
- "type": "object",
- "properties": {
- "vegan": {
- "type": "boolean"
- },
- "favoriteVegetable": {
- "type": "string",
- "enum": [
- "Tomato",
- "Potato",
- "Salad",
- "Aubergine",
- "Cucumber",
- "Other"
- ]
- },
- "otherFavoriteVegetable": {
- "type": "string"
- }
- }
- }
- }
-}
\ No newline at end of file
diff --git a/packages/vue-vuetify/example-app/src/examples/categorization-stepper/uischema.json b/packages/vue-vuetify/example-app/src/examples/categorization-stepper/uischema.json
deleted file mode 100644
index ba7bd947d2..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/categorization-stepper/uischema.json
+++ /dev/null
@@ -1,125 +0,0 @@
-{
- "type": "Categorization",
- "elements": [
- {
- "type": "Category",
- "label": "Basic Information",
- "elements": [
- {
- "type": "HorizontalLayout",
- "elements": [
- {
- "type": "Control",
- "scope": "#/properties/firstName"
- },
- {
- "type": "Control",
- "scope": "#/properties/secondName"
- }
- ]
- },
- {
- "type": "HorizontalLayout",
- "elements": [
- {
- "type": "Control",
- "scope": "#/properties/birthDate"
- },
- {
- "type": "Control",
- "scope": "#/properties/nationality"
- }
- ]
- },
- {
- "type": "Control",
- "scope": "#/properties/provideAddress"
- },
- {
- "type": "Control",
- "scope": "#/properties/vegetarian"
- }
- ]
- },
- {
- "type": "Category",
- "label": "Address",
- "elements": [
- {
- "type": "HorizontalLayout",
- "elements": [
- {
- "type": "Control",
- "scope": "#/properties/address/properties/street"
- },
- {
- "type": "Control",
- "scope": "#/properties/address/properties/streetNumber"
- }
- ]
- },
- {
- "type": "HorizontalLayout",
- "elements": [
- {
- "type": "Control",
- "scope": "#/properties/address/properties/city"
- },
- {
- "type": "Control",
- "scope": "#/properties/address/properties/postalCode"
- }
- ]
- }
- ],
- "rule": {
- "effect": "SHOW",
- "condition": {
- "scope": "#/properties/provideAddress",
- "schema": {
- "const": true
- }
- }
- }
- },
- {
- "type": "Category",
- "label": "Additional",
- "elements": [
- {
- "type": "Control",
- "scope": "#/properties/vegetarianOptions/properties/vegan"
- },
- {
- "type": "Control",
- "scope": "#/properties/vegetarianOptions/properties/favoriteVegetable"
- },
- {
- "type": "Control",
- "scope": "#/properties/vegetarianOptions/properties/otherFavoriteVegetable",
- "rule": {
- "effect": "SHOW",
- "condition": {
- "scope": "#/properties/vegetarianOptions/properties/favoriteVegetable",
- "schema": {
- "const": "Other"
- }
- }
- }
- }
- ],
- "rule": {
- "effect": "SHOW",
- "condition": {
- "scope": "#/properties/vegetarian",
- "schema": {
- "const": true
- }
- }
- }
- }
- ],
- "options": {
- "variant": "stepper"
- }
-}
\ No newline at end of file
diff --git a/packages/vue-vuetify/example-app/src/examples/categorization/data.json b/packages/vue-vuetify/example-app/src/examples/categorization/data.json
deleted file mode 100644
index e62c2f35d5..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/categorization/data.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{
- "provideAddress": true,
- "vegetarian": false
-}
\ No newline at end of file
diff --git a/packages/vue-vuetify/example-app/src/examples/categorization/index.ts b/packages/vue-vuetify/example-app/src/examples/categorization/index.ts
deleted file mode 100644
index 8f5e656657..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/categorization/index.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import schema from './schema.json';
-import uischema from './uischema.json';
-import data from './data.json';
-import { UISchemaElement, JsonSchema } from '@jsonforms/core';
-
-export const input: {
- schema: JsonSchema;
- uischema: UISchemaElement;
- data: any;
-} = { schema, uischema, data };
diff --git a/packages/vue-vuetify/example-app/src/examples/categorization/schema.json b/packages/vue-vuetify/example-app/src/examples/categorization/schema.json
deleted file mode 100644
index dbb0480dff..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/categorization/schema.json
+++ /dev/null
@@ -1,77 +0,0 @@
-{
- "type": "object",
- "properties": {
- "firstName": {
- "type": "string",
- "minLength": 3,
- "description": "Please enter your first name"
- },
- "secondName": {
- "type": "string",
- "minLength": 3,
- "description": "Please enter your second name"
- },
- "vegetarian": {
- "type": "boolean"
- },
- "birthDate": {
- "type": "string",
- "format": "date",
- "description": "Please enter your birth date."
- },
- "nationality": {
- "type": "string",
- "enum": [
- "DE",
- "IT",
- "JP",
- "US",
- "RU",
- "Other"
- ]
- },
- "provideAddress": {
- "type": "boolean"
- },
- "address": {
- "type": "object",
- "properties": {
- "street": {
- "type": "string"
- },
- "streetNumber": {
- "type": "string"
- },
- "city": {
- "type": "string"
- },
- "postalCode": {
- "type": "string",
- "maxLength": 5
- }
- }
- },
- "vegetarianOptions": {
- "type": "object",
- "properties": {
- "vegan": {
- "type": "boolean"
- },
- "favoriteVegetable": {
- "type": "string",
- "enum": [
- "Tomato",
- "Potato",
- "Salad",
- "Aubergine",
- "Cucumber",
- "Other"
- ]
- },
- "otherFavoriteVegetable": {
- "type": "string"
- }
- }
- }
- }
-}
\ No newline at end of file
diff --git a/packages/vue-vuetify/example-app/src/examples/categorization/uischema.json b/packages/vue-vuetify/example-app/src/examples/categorization/uischema.json
deleted file mode 100644
index 17eaeeb48b..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/categorization/uischema.json
+++ /dev/null
@@ -1,122 +0,0 @@
-{
- "type": "Categorization",
- "elements": [
- {
- "type": "Category",
- "label": "Basic Information",
- "elements": [
- {
- "type": "HorizontalLayout",
- "elements": [
- {
- "type": "Control",
- "scope": "#/properties/firstName"
- },
- {
- "type": "Control",
- "scope": "#/properties/secondName"
- }
- ]
- },
- {
- "type": "HorizontalLayout",
- "elements": [
- {
- "type": "Control",
- "scope": "#/properties/birthDate"
- },
- {
- "type": "Control",
- "scope": "#/properties/nationality"
- }
- ]
- },
- {
- "type": "Control",
- "scope": "#/properties/provideAddress"
- },
- {
- "type": "Control",
- "scope": "#/properties/vegetarian"
- }
- ]
- },
- {
- "type": "Category",
- "label": "Address",
- "elements": [
- {
- "type": "HorizontalLayout",
- "elements": [
- {
- "type": "Control",
- "scope": "#/properties/address/properties/street"
- },
- {
- "type": "Control",
- "scope": "#/properties/address/properties/streetNumber"
- }
- ]
- },
- {
- "type": "HorizontalLayout",
- "elements": [
- {
- "type": "Control",
- "scope": "#/properties/address/properties/city"
- },
- {
- "type": "Control",
- "scope": "#/properties/address/properties/postalCode"
- }
- ]
- }
- ],
- "rule": {
- "effect": "SHOW",
- "condition": {
- "scope": "#/properties/provideAddress",
- "schema": {
- "const": true
- }
- }
- }
- },
- {
- "type": "Category",
- "label": "Additional",
- "elements": [
- {
- "type": "Control",
- "scope": "#/properties/vegetarianOptions/properties/vegan"
- },
- {
- "type": "Control",
- "scope": "#/properties/vegetarianOptions/properties/favoriteVegetable"
- },
- {
- "type": "Control",
- "scope": "#/properties/vegetarianOptions/properties/otherFavoriteVegetable",
- "rule": {
- "effect": "SHOW",
- "condition": {
- "scope": "#/properties/vegetarianOptions/properties/favoriteVegetable",
- "schema": {
- "const": "Other"
- }
- }
- }
- }
- ],
- "rule": {
- "effect": "SHOW",
- "condition": {
- "scope": "#/properties/vegetarian",
- "schema": {
- "const": true
- }
- }
- }
- }
- ]
-}
\ No newline at end of file
diff --git a/packages/vue-vuetify/example-app/src/examples/control-options/data.json b/packages/vue-vuetify/example-app/src/examples/control-options/data.json
deleted file mode 100644
index 3996f033a2..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/control-options/data.json
+++ /dev/null
@@ -1,27 +0,0 @@
-{
- "multilineString": "Multi-\nline\nexample",
- "slider": 4,
- "trimText": "abcdefg",
- "restrictText": "abcde",
- "toggle": false,
- "phone": "1115554444888",
- "formattedPhone": "(333)555-4444",
- "placeholderInfo": [
- {
- "placeholder": "#",
- "format": "Number (0-9)"
- },
- {
- "placeholder": "A",
- "format": "Letter in any case (a-z,A-Z)"
- },
- {
- "placeholder": "N",
- "format": "Number or letter (a-z,A-Z,0-9)"
- },
- {
- "placeholder": "X",
- "format": "Any symbol"
- }
- ]
-}
diff --git a/packages/vue-vuetify/example-app/src/examples/control-options/index.ts b/packages/vue-vuetify/example-app/src/examples/control-options/index.ts
deleted file mode 100644
index 8f5e656657..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/control-options/index.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import schema from './schema.json';
-import uischema from './uischema.json';
-import data from './data.json';
-import { UISchemaElement, JsonSchema } from '@jsonforms/core';
-
-export const input: {
- schema: JsonSchema;
- uischema: UISchemaElement;
- data: any;
-} = { schema, uischema, data };
diff --git a/packages/vue-vuetify/example-app/src/examples/control-options/schema.json b/packages/vue-vuetify/example-app/src/examples/control-options/schema.json
deleted file mode 100644
index 7e4cdc4580..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/control-options/schema.json
+++ /dev/null
@@ -1,60 +0,0 @@
-{
- "type": "object",
- "properties": {
- "multilineString": {
- "type": "string",
- "description": "Multiline Example"
- },
- "slider": {
- "type": "number",
- "minimum": 1,
- "maximum": 5,
- "default": 2,
- "description": "Slider Example"
- },
- "trimText": {
- "type": "string",
- "description": "Trim indicates whether the control shall grab the full width available"
- },
- "restrictText": {
- "type": "string",
- "maxLength": 5,
- "description": "Restricts the input length to the set value (in this case: 5)"
- },
- "unfocusedDescription": {
- "type": "string",
- "description": "This description is shown even when the control is not focused"
- },
- "hideRequiredAsterisk": {
- "type": "string",
- "description": "Hides the \"*\" symbol, when the field is required"
- },
- "toggle": {
- "type": "boolean",
- "description": "The \"toggle\" option renders boolean values as a toggle."
- },
- "phone": {
- "type": "string",
- "pattern": "^[0-9]{13}$"
- },
- "formattedPhone": {
- "type": "string",
- "pattern": "^\\([0-9]{3}\\)-[0-9]{3}-[0-9]{4}$"
- },
- "placeholderInfo": {
- "type": "array",
- "items": {
- "type": "object",
- "properties": {
- "placeholder": {
- "type": "string"
- },
- "format": {
- "type": "string"
- }
- }
- }
- }
- },
- "required": ["hideRequiredAsterisk", "restrictText", "phone"]
-}
diff --git a/packages/vue-vuetify/example-app/src/examples/control-options/uischema.json b/packages/vue-vuetify/example-app/src/examples/control-options/uischema.json
deleted file mode 100644
index e97b8d9a1a..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/control-options/uischema.json
+++ /dev/null
@@ -1,94 +0,0 @@
-{
- "type": "VerticalLayout",
- "elements": [
- {
- "type": "Control",
- "scope": "#/properties/multilineString",
- "options": {
- "multi": true
- }
- },
- {
- "type": "Control",
- "scope": "#/properties/slider",
- "options": {
- "slider": true
- }
- },
- {
- "type": "Control",
- "scope": "#/properties/trimText",
- "options": {
- "trim": true
- }
- },
- {
- "type": "Control",
- "scope": "#/properties/restrictText",
- "options": {
- "restrict": true
- }
- },
- {
- "type": "Control",
- "scope": "#/properties/unfocusedDescription",
- "options": {
- "showUnfocusedDescription": true
- }
- },
- {
- "type": "Control",
- "scope": "#/properties/hideRequiredAsterisk",
- "options": {
- "hideRequiredAsterisk": true
- }
- },
- {
- "type": "Control",
- "scope": "#/properties/toggle",
- "label": "Boolean as Toggle",
- "options": {
- "toggle": true
- }
- },
- {
- "type": "Group",
- "label": "Masked input",
- "elements": [
- {
- "type": "Label",
- "text": "Supported default mask replacers: (If you place value null then it will ignore the default)"
- },
- {
- "type": "Control",
- "scope": "#/properties/placeholderInfo",
- "options": {
- "readonly": true
- }
- }
- ]
- },
- {
- "type": "Control",
- "scope": "#/properties/phone",
- "label": "Phone (format not stored)",
- "options": {
- "mask": "(SSS) SSS - SSSS #SSS",
- "maskReplacers": {
- "S": "\\d",
- "#": null
- }
- }
- },
- {
- "type": "Control",
- "scope": "#/properties/formattedPhone",
- "label": "Phone (format is stored)",
- "options": {
- "placeholder": "(###)-###-####",
- "mask": "(###)-###-####",
- "returnMaskedValue": true
- }
- }
- ]
-}
diff --git a/packages/vue-vuetify/example-app/src/examples/control/data.json b/packages/vue-vuetify/example-app/src/examples/control/data.json
deleted file mode 100644
index 3595d7b56a..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/control/data.json
+++ /dev/null
@@ -1,10 +0,0 @@
-{
- "string": "This is a string",
- "boolean": true,
- "number": 50.5,
- "integer": 50,
- "date": "2020-06-25",
- "time": "23:08:00",
- "dateTime": "2020-06-25T23:08:42+02:00",
- "enum": "Two"
-}
diff --git a/packages/vue-vuetify/example-app/src/examples/control/index.ts b/packages/vue-vuetify/example-app/src/examples/control/index.ts
deleted file mode 100644
index 8f5e656657..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/control/index.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import schema from './schema.json';
-import uischema from './uischema.json';
-import data from './data.json';
-import { UISchemaElement, JsonSchema } from '@jsonforms/core';
-
-export const input: {
- schema: JsonSchema;
- uischema: UISchemaElement;
- data: any;
-} = { schema, uischema, data };
diff --git a/packages/vue-vuetify/example-app/src/examples/control/schema.json b/packages/vue-vuetify/example-app/src/examples/control/schema.json
deleted file mode 100644
index 278b7758ce..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/control/schema.json
+++ /dev/null
@@ -1,37 +0,0 @@
-{
- "type": "object",
- "properties": {
- "string": {
- "type": "string"
- },
- "boolean": {
- "type": "boolean"
- },
- "number": {
- "type": "number"
- },
- "integer": {
- "type": "integer"
- },
- "date": {
- "type": "string",
- "format": "date"
- },
- "time": {
- "type": "string",
- "format": "time"
- },
- "dateTime": {
- "type": "string",
- "format": "date-time"
- },
- "enum": {
- "type": "string",
- "enum": [
- "One",
- "Two",
- "Three"
- ]
- }
- }
-}
\ No newline at end of file
diff --git a/packages/vue-vuetify/example-app/src/examples/control/uischema.json b/packages/vue-vuetify/example-app/src/examples/control/uischema.json
deleted file mode 100644
index a64776230c..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/control/uischema.json
+++ /dev/null
@@ -1,44 +0,0 @@
-{
- "type": "VerticalLayout",
- "elements": [
- {
- "type": "Control",
- "scope": "#/properties/string",
- "options": {
- "vuetify": {
- "v-text-field": {
- "prepend-icon": "mdi-format-text"
- }
- }
- }
- },
- {
- "type": "Control",
- "scope": "#/properties/boolean"
- },
- {
- "type": "Control",
- "scope": "#/properties/number"
- },
- {
- "type": "Control",
- "scope": "#/properties/integer"
- },
- {
- "type": "Control",
- "scope": "#/properties/date"
- },
- {
- "type": "Control",
- "scope": "#/properties/time"
- },
- {
- "type": "Control",
- "scope": "#/properties/dateTime"
- },
- {
- "type": "Control",
- "scope": "#/properties/enum"
- }
- ]
-}
diff --git a/packages/vue-vuetify/example-app/src/examples/custom-renderer/CustomArrayRenderer.vue b/packages/vue-vuetify/example-app/src/examples/custom-renderer/CustomArrayRenderer.vue
deleted file mode 100644
index 2cd1acc900..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/custom-renderer/CustomArrayRenderer.vue
+++ /dev/null
@@ -1,58 +0,0 @@
-
-
- {{ null }}
-
-
-
-
- mdi-plus {{ actionsProps.labels.add }}
-
-
- {{ actionsProps.labels.add }}
-
-
-
-
-
-
diff --git a/packages/vue-vuetify/example-app/src/examples/custom-renderer/data.json b/packages/vue-vuetify/example-app/src/examples/custom-renderer/data.json
deleted file mode 100644
index 00273e39b3..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/custom-renderer/data.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "exampleArray": [
- {
- "choices": ["This", "is", "an", "example"],
- "name": "Hi there"
- }
- ]
-}
diff --git a/packages/vue-vuetify/example-app/src/examples/custom-renderer/index.ts b/packages/vue-vuetify/example-app/src/examples/custom-renderer/index.ts
deleted file mode 100644
index 2fc09072ee..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/custom-renderer/index.ts
+++ /dev/null
@@ -1,16 +0,0 @@
-import schema from './schema.json';
-import uischema from './uischema.json';
-import data from './data.json';
-import { entry as customArrayRendererEntry } from './CustomArrayRenderer.vue';
-import {
- UISchemaElement,
- JsonSchema,
- JsonFormsRendererRegistryEntry,
-} from '@jsonforms/core';
-
-export const input: {
- schema: JsonSchema;
- uischema: UISchemaElement;
- data: any;
- renderers: JsonFormsRendererRegistryEntry[];
-} = { schema, uischema, data, renderers: [customArrayRendererEntry] };
diff --git a/packages/vue-vuetify/example-app/src/examples/custom-renderer/schema.json b/packages/vue-vuetify/example-app/src/examples/custom-renderer/schema.json
deleted file mode 100644
index 25c7f52d3e..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/custom-renderer/schema.json
+++ /dev/null
@@ -1,23 +0,0 @@
-{
- "type": "object",
- "properties": {
- "exampleArray": {
- "type": "array",
- "items": {
- "type": "object",
- "properties": {
- "name": {
- "type": "string",
- "minLength": 3
- },
- "choices": {
- "type": "array",
- "items": {
- "type": "string"
- }
- }
- }
- }
- }
- }
-}
diff --git a/packages/vue-vuetify/example-app/src/examples/custom-renderer/uischema.json b/packages/vue-vuetify/example-app/src/examples/custom-renderer/uischema.json
deleted file mode 100644
index 8f5b6bcc8f..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/custom-renderer/uischema.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
- "type": "HorizontalLayout",
- "elements": [
- {
- "type": "Control",
- "label": {
- "text": "Example Array",
- "show": true
- },
- "scope": "#/properties/exampleArray"
- }
- ]
-}
\ No newline at end of file
diff --git a/packages/vue-vuetify/example-app/src/examples/date/data.json b/packages/vue-vuetify/example-app/src/examples/date/data.json
deleted file mode 100644
index 5b1ba9c997..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/date/data.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "date": "2022-06-15",
- "stringDate": "2022-06",
- "stringDateFull": "2022-06-15"
-}
diff --git a/packages/vue-vuetify/example-app/src/examples/date/index.ts b/packages/vue-vuetify/example-app/src/examples/date/index.ts
deleted file mode 100644
index 8f5e656657..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/date/index.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import schema from './schema.json';
-import uischema from './uischema.json';
-import data from './data.json';
-import { UISchemaElement, JsonSchema } from '@jsonforms/core';
-
-export const input: {
- schema: JsonSchema;
- uischema: UISchemaElement;
- data: any;
-} = { schema, uischema, data };
diff --git a/packages/vue-vuetify/example-app/src/examples/date/schema.json b/packages/vue-vuetify/example-app/src/examples/date/schema.json
deleted file mode 100644
index f8059fb849..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/date/schema.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
- "type": "object",
- "properties": {
- "date": {
- "type": "string",
- "format": "date"
- },
- "stringDate": {
- "type": "string"
- }
- }
-}
diff --git a/packages/vue-vuetify/example-app/src/examples/date/uischema.json b/packages/vue-vuetify/example-app/src/examples/date/uischema.json
deleted file mode 100644
index 5869ee4267..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/date/uischema.json
+++ /dev/null
@@ -1,46 +0,0 @@
-{
- "type": "VerticalLayout",
- "elements": [
- {
- "type": "Group",
- "label": "Schema Based",
- "elements": [
- {
- "type": "HorizontalLayout",
- "elements": [
- {
- "type": "Control",
- "scope": "#/properties/date",
- "label": "Date",
- "options": {
- "dateFormat": "MM/DD/YYYY",
- "dateSaveFormat": "YYYY-MM-DD"
- }
- }
- ]
- }
- ]
- },
- {
- "type": "Group",
- "label": "UI Schema Based",
- "elements": [
- {
- "type": "HorizontalLayout",
- "elements": [
- {
- "type": "Control",
- "scope": "#/properties/stringDateFull",
- "label": "Full Date",
- "options": {
- "format": "date",
- "dateFormat": "MM/DD/YYYY",
- "dateSaveFormat": "MM/DD/YYYY"
- }
- }
- ]
- }
- ]
- }
- ]
-}
diff --git a/packages/vue-vuetify/example-app/src/examples/datetime/data.json b/packages/vue-vuetify/example-app/src/examples/datetime/data.json
deleted file mode 100644
index 7f593a9e02..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/datetime/data.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{
- "dateTime": "2022-06-15T13:15:15Z",
- "stringDateTime": "2022-06-15 13:15:15Z"
-}
diff --git a/packages/vue-vuetify/example-app/src/examples/datetime/index.ts b/packages/vue-vuetify/example-app/src/examples/datetime/index.ts
deleted file mode 100644
index 8f5e656657..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/datetime/index.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import schema from './schema.json';
-import uischema from './uischema.json';
-import data from './data.json';
-import { UISchemaElement, JsonSchema } from '@jsonforms/core';
-
-export const input: {
- schema: JsonSchema;
- uischema: UISchemaElement;
- data: any;
-} = { schema, uischema, data };
diff --git a/packages/vue-vuetify/example-app/src/examples/datetime/schema.json b/packages/vue-vuetify/example-app/src/examples/datetime/schema.json
deleted file mode 100644
index 38fd786698..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/datetime/schema.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
- "type": "object",
- "properties": {
- "dateTime": {
- "type": "string",
- "format": "date-time"
- },
- "stringDateTime": {
- "type": "string"
- }
- }
-}
diff --git a/packages/vue-vuetify/example-app/src/examples/datetime/uischema.json b/packages/vue-vuetify/example-app/src/examples/datetime/uischema.json
deleted file mode 100644
index 9107470642..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/datetime/uischema.json
+++ /dev/null
@@ -1,16 +0,0 @@
-{
- "type": "VerticalLayout",
- "elements": [
- {
- "type": "Control",
- "scope": "#/properties/dateTime"
- },
- {
- "type": "Control",
- "scope": "#/properties/stringDateTime",
- "options": {
- "format": "date-time"
- }
- }
- ]
-}
diff --git a/packages/vue-vuetify/example-app/src/examples/enum-in-array/data.json b/packages/vue-vuetify/example-app/src/examples/enum-in-array/data.json
deleted file mode 100644
index 0637a088a0..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/enum-in-array/data.json
+++ /dev/null
@@ -1 +0,0 @@
-[]
\ No newline at end of file
diff --git a/packages/vue-vuetify/example-app/src/examples/enum-in-array/index.ts b/packages/vue-vuetify/example-app/src/examples/enum-in-array/index.ts
deleted file mode 100644
index 8f5e656657..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/enum-in-array/index.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import schema from './schema.json';
-import uischema from './uischema.json';
-import data from './data.json';
-import { UISchemaElement, JsonSchema } from '@jsonforms/core';
-
-export const input: {
- schema: JsonSchema;
- uischema: UISchemaElement;
- data: any;
-} = { schema, uischema, data };
diff --git a/packages/vue-vuetify/example-app/src/examples/enum-in-array/schema.json b/packages/vue-vuetify/example-app/src/examples/enum-in-array/schema.json
deleted file mode 100644
index 3da1e05bcd..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/enum-in-array/schema.json
+++ /dev/null
@@ -1,32 +0,0 @@
-{
- "type": "array",
- "items": {
- "type": "object",
- "properties": {
- "plainEnum": {
- "type": "string",
- "enum": [
- "foo",
- "bar"
- ]
- },
- "oneOfEnum": {
- "type": "string",
- "oneOf": [
- {
- "const": "foo",
- "title": "Foo"
- },
- {
- "const": "bar",
- "title": "Bar"
- },
- {
- "const": "foobar",
- "title": "FooBar"
- }
- ]
- }
- }
- }
-}
\ No newline at end of file
diff --git a/packages/vue-vuetify/example-app/src/examples/enum-in-array/uischema.json b/packages/vue-vuetify/example-app/src/examples/enum-in-array/uischema.json
deleted file mode 100644
index a4035a463d..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/enum-in-array/uischema.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
- "type": "VerticalLayout",
- "elements": [
- {
- "type": "Control",
- "scope": "#"
- }
- ]
-}
\ No newline at end of file
diff --git a/packages/vue-vuetify/example-app/src/examples/enum/data.json b/packages/vue-vuetify/example-app/src/examples/enum/data.json
deleted file mode 100644
index bbd2c90b94..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/enum/data.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{
- "plainEnumSet": "foo",
- "oneOfEnumSet": "bar"
-}
\ No newline at end of file
diff --git a/packages/vue-vuetify/example-app/src/examples/enum/index.ts b/packages/vue-vuetify/example-app/src/examples/enum/index.ts
deleted file mode 100644
index 8f5e656657..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/enum/index.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import schema from './schema.json';
-import uischema from './uischema.json';
-import data from './data.json';
-import { UISchemaElement, JsonSchema } from '@jsonforms/core';
-
-export const input: {
- schema: JsonSchema;
- uischema: UISchemaElement;
- data: any;
-} = { schema, uischema, data };
diff --git a/packages/vue-vuetify/example-app/src/examples/enum/schema.json b/packages/vue-vuetify/example-app/src/examples/enum/schema.json
deleted file mode 100644
index b21d8d7201..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/enum/schema.json
+++ /dev/null
@@ -1,53 +0,0 @@
-{
- "type": "object",
- "properties": {
- "plainEnum": {
- "type": "string",
- "enum": [
- "foo",
- "bar"
- ]
- },
- "plainEnumSet": {
- "type": "string",
- "enum": [
- "foo",
- "bar"
- ]
- },
- "oneOfEnum": {
- "type": "string",
- "oneOf": [
- {
- "const": "foo",
- "title": "Foo"
- },
- {
- "const": "bar",
- "title": "Bar"
- },
- {
- "const": "foobar",
- "title": "FooBar"
- }
- ]
- },
- "oneOfEnumSet": {
- "type": "string",
- "oneOf": [
- {
- "const": "foo",
- "title": "Foo"
- },
- {
- "const": "bar",
- "title": "Bar"
- },
- {
- "const": "foobar",
- "title": "FooBar"
- }
- ]
- }
- }
-}
\ No newline at end of file
diff --git a/packages/vue-vuetify/example-app/src/examples/enum/uischema.json b/packages/vue-vuetify/example-app/src/examples/enum/uischema.json
deleted file mode 100644
index 4bce4f9608..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/enum/uischema.json
+++ /dev/null
@@ -1,61 +0,0 @@
-{
- "type": "VerticalLayout",
- "elements": [
- {
- "type": "Group",
- "label": "Enums",
- "elements": [
- {
- "type": "Control",
- "scope": "#/properties/plainEnum"
- },
- {
- "type": "Control",
- "scope": "#/properties/plainEnumSet"
- },
- {
- "type": "Control",
- "scope": "#/properties/plainEnum",
- "options": {
- "autocomplete": false
- }
- },
- {
- "type": "Control",
- "scope": "#/properties/plainEnumSet",
- "options": {
- "autocomplete": false
- }
- }
- ]
- },
- {
- "type": "Group",
- "label": "One of Enums",
- "elements": [
- {
- "type": "Control",
- "scope": "#/properties/oneOfEnum"
- },
- {
- "type": "Control",
- "scope": "#/properties/oneOfEnumSet"
- },
- {
- "type": "Control",
- "scope": "#/properties/oneOfEnum",
- "options": {
- "autocomplete": false
- }
- },
- {
- "type": "Control",
- "scope": "#/properties/oneOfEnumSet",
- "options": {
- "autocomplete": false
- }
- }
- ]
- }
- ]
-}
\ No newline at end of file
diff --git a/packages/vue-vuetify/example-app/src/examples/group-layout/data.json b/packages/vue-vuetify/example-app/src/examples/group-layout/data.json
deleted file mode 100644
index 59a6d43787..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/group-layout/data.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
- "name": "John Doe",
- "vegetarian": false,
- "birthDate": "1985-06-02",
- "personalData": {
- "age": 34
- },
- "postalCode": "12345"
-}
\ No newline at end of file
diff --git a/packages/vue-vuetify/example-app/src/examples/group-layout/index.ts b/packages/vue-vuetify/example-app/src/examples/group-layout/index.ts
deleted file mode 100644
index 8f5e656657..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/group-layout/index.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import schema from './schema.json';
-import uischema from './uischema.json';
-import data from './data.json';
-import { UISchemaElement, JsonSchema } from '@jsonforms/core';
-
-export const input: {
- schema: JsonSchema;
- uischema: UISchemaElement;
- data: any;
-} = { schema, uischema, data };
diff --git a/packages/vue-vuetify/example-app/src/examples/group-layout/schema.json b/packages/vue-vuetify/example-app/src/examples/group-layout/schema.json
deleted file mode 100644
index 215f8fd803..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/group-layout/schema.json
+++ /dev/null
@@ -1,61 +0,0 @@
-{
- "type": "object",
- "properties": {
- "name": {
- "type": "string",
- "minLength": 3,
- "description": "Please enter your name"
- },
- "vegetarian": {
- "type": "boolean"
- },
- "birthDate": {
- "type": "string",
- "format": "date"
- },
- "nationality": {
- "type": "string",
- "enum": [
- "DE",
- "IT",
- "JP",
- "US",
- "RU",
- "Other"
- ]
- },
- "personalData": {
- "type": "object",
- "properties": {
- "age": {
- "type": "integer",
- "description": "Please enter your age."
- },
- "height": {
- "type": "number"
- },
- "drivingSkill": {
- "type": "number",
- "maximum": 10,
- "minimum": 1,
- "default": 7
- }
- },
- "required": [
- "age",
- "height"
- ]
- },
- "occupation": {
- "type": "string"
- },
- "postalCode": {
- "type": "string",
- "maxLength": 5
- }
- },
- "required": [
- "occupation",
- "nationality"
- ]
-}
\ No newline at end of file
diff --git a/packages/vue-vuetify/example-app/src/examples/group-layout/uischema.json b/packages/vue-vuetify/example-app/src/examples/group-layout/uischema.json
deleted file mode 100644
index 9d0da84ecd..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/group-layout/uischema.json
+++ /dev/null
@@ -1,16 +0,0 @@
-{
- "type": "Group",
- "label": "My Group",
- "elements": [
- {
- "type": "Control",
- "label": "Name",
- "scope": "#/properties/name"
- },
- {
- "type": "Control",
- "label": "Birth Date",
- "scope": "#/properties/birthDate"
- }
- ]
-}
\ No newline at end of file
diff --git a/packages/vue-vuetify/example-app/src/examples/horizontal-layout/data.json b/packages/vue-vuetify/example-app/src/examples/horizontal-layout/data.json
deleted file mode 100644
index 59a6d43787..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/horizontal-layout/data.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
- "name": "John Doe",
- "vegetarian": false,
- "birthDate": "1985-06-02",
- "personalData": {
- "age": 34
- },
- "postalCode": "12345"
-}
\ No newline at end of file
diff --git a/packages/vue-vuetify/example-app/src/examples/horizontal-layout/index.ts b/packages/vue-vuetify/example-app/src/examples/horizontal-layout/index.ts
deleted file mode 100644
index 8f5e656657..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/horizontal-layout/index.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import schema from './schema.json';
-import uischema from './uischema.json';
-import data from './data.json';
-import { UISchemaElement, JsonSchema } from '@jsonforms/core';
-
-export const input: {
- schema: JsonSchema;
- uischema: UISchemaElement;
- data: any;
-} = { schema, uischema, data };
diff --git a/packages/vue-vuetify/example-app/src/examples/horizontal-layout/schema.json b/packages/vue-vuetify/example-app/src/examples/horizontal-layout/schema.json
deleted file mode 100644
index 215f8fd803..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/horizontal-layout/schema.json
+++ /dev/null
@@ -1,61 +0,0 @@
-{
- "type": "object",
- "properties": {
- "name": {
- "type": "string",
- "minLength": 3,
- "description": "Please enter your name"
- },
- "vegetarian": {
- "type": "boolean"
- },
- "birthDate": {
- "type": "string",
- "format": "date"
- },
- "nationality": {
- "type": "string",
- "enum": [
- "DE",
- "IT",
- "JP",
- "US",
- "RU",
- "Other"
- ]
- },
- "personalData": {
- "type": "object",
- "properties": {
- "age": {
- "type": "integer",
- "description": "Please enter your age."
- },
- "height": {
- "type": "number"
- },
- "drivingSkill": {
- "type": "number",
- "maximum": 10,
- "minimum": 1,
- "default": 7
- }
- },
- "required": [
- "age",
- "height"
- ]
- },
- "occupation": {
- "type": "string"
- },
- "postalCode": {
- "type": "string",
- "maxLength": 5
- }
- },
- "required": [
- "occupation",
- "nationality"
- ]
-}
\ No newline at end of file
diff --git a/packages/vue-vuetify/example-app/src/examples/horizontal-layout/uischema.json b/packages/vue-vuetify/example-app/src/examples/horizontal-layout/uischema.json
deleted file mode 100644
index b1a4a8ba68..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/horizontal-layout/uischema.json
+++ /dev/null
@@ -1,26 +0,0 @@
-{
- "type": "HorizontalLayout",
- "elements": [
- {
- "type": "Control",
- "label": "Name",
- "scope": "#/properties/name"
- },
- {
- "type": "Control",
- "label": "Birth Date",
- "scope": "#/properties/birthDate"
- }
- ],
- "options": {
- "vuetify": {
- "v-container": {
- "fluid": true
- },
- "v-row": {
- "no-gutters": false
- },
- "v-col": [{ "cols": 8 }, { "cols": 4 }]
- }
- }
-}
diff --git a/packages/vue-vuetify/example-app/src/examples/huge/data.json b/packages/vue-vuetify/example-app/src/examples/huge/data.json
deleted file mode 100644
index 07a79772d0..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/huge/data.json
+++ /dev/null
@@ -1,180 +0,0 @@
-{
- "attribution": {
- "contributor": { "resource": "#A-1" },
- "modified": 1398405600000
- },
- "persons": [
- {
- "names": [{ "nameForms": [{ "fullText": "Samuel Ham" }] }],
- "gender": { "type": "http://gedcomx.org/Male" },
- "facts": [
- {
- "type": "http://gedcomx.org/Residence",
- "date": { "original": "3 November 1828", "formal": "+1828-11-03" },
- "place": { "original": "parish of Honiton, Devon, England" }
- }
- ],
- "extracted": true,
- "sources": [{ "description": "#S-2" }],
- "id": "P-1"
- },
- {
- "names": [{ "nameForms": [{ "fullText": "Elizabeth Spiller" }] }],
- "gender": { "type": "http://gedcomx.org/Female" },
- "facts": [
- {
- "type": "http://gedcomx.org/Residence",
- "date": { "original": "3 November 1828", "formal": "+1828-11-03" },
- "place": { "original": "parish of Wilton, Somerset, England" }
- }
- ],
- "extracted": true,
- "sources": [{ "description": "#S-2" }],
- "id": "P-2"
- },
- {
- "names": [{ "nameForms": [{ "fullText": "Jno. Pain" }] }],
- "extracted": true,
- "sources": [{ "description": "#S-2" }],
- "id": "P-3"
- },
- {
- "names": [{ "nameForms": [{ "fullText": "R.G. Halls" }] }],
- "extracted": true,
- "sources": [{ "description": "#S-2" }],
- "id": "P-4"
- },
- {
- "names": [{ "nameForms": [{ "fullText": "Peggy Hammet" }] }],
- "extracted": true,
- "sources": [{ "description": "#S-2" }],
- "id": "P-5"
- },
- {
- "names": [{ "nameForms": [{ "fullText": "David Smith Stone" }] }],
- "extracted": true,
- "sources": [{ "description": "#S-2" }],
- "id": "P-6"
- },
- {
- "evidence": [{ "resource": "#P-1" }],
- "analysis": { "resource": "#D-2" },
- "id": "C-1"
- }
- ],
- "relationships": [
- {
- "type": "http://gedcomx.org/Couple",
- "extracted": true,
- "facts": [
- {
- "type": "http://gedcomx.org/Marriage",
- "date": { "original": "3 November 1828", "formal": "+1828-11-03" },
- "place": { "original": "Wilton St George, Wilton, Somerset, England" }
- }
- ],
- "person1": { "resource": "#P-1" },
- "person2": { "resource": "#P-2" }
- }
- ],
- "sourceDescriptions": [
- {
- "description": [
- {
- "value": "Marriage entry for Samuel Ham and Elizabeth in a copy of the registers of the baptisms, marriages, and burials at the church of St. George in the parish of Wilton : adjoining Taunton, in the county of Somerset from A.D. 1558 to A.D. 1837."
- }
- ],
- "resourceType": "http://gedcomx.org/PhysicalArtifact",
- "citations": [
- {
- "value": "Joseph Houghton Spencer, transcriber, Church of England, Parish Church of Wilton (Somerset). A copy of the registers of the baptisms, marriages, and burials at the church of St. George in the parish of Wilton : adjoining Taunton, in the county of Somerset from A.D. 1558 to A.D. 1837; Marriage entry for Samuel Ham and Elizabeth Spiller (3 November 1828), (Taunton: Barnicott, 1890), p. 224, No. 86."
- }
- ],
- "titles": [
- {
- "value": "Marriage entry for Samuel Ham and Elizabeth Spiller, Parish Register, Wilton, Somerset, England"
- }
- ],
- "repository": { "resource": "#A-2" },
- "id": "S-1"
- },
- {
- "description": [
- {
- "value": "Transcription of marriage entry for Samuel Ham and Elizabeth in a copy of the registers of the baptisms, marriages, and burials at the church of St. George in the parish of Wilton : adjoining Taunton, in the county of Somerset from A.D. 1558 to A.D. 1837."
- }
- ],
- "sources": [{ "description": "#S-1" }],
- "resourceType": "http://gedcomx.org/DigitalArtifact",
- "citations": [
- {
- "value": "Joseph Houghton Spencer, transcriber, Church of England, Parish Church of Wilton (Somerset). A copy of the registers of the baptisms, marriages, and burials at the church of St. George in the parish of Wilton : adjoining Taunton, in the county of Somerset from A.D. 1558 to A.D. 1837; Marriage entry for Samuel Ham and Elizabeth Spiller (3 November 1828), (Taunton: Barnicott, 1890), p. 224, No. 86."
- }
- ],
- "about": "#D-1",
- "titles": [
- {
- "value": "Transcription of marriage entry for Samuel Ham and Elizabeth Spiller, Parish Register, Wilton, Somerset, England"
- }
- ],
- "id": "S-2"
- }
- ],
- "agents": [
- {
- "names": [{ "value": "Jane Doe" }],
- "emails": [{ "resource": "mailto:example@example.org" }],
- "id": "A-1"
- },
- {
- "names": [{ "value": "Family History Library" }],
- "addresses": [{ "city": "Salt Lake City", "stateOrProvince": "Utah" }],
- "id": "A-2"
- }
- ],
- "events": [
- {
- "type": "http://gedcomx.org/Marriage",
- "date": { "original": "3 November 1828", "formal": "+1828-11-03" },
- "place": { "original": "Wilton St George, Wilton, Somerset, England" },
- "roles": [
- {
- "type": "http://gedcomx.org/Principal",
- "person": { "resource": "#P-1" }
- },
- {
- "type": "http://gedcomx.org/Principal",
- "person": { "resource": "#P-2" }
- },
- {
- "type": "http://gedcomx.org/Witness",
- "person": { "resource": "#P-3" }
- },
- {
- "type": "http://gedcomx.org/Witness",
- "person": { "resource": "#P-4" }
- },
- {
- "type": "http://gedcomx.org/Witness",
- "person": { "resource": "#P-5" }
- },
- {
- "type": "http://gedcomx.org/Official",
- "person": { "resource": "#P-6" }
- }
- ],
- "extracted": true,
- "id": "E-1"
- }
- ],
- "documents": [
- {
- "type": "http://gedcomx.org/Transcription",
- "text": "Samuel Ham of the parish of Honiton and Elizabeth Spiller\nwere married this 3rd day of November 1828 by David Smith\nStone, Pl Curate,\nIn the Presence of\nJno Pain.\nR.G. Halls. Peggy Hammet.\nNo. 86.",
- "sources": [{ "description": "#S-1" }],
- "lang": "en",
- "id": "D-1"
- },
- { "text": "...Jane Doe`s analysis document...", "id": "D-2" }
- ]
-}
diff --git a/packages/vue-vuetify/example-app/src/examples/huge/index.ts b/packages/vue-vuetify/example-app/src/examples/huge/index.ts
deleted file mode 100644
index 8f5e656657..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/huge/index.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import schema from './schema.json';
-import uischema from './uischema.json';
-import data from './data.json';
-import { UISchemaElement, JsonSchema } from '@jsonforms/core';
-
-export const input: {
- schema: JsonSchema;
- uischema: UISchemaElement;
- data: any;
-} = { schema, uischema, data };
diff --git a/packages/vue-vuetify/example-app/src/examples/huge/schema.json b/packages/vue-vuetify/example-app/src/examples/huge/schema.json
deleted file mode 100644
index 6baf1b9a93..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/huge/schema.json
+++ /dev/null
@@ -1,966 +0,0 @@
-{
- "$schema": "http://json-schema.org/schema#",
-
- "definitions": {
- "confidenceTypes": {
- "type": "string",
- "enum": [
- "http://gedcomx.org/High",
- "http://gedcomx.org/Medium",
- "http://gedcomx.org/Low"
- ]
- },
- "genderTypes": {
- "type": "string",
- "enum": [
- "http://gedcomx.org/Male",
- "http://gedcomx.org/Female",
- "http://gedcomx.org/Unknown",
- "http://gedcomx.org/Intersex"
- ]
- },
- "nameTypes": {
- "type": "string",
- "enum": [
- "http://gedcomx.org/BirthName",
- "http://gedcomx.org/MarriedName",
- "http://gedcomx.org/AlsoKnownAs",
- "http://gedcomx.org/Nickname",
- "http://gedcomx.org/AdoptiveName",
- "http://gedcomx.org/FormalName",
- "http://gedcomx.org/ReligiousName"
- ]
- },
- "namePartTypes": {
- "enum": [
- "http://gedcomx.org/Prefix",
- "http://gedcomx.org/Suffix",
- "http://gedcomx.org/Given",
- "http://gedcomx.org/Surname"
- ]
- },
- "personFactTypes": {
- "type": "string",
- "enum": [
- "http://gedcomx.org/Adoption",
- "http://gedcomx.org/AdultChristening",
- "http://gedcomx.org/Amnesty",
- "http://gedcomx.org/Apprenticeship",
- "http://gedcomx.org/Arrest",
- "http://gedcomx.org/Baptism",
- "http://gedcomx.org/BarMitzvah",
- "http://gedcomx.org/BatMitzvah",
- "http://gedcomx.org/Birth",
- "http://gedcomx.org/Blessing",
- "http://gedcomx.org/Burial",
- "http://gedcomx.org/Caste",
- "http://gedcomx.org/Census",
- "http://gedcomx.org/Christening",
- "http://gedcomx.org/Circumcision",
- "http://gedcomx.org/Clan",
- "http://gedcomx.org/Confirmation",
- "http://gedcomx.org/Cremation",
- "http://gedcomx.org/Death",
- "http://gedcomx.org/Education",
- "http://gedcomx.org/Emigration",
- "http://gedcomx.org/Ethnicity",
- "http://gedcomx.org/Excommunication",
- "http://gedcomx.org/FirstCommunion",
- "http://gedcomx.org/Funeral",
- "http://gedcomx.org/GenderChange",
- "http://gedcomx.org/Heimat",
- "http://gedcomx.org/Immigration",
- "http://gedcomx.org/Imprisonment",
- "http://gedcomx.org/LandTransaction",
- "http://gedcomx.org/Language",
- "http://gedcomx.org/Living",
- "http://gedcomx.org/MaritalStatus",
- "http://gedcomx.org/Medical",
- "http://gedcomx.org/MilitaryAward",
- "http://gedcomx.org/MilitaryDischarge",
- "http://gedcomx.org/MilitaryDraftRegistration",
- "http://gedcomx.org/MilitaryInduction",
- "http://gedcomx.org/MilitaryService",
- "http://gedcomx.org/Mission",
- "http://gedcomx.org/MoveTo",
- "http://gedcomx.org/MoveFrom",
- "http://gedcomx.org/MultipleBirth",
- "http://gedcomx.org/NationalId",
- "http://gedcomx.org/Nationality",
- "http://gedcomx.org/Naturalization",
- "http://gedcomx.org/NumberOfChildren",
- "http://gedcomx.org/NumberOfMarriages",
- "http://gedcomx.org/Occupation",
- "http://gedcomx.org/Ordination",
- "http://gedcomx.org/Pardon",
- "http://gedcomx.org/PhysicalDescription",
- "http://gedcomx.org/Probate",
- "http://gedcomx.org/Property",
- "http://gedcomx.org/Religion",
- "http://gedcomx.org/Residence",
- "http://gedcomx.org/Retirement",
- "http://gedcomx.org/Stillbirth",
- "http://gedcomx.org/Will",
- "http://gedcomx.org/Visit",
- "http://gedcomx.org/Yahrzeit"
- ]
- },
- "uri": {
- "type": "string"
- },
- "localeTag": {
- "type": "string"
- },
- "resourceReference": {
- "type": "object",
- "properties": {
- "resource": { "$ref": "#/definitions/uri" }
- }
- },
- "identifier": {
- "type": "object"
- },
- "attribution": {
- "title": "Attribution",
- "properties": {
- "contributor": {
- "$ref": "#/definitions/resourceReference",
- "description": "Reference to the agent to whom the attributed data is attributed."
- },
- "modified": {
- "type": "number",
- "description": "Timestamp of when the attributed data was contributed."
- },
- "changeMessage": {
- "type": "string",
- "description": "A statement of why the attributed data is being provided by the contributor."
- },
- "creator": {
- "$ref": "#/definitions/resourceReference",
- "description": "Reference to the agent that created the attributed data. The creator MAY be different from the contributor if changes were made to the attributed data."
- },
- "created": {
- "type": "number",
- "description": "Timestamp of when the attributed data was contributed."
- }
- }
- },
- "note": {
- "title": "Note",
- "properties": {
- "lang": {
- "$ref": "#/definitions/localeTag",
- "description": "The locale identifier for the note."
- },
- "subject": {
- "type": "string",
- "description": "A subject or title for the note."
- },
- "text": { "type": "string", "description": "The text of the note." },
- "attribution": {
- "$ref": "#/definitions/attribution",
- "description": "The attribution of this note."
- }
- },
- "required": ["text"]
- },
- "textValue": {
- "type": "object",
- "properties": {
- "lang": {
- "$ref": "#/definitions/localeTag",
- "description": "The locale identifier for the value of the text."
- },
- "value": { "type": "string", "description": "The text value." }
- },
- "required": ["value"]
- },
- "sourceCitation": {
- "type": "object",
- "properties": {
- "lang": {
- "$ref": "#/definitions/localeTag",
- "description": "The locale identifier for the bibliographic metadata."
- },
- "value": {
- "type": "string",
- "description": "The bibliographic metadata rendered as a full citation."
- }
- },
- "required": ["value"]
- },
- "sourceReference": {
- "title": "SourceReference",
- "properties": {
- "description": {
- "$ref": "#/definitions/uri",
- "description": "Reference to a description of the target source."
- },
- "descriptionId": {
- "type": "string",
- "description": "The id of the target source."
- },
- "attribution": {
- "$ref": "#/definitions/attribution",
- "description": "The attribution of this source reference."
- },
- "qualifiers": {
- "items": { "$ref": "#/definitions/sourceReferenceQualifier" },
- "description": "Qualifiers for the reference, used to identify specific fragments of the source that are being referenced."
- }
- },
- "required": ["description"]
- },
- "sourceReferenceQualifier": {
- "properties": {
- "name": {
- "anyOf": [
- { "$ref": "#/definitions/sourceReferenceQualifierNames" },
- { "$ref": "#/definitions/uri" }
- ]
- },
- "value": { "type": "string" }
- },
- "required": ["name"]
- },
- "sourceReferenceQualifierNames": {
- "enum": [
- "http://gedcomx.org/CharacterRegion",
- "http://gedcomx.org/RectangleRegion",
- "http://gedcomx.org/TimeRegion"
- ]
- },
- "evidenceReference": {
- "title": "EvidenceReference",
- "properties": {
- "resource": { "$ref": "#/definitions/uri" },
- "attribution": { "$ref": "#/definitions/attribution" }
- },
- "required": ["resource"]
- },
- "onlineAccount": {
- "type": "object",
- "properties": {
- "serviceHomepage": { "$ref": "#/definitions/resourceReference" },
- "accountName": { "type": "string" }
- },
- "required": ["serviceHomepage", "accountName"]
- },
- "address": {
- "type": "object",
- "properties": {
- "value": { "type": "string" },
- "city": { "type": "string" },
- "country": { "type": "string" },
- "postalCode": { "type": "string" },
- "stateOrProvince": { "type": "string" },
- "street": { "type": "string" },
- "street2": { "type": "string" },
- "street3": { "type": "string" },
- "street4": { "type": "string" },
- "street5": { "type": "string" },
- "street6": { "type": "string" }
- }
- },
- "conclusion": {
- "type": "object",
- "title": "Conclusion",
- "properties": {
- "id": {
- "type": "string",
- "description": "An identifier for the conclusion data."
- },
- "lang": {
- "$ref": "#/definitions/localeTag",
- "description": "The locale identifier for the conclusion."
- },
- "sources": {
- "items": { "$ref": "#/definitions/sourceReference" },
- "description": "The list of references to the sources of related to this conclusion."
- },
- "analysis": {
- "$ref": "#/definitions/resourceReference",
- "description": "Reference to a document containing analysis supporting this conclusion."
- },
- "notes": {
- "items": { "$ref": "#/definitions/note" },
- "description": "A list of notes about this conclusion."
- },
- "confidence": {
- "anyOf": [
- { "$ref": "#/definitions/uri" },
- { "$ref": "#/definitions/confidenceTypes" }
- ],
- "description": "Reference to a confidence level for this conclusion."
- },
- "attribution": {
- "$ref": "#/definitions/attribution",
- "description": "The attribution of this conclusion."
- }
- }
- },
- "subject": {
- "title": "Subject",
- "allOf": [
- { "$ref": "#/definitions/conclusion" },
- {
- "properties": {
- "extracted": {
- "type": "boolean",
- "description": "Whether this subject is to be constrained as an extracted conclusion."
- },
- "evidence": {
- "items": { "$ref": "#/definitions/evidenceReference" },
- "description": "References to other subjects that support this subject."
- },
- "media": {
- "items": { "$ref": "#/definitions/sourceReference" },
- "description": "References to multimedia resources for this subject, such as photos or videos, intended to provide additional context or illustration for the subject and not considered evidence supporting the identity of the subject or its supporting conclusions."
- },
- "identifiers": {
- "$ref": "#/definitions/identifier",
- "description": "A list of identifiers for the subject."
- }
- }
- }
- ]
- },
- "gender": {
- "allOf": [
- { "$ref": "#/definitions/conclusion" },
- {
- "properties": {
- "type": {
- "anyOf": [
- { "$ref": "#/definitions/uri" },
- { "$ref": "#/definitions/genderTypes" }
- ],
- "description": "Enumerated value identifying the gender."
- }
- },
- "required": ["type"]
- }
- ]
- },
- "date": {
- "type": "object",
- "properties": {
- "original": {
- "type": "string",
- "description": "The original value of the date as supplied by the contributor."
- },
- "formal": {
- "type": "string",
- "pattern": "^(A?[\\+-]\\d{4}(-\\d{2})?(-\\d{2})?T?(\\d{2})?(\":\\d{2})?(\":\\d{2})?([\\+-]\\d{2}(\":\\d{2})?|Z)?)|(P(\\d{0,4}Y)?(\\d{0,4}M)?(\\d{0,4}D)?(T(\\d{0,4}H)?(\\d{0,4}M)?(\\d{0,4}S)?)?)$",
- "description": "The standardized formal value of the date, formatted according to the GEDCOM X Date Format specification."
- }
- }
- },
- "name": {
- "title": "Name",
- "allOf": [
- { "$ref": "#/definitions/conclusion" },
- {
- "properties": {
- "type": {
- "anyOf": [
- { "$ref": "#/definitions/uri" },
- { "$ref": "#/definitions/nameTypes" }
- ],
- "description": "Enumerated value identifying the name type."
- },
- "date": {
- "$ref": "#/definitions/date",
- "description": "The date of applicability of the name."
- },
- "nameForms": {
- "items": {
- "$ref": "#/definitions/nameForm"
- },
- "description": "The name form(s) that best express this name, usually representations considered proper and well formed in the person\"s native, historical cultural context."
- }
- },
- "required": ["nameForms"]
- }
- ]
- },
- "namePart": {
- "title": "NamePart",
- "description": "The NamePart data type is used to model a portion of a full name, including the terms that make up that portion. Some name parts may have qualifiers to provide additional semantic meaning to the name part (e.g., \"given name\" or \"surname\").",
- "properties": {
- "type": {
- "anyOf": [
- { "$ref": "#/definitions/uri" },
- { "$ref": "#/definitions/namePartTypes" }
- ],
- "description": "Enumerated value identifying the type of the name part."
- },
- "value": {
- "type": "string",
- "description": "The term(s) from the name that make up this name part."
- },
- "qualifiers": {
- "items": { "$ref": "#/definitions/namePartQualifier" },
- "description": "Qualifiers to add additional semantic meaning to the name part."
- }
- },
- "required": ["value"]
- },
- "namePartQualifier": {
- "properties": {
- "name": {
- "anyOf": [
- { "$ref": "#/definitions/namePartQualifierNames" },
- { "$ref": "#/definitions/uri" }
- ]
- },
- "value": { "type": "string" }
- },
- "required": ["name"]
- },
- "namePartQualifierNames": {
- "enum": [
- "http://gedcomx.org/Title",
- "http://gedcomx.org/Primary",
- "http://gedcomx.org/Secondary",
- "http://gedcomx.org/Middle",
- "http://gedcomx.org/Familiar",
- "http://gedcomx.org/Religious",
- "http://gedcomx.org/Family",
- "http://gedcomx.org/Maiden",
- "http://gedcomx.org/Patronymic",
- "http://gedcomx.org/Matronymic",
- "http://gedcomx.org/Geographic",
- "http://gedcomx.org/Occupational",
- "http://gedcomx.org/Characteristic",
- "http://gedcomx.org/Postnom",
- "http://gedcomx.org/Particle",
- "http://gedcomx.org/RootName"
- ]
- },
- "nameForm": {
- "title": "NameForm",
- "description": "The NameForm data type defines a representation of a name (a \"name form\") within a given cultural context, such as a given language and script.\n\"As names are captured (both in records or in applications), the terms in the name are sometimes classified by type. For example, a certificate of death might prompt for \"given name(s)\" and \"surname\". The parts list can be used to represent the terms in the name that have been classified.\n\"If both a full rendering of the name and a list of parts are provided, it NOT REQUIRED that every term in the fully rendered name appear in the list of parts.\n\"Name parts in the parts list SHOULD be ordered in the natural order they would be used in the applicable cultural context.\n\"If a full rendering of the name is not provided (i.e., the name has only been expressed in parts), a full rendering of the name MAY be derived (sans punctuation) by concatenating, in order, each name part value in the list of parts, separating each part with the name part separator appropriate for the applicable cultural context.",
- "properties": {
- "lang": {
- "$ref": "#/definitions/localeTag",
- "description": "The locale identifier for the name form."
- },
- "fullText": {
- "type": "string",
- "description": "A full rendering of the name (or as much of the name as is known)."
- },
- "parts": {
- "items": {
- "$ref": "#/definitions/namePart"
- },
- "description": "Any identified name parts from the name."
- }
- }
- },
- "fact": {
- "title": "PersonFact",
- "allOf": [
- { "$ref": "#/definitions/conclusion" },
- {
- "properties": {
- "type": {
- "anyOf": [
- { "$ref": "#/definitions/uri" },
- { "$ref": "#/definitions/personFactTypes" }
- ],
- "description": "Enumerated value identifying the type of the fact."
- },
- "date": {
- "$ref": "#/definitions/date",
- "description": "The date of applicability of the fact."
- },
- "place": {
- "$ref": "#/definitions/placeReference",
- "description": "A reference to the place applicable to this fact."
- },
- "value": {
- "type": "string",
- "description": "The value of the fact."
- },
- "qualifiers": {
- "items": { "$ref": "#/definitions/factQualifier" },
- "description": "Qualifiers to add additional details about the fact."
- }
- },
- "required": ["type"]
- }
- ]
- },
- "factQualifier": {
- "properties": {
- "name": {
- "anyOf": [
- { "$ref": "#/definitions/factQualifierNames" },
- { "$ref": "#/definitions/uri" }
- ]
- },
- "value": { "type": "string" }
- },
- "required": ["name"]
- },
- "factQualifierNames": {
- "enum": [
- "http://gedcomx.org/Age",
- "http://gedcomx.org/Cause",
- "http://gedcomx.org/Religion",
- "http://gedcomx.org/Transport",
- "http://gedcomx.org/NonConsensual"
- ]
- },
- "eventRole": {
- "allOf": [
- { "$ref": "#/definitions/conclusion" },
- {
- "properties": {
- "person": {
- "$ref": "#/definitions/resourceReference",
- "description": "Reference to the event participant."
- },
- "type": {
- "anyOf": [
- { "$ref": "#/definitions/uri" },
- { "$ref": "#/definitions/eventRoleTypes" }
- ],
- "description": "Enumerated value identifying the participant's role."
- },
- "details": {
- "type": "string",
- "description": "Details about the role of participant in the event."
- }
- },
- "required": ["person"]
- }
- ]
- },
- "eventRoleTypes": {
- "enum": [
- "http://gedcomx.org/Principal",
- "http://gedcomx.org/Participant",
- "http://gedcomx.org/Official",
- "http://gedcomx.org/Witness"
- ]
- },
- "placeReference": {
- "type": "object",
- "properties": {
- "original": {
- "type": "string",
- "description": "The original place name text as supplied by the contributor."
- },
- "description": {
- "$ref": "#/definitions/uri",
- "description": "A reference to a description of this place."
- }
- }
- },
- "coverage": {
- "properties": {
- "spatial": {
- "$ref": "#/definitions/placeReference",
- "description": "The spatial (i.e., geographic) coverage."
- },
- "temporal": {
- "$ref": "#/definitions/date",
- "description": "The temporal coverage."
- }
- }
- },
- "groupRole": {
- "allOf": [
- { "$ref": "#/definitions/conclusion" },
- {
- "properties": {
- "person": {
- "$ref": "#/definitions/resourceReference",
- "description": "Reference to the group participant."
- },
- "type": {
- "$ref": "#/definitions/uri",
- "description": "Enumerated value identifying the participant's role."
- },
- "date": {
- "$ref": "#/definitions/date",
- "description": "The date of applicability of the role."
- },
- "details": {
- "type": "string",
- "description": "Details about the role of he participant in the group."
- }
- },
- "required": ["person"]
- }
- ]
- },
- "person": {
- "title": "Person",
- "allOf": [
- { "$ref": "#/definitions/subject" },
- {
- "properties": {
- "private": {
- "type": "boolean",
- "description": "Whether this instance of Person has been designated for limited distribution or display."
- },
- "gender": {
- "$ref": "#/definitions/gender",
- "description": "The sex of the person as assigned at birth."
- },
- "names": {
- "items": { "$ref": "#/definitions/name" },
- "description": "The names of the person."
- },
- "facts": {
- "items": { "$ref": "#/definitions/fact" },
- "description": "The facts of the person."
- }
- }
- }
- ]
- },
- "relationship": {
- "allOf": [
- { "$ref": "#/definitions/subject" },
- {
- "properties": {
- "type": {
- "anyOf": [
- { "$ref": "#/definitions/relationshipType" },
- { "$ref": "#/definitions/uri" }
- ],
- "description": "Enumerated value identifying the type of the relationship."
- },
- "person1": {
- "$ref": "#/definitions/resourceReference",
- "description": "Reference to the first person in the relationship."
- },
- "person2": {
- "$ref": "#/definitions/resourceReference",
- "description": "Reference to the second person in the relationship."
- },
- "facts": {
- "items": { "$ref": "#/definitions/fact" },
- "description": "The facts about the relationship."
- }
- },
- "required": ["person1", "person2"]
- }
- ]
- },
- "relationshipType": {
- "enum": [
- "http://gedcomx.org/Couple",
- "http://gedcomx.org/ParentChild",
- "http://gedcomx.org/EnslavedBy"
- ]
- },
- "sourceDescription": {
- "title": "SourceDescription",
- "properties": {
- "id": {
- "type": "string",
- "description": "An identifier for the data structure holding the source description data."
- },
- "resourceType": {
- "anyOf": [
- { "$ref": "#/definitions/resourceTypes" },
- { "$ref": "#/definitions/uri" }
- ],
- "description": "Enumerated value identifying the type of resource being described."
- },
- "citations": {
- "items": { "$ref": "#/definitions/sourceCitation" },
- "description": "The citation(s) for this source."
- },
- "mediaType": {
- "type": "string",
- "description": "A hint about the media type of the resource being described."
- },
- "about": {
- "$ref": "#/definitions/uri",
- "description": "A uniform resource identifier (URI) for the resource being described."
- },
- "mediator": {
- "$ref": "#/definitions/resourceReference",
- "description": "A reference to the entity that mediates access to the described source."
- },
- "publisher": {
- "$ref": "#/definitions/resourceReference",
- "description": "A reference to the entity responsible for making the described source available."
- },
- "sources": {
- "items": { "$ref": "#/definitions/sourceReference" },
- "description": "A list of references to any sources from which this source is derived."
- },
- "analysis": {
- "$ref": "#/definitions/resourceReference",
- "description": "A reference to a document containing analysis about this source."
- },
- "componentOf": {
- "$ref": "#/definitions/sourceReference",
- "description": "A reference to the source that contains this source, i.e. its parent context. Used when the description of a source is not complete without the description of its parent (or containing) source."
- },
- "titles": {
- "items": { "$ref": "#/definitions/textValue" },
- "description": "The display name(s) for this source."
- },
- "notes": {
- "items": { "$ref": "#/definitions/note" },
- "description": "A list of notes about a source."
- },
- "attribution": {
- "$ref": "#/definitions/attribution",
- "description": "The attribution of this source description."
- },
- "rights": {
- "items": { "$ref": "#/definitions/resourceReference" },
- "description": "The rights for this resource."
- },
- "coverage": {
- "$ref": "#/definitions/coverage",
- "description": "The coverage of the resource."
- },
- "descriptions": {
- "items": { "$ref": "#/definitions/textValue" },
- "description": "Human-readable descriptions of this source."
- },
- "identifiers": {
- "items": { "$ref": "#/definitions/identifier" },
- "description": "A list of identifiers for the resource being described."
- },
- "created": {
- "type": "number",
- "description": "Timestamp of when the resource being described was created."
- },
- "modified": {
- "type": "number",
- "description": "Timestamp of when the resource being described was modified."
- },
- "repository": {
- "$ref": "#/definitions/resourceReference",
- "description": "A reference to the repository that contains the described resource."
- }
- },
- "required": ["citations"]
- },
- "resourceTypes": {
- "enum": [
- "http://gedcomx.org/Collection",
- "http://gedcomx.org/PhysicalArtifact",
- "http://gedcomx.org/DigitalArtifact",
- "http://gedcomx.org/Record"
- ]
- },
- "agent": {
- "title": "Agent",
- "properties": {
- "id": { "type": "string" },
- "identifiers": {
- "type": "array",
- "items": { "$ref": "#/definitions/identifier" }
- },
- "names": {
- "type": "array",
- "items": { "$ref": "#/definitions/textValue" }
- },
- "homepage": { "$ref": "#/definitions/resourceReference" },
- "openid": { "$ref": "#/definitions/resourceReference" },
- "accounts": {
- "type": "array",
- "items": { "$ref": "#/definitions/onlineAccount" }
- },
- "emails": {
- "type": "array",
- "items": { "$ref": "#/definitions/resourceReference" }
- },
- "phones": {
- "type": "array",
- "items": { "$ref": "#/definitions/resourceReference" }
- },
- "addresses": {
- "type": "array",
- "items": { "$ref": "#/definitions/address" }
- },
- "person": {
- "$ref": "#/definitions/resourceReference"
- }
- }
- },
- "event": {
- "allOf": [
- { "$ref": "#/definitions/subject" },
- {
- "properties": {
- "type": {
- "anyOf": [
- { "$ref": "#/definitions/eventTypes" },
- { "$ref": "#/definitions/uri" }
- ]
- },
- "date": { "$ref": "#/definitions/date" },
- "place": { "$ref": "#/definitions/placeReference" },
- "roles": {
- "type": "array",
- "items": { "$ref": "#/definitions/eventRole" }
- }
- }
- }
- ]
- },
- "eventTypes": {
- "enum": [
- "http://gedcomx.org/Adoption",
- "http://gedcomx.org/AdultChristening",
- "http://gedcomx.org/Annulment",
- "http://gedcomx.org/Baptism",
- "http://gedcomx.org/BarMitzvah",
- "http://gedcomx.org/BatMitzvah",
- "http://gedcomx.org/Birth",
- "http://gedcomx.org/Blessing",
- "http://gedcomx.org/Burial",
- "http://gedcomx.org/Census",
- "http://gedcomx.org/Christening",
- "http://gedcomx.org/Circumcision",
- "http://gedcomx.org/Confirmation",
- "http://gedcomx.org/Cremation",
- "http://gedcomx.org/Death",
- "http://gedcomx.org/Divorce",
- "http://gedcomx.org/DivorceFiling",
- "http://gedcomx.org/Education",
- "http://gedcomx.org/Engagement",
- "http://gedcomx.org/Emigration",
- "http://gedcomx.org/Excommunication",
- "http://gedcomx.org/FirstCommunion",
- "http://gedcomx.org/Funeral",
- "http://gedcomx.org/Immigration",
- "http://gedcomx.org/LandTransaction",
- "http://gedcomx.org/Marriage",
- "http://gedcomx.org/MilitaryAward",
- "http://gedcomx.org/MilitaryDischarge",
- "http://gedcomx.org/Mission",
- "http://gedcomx.org/MoveFrom",
- "http://gedcomx.org/MoveTo",
- "http://gedcomx.org/Naturalization",
- "http://gedcomx.org/Ordination",
- "http://gedcomx.org/Retirement"
- ]
- },
- "document": {
- "title": "Document",
- "allOf": [
- { "$ref": "#/definitions/conclusion" },
- {
- "properties": {
- "type": {
- "anyOf": [
- { "$ref": "#/definitions/documentTypes" },
- { "$ref": "#/definitions/uri" }
- ]
- },
- "extracted": { "type": "boolean" },
- "textType": { "type": "string" },
- "text": { "type": "string" },
- "attribution": { "$ref": "#/definitions/attribution" }
- },
- "required": ["text"]
- }
- ]
- },
- "documentTypes": {
- "enum": [
- "http://gedcomx.org/Abstract",
- "http://gedcomx.org/Transcription",
- "http://gedcomx.org/Translation",
- "http://gedcomx.org/Analysis"
- ]
- },
- "placeDescription": {
- "title": "PlaceDescription",
- "allOf": [
- { "$ref": "#/definitions/subject" },
- {
- "properties": {
- "names": {
- "items": { "$ref": "#/definitions/textValue" }
- },
- "type": { "$ref": "#/definitions/uri" },
- "place": { "$ref": "#/definitions/resourceReference" },
- "jurisdiction": {
- "$ref": "#/definitions/resourceReference"
- },
- "latitude": { "type": "number" },
- "longitude": { "type": "number" },
- "temporalDescription": { "$ref": "#/definitions/date" },
- "spatialDescription": { "$ref": "#/definitions/resourceReference" }
- },
- "required": ["names"]
- }
- ]
- },
- "group": {
- "allOf": [
- { "$ref": "#/definitions/subject" },
- {
- "properties": {
- "names": {
- "type": "array",
- "items": { "$ref": "#/definitions/textValue" }
- },
- "date": { "$ref": "#/definitions/date" },
- "place": { "$ref": "#/definitions/resourceReference" },
- "roles": {
- "type": "array",
- "items": { "$ref": "#/definitions/groupRole" }
- }
- },
- "required": ["names"]
- }
- ]
- }
- },
-
- "type": "object",
- "properties": {
- "persons": {
- "type": "array",
- "items": { "$ref": "#/definitions/person" }
- },
- "relationships": {
- "type": "array",
- "items": { "$ref": "#/definitions/relationship" }
- },
- "sourceDescriptions": {
- "type": "array",
- "items": { "$ref": "#/definitions/sourceDescription" }
- },
- "agents": {
- "type": "array",
- "items": { "$ref": "#/definitions/agent" }
- },
- "events": {
- "type": "array",
- "items": { "$ref": "#/definitions/event" }
- },
- "documents": {
- "type": "array",
- "items": { "$ref": "#/definitions/document" }
- },
- "places": {
- "type": "array",
- "items": { "$ref": "#/definitions/placeDescription" }
- },
- "groups": {
- "type": "array",
- "items": { "$ref": "#/definitions/group" }
- },
- "description": { "$ref": "#/definitions/uri" },
- "id": { "type": "string" },
- "lang": { "$ref": "#/definitions/localeTag" },
- "attribution": { "$ref": "#/definitions/attribution" }
- }
-}
diff --git a/packages/vue-vuetify/example-app/src/examples/huge/uischema.json b/packages/vue-vuetify/example-app/src/examples/huge/uischema.json
deleted file mode 100644
index c9c72a2e48..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/huge/uischema.json
+++ /dev/null
@@ -1,58 +0,0 @@
-{
- "type": "Categorization",
- "elements": [
- {
- "type": "Category",
- "label": "Persons",
- "elements": [
- { "type": "ListWithDetail", "scope": "#/properties/persons" }
- ]
- },
- {
- "type": "Category",
- "label": "Relationships",
- "elements": [
- { "type": "ListWithDetail", "scope": "#/properties/relationships" }
- ]
- },
- {
- "type": "Category",
- "label": "SourceDescriptions",
- "elements": [
- { "type": "ListWithDetail", "scope": "#/properties/sourceDescriptions" }
- ]
- },
- {
- "type": "Category",
- "label": "Agents",
- "elements": [{ "type": "ListWithDetail", "scope": "#/properties/agents" }]
- },
- {
- "type": "Category",
- "label": "Events",
- "elements": [{ "type": "ListWithDetail", "scope": "#/properties/events" }]
- },
- {
- "type": "Category",
- "label": "Documents",
- "elements": [
- { "type": "ListWithDetail", "scope": "#/properties/documents" }
- ]
- },
- {
- "type": "Category",
- "label": "Places",
- "elements": [{ "type": "ListWithDetail", "scope": "#/properties/places" }]
- },
- {
- "type": "Category",
- "label": "Generic",
- "elements": [
- { "type": "Control", "scope": "#/properties/description" },
- { "type": "Control", "scope": "#/properties/lang" },
- { "type": "Control", "scope": "#/properties/attribution" },
- { "type": "Control", "scope": "#/properties/id" }
- ]
- }
- ]
-}
diff --git a/packages/vue-vuetify/example-app/src/examples/if-then-else/data.json b/packages/vue-vuetify/example-app/src/examples/if-then-else/data.json
deleted file mode 100644
index 7a73a41bfd..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/if-then-else/data.json
+++ /dev/null
@@ -1,2 +0,0 @@
-{
-}
\ No newline at end of file
diff --git a/packages/vue-vuetify/example-app/src/examples/if-then-else/index.ts b/packages/vue-vuetify/example-app/src/examples/if-then-else/index.ts
deleted file mode 100644
index 190d6b2aef..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/if-then-else/index.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import schema from './schema.json';
-import data from './data.json';
-import { UISchemaElement, JsonSchema } from '@jsonforms/core';
-
-const uischema = undefined;
-export const input: {
- schema: JsonSchema;
- uischema: UISchemaElement | undefined;
- data: any;
-} = { schema, uischema, data };
diff --git a/packages/vue-vuetify/example-app/src/examples/if-then-else/schema.json b/packages/vue-vuetify/example-app/src/examples/if-then-else/schema.json
deleted file mode 100644
index 883ac90adb..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/if-then-else/schema.json
+++ /dev/null
@@ -1,26 +0,0 @@
-{
- "type": "object",
- "properties": {
- "b": {
- "type": "boolean"
- },
- "c": {
- "type": "string",
- "minLength": 1
- }
- },
- "if": {
- "properties": {
- "b": {
- "enum": [
- false
- ]
- }
- }
- },
- "then": {
- "required": [
- "c"
- ]
- }
-}
\ No newline at end of file
diff --git a/packages/vue-vuetify/example-app/src/examples/index.ts b/packages/vue-vuetify/example-app/src/examples/index.ts
deleted file mode 100644
index d887864dd7..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/index.ts
+++ /dev/null
@@ -1,291 +0,0 @@
-import { input as allOf } from './allOf';
-import { input as allOfWithProps } from './allOf-with-props';
-import { input as anyOf } from './anyOf';
-import { input as anyOfWithProps } from './anyOf-with-props';
-import { input as anyOfSimple } from './anyOf-simple';
-import { input as array } from './array';
-import { input as arrayRestrict } from './array-restrict';
-import { input as arrayWithReorder } from './array-with-reorder';
-import { input as basic } from './basic';
-import { input as categorization } from './categorization';
-import { input as categorizationStepper } from './categorization-stepper';
-import { input as categorizationStepperNav } from './categorization-stepper-nav';
-import { input as control } from './control';
-import { input as controlOptions } from './control-options';
-import { input as customRenderer } from './custom-renderer';
-import { input as enumExample } from './enum';
-import { input as dateExample } from './date';
-import { input as timeExample } from './time';
-import { input as dateTimeExample } from './datetime';
-import { input as enumInArray } from './enum-in-array';
-import { input as groupLayout } from './group-layout';
-import { input as horizontalLayout } from './horizontal-layout';
-import { input as listWithDetails } from './list-with-details';
-import { input as listWithDetailsAndReorder } from './list-with-details-and-reorder';
-import { input as listWithDetailsRestrict } from './list-with-details-restrict';
-import { input as login } from './login';
-import { input as main } from './main';
-import { input as multiEnum } from './multi-enum';
-import { input as nestedArray } from './nested-array';
-import { input as nestedArrayRestrict } from './nested-array-restrict';
-import { input as nestedArrayWithReorder } from './nested-array-with-reorder';
-import { input as nestedLayout } from './nested-layout';
-import { input as noSchemas } from './no-schemas';
-import { input as noUISchema } from './no-ui-schema';
-import { input as object } from './object';
-import { input as objectNested } from './object-nested';
-import { input as oneOf } from './oneOf';
-import { input as oneOfWithProps } from './oneOf-with-props';
-import { input as oneOfTab } from './oneOf-tab';
-import { input as oneOfRecursive } from './oneOf-recursive';
-import { input as radio } from './radio';
-import { input as radioGroup } from './radio-group';
-import { input as rootObject } from './root-object';
-import { input as additionalProperties } from './additionalProperties';
-import { input as rule } from './rule';
-import { input as verticalLayout } from './vertical-layout';
-import { input as huge } from './huge';
-import { input as ifThenElse } from './if-then-else';
-
-export const examples = [
- {
- id: 'main',
- title: 'Main',
- input: main,
- },
- {
- id: 'basic',
- title: 'Basic',
- input: basic,
- },
- {
- id: 'control',
- title: 'Control',
- input: control,
- },
- {
- id: 'control-options',
- title: 'Control Options',
- input: controlOptions,
- },
- {
- id: 'datetime',
- title: 'Datetime',
- input: dateTimeExample,
- },
- {
- id: 'date',
- title: 'Date',
- input: dateExample,
- },
- {
- id: 'time',
- title: 'Time',
- input: timeExample,
- },
- {
- id: 'enum',
- title: 'Enum',
- input: enumExample,
- },
- {
- id: 'enum-in-array',
- title: 'Enum In Array',
- input: enumInArray,
- },
- {
- id: 'multi-array',
- title: 'Multi Enum',
- input: multiEnum,
- },
- {
- id: 'categorization',
- title: 'Categorization',
- input: categorization,
- },
- {
- id: 'categorization-stepper',
- title: 'Categorization Stepper',
- input: categorizationStepper,
- },
- {
- id: 'categorization-stepper-nav',
- title: 'Categorization Stepper With Navigation',
- input: categorizationStepperNav,
- },
- {
- id: 'custom-renderer',
- title: 'Custom Renderer',
- input: customRenderer,
- },
- {
- id: 'horizontal-layout',
- title: 'Horizontal Layout',
- input: horizontalLayout,
- },
- {
- id: 'vertical-layout',
- title: 'Vertical Layout',
- input: verticalLayout,
- },
- {
- id: 'group-layout',
- title: 'Group Layout',
- input: groupLayout,
- },
- {
- id: 'nested-layout',
- title: 'Nested Layout',
- input: nestedLayout,
- },
- {
- id: 'array',
- title: 'Array',
- input: array,
- },
- {
- id: 'array-restrict',
- title: 'Array Min/Max Items',
- input: arrayRestrict,
- },
- {
- id: 'array-with-reorder',
- title: 'Array With Reorder',
- input: arrayWithReorder,
- },
- {
- id: 'nested-array',
- title: 'Nested Array',
- input: nestedArray,
- },
- {
- id: 'nested-array-restrict',
- title: 'Nested Array Min/Max Items',
- input: nestedArrayRestrict,
- },
- {
- id: 'nested-array-with-reorder',
- title: 'Nested Array With Reorder',
- input: nestedArrayWithReorder,
- },
- {
- id: 'rule',
- title: 'Rule',
- input: rule,
- },
- {
- id: 'login',
- title: 'Login',
- input: login,
- },
- {
- id: 'radio',
- title: 'Radio',
- input: radio,
- },
- {
- id: 'radio-group',
- title: 'Radio Group',
- input: radioGroup,
- },
- {
- id: 'object',
- title: 'Object',
- input: object,
- },
- {
- id: 'object-nested',
- title: 'Object (Nested)',
- input: objectNested,
- },
- {
- id: 'root-object',
- title: 'Root Object',
- input: rootObject,
- },
- {
- id: 'additional-properties',
- title: 'Additional Properties',
- input: additionalProperties,
- },
- {
- id: 'no-ui-schema',
- title: 'Generate UI Schema',
- input: noUISchema,
- },
- {
- id: 'no-schemas',
- title: 'Generate Both Schemas',
- input: noSchemas,
- },
- {
- id: 'one-of',
- title: 'Combinators oneOf',
- input: oneOf,
- },
- {
- id: 'one-of-with-props',
- title: 'Combinators oneOf with props',
- input: oneOfWithProps,
- },
- {
- id: 'one-of-tab',
- title: 'Combinators oneOf tab',
- input: oneOfTab,
- },
- {
- id: 'one-of-recursive',
- title: 'Combinators oneOf recursive',
- input: oneOfRecursive,
- },
- {
- id: 'any-of',
- title: 'Combinators anyOf',
- input: anyOf,
- },
- {
- id: 'any-of-with-props',
- title: 'Combinators anyOf with props',
- input: anyOfWithProps,
- },
- {
- id: 'any-of-simple',
- title: 'Combinators anyOf simple',
- input: anyOfSimple,
- },
- {
- id: 'all-of',
- title: 'Combinators allOf',
- input: allOf,
- },
- {
- id: 'all-of-with-props',
- title: 'Combinators allOf with props',
- input: allOfWithProps,
- },
- {
- id: 'list-with-details',
- title: 'List With Details',
- input: listWithDetails,
- },
- {
- id: 'list-with-details-restrict',
- title: 'List With Details Min/Max Items',
- input: listWithDetailsRestrict,
- },
- {
- id: 'list-with-details-reorder',
- title: 'List With Details And Reorder',
- input: listWithDetailsAndReorder,
- },
- {
- id: 'if-then-else',
- title: 'If Then Else',
- input: ifThenElse,
- },
- {
- id: 'huge',
- title: 'Huge',
- input: huge,
- },
-];
diff --git a/packages/vue-vuetify/example-app/src/examples/list-with-details-and-reorder/data.json b/packages/vue-vuetify/example-app/src/examples/list-with-details-and-reorder/data.json
deleted file mode 100644
index ff6ff8d420..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/list-with-details-and-reorder/data.json
+++ /dev/null
@@ -1,16 +0,0 @@
-{
- "users": [
- {
- "firstname": "Max",
- "lastname": "Mustermann",
- "age": 25,
- "email": "max@mustermann.com"
- },
- {
- "firstname": "John",
- "lastname": "Doe",
- "age": 35,
- "email": "john@doe.com"
- }
- ]
-}
\ No newline at end of file
diff --git a/packages/vue-vuetify/example-app/src/examples/list-with-details-and-reorder/index.ts b/packages/vue-vuetify/example-app/src/examples/list-with-details-and-reorder/index.ts
deleted file mode 100644
index 8f5e656657..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/list-with-details-and-reorder/index.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import schema from './schema.json';
-import uischema from './uischema.json';
-import data from './data.json';
-import { UISchemaElement, JsonSchema } from '@jsonforms/core';
-
-export const input: {
- schema: JsonSchema;
- uischema: UISchemaElement;
- data: any;
-} = { schema, uischema, data };
diff --git a/packages/vue-vuetify/example-app/src/examples/list-with-details-and-reorder/schema.json b/packages/vue-vuetify/example-app/src/examples/list-with-details-and-reorder/schema.json
deleted file mode 100644
index 2714669b43..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/list-with-details-and-reorder/schema.json
+++ /dev/null
@@ -1,31 +0,0 @@
-{
- "type": "object",
- "properties": {
- "users": {
- "type": "array",
- "items": {
- "type": "object",
- "title": "Users",
- "properties": {
- "firstname": {
- "type": "string"
- },
- "lastname": {
- "type": "string"
- },
- "email": {
- "type": "string",
- "format": "email"
- },
- "age": {
- "type": "number",
- "minimum": 0
- }
- },
- "required": [
- "firstname"
- ]
- }
- }
- }
-}
\ No newline at end of file
diff --git a/packages/vue-vuetify/example-app/src/examples/list-with-details-and-reorder/uischema.json b/packages/vue-vuetify/example-app/src/examples/list-with-details-and-reorder/uischema.json
deleted file mode 100644
index 582b253332..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/list-with-details-and-reorder/uischema.json
+++ /dev/null
@@ -1,37 +0,0 @@
-{
- "type": "ListWithDetail",
- "scope": "#/properties/users",
- "options": {
- "detail": {
- "type": "VerticalLayout",
- "elements": [
- {
- "type": "HorizontalLayout",
- "elements": [
- {
- "type": "Control",
- "scope": "#/properties/firstname",
- "label": "First Name"
- },
- {
- "type": "Control",
- "scope": "#/properties/lastname",
- "label": "Last Name"
- }
- ]
- },
- {
- "type": "Control",
- "scope": "#/properties/age",
- "label": "Age"
- },
- {
- "type": "Control",
- "scope": "#/properties/email",
- "label": "Email"
- }
- ]
- },
- "showSortButtons": true
- }
-}
\ No newline at end of file
diff --git a/packages/vue-vuetify/example-app/src/examples/list-with-details-restrict/data.json b/packages/vue-vuetify/example-app/src/examples/list-with-details-restrict/data.json
deleted file mode 100644
index ff6ff8d420..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/list-with-details-restrict/data.json
+++ /dev/null
@@ -1,16 +0,0 @@
-{
- "users": [
- {
- "firstname": "Max",
- "lastname": "Mustermann",
- "age": 25,
- "email": "max@mustermann.com"
- },
- {
- "firstname": "John",
- "lastname": "Doe",
- "age": 35,
- "email": "john@doe.com"
- }
- ]
-}
\ No newline at end of file
diff --git a/packages/vue-vuetify/example-app/src/examples/list-with-details-restrict/index.ts b/packages/vue-vuetify/example-app/src/examples/list-with-details-restrict/index.ts
deleted file mode 100644
index 8f5e656657..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/list-with-details-restrict/index.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import schema from './schema.json';
-import uischema from './uischema.json';
-import data from './data.json';
-import { UISchemaElement, JsonSchema } from '@jsonforms/core';
-
-export const input: {
- schema: JsonSchema;
- uischema: UISchemaElement;
- data: any;
-} = { schema, uischema, data };
diff --git a/packages/vue-vuetify/example-app/src/examples/list-with-details-restrict/schema.json b/packages/vue-vuetify/example-app/src/examples/list-with-details-restrict/schema.json
deleted file mode 100644
index 9c5367003e..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/list-with-details-restrict/schema.json
+++ /dev/null
@@ -1,33 +0,0 @@
-{
- "type": "object",
- "properties": {
- "users": {
- "type": "array",
- "items": {
- "type": "object",
- "title": "Users",
- "properties": {
- "firstname": {
- "type": "string"
- },
- "lastname": {
- "type": "string"
- },
- "email": {
- "type": "string",
- "format": "email"
- },
- "age": {
- "type": "number",
- "minimum": 0
- }
- },
- "required": [
- "firstname"
- ]
- },
- "minItems": 1,
- "maxItems": 5
- }
- }
-}
\ No newline at end of file
diff --git a/packages/vue-vuetify/example-app/src/examples/list-with-details-restrict/uischema.json b/packages/vue-vuetify/example-app/src/examples/list-with-details-restrict/uischema.json
deleted file mode 100644
index 770167653b..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/list-with-details-restrict/uischema.json
+++ /dev/null
@@ -1,37 +0,0 @@
-{
- "type": "ListWithDetail",
- "scope": "#/properties/users",
- "options": {
- "detail": {
- "type": "VerticalLayout",
- "elements": [
- {
- "type": "HorizontalLayout",
- "elements": [
- {
- "type": "Control",
- "scope": "#/properties/firstname",
- "label": "First Name"
- },
- {
- "type": "Control",
- "scope": "#/properties/lastname",
- "label": "Last Name"
- }
- ]
- },
- {
- "type": "Control",
- "scope": "#/properties/age",
- "label": "Age"
- },
- {
- "type": "Control",
- "scope": "#/properties/email",
- "label": "Email"
- }
- ]
- },
- "restrict": true
- }
-}
\ No newline at end of file
diff --git a/packages/vue-vuetify/example-app/src/examples/list-with-details/data.json b/packages/vue-vuetify/example-app/src/examples/list-with-details/data.json
deleted file mode 100644
index ff6ff8d420..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/list-with-details/data.json
+++ /dev/null
@@ -1,16 +0,0 @@
-{
- "users": [
- {
- "firstname": "Max",
- "lastname": "Mustermann",
- "age": 25,
- "email": "max@mustermann.com"
- },
- {
- "firstname": "John",
- "lastname": "Doe",
- "age": 35,
- "email": "john@doe.com"
- }
- ]
-}
\ No newline at end of file
diff --git a/packages/vue-vuetify/example-app/src/examples/list-with-details/index.ts b/packages/vue-vuetify/example-app/src/examples/list-with-details/index.ts
deleted file mode 100644
index 8f5e656657..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/list-with-details/index.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import schema from './schema.json';
-import uischema from './uischema.json';
-import data from './data.json';
-import { UISchemaElement, JsonSchema } from '@jsonforms/core';
-
-export const input: {
- schema: JsonSchema;
- uischema: UISchemaElement;
- data: any;
-} = { schema, uischema, data };
diff --git a/packages/vue-vuetify/example-app/src/examples/list-with-details/schema.json b/packages/vue-vuetify/example-app/src/examples/list-with-details/schema.json
deleted file mode 100644
index 2714669b43..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/list-with-details/schema.json
+++ /dev/null
@@ -1,31 +0,0 @@
-{
- "type": "object",
- "properties": {
- "users": {
- "type": "array",
- "items": {
- "type": "object",
- "title": "Users",
- "properties": {
- "firstname": {
- "type": "string"
- },
- "lastname": {
- "type": "string"
- },
- "email": {
- "type": "string",
- "format": "email"
- },
- "age": {
- "type": "number",
- "minimum": 0
- }
- },
- "required": [
- "firstname"
- ]
- }
- }
- }
-}
\ No newline at end of file
diff --git a/packages/vue-vuetify/example-app/src/examples/list-with-details/uischema.json b/packages/vue-vuetify/example-app/src/examples/list-with-details/uischema.json
deleted file mode 100644
index ec4596fa24..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/list-with-details/uischema.json
+++ /dev/null
@@ -1,36 +0,0 @@
-{
- "type": "ListWithDetail",
- "scope": "#/properties/users",
- "options": {
- "detail": {
- "type": "VerticalLayout",
- "elements": [
- {
- "type": "HorizontalLayout",
- "elements": [
- {
- "type": "Control",
- "scope": "#/properties/firstname",
- "label": "First Name"
- },
- {
- "type": "Control",
- "scope": "#/properties/lastname",
- "label": "Last Name"
- }
- ]
- },
- {
- "type": "Control",
- "scope": "#/properties/age",
- "label": "Age"
- },
- {
- "type": "Control",
- "scope": "#/properties/email",
- "label": "Email"
- }
- ]
- }
- }
-}
\ No newline at end of file
diff --git a/packages/vue-vuetify/example-app/src/examples/login/data.json b/packages/vue-vuetify/example-app/src/examples/login/data.json
deleted file mode 100644
index fda53a016a..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/login/data.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "username": "john.doe@email.com"
-}
\ No newline at end of file
diff --git a/packages/vue-vuetify/example-app/src/examples/login/index.ts b/packages/vue-vuetify/example-app/src/examples/login/index.ts
deleted file mode 100644
index 8f5e656657..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/login/index.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import schema from './schema.json';
-import uischema from './uischema.json';
-import data from './data.json';
-import { UISchemaElement, JsonSchema } from '@jsonforms/core';
-
-export const input: {
- schema: JsonSchema;
- uischema: UISchemaElement;
- data: any;
-} = { schema, uischema, data };
diff --git a/packages/vue-vuetify/example-app/src/examples/login/schema.json b/packages/vue-vuetify/example-app/src/examples/login/schema.json
deleted file mode 100644
index 7368bee5aa..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/login/schema.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{
- "type": "object",
- "properties": {
- "username": {
- "type": "string",
- "description": "Login Name"
- },
- "password": {
- "type": "string",
- "format": "password",
- "description": "Login password"
- }
- },
- "required": [
- "username",
- "password"
- ]
-}
\ No newline at end of file
diff --git a/packages/vue-vuetify/example-app/src/examples/login/uischema.json b/packages/vue-vuetify/example-app/src/examples/login/uischema.json
deleted file mode 100644
index b0e5eefc7f..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/login/uischema.json
+++ /dev/null
@@ -1,22 +0,0 @@
-{
- "type": "VerticalLayout",
- "elements": [
- {
- "type": "Label",
- "text": "Login Information"
- },
- {
- "type": "HorizontalLayout",
- "elements": [
- {
- "type": "Control",
- "scope": "#/properties/username"
- },
- {
- "type": "Control",
- "scope": "#/properties/password"
- }
- ]
- }
- ]
-}
\ No newline at end of file
diff --git a/packages/vue-vuetify/example-app/src/examples/main/data.json b/packages/vue-vuetify/example-app/src/examples/main/data.json
deleted file mode 100644
index a113e0aa0b..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/main/data.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{
- "firstName": "Max",
- "lastName": "Power"
-}
\ No newline at end of file
diff --git a/packages/vue-vuetify/example-app/src/examples/main/i18n.json b/packages/vue-vuetify/example-app/src/examples/main/i18n.json
deleted file mode 100644
index ba06b21bfc..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/main/i18n.json
+++ /dev/null
@@ -1,103 +0,0 @@
-{
- "en": {
- "firstName": {
- "label": "First Name",
- "description": "First name of the person"
- },
- "lastName": {
- "label": "Last Name",
- "description": "Last name of the person"
- },
- "age": {
- "label": "Age",
- "description": "Person's age",
- "error": {
- "required": "Age is required"
- }
- },
- "gender": {
- "label": "Gender",
- "description": "Gender of the person"
- },
- "height": {
- "label": "Height",
- "description": "Height of the person"
- },
- "dateOfBirth": {
- "label": "Birth Date",
- "description": "Birth date of the person"
- },
- "committer": {
- "label": "Committer"
- },
- "address": {
- "street": {
- "label": "Street",
- "description": "Shipping street address"
- },
- "streetnumber": {
- "label": "Street Number",
- "description": "Shipping street number"
- },
- "postalCode": {
- "label": "Postal Code",
- "description": "Shipping postal code"
- },
- "city": {
- "label": "City",
- "description": "Shipping city"
- }
- }
- },
- "bg": {
- "firstName": {
- "label": "Първо име",
- "description": "Първо име на лицето"
- },
- "lastName": {
- "label": "Фамилия",
- "description": "Фамилия на лицето"
- },
- "age": {
- "label": "Възраст",
- "description": "Възраст на лицето",
- "error": {
- "required": "Изисква се възраст"
- }
- },
- "gender": {
- "label": "Пол",
- "description": "Пол на лицето"
- },
- "height": {
- "label": "Височина",
- "description": "Височина на лицето"
- },
- "dateOfBirth": {
- "label": "Рождена дата",
- "description": "Рождена дата на лицето"
- },
- "committer": {
- "label": "деятел"
- },
- "address": {
- "street": {
- "label": "Улица",
- "description": "Улица за доставка"
- },
- "streetnumber": {
- "label": "Номер на улица",
- "description": "Номер на улицата за доставка"
- },
- "postalCode": {
- "label": "Пощенски код",
- "description": "Пощенски код за доставка"
- },
- "city": {
- "label": "Град",
- "description": "Град за доставка"
- }
- },
- "Address for Shipping T-Shirt": "Адрес за доставка на тениска"
- }
-}
diff --git a/packages/vue-vuetify/example-app/src/examples/main/index.ts b/packages/vue-vuetify/example-app/src/examples/main/index.ts
deleted file mode 100644
index b942ddffd8..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/main/index.ts
+++ /dev/null
@@ -1,12 +0,0 @@
-import schema from './schema.json';
-import uischema from './uischema.json';
-import data from './data.json';
-import i18n from './i18n.json';
-import { UISchemaElement, JsonSchema } from '@jsonforms/core';
-
-export const input: {
- schema: JsonSchema;
- uischema: UISchemaElement;
- data: any;
- i18n: any;
-} = { schema, uischema, data, i18n };
diff --git a/packages/vue-vuetify/example-app/src/examples/main/schema.json b/packages/vue-vuetify/example-app/src/examples/main/schema.json
deleted file mode 100644
index 8d4f6bcd43..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/main/schema.json
+++ /dev/null
@@ -1,61 +0,0 @@
-{
- "type": "object",
- "required": [
- "age"
- ],
- "properties": {
- "firstName": {
- "type": "string",
- "minLength": 2,
- "maxLength": 20
- },
- "lastName": {
- "type": "string",
- "minLength": 5,
- "maxLength": 15
- },
- "age": {
- "type": "integer",
- "minimum": 18,
- "maximum": 100
- },
- "gender": {
- "type": "string",
- "enum": [
- "Male",
- "Female",
- "Undisclosed"
- ]
- },
- "height": {
- "type": "number"
- },
- "dateOfBirth": {
- "type": "string",
- "format": "date"
- },
- "rating": {
- "type": "integer"
- },
- "committer": {
- "type": "boolean"
- },
- "address": {
- "type": "object",
- "properties": {
- "street": {
- "type": "string"
- },
- "streetnumber": {
- "type": "string"
- },
- "postalCode": {
- "type": "string"
- },
- "city": {
- "type": "string"
- }
- }
- }
- }
-}
\ No newline at end of file
diff --git a/packages/vue-vuetify/example-app/src/examples/main/uischema.json b/packages/vue-vuetify/example-app/src/examples/main/uischema.json
deleted file mode 100644
index 36db9d8167..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/main/uischema.json
+++ /dev/null
@@ -1,89 +0,0 @@
-{
- "type": "VerticalLayout",
- "elements": [
- {
- "type": "HorizontalLayout",
- "elements": [
- {
- "type": "Control",
- "scope": "#/properties/firstName"
- },
- {
- "type": "Control",
- "scope": "#/properties/lastName"
- }
- ]
- },
- {
- "type": "HorizontalLayout",
- "elements": [
- {
- "type": "Control",
- "scope": "#/properties/age"
- },
- {
- "type": "Control",
- "scope": "#/properties/dateOfBirth"
- }
- ]
- },
- {
- "type": "HorizontalLayout",
- "elements": [
- {
- "type": "Control",
- "scope": "#/properties/height"
- },
- {
- "type": "Control",
- "scope": "#/properties/gender"
- },
- {
- "type": "Control",
- "scope": "#/properties/committer"
- }
- ]
- },
- {
- "type": "Group",
- "label": "Address for Shipping T-Shirt",
- "elements": [
- {
- "type": "HorizontalLayout",
- "elements": [
- {
- "type": "Control",
- "scope": "#/properties/address/properties/street"
- },
- {
- "type": "Control",
- "scope": "#/properties/address/properties/streetnumber"
- }
- ]
- },
- {
- "type": "HorizontalLayout",
- "elements": [
- {
- "type": "Control",
- "scope": "#/properties/address/properties/postalCode"
- },
- {
- "type": "Control",
- "scope": "#/properties/address/properties/city"
- }
- ]
- }
- ],
- "rule": {
- "effect": "ENABLE",
- "condition": {
- "scope": "#/properties/committer",
- "schema": {
- "const": true
- }
- }
- }
- }
- ]
-}
\ No newline at end of file
diff --git a/packages/vue-vuetify/example-app/src/examples/multi-enum/data.json b/packages/vue-vuetify/example-app/src/examples/multi-enum/data.json
deleted file mode 100644
index 2f1fc9351e..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/multi-enum/data.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "oneOfMultiEnum": [
- "foo"
- ],
- "multiEnum": [
- "bar"
- ]
-}
\ No newline at end of file
diff --git a/packages/vue-vuetify/example-app/src/examples/multi-enum/index.ts b/packages/vue-vuetify/example-app/src/examples/multi-enum/index.ts
deleted file mode 100644
index 8f5e656657..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/multi-enum/index.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import schema from './schema.json';
-import uischema from './uischema.json';
-import data from './data.json';
-import { UISchemaElement, JsonSchema } from '@jsonforms/core';
-
-export const input: {
- schema: JsonSchema;
- uischema: UISchemaElement;
- data: any;
-} = { schema, uischema, data };
diff --git a/packages/vue-vuetify/example-app/src/examples/multi-enum/schema.json b/packages/vue-vuetify/example-app/src/examples/multi-enum/schema.json
deleted file mode 100644
index d4277792d5..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/multi-enum/schema.json
+++ /dev/null
@@ -1,37 +0,0 @@
-{
- "type": "object",
- "properties": {
- "oneOfMultiEnum": {
- "type": "array",
- "uniqueItems": true,
- "items": {
- "oneOf": [
- {
- "const": "foo",
- "title": "My Foo"
- },
- {
- "const": "bar",
- "title": "My Bar"
- },
- {
- "const": "foobar",
- "title": "My FooBar"
- }
- ]
- }
- },
- "multiEnum": {
- "type": "array",
- "uniqueItems": true,
- "items": {
- "type": "string",
- "enum": [
- "foo",
- "bar",
- "foobar"
- ]
- }
- }
- }
-}
\ No newline at end of file
diff --git a/packages/vue-vuetify/example-app/src/examples/multi-enum/uischema.json b/packages/vue-vuetify/example-app/src/examples/multi-enum/uischema.json
deleted file mode 100644
index 49cea8d642..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/multi-enum/uischema.json
+++ /dev/null
@@ -1,31 +0,0 @@
-{
- "type": "VerticalLayout",
- "elements": [
- {
- "type": "Control",
- "scope": "#/properties/oneOfMultiEnum",
- "options": {
- "vuetify": {
- "v-checkbox": {
- "foo": {
- "color": "green"
- }
- }
- }
- }
- },
- {
- "type": "Control",
- "scope": "#/properties/multiEnum",
- "options": {
- "vuetify": {
- "v-checkbox": {
- "foobar": {
- "color": "yellow"
- }
- }
- }
- }
- }
- ]
-}
diff --git a/packages/vue-vuetify/example-app/src/examples/nested-array-restrict/data.json b/packages/vue-vuetify/example-app/src/examples/nested-array-restrict/data.json
deleted file mode 100644
index 00273e39b3..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/nested-array-restrict/data.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "exampleArray": [
- {
- "choices": ["This", "is", "an", "example"],
- "name": "Hi there"
- }
- ]
-}
diff --git a/packages/vue-vuetify/example-app/src/examples/nested-array-restrict/index.ts b/packages/vue-vuetify/example-app/src/examples/nested-array-restrict/index.ts
deleted file mode 100644
index 8f5e656657..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/nested-array-restrict/index.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import schema from './schema.json';
-import uischema from './uischema.json';
-import data from './data.json';
-import { UISchemaElement, JsonSchema } from '@jsonforms/core';
-
-export const input: {
- schema: JsonSchema;
- uischema: UISchemaElement;
- data: any;
-} = { schema, uischema, data };
diff --git a/packages/vue-vuetify/example-app/src/examples/nested-array-restrict/schema.json b/packages/vue-vuetify/example-app/src/examples/nested-array-restrict/schema.json
deleted file mode 100644
index f087dce68b..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/nested-array-restrict/schema.json
+++ /dev/null
@@ -1,24 +0,0 @@
-{
- "type": "object",
- "properties": {
- "exampleArray": {
- "type": "array",
- "items": {
- "type": "object",
- "properties": {
- "name": {
- "type": "string"
- },
- "choices": {
- "type": "array",
- "items": {
- "type": "string"
- }
- }
- }
- },
- "minItems": 1,
- "maxItems": 5
- }
- }
-}
\ No newline at end of file
diff --git a/packages/vue-vuetify/example-app/src/examples/nested-array-restrict/uischema.json b/packages/vue-vuetify/example-app/src/examples/nested-array-restrict/uischema.json
deleted file mode 100644
index a8a2689758..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/nested-array-restrict/uischema.json
+++ /dev/null
@@ -1,16 +0,0 @@
-{
- "type": "HorizontalLayout",
- "elements": [
- {
- "type": "Control",
- "label": {
- "text": "Example Array",
- "show": true
- },
- "scope": "#/properties/exampleArray",
- "options": {
- "restrict": true
- }
- }
- ]
-}
\ No newline at end of file
diff --git a/packages/vue-vuetify/example-app/src/examples/nested-array-with-reorder/data.json b/packages/vue-vuetify/example-app/src/examples/nested-array-with-reorder/data.json
deleted file mode 100644
index 95ac635931..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/nested-array-with-reorder/data.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "exampleArray": [
- {
- "phones": ["555-1212", "(888)555-1212"],
- "name": "John Smith"
- }
- ]
-}
diff --git a/packages/vue-vuetify/example-app/src/examples/nested-array-with-reorder/index.ts b/packages/vue-vuetify/example-app/src/examples/nested-array-with-reorder/index.ts
deleted file mode 100644
index 8f5e656657..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/nested-array-with-reorder/index.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import schema from './schema.json';
-import uischema from './uischema.json';
-import data from './data.json';
-import { UISchemaElement, JsonSchema } from '@jsonforms/core';
-
-export const input: {
- schema: JsonSchema;
- uischema: UISchemaElement;
- data: any;
-} = { schema, uischema, data };
diff --git a/packages/vue-vuetify/example-app/src/examples/nested-array-with-reorder/schema.json b/packages/vue-vuetify/example-app/src/examples/nested-array-with-reorder/schema.json
deleted file mode 100644
index 17220f042a..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/nested-array-with-reorder/schema.json
+++ /dev/null
@@ -1,24 +0,0 @@
-{
- "type": "object",
- "properties": {
- "exampleArray": {
- "type": "array",
- "items": {
- "type": "object",
- "properties": {
- "name": { "type": "string" },
- "phones": {
- "type": "array",
- "items": {
- "type": "string",
- "pattern": "^(\\([0-9]{3}\\))?[0-9]{3}-[0-9]{4}$"
- }
- }
- },
- "required":[
- "name"
- ]
- }
- }
- }
-}
diff --git a/packages/vue-vuetify/example-app/src/examples/nested-array-with-reorder/uischema.json b/packages/vue-vuetify/example-app/src/examples/nested-array-with-reorder/uischema.json
deleted file mode 100644
index f0d9c0a1a0..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/nested-array-with-reorder/uischema.json
+++ /dev/null
@@ -1,16 +0,0 @@
-{
- "type": "HorizontalLayout",
- "elements": [
- {
- "type": "Control",
- "label": {
- "text": "Example Array",
- "show": true
- },
- "scope": "#/properties/exampleArray",
- "options": {
- "showSortButtons": true
- }
- }
- ]
-}
diff --git a/packages/vue-vuetify/example-app/src/examples/nested-array/data.json b/packages/vue-vuetify/example-app/src/examples/nested-array/data.json
deleted file mode 100644
index 00273e39b3..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/nested-array/data.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "exampleArray": [
- {
- "choices": ["This", "is", "an", "example"],
- "name": "Hi there"
- }
- ]
-}
diff --git a/packages/vue-vuetify/example-app/src/examples/nested-array/index.ts b/packages/vue-vuetify/example-app/src/examples/nested-array/index.ts
deleted file mode 100644
index 8f5e656657..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/nested-array/index.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import schema from './schema.json';
-import uischema from './uischema.json';
-import data from './data.json';
-import { UISchemaElement, JsonSchema } from '@jsonforms/core';
-
-export const input: {
- schema: JsonSchema;
- uischema: UISchemaElement;
- data: any;
-} = { schema, uischema, data };
diff --git a/packages/vue-vuetify/example-app/src/examples/nested-array/schema.json b/packages/vue-vuetify/example-app/src/examples/nested-array/schema.json
deleted file mode 100644
index 82eab10f96..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/nested-array/schema.json
+++ /dev/null
@@ -1,23 +0,0 @@
-{
- "type": "object",
- "properties": {
- "exampleArray": {
- "type": "array",
- "items": {
- "type": "object",
- "properties": {
- "name": {
- "type": "string",
- "minLength": 3
- },
- "choices": {
- "type": "array",
- "items": {
- "type": "string"
- }
- }
- }
- }
- }
- }
-}
diff --git a/packages/vue-vuetify/example-app/src/examples/nested-array/uischema.json b/packages/vue-vuetify/example-app/src/examples/nested-array/uischema.json
deleted file mode 100644
index 78721de0e2..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/nested-array/uischema.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
- "type": "HorizontalLayout",
- "elements": [
- {
- "type": "Control",
- "label": {
- "text": "Example Array",
- "show": true
- },
- "scope": "#/properties/exampleArray"
- }
- ]
-}
\ No newline at end of file
diff --git a/packages/vue-vuetify/example-app/src/examples/nested-layout/data.json b/packages/vue-vuetify/example-app/src/examples/nested-layout/data.json
deleted file mode 100644
index 59a6d43787..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/nested-layout/data.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
- "name": "John Doe",
- "vegetarian": false,
- "birthDate": "1985-06-02",
- "personalData": {
- "age": 34
- },
- "postalCode": "12345"
-}
\ No newline at end of file
diff --git a/packages/vue-vuetify/example-app/src/examples/nested-layout/index.ts b/packages/vue-vuetify/example-app/src/examples/nested-layout/index.ts
deleted file mode 100644
index 8f5e656657..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/nested-layout/index.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import schema from './schema.json';
-import uischema from './uischema.json';
-import data from './data.json';
-import { UISchemaElement, JsonSchema } from '@jsonforms/core';
-
-export const input: {
- schema: JsonSchema;
- uischema: UISchemaElement;
- data: any;
-} = { schema, uischema, data };
diff --git a/packages/vue-vuetify/example-app/src/examples/nested-layout/schema.json b/packages/vue-vuetify/example-app/src/examples/nested-layout/schema.json
deleted file mode 100644
index 215f8fd803..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/nested-layout/schema.json
+++ /dev/null
@@ -1,61 +0,0 @@
-{
- "type": "object",
- "properties": {
- "name": {
- "type": "string",
- "minLength": 3,
- "description": "Please enter your name"
- },
- "vegetarian": {
- "type": "boolean"
- },
- "birthDate": {
- "type": "string",
- "format": "date"
- },
- "nationality": {
- "type": "string",
- "enum": [
- "DE",
- "IT",
- "JP",
- "US",
- "RU",
- "Other"
- ]
- },
- "personalData": {
- "type": "object",
- "properties": {
- "age": {
- "type": "integer",
- "description": "Please enter your age."
- },
- "height": {
- "type": "number"
- },
- "drivingSkill": {
- "type": "number",
- "maximum": 10,
- "minimum": 1,
- "default": 7
- }
- },
- "required": [
- "age",
- "height"
- ]
- },
- "occupation": {
- "type": "string"
- },
- "postalCode": {
- "type": "string",
- "maxLength": 5
- }
- },
- "required": [
- "occupation",
- "nationality"
- ]
-}
\ No newline at end of file
diff --git a/packages/vue-vuetify/example-app/src/examples/nested-layout/uischema.json b/packages/vue-vuetify/example-app/src/examples/nested-layout/uischema.json
deleted file mode 100644
index d64d42523d..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/nested-layout/uischema.json
+++ /dev/null
@@ -1,41 +0,0 @@
-{
- "type": "Group",
- "label": "My Group",
- "elements": [
- {
- "type": "HorizontalLayout",
- "elements": [
- {
- "type": "VerticalLayout",
- "elements": [
- {
- "type": "Control",
- "label": "Name",
- "scope": "#/properties/name"
- },
- {
- "type": "Control",
- "label": "Birth Date",
- "scope": "#/properties/birthDate"
- }
- ]
- },
- {
- "type": "VerticalLayout",
- "elements": [
- {
- "type": "Control",
- "label": "Name",
- "scope": "#/properties/name"
- },
- {
- "type": "Control",
- "label": "Birth Date",
- "scope": "#/properties/birthDate"
- }
- ]
- }
- ]
- }
- ]
-}
\ No newline at end of file
diff --git a/packages/vue-vuetify/example-app/src/examples/no-schemas/data.json b/packages/vue-vuetify/example-app/src/examples/no-schemas/data.json
deleted file mode 100644
index 59a6d43787..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/no-schemas/data.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
- "name": "John Doe",
- "vegetarian": false,
- "birthDate": "1985-06-02",
- "personalData": {
- "age": 34
- },
- "postalCode": "12345"
-}
\ No newline at end of file
diff --git a/packages/vue-vuetify/example-app/src/examples/no-schemas/index.ts b/packages/vue-vuetify/example-app/src/examples/no-schemas/index.ts
deleted file mode 100644
index c382ba9191..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/no-schemas/index.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import data from './data.json';
-import { UISchemaElement, JsonSchema } from '@jsonforms/core';
-
-const schema = undefined;
-const uischema = undefined;
-export const input: {
- schema: JsonSchema | undefined;
- uischema: UISchemaElement | undefined;
- data: any;
-} = { schema, uischema, data };
diff --git a/packages/vue-vuetify/example-app/src/examples/no-ui-schema/data.json b/packages/vue-vuetify/example-app/src/examples/no-ui-schema/data.json
deleted file mode 100644
index 59a6d43787..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/no-ui-schema/data.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
- "name": "John Doe",
- "vegetarian": false,
- "birthDate": "1985-06-02",
- "personalData": {
- "age": 34
- },
- "postalCode": "12345"
-}
\ No newline at end of file
diff --git a/packages/vue-vuetify/example-app/src/examples/no-ui-schema/index.ts b/packages/vue-vuetify/example-app/src/examples/no-ui-schema/index.ts
deleted file mode 100644
index 190d6b2aef..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/no-ui-schema/index.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import schema from './schema.json';
-import data from './data.json';
-import { UISchemaElement, JsonSchema } from '@jsonforms/core';
-
-const uischema = undefined;
-export const input: {
- schema: JsonSchema;
- uischema: UISchemaElement | undefined;
- data: any;
-} = { schema, uischema, data };
diff --git a/packages/vue-vuetify/example-app/src/examples/no-ui-schema/schema.json b/packages/vue-vuetify/example-app/src/examples/no-ui-schema/schema.json
deleted file mode 100644
index 6dbc016e4e..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/no-ui-schema/schema.json
+++ /dev/null
@@ -1,37 +0,0 @@
-{
- "type": "object",
- "properties": {
- "name": {
- "type": "string"
- },
- "vegetarian": {
- "type": "boolean"
- },
- "birthDate": {
- "type": "string"
- },
- "personalData": {
- "type": "object",
- "properties": {
- "age": {
- "type": "integer"
- }
- },
- "additionalProperties": true,
- "required": [
- "age"
- ]
- },
- "postalCode": {
- "type": "string"
- }
- },
- "additionalProperties": true,
- "required": [
- "name",
- "vegetarian",
- "birthDate",
- "personalData",
- "postalCode"
- ]
-}
\ No newline at end of file
diff --git a/packages/vue-vuetify/example-app/src/examples/object-nested/data.json b/packages/vue-vuetify/example-app/src/examples/object-nested/data.json
deleted file mode 100644
index 0967ef424b..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/object-nested/data.json
+++ /dev/null
@@ -1 +0,0 @@
-{}
diff --git a/packages/vue-vuetify/example-app/src/examples/object-nested/index.ts b/packages/vue-vuetify/example-app/src/examples/object-nested/index.ts
deleted file mode 100644
index 4696aeb4bb..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/object-nested/index.ts
+++ /dev/null
@@ -1,9 +0,0 @@
-import schema from './schema.json';
-import data from './data.json';
-import { UISchemaElement, JsonSchema } from '@jsonforms/core';
-
-export const input: {
- schema: JsonSchema;
- uischema: UISchemaElement | undefined;
- data: any;
-} = { schema, uischema: undefined, data };
diff --git a/packages/vue-vuetify/example-app/src/examples/object-nested/schema.json b/packages/vue-vuetify/example-app/src/examples/object-nested/schema.json
deleted file mode 100644
index a087b5f532..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/object-nested/schema.json
+++ /dev/null
@@ -1,94 +0,0 @@
-{
- "$schema": "http://json-schema.org/draft-07/schema#",
- "type": "object",
- "properties": {
- "address": {
- "type": "array",
- "items": {
- "type": "object",
- "properties": {
- "nestedObject": {
- "type": "object",
- "properties": {
- "loc": {
- "type": "string"
- },
- "toll": {
- "type": ["string", "null"]
- },
- "message": {
- "type": ["string", "null"]
- }
- },
- "required": ["loc"]
- },
- "loc": {
- "type": "string"
- },
- "toll": {
- "type": ["string", "null"]
- },
- "message": {
- "type": ["string", "null"]
- }
- },
- "required": ["loc"]
- }
- },
- "user": {
- "type": "object",
- "properties": {
- "name": {
- "type": "string"
- },
- "mail": {
- "type": "string"
- },
- "additional_details": {
- "type": "object",
- "properties": {
- "interests": {
- "type": "string"
- },
- "optional_details": {
- "type": "object",
- "properties": {
- "type": {
- "type": "string"
- },
- "related_activities": {
- "type": "object",
- "properties": {
- "id": {
- "type": "string"
- },
- "excemption": {
- "type": "object",
- "properties": {
- "cause": {
- "type": "string"
- },
- "further_information": {
- "type": "object",
- "properties": {
- "info": {
- "type": "string"
- }
- }
- }
- }
- }
- }
- }
- }
- },
- "private_mail": {
- "type": "string"
- }
- }
- }
- },
- "required": ["name", "mail"]
- }
- }
-}
diff --git a/packages/vue-vuetify/example-app/src/examples/object/data.json b/packages/vue-vuetify/example-app/src/examples/object/data.json
deleted file mode 100644
index 6d57b3ca6f..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/object/data.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "address": {
- "street_address": "1600 Pennsylvania Avenue NW",
- "city": "Washington",
- "state": "DC"
- }
-}
\ No newline at end of file
diff --git a/packages/vue-vuetify/example-app/src/examples/object/index.ts b/packages/vue-vuetify/example-app/src/examples/object/index.ts
deleted file mode 100644
index 8f5e656657..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/object/index.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import schema from './schema.json';
-import uischema from './uischema.json';
-import data from './data.json';
-import { UISchemaElement, JsonSchema } from '@jsonforms/core';
-
-export const input: {
- schema: JsonSchema;
- uischema: UISchemaElement;
- data: any;
-} = { schema, uischema, data };
diff --git a/packages/vue-vuetify/example-app/src/examples/object/schema.json b/packages/vue-vuetify/example-app/src/examples/object/schema.json
deleted file mode 100644
index 980dc09fa1..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/object/schema.json
+++ /dev/null
@@ -1,40 +0,0 @@
-{
- "$schema": "http://json-schema.org/draft-07/schema#",
- "type": "object",
- "properties": {
- "address": {
- "type": "object",
- "properties": {
- "street_address": {
- "type": "string"
- },
- "city": {
- "type": "string"
- },
- "state": {
- "type": "string"
- }
- },
- "required": [
- "street_address",
- "city",
- "state"
- ]
- },
- "user": {
- "type": "object",
- "properties": {
- "name": {
- "type": "string"
- },
- "mail": {
- "type": "string"
- }
- },
- "required": [
- "name",
- "mail"
- ]
- }
- }
-}
\ No newline at end of file
diff --git a/packages/vue-vuetify/example-app/src/examples/object/uischema.json b/packages/vue-vuetify/example-app/src/examples/object/uischema.json
deleted file mode 100644
index e82adb78b0..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/object/uischema.json
+++ /dev/null
@@ -1,21 +0,0 @@
-{
- "type": "VerticalLayout",
- "elements": [
- {
- "type": "Control",
- "scope": "#/properties/address"
- },
- {
- "type": "Control",
- "scope": "#/properties/user",
- "rule": {
- "effect": "SHOW",
- "condition": {
- "type": "LEAF",
- "scope": "#/properties/address/properties/state",
- "expectedValue": "DC"
- }
- }
- }
- ]
-}
\ No newline at end of file
diff --git a/packages/vue-vuetify/example-app/src/examples/oneOf-recursive/data.json b/packages/vue-vuetify/example-app/src/examples/oneOf-recursive/data.json
deleted file mode 100644
index 7a73a41bfd..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/oneOf-recursive/data.json
+++ /dev/null
@@ -1,2 +0,0 @@
-{
-}
\ No newline at end of file
diff --git a/packages/vue-vuetify/example-app/src/examples/oneOf-recursive/index.ts b/packages/vue-vuetify/example-app/src/examples/oneOf-recursive/index.ts
deleted file mode 100644
index 8f5e656657..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/oneOf-recursive/index.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import schema from './schema.json';
-import uischema from './uischema.json';
-import data from './data.json';
-import { UISchemaElement, JsonSchema } from '@jsonforms/core';
-
-export const input: {
- schema: JsonSchema;
- uischema: UISchemaElement;
- data: any;
-} = { schema, uischema, data };
diff --git a/packages/vue-vuetify/example-app/src/examples/oneOf-recursive/schema.json b/packages/vue-vuetify/example-app/src/examples/oneOf-recursive/schema.json
deleted file mode 100644
index 28c7c3ec02..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/oneOf-recursive/schema.json
+++ /dev/null
@@ -1,49 +0,0 @@
-{
- "$schema": "http://json-schema.org/draft-07/schema#",
- "definitions": {
- "fileOrFolder": {
- "title": "fileOrFolder",
- "oneOf": [
- {
- "$ref": "#/definitions/file"
- },
- {
- "$ref": "#/definitions/folder"
- }
- ]
- },
- "file": {
- "title": "File",
- "type": "object",
- "properties": {
- "name": {
- "type": "string"
- }
- }
- },
- "folder": {
- "type": "object",
- "title": "Folder",
- "properties": {
- "name": {
- "type": "string"
- },
- "children": {
- "type": "array",
- "items": {
- "$ref": "#/definitions/fileOrFolder"
- }
- }
- }
- }
- },
- "type": "object",
- "properties": {
- "root": {
- "type": "array",
- "items": {
- "$ref": "#/definitions/folder"
- }
- }
- }
-}
\ No newline at end of file
diff --git a/packages/vue-vuetify/example-app/src/examples/oneOf-recursive/uischema.json b/packages/vue-vuetify/example-app/src/examples/oneOf-recursive/uischema.json
deleted file mode 100644
index 738e9e9c2c..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/oneOf-recursive/uischema.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{
- "type": "Control",
- "scope": "#"
-}
\ No newline at end of file
diff --git a/packages/vue-vuetify/example-app/src/examples/oneOf-tab/data.json b/packages/vue-vuetify/example-app/src/examples/oneOf-tab/data.json
deleted file mode 100644
index 0967ef424b..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/oneOf-tab/data.json
+++ /dev/null
@@ -1 +0,0 @@
-{}
diff --git a/packages/vue-vuetify/example-app/src/examples/oneOf-tab/index.ts b/packages/vue-vuetify/example-app/src/examples/oneOf-tab/index.ts
deleted file mode 100644
index 8f5e656657..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/oneOf-tab/index.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import schema from './schema.json';
-import uischema from './uischema.json';
-import data from './data.json';
-import { UISchemaElement, JsonSchema } from '@jsonforms/core';
-
-export const input: {
- schema: JsonSchema;
- uischema: UISchemaElement;
- data: any;
-} = { schema, uischema, data };
diff --git a/packages/vue-vuetify/example-app/src/examples/oneOf-tab/schema.json b/packages/vue-vuetify/example-app/src/examples/oneOf-tab/schema.json
deleted file mode 100644
index 95564846cd..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/oneOf-tab/schema.json
+++ /dev/null
@@ -1,46 +0,0 @@
-{
- "definitions": {
- "address": {
- "type": "object",
- "title": "Address",
- "properties": {
- "street_address": {
- "type": "string"
- },
- "city": {
- "type": "string"
- },
- "state": {
- "type": "string"
- }
- },
- "required": ["street_address", "city", "state"]
- },
- "user": {
- "type": "object",
- "title": "User",
- "properties": {
- "name": {
- "type": "string"
- },
- "mail": {
- "type": "string"
- }
- },
- "required": ["name", "mail"]
- }
- },
- "type": "object",
- "properties": {
- "addressOrUser": {
- "oneOf": [
- {
- "$ref": "#/definitions/address"
- },
- {
- "$ref": "#/definitions/user"
- }
- ]
- }
- }
-}
diff --git a/packages/vue-vuetify/example-app/src/examples/oneOf-tab/uischema.json b/packages/vue-vuetify/example-app/src/examples/oneOf-tab/uischema.json
deleted file mode 100644
index 6518f454e2..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/oneOf-tab/uischema.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
- "type": "VerticalLayout",
- "elements": [
- {
- "type": "Control",
- "label": "Basic Information",
- "scope": "#/properties/addressOrUser",
- "options": {
- "variant": "tab"
- }
- }
- ]
-}
diff --git a/packages/vue-vuetify/example-app/src/examples/oneOf-with-props/data.json b/packages/vue-vuetify/example-app/src/examples/oneOf-with-props/data.json
deleted file mode 100644
index 0967ef424b..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/oneOf-with-props/data.json
+++ /dev/null
@@ -1 +0,0 @@
-{}
diff --git a/packages/vue-vuetify/example-app/src/examples/oneOf-with-props/index.ts b/packages/vue-vuetify/example-app/src/examples/oneOf-with-props/index.ts
deleted file mode 100644
index bfb0d8cc49..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/oneOf-with-props/index.ts
+++ /dev/null
@@ -1,11 +0,0 @@
-import schema from './schema.json';
-import data from './data.json';
-import { UISchemaElement, JsonSchema } from '@jsonforms/core';
-
-const uischema = undefined;
-
-export const input: {
- schema: JsonSchema;
- uischema?: UISchemaElement;
- data: any;
-} = { schema, uischema, data };
diff --git a/packages/vue-vuetify/example-app/src/examples/oneOf-with-props/schema.json b/packages/vue-vuetify/example-app/src/examples/oneOf-with-props/schema.json
deleted file mode 100644
index b6fb694354..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/oneOf-with-props/schema.json
+++ /dev/null
@@ -1,47 +0,0 @@
-{
- "definitions": {
- "address": {
- "type": "object",
- "title": "Address",
- "properties": {
- "street_address": {
- "type": "string"
- },
- "city": {
- "type": "string"
- },
- "state": {
- "type": "string"
- }
- },
- "required": ["street_address", "city", "state"]
- },
- "user": {
- "type": "object",
- "title": "User",
- "properties": {
- "name": {
- "type": "string"
- },
- "mail": {
- "type": "string"
- }
- },
- "required": ["name", "mail"]
- }
- },
- "type": "object",
- "properties": {
- "label": {
- "type": "string"
- }
- },
- "oneOf": [
- {
- "$ref": "#/definitions/address"
- },
- {
- "$ref": "#/definitions/user"
- }
- ]
-}
diff --git a/packages/vue-vuetify/example-app/src/examples/oneOf/data.json b/packages/vue-vuetify/example-app/src/examples/oneOf/data.json
deleted file mode 100644
index 0967ef424b..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/oneOf/data.json
+++ /dev/null
@@ -1 +0,0 @@
-{}
diff --git a/packages/vue-vuetify/example-app/src/examples/oneOf/index.ts b/packages/vue-vuetify/example-app/src/examples/oneOf/index.ts
deleted file mode 100644
index 8f5e656657..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/oneOf/index.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import schema from './schema.json';
-import uischema from './uischema.json';
-import data from './data.json';
-import { UISchemaElement, JsonSchema } from '@jsonforms/core';
-
-export const input: {
- schema: JsonSchema;
- uischema: UISchemaElement;
- data: any;
-} = { schema, uischema, data };
diff --git a/packages/vue-vuetify/example-app/src/examples/oneOf/schema.json b/packages/vue-vuetify/example-app/src/examples/oneOf/schema.json
deleted file mode 100644
index 6b96db35be..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/oneOf/schema.json
+++ /dev/null
@@ -1,53 +0,0 @@
-{
- "definitions": {
- "address": {
- "type": "object",
- "title": "Address",
- "properties": {
- "street_address": {
- "type": "string"
- },
- "city": {
- "type": "string"
- },
- "state": {
- "type": "string"
- }
- },
- "required": [
- "street_address",
- "city",
- "state"
- ]
- },
- "user": {
- "type": "object",
- "title": "User",
- "properties": {
- "name": {
- "type": "string"
- },
- "mail": {
- "type": "string"
- }
- },
- "required": [
- "name",
- "mail"
- ]
- }
- },
- "type": "object",
- "properties": {
- "addressOrUser": {
- "oneOf": [
- {
- "$ref": "#/definitions/address"
- },
- {
- "$ref": "#/definitions/user"
- }
- ]
- }
- }
-}
\ No newline at end of file
diff --git a/packages/vue-vuetify/example-app/src/examples/oneOf/uischema.json b/packages/vue-vuetify/example-app/src/examples/oneOf/uischema.json
deleted file mode 100644
index 8120bed021..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/oneOf/uischema.json
+++ /dev/null
@@ -1,10 +0,0 @@
-{
- "type": "VerticalLayout",
- "elements": [
- {
- "type": "Control",
- "label": "Basic Information",
- "scope": "#/properties/addressOrUser"
- }
- ]
-}
\ No newline at end of file
diff --git a/packages/vue-vuetify/example-app/src/examples/radio-group/data.json b/packages/vue-vuetify/example-app/src/examples/radio-group/data.json
deleted file mode 100644
index 9e26dfeeb6..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/radio-group/data.json
+++ /dev/null
@@ -1 +0,0 @@
-{}
\ No newline at end of file
diff --git a/packages/vue-vuetify/example-app/src/examples/radio-group/index.ts b/packages/vue-vuetify/example-app/src/examples/radio-group/index.ts
deleted file mode 100644
index 8f5e656657..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/radio-group/index.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import schema from './schema.json';
-import uischema from './uischema.json';
-import data from './data.json';
-import { UISchemaElement, JsonSchema } from '@jsonforms/core';
-
-export const input: {
- schema: JsonSchema;
- uischema: UISchemaElement;
- data: any;
-} = { schema, uischema, data };
diff --git a/packages/vue-vuetify/example-app/src/examples/radio-group/schema.json b/packages/vue-vuetify/example-app/src/examples/radio-group/schema.json
deleted file mode 100644
index 63ad5224ea..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/radio-group/schema.json
+++ /dev/null
@@ -1,30 +0,0 @@
-{
- "type": "object",
- "properties": {
- "exampleRadioEnum": {
- "type": "string",
- "enum": [
- "One",
- "Two",
- "Three"
- ]
- },
- "exampleRadioOneOfEnum": {
- "type": "string",
- "oneOf": [
- {
- "const": "foo",
- "title": "Foo"
- },
- {
- "const": "bar",
- "title": "Bar"
- },
- {
- "const": "foobar",
- "title": "FooBar"
- }
- ]
- }
- }
-}
\ No newline at end of file
diff --git a/packages/vue-vuetify/example-app/src/examples/radio-group/uischema.json b/packages/vue-vuetify/example-app/src/examples/radio-group/uischema.json
deleted file mode 100644
index 7622748d37..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/radio-group/uischema.json
+++ /dev/null
@@ -1,31 +0,0 @@
-{
- "type": "VerticalLayout",
- "elements": [
- {
- "type": "Group",
- "label": "Simple enum",
- "elements": [
- {
- "type": "Control",
- "scope": "#/properties/exampleRadioEnum",
- "options": {
- "format": "radio"
- }
- }
- ]
- },
- {
- "type": "Group",
- "label": "One of Enum",
- "elements": [
- {
- "type": "Control",
- "scope": "#/properties/exampleRadioOneOfEnum",
- "options": {
- "format": "radio"
- }
- }
- ]
- }
- ]
-}
\ No newline at end of file
diff --git a/packages/vue-vuetify/example-app/src/examples/radio/data.json b/packages/vue-vuetify/example-app/src/examples/radio/data.json
deleted file mode 100644
index 9e26dfeeb6..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/radio/data.json
+++ /dev/null
@@ -1 +0,0 @@
-{}
\ No newline at end of file
diff --git a/packages/vue-vuetify/example-app/src/examples/radio/index.ts b/packages/vue-vuetify/example-app/src/examples/radio/index.ts
deleted file mode 100644
index 8f5e656657..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/radio/index.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import schema from './schema.json';
-import uischema from './uischema.json';
-import data from './data.json';
-import { UISchemaElement, JsonSchema } from '@jsonforms/core';
-
-export const input: {
- schema: JsonSchema;
- uischema: UISchemaElement;
- data: any;
-} = { schema, uischema, data };
diff --git a/packages/vue-vuetify/example-app/src/examples/radio/schema.json b/packages/vue-vuetify/example-app/src/examples/radio/schema.json
deleted file mode 100644
index e111e18d3f..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/radio/schema.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
- "type": "object",
- "properties": {
- "exampleRadioEnum": {
- "type": "string",
- "enum": ["Red", "Green", "Blue"]
- }
- }
-}
diff --git a/packages/vue-vuetify/example-app/src/examples/radio/uischema.json b/packages/vue-vuetify/example-app/src/examples/radio/uischema.json
deleted file mode 100644
index 3cc0c81e73..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/radio/uischema.json
+++ /dev/null
@@ -1,25 +0,0 @@
-{
- "type": "Control",
- "scope": "#/properties/exampleRadioEnum",
- "options": {
- "format": "radio",
- "vuetify": {
- "v-radio-group": {
- "prepend-icon": "mdi-palette",
- "column": false,
- "row": true
- },
- "v-radio": {
- "Blue": {
- "color": "blue"
- },
- "Red": {
- "color": "red"
- },
- "Green": {
- "color": "green"
- }
- }
- }
- }
-}
diff --git a/packages/vue-vuetify/example-app/src/examples/root-object/data.json b/packages/vue-vuetify/example-app/src/examples/root-object/data.json
deleted file mode 100644
index 6d57b3ca6f..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/root-object/data.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "address": {
- "street_address": "1600 Pennsylvania Avenue NW",
- "city": "Washington",
- "state": "DC"
- }
-}
\ No newline at end of file
diff --git a/packages/vue-vuetify/example-app/src/examples/root-object/index.ts b/packages/vue-vuetify/example-app/src/examples/root-object/index.ts
deleted file mode 100644
index 8f5e656657..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/root-object/index.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import schema from './schema.json';
-import uischema from './uischema.json';
-import data from './data.json';
-import { UISchemaElement, JsonSchema } from '@jsonforms/core';
-
-export const input: {
- schema: JsonSchema;
- uischema: UISchemaElement;
- data: any;
-} = { schema, uischema, data };
diff --git a/packages/vue-vuetify/example-app/src/examples/root-object/schema.json b/packages/vue-vuetify/example-app/src/examples/root-object/schema.json
deleted file mode 100644
index 980dc09fa1..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/root-object/schema.json
+++ /dev/null
@@ -1,40 +0,0 @@
-{
- "$schema": "http://json-schema.org/draft-07/schema#",
- "type": "object",
- "properties": {
- "address": {
- "type": "object",
- "properties": {
- "street_address": {
- "type": "string"
- },
- "city": {
- "type": "string"
- },
- "state": {
- "type": "string"
- }
- },
- "required": [
- "street_address",
- "city",
- "state"
- ]
- },
- "user": {
- "type": "object",
- "properties": {
- "name": {
- "type": "string"
- },
- "mail": {
- "type": "string"
- }
- },
- "required": [
- "name",
- "mail"
- ]
- }
- }
-}
\ No newline at end of file
diff --git a/packages/vue-vuetify/example-app/src/examples/root-object/uischema.json b/packages/vue-vuetify/example-app/src/examples/root-object/uischema.json
deleted file mode 100644
index 738e9e9c2c..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/root-object/uischema.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{
- "type": "Control",
- "scope": "#"
-}
\ No newline at end of file
diff --git a/packages/vue-vuetify/example-app/src/examples/rule/data.json b/packages/vue-vuetify/example-app/src/examples/rule/data.json
deleted file mode 100644
index 4e9c88e312..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/rule/data.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "name": "John Doe",
- "dead": false,
- "vegetables": false
-}
\ No newline at end of file
diff --git a/packages/vue-vuetify/example-app/src/examples/rule/index.ts b/packages/vue-vuetify/example-app/src/examples/rule/index.ts
deleted file mode 100644
index 8f5e656657..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/rule/index.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import schema from './schema.json';
-import uischema from './uischema.json';
-import data from './data.json';
-import { UISchemaElement, JsonSchema } from '@jsonforms/core';
-
-export const input: {
- schema: JsonSchema;
- uischema: UISchemaElement;
- data: any;
-} = { schema, uischema, data };
diff --git a/packages/vue-vuetify/example-app/src/examples/rule/schema.json b/packages/vue-vuetify/example-app/src/examples/rule/schema.json
deleted file mode 100644
index ec8217353f..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/rule/schema.json
+++ /dev/null
@@ -1,30 +0,0 @@
-{
- "type": "object",
- "properties": {
- "name": {
- "type": "string"
- },
- "dead": {
- "type": "boolean"
- },
- "kindOfDead": {
- "type": "string",
- "enum": [
- "Zombie",
- "Vampire",
- "Ghoul"
- ]
- },
- "vegetables": {
- "type": "boolean"
- },
- "kindOfVegetables": {
- "type": "string",
- "enum": [
- "All",
- "Some",
- "Only potatoes"
- ]
- }
- }
-}
\ No newline at end of file
diff --git a/packages/vue-vuetify/example-app/src/examples/rule/uischema.json b/packages/vue-vuetify/example-app/src/examples/rule/uischema.json
deleted file mode 100644
index 0b214fc473..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/rule/uischema.json
+++ /dev/null
@@ -1,58 +0,0 @@
-{
- "type": "VerticalLayout",
- "elements": [
- {
- "type": "Control",
- "label": "Name",
- "scope": "#/properties/name"
- },
- {
- "type": "Group",
- "elements": [
- {
- "type": "Control",
- "label": "Is Dead?",
- "scope": "#/properties/dead"
- },
- {
- "type": "Control",
- "label": "Kind of dead",
- "scope": "#/properties/kindOfDead",
- "rule": {
- "effect": "ENABLE",
- "condition": {
- "scope": "#/properties/dead",
- "schema": {
- "const": true
- }
- }
- }
- }
- ]
- },
- {
- "type": "Group",
- "elements": [
- {
- "type": "Control",
- "label": "Eats vegetables?",
- "scope": "#/properties/vegetables"
- },
- {
- "type": "Control",
- "label": "Kind of vegetables",
- "scope": "#/properties/kindOfVegetables",
- "rule": {
- "effect": "HIDE",
- "condition": {
- "scope": "#/properties/vegetables",
- "schema": {
- "const": false
- }
- }
- }
- }
- ]
- }
- ]
-}
\ No newline at end of file
diff --git a/packages/vue-vuetify/example-app/src/examples/time/data.json b/packages/vue-vuetify/example-app/src/examples/time/data.json
deleted file mode 100644
index f0be050893..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/time/data.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{
- "time": "13:15:00",
- "stringTime": "13:15"
-}
diff --git a/packages/vue-vuetify/example-app/src/examples/time/index.ts b/packages/vue-vuetify/example-app/src/examples/time/index.ts
deleted file mode 100644
index 8f5e656657..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/time/index.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import schema from './schema.json';
-import uischema from './uischema.json';
-import data from './data.json';
-import { UISchemaElement, JsonSchema } from '@jsonforms/core';
-
-export const input: {
- schema: JsonSchema;
- uischema: UISchemaElement;
- data: any;
-} = { schema, uischema, data };
diff --git a/packages/vue-vuetify/example-app/src/examples/time/schema.json b/packages/vue-vuetify/example-app/src/examples/time/schema.json
deleted file mode 100644
index 155be73df9..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/time/schema.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
- "type": "object",
- "properties": {
- "time": {
- "type": "string",
- "format": "time"
- },
- "stringTime": {
- "type": "string"
- }
- }
-}
diff --git a/packages/vue-vuetify/example-app/src/examples/time/uischema.json b/packages/vue-vuetify/example-app/src/examples/time/uischema.json
deleted file mode 100644
index 5e38f2a8cb..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/time/uischema.json
+++ /dev/null
@@ -1,16 +0,0 @@
-{
- "type": "VerticalLayout",
- "elements": [
- {
- "type": "Control",
- "scope": "#/properties/time"
- },
- {
- "type": "Control",
- "scope": "#/properties/stringTime",
- "options": {
- "format": "time"
- }
- }
- ]
-}
diff --git a/packages/vue-vuetify/example-app/src/examples/vertical-layout/data.json b/packages/vue-vuetify/example-app/src/examples/vertical-layout/data.json
deleted file mode 100644
index 59a6d43787..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/vertical-layout/data.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
- "name": "John Doe",
- "vegetarian": false,
- "birthDate": "1985-06-02",
- "personalData": {
- "age": 34
- },
- "postalCode": "12345"
-}
\ No newline at end of file
diff --git a/packages/vue-vuetify/example-app/src/examples/vertical-layout/index.ts b/packages/vue-vuetify/example-app/src/examples/vertical-layout/index.ts
deleted file mode 100644
index 8f5e656657..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/vertical-layout/index.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import schema from './schema.json';
-import uischema from './uischema.json';
-import data from './data.json';
-import { UISchemaElement, JsonSchema } from '@jsonforms/core';
-
-export const input: {
- schema: JsonSchema;
- uischema: UISchemaElement;
- data: any;
-} = { schema, uischema, data };
diff --git a/packages/vue-vuetify/example-app/src/examples/vertical-layout/schema.json b/packages/vue-vuetify/example-app/src/examples/vertical-layout/schema.json
deleted file mode 100644
index 215f8fd803..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/vertical-layout/schema.json
+++ /dev/null
@@ -1,61 +0,0 @@
-{
- "type": "object",
- "properties": {
- "name": {
- "type": "string",
- "minLength": 3,
- "description": "Please enter your name"
- },
- "vegetarian": {
- "type": "boolean"
- },
- "birthDate": {
- "type": "string",
- "format": "date"
- },
- "nationality": {
- "type": "string",
- "enum": [
- "DE",
- "IT",
- "JP",
- "US",
- "RU",
- "Other"
- ]
- },
- "personalData": {
- "type": "object",
- "properties": {
- "age": {
- "type": "integer",
- "description": "Please enter your age."
- },
- "height": {
- "type": "number"
- },
- "drivingSkill": {
- "type": "number",
- "maximum": 10,
- "minimum": 1,
- "default": 7
- }
- },
- "required": [
- "age",
- "height"
- ]
- },
- "occupation": {
- "type": "string"
- },
- "postalCode": {
- "type": "string",
- "maxLength": 5
- }
- },
- "required": [
- "occupation",
- "nationality"
- ]
-}
\ No newline at end of file
diff --git a/packages/vue-vuetify/example-app/src/examples/vertical-layout/uischema.json b/packages/vue-vuetify/example-app/src/examples/vertical-layout/uischema.json
deleted file mode 100644
index e57f4ba02e..0000000000
--- a/packages/vue-vuetify/example-app/src/examples/vertical-layout/uischema.json
+++ /dev/null
@@ -1,15 +0,0 @@
-{
- "type": "VerticalLayout",
- "elements": [
- {
- "type": "Control",
- "label": "Name",
- "scope": "#/properties/name"
- },
- {
- "type": "Control",
- "label": "Birth Date",
- "scope": "#/properties/birthDate"
- }
- ]
-}
\ No newline at end of file
diff --git a/packages/vue-vuetify/example-app/src/i18n/i18n.ts b/packages/vue-vuetify/example-app/src/i18n/i18n.ts
deleted file mode 100644
index f7af747e09..0000000000
--- a/packages/vue-vuetify/example-app/src/i18n/i18n.ts
+++ /dev/null
@@ -1,51 +0,0 @@
-import { Translator } from '@jsonforms/core';
-import get from 'lodash/get';
-import template from 'lodash/template';
-import memoize from 'lodash/memoize';
-
-export const createTranslator = (
- locale: string,
- translations?: Record
-): Translator => {
- let localeTranslations = translations ? translations[locale] : undefined;
-
- if (!localeTranslations && translations) {
- const dashIndex = locale.indexOf('-');
- localeTranslations =
- dashIndex > 0 ? translations[locale.substring(0, dashIndex)] : undefined;
- }
-
- const translate = (
- id: string,
- defaultMessage: string | undefined,
- values?: any
- ): string | undefined => {
- if (!localeTranslations) return defaultMessage;
-
- const message = get(localeTranslations, id);
- if (message && values) {
- return translateWithParams(message, values) ?? defaultMessage;
- }
- return message ?? defaultMessage;
- };
-
- return translate as Translator;
-};
-
-const translateWithParams = memoize(templateToMessage);
-
-function templateToMessage(
- templateMessage: string,
- params: Record = {}
-): string {
- const compiled = template(templateMessage, {
- interpolate: /\${([\s\S]+?)}/g, // ${myVar}
- });
-
- try {
- return compiled(params);
- } catch (e) {
- console.log(`Unable to generate message from template: ${templateMessage}`);
- return templateMessage;
- }
-}
diff --git a/packages/vue-vuetify/example-app/src/i18n/index.ts b/packages/vue-vuetify/example-app/src/i18n/index.ts
deleted file mode 100644
index e82230f1bf..0000000000
--- a/packages/vue-vuetify/example-app/src/i18n/index.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from './i18n';
diff --git a/packages/vue-vuetify/example-app/src/layouts/default/AppBar.vue b/packages/vue-vuetify/example-app/src/layouts/default/AppBar.vue
deleted file mode 100644
index 2667db9335..0000000000
--- a/packages/vue-vuetify/example-app/src/layouts/default/AppBar.vue
+++ /dev/null
@@ -1,72 +0,0 @@
-
-
-
-
-
-
-
-
-
- JSON Forms
-
-
-
-
-
-
-
-
-
-
-
- mdi-cog
-
-
- Settings
-
-
-
-
-
-
-
-
-
diff --git a/packages/vue-vuetify/example-app/src/layouts/default/Drawer.vue b/packages/vue-vuetify/example-app/src/layouts/default/Drawer.vue
deleted file mode 100644
index 852cdb9f84..0000000000
--- a/packages/vue-vuetify/example-app/src/layouts/default/Drawer.vue
+++ /dev/null
@@ -1,53 +0,0 @@
-
-
-
-
-
-
- Examples
- Vuetify Renderers
-
-
-
-
-
-
- {{ example.title }}
-
-
-
-
-
-
diff --git a/packages/vue-vuetify/example-app/src/layouts/default/View.vue b/packages/vue-vuetify/example-app/src/layouts/default/View.vue
deleted file mode 100644
index fc17d1cc9b..0000000000
--- a/packages/vue-vuetify/example-app/src/layouts/default/View.vue
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
-
-
-
-
-
diff --git a/packages/vue-vuetify/example-app/src/layouts/default/index.vue b/packages/vue-vuetify/example-app/src/layouts/default/index.vue
deleted file mode 100644
index 758e0f0106..0000000000
--- a/packages/vue-vuetify/example-app/src/layouts/default/index.vue
+++ /dev/null
@@ -1,32 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/packages/vue-vuetify/example-app/src/main.ts b/packages/vue-vuetify/example-app/src/main.ts
deleted file mode 100644
index 98ba824fdb..0000000000
--- a/packages/vue-vuetify/example-app/src/main.ts
+++ /dev/null
@@ -1,8 +0,0 @@
-import { createApp } from 'vue';
-import App from './App.vue';
-import router from './router';
-import store from './store';
-import vuetify from './plugins/vuetify';
-import './plugins';
-
-createApp(App).use(store).use(router).use(vuetify).mount('#app');
diff --git a/packages/vue-vuetify/example-app/src/plugins/app.ts b/packages/vue-vuetify/example-app/src/plugins/app.ts
deleted file mode 100644
index b9f14cd58f..0000000000
--- a/packages/vue-vuetify/example-app/src/plugins/app.ts
+++ /dev/null
@@ -1,23 +0,0 @@
-/**
- * plugins/app.ts
- *
- * Automatically loads and bootstraps files
- * in the `./src/components/` folder.
- */
-
-export function registerComponents(app) {
- // Automatically get all .vue files within
- // `src/components` and register them to
- // the current app.
- // https://webpack.js.org/guides/dependency-management/#requirecontext
- const requireComponent = require.context('@/components', true, /\.vue$/);
-
- for (const file of requireComponent.keys()) {
- const componentConfig = requireComponent(file);
-
- app.component(
- componentConfig.default.name,
- componentConfig.default || componentConfig
- );
- }
-}
diff --git a/packages/vue-vuetify/example-app/src/plugins/index.ts b/packages/vue-vuetify/example-app/src/plugins/index.ts
deleted file mode 100644
index 36c3352e9f..0000000000
--- a/packages/vue-vuetify/example-app/src/plugins/index.ts
+++ /dev/null
@@ -1 +0,0 @@
-import './app';
diff --git a/packages/vue-vuetify/example-app/src/plugins/vuetify.ts b/packages/vue-vuetify/example-app/src/plugins/vuetify.ts
deleted file mode 100644
index 5e61b9c179..0000000000
--- a/packages/vue-vuetify/example-app/src/plugins/vuetify.ts
+++ /dev/null
@@ -1,47 +0,0 @@
-// import Vue from 'vue';
-import { createVuetify } from 'vuetify';
-import '@mdi/font/css/materialdesignicons.css';
-import 'vuetify/styles';
-// import { VuetifyPreset } from 'vuetify/types/services/presets';
-
-// Vue.use(Vuetify);
-
-// export const preset: Partial = {
-// icons: {
-// iconfont: 'mdi',
-// values: {},
-// },
-// theme: {
-// dark: false,
-// default: 'light',
-// disable: false,
-// options: {
-// cspNonce: undefined,
-// customProperties: undefined,
-// minifyTheme: undefined,
-// themeCache: undefined,
-// },
-// themes: {
-// light: {
-// primary: '#1976D2',
-// secondary: '#424242',
-// accent: '#82B1FF',
-// error: '#FF5252',
-// info: '#2196F3',
-// success: '#4CAF50',
-// warning: '#FB8C00',
-// },
-// dark: {
-// primary: '#2196F3',
-// secondary: '#424242',
-// accent: '#FF4081',
-// error: '#FF5252',
-// info: '#2196F3',
-// success: '#4CAF50',
-// warning: '#FB8C00',
-// },
-// },
-// },
-// };
-
-export default createVuetify();
diff --git a/packages/vue-vuetify/example-app/src/plugins/vuex-pathify.ts b/packages/vue-vuetify/example-app/src/plugins/vuex-pathify.ts
deleted file mode 100644
index ef21fe3ae9..0000000000
--- a/packages/vue-vuetify/example-app/src/plugins/vuex-pathify.ts
+++ /dev/null
@@ -1,9 +0,0 @@
-import pathify from 'vuex-pathify';
-
-// options
-pathify.options.mapping = 'standard'; // map states to store members using the "standard" scheme [standard, simple, custom]
-pathify.options.strict = true; // throw an error if the store member cannot be found
-pathify.options.cache = true; // cache generated functions for faster re-use
-pathify.options.deep = 2; // allow sub-property access to Vuex stores
-
-export default pathify;
diff --git a/packages/vue-vuetify/example-app/src/router/index.ts b/packages/vue-vuetify/example-app/src/router/index.ts
deleted file mode 100644
index 3ff97aefd0..0000000000
--- a/packages/vue-vuetify/example-app/src/router/index.ts
+++ /dev/null
@@ -1,30 +0,0 @@
-import { createRouter, createWebHashHistory } from 'vue-router';
-import { defineAsyncComponent } from 'vue';
-export default createRouter({
- // base: process.env.BASE_URL,
- // scrollBehavior: (to, _, savedPosition) => {
- // if (to.hash) return { selector: to.hash };
- // if (savedPosition) return savedPosition;
-
- // return { x: 0, y: 0 };
- // },
- history: createWebHashHistory(),
- routes: [
- {
- path: '/',
- component: () => import('../layouts/default/index.vue'),
- children: [
- {
- path: '',
- name: 'Default',
- component: () => import('../views/home'),
- },
- {
- path: 'example/:id',
- name: 'example',
- component: () => import('../views/example'),
- },
- ],
- },
- ],
-});
diff --git a/packages/vue-vuetify/example-app/src/shims-tsx.d.ts b/packages/vue-vuetify/example-app/src/shims-tsx.d.ts
deleted file mode 100644
index 3b88b58292..0000000000
--- a/packages/vue-vuetify/example-app/src/shims-tsx.d.ts
+++ /dev/null
@@ -1,13 +0,0 @@
-import Vue, { VNode } from 'vue';
-
-declare global {
- namespace JSX {
- // tslint:disable no-empty-interface
- interface Element extends VNode {}
- // tslint:disable no-empty-interface
- interface ElementClass extends Vue {}
- interface IntrinsicElements {
- [elem: string]: any;
- }
- }
-}
diff --git a/packages/vue-vuetify/example-app/src/shims-vue.d.ts b/packages/vue-vuetify/example-app/src/shims-vue.d.ts
deleted file mode 100644
index 0a4c9aa0d8..0000000000
--- a/packages/vue-vuetify/example-app/src/shims-vue.d.ts
+++ /dev/null
@@ -1,6 +0,0 @@
-declare module '*.vue' {
- import type { DefineComponent } from 'vue';
- const component: DefineComponent<{}, {}, any>;
- export default component;
- export const entry;
-}
diff --git a/packages/vue-vuetify/example-app/src/store/index.ts b/packages/vue-vuetify/example-app/src/store/index.ts
deleted file mode 100644
index 9488cbd698..0000000000
--- a/packages/vue-vuetify/example-app/src/store/index.ts
+++ /dev/null
@@ -1,33 +0,0 @@
-/**
- * Vuetify Vue CLI Preset
- *
- * store/index.js
- *
- * vuex documentation: https://vuex.vuejs.org/
- */
-
-// Vue
-import { createStore } from 'vuex';
-import { RootState } from './types';
-
-// Utilities
-// https://davestewart.github.io/vuex-pathify/#/
-import pathify from '../plugins/vuex-pathify';
-
-// Modules
-// https://vuex.vuejs.org/guide/modules.html
-import appModule from './modules/app';
-
-export default createStore({
- state: {
- version: '1.0.0',
- },
- modules: {
- app: appModule,
- },
- plugins: [pathify.plugin],
-});
-
-// A reusable const for making root commits and dispatches
-// https://vuex.vuejs.org/guide/modules.html#accessing-global-assets-in-namespaced-modules
-export const ROOT_DISPATCH = Object.freeze({ root: true });
diff --git a/packages/vue-vuetify/example-app/src/store/modules/app.ts b/packages/vue-vuetify/example-app/src/store/modules/app.ts
deleted file mode 100644
index bd8572ef08..0000000000
--- a/packages/vue-vuetify/example-app/src/store/modules/app.ts
+++ /dev/null
@@ -1,51 +0,0 @@
-// Pathify
-import { make } from 'vuex-pathify';
-import { AppState } from './types';
-import { RootState } from '../types';
-import { Module } from 'vuex';
-import { createAjv } from '../validate/validate';
-
-const ajv = createAjv();
-
-// Data
-const state: AppState = {
- drawer: null,
- settings: null,
- jsonforms: {
- readonly: false,
- validationMode: 'ValidateAndShow',
- config: {
- restrict: true,
- trim: false,
- showUnfocusedDescription: false,
- hideRequiredAsterisk: true,
- collapseNewItems: false,
- breakHorizontal: false,
- initCollapsed: false,
- hideAvatar: false,
- hideArraySummaryValidation: false,
- },
- locale: 'en',
- },
- monaco: {
- schemaModel: undefined,
- uischemaModel: undefined,
- dataModel: undefined,
- },
-};
-
-const mutations = make.mutations(state);
-
-const actions = make.actions(state);
-
-const getters = {};
-
-const app: Module = {
- namespaced: true,
- state: () => state,
- mutations,
- actions,
- getters,
-};
-
-export default app;
diff --git a/packages/vue-vuetify/example-app/src/store/modules/index.ts b/packages/vue-vuetify/example-app/src/store/modules/index.ts
deleted file mode 100644
index 92704b8d88..0000000000
--- a/packages/vue-vuetify/example-app/src/store/modules/index.ts
+++ /dev/null
@@ -1 +0,0 @@
-export { default as app } from './app';
diff --git a/packages/vue-vuetify/example-app/src/store/modules/types.ts b/packages/vue-vuetify/example-app/src/store/modules/types.ts
deleted file mode 100644
index 4da5c98249..0000000000
--- a/packages/vue-vuetify/example-app/src/store/modules/types.ts
+++ /dev/null
@@ -1,29 +0,0 @@
-import * as monaco from 'monaco-editor/esm/vs/editor/editor.api';
-
-// declare your own store states
-export interface AppState {
- drawer: boolean | null;
- settings: boolean | null;
- jsonforms: {
- readonly: boolean;
- validationMode: 'ValidateAndShow' | 'ValidateAndHide' | 'NoValidation';
- config: {
- restrict: boolean;
- trim: boolean;
- showUnfocusedDescription: boolean;
- hideRequiredAsterisk: boolean;
- collapseNewItems: boolean;
- initCollapsed: boolean;
- breakHorizontal: false | string;
- hideAvatar: boolean;
- hideArraySummaryValidation: boolean;
- vuetify?: Record;
- };
- locale: string;
- };
- monaco: {
- schemaModel: monaco.editor.ITextModel | undefined;
- uischemaModel: monaco.editor.ITextModel | undefined;
- dataModel: monaco.editor.ITextModel | undefined;
- };
-}
diff --git a/packages/vue-vuetify/example-app/src/store/types.ts b/packages/vue-vuetify/example-app/src/store/types.ts
deleted file mode 100644
index 6e9937309e..0000000000
--- a/packages/vue-vuetify/example-app/src/store/types.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-export interface RootState {
- version: string;
-}
diff --git a/packages/vue-vuetify/example-app/src/views/example/Example.vue b/packages/vue-vuetify/example-app/src/views/example/Example.vue
deleted file mode 100644
index 844e57d16a..0000000000
--- a/packages/vue-vuetify/example-app/src/views/example/Example.vue
+++ /dev/null
@@ -1,614 +0,0 @@
-
-
-
-
- {{ example.title }}
-
-
- Demo
-
- Schema
- UI Schema
- Data
- Internationalization
-
-
-
-
-
-
-
- JSONForm
-
-
-
-
- mdi-dock-window
-
-
- {{ `Show JsonForm Only` }}
-
-
-
-
-
-
-
-
-
-
-
-
-
- Schema
-
-
-
-
- mdi-reload
-
-
- {{ `Reload Example Schema` }}
-
-
-
-
- mdi-content-save
-
-
- {{ `Apply Change To Example Schema` }}
-
-
-
-
-
-
-
-
-
-
-
- UI Schema
-
-
-
-
- mdi-reload
-
-
- {{ `Reload Example UI Schema` }}
-
-
-
-
- mdi-content-save
-
-
- {{ `Apply Change To Example UI Schema` }}
-
-
-
-
-
-
-
-
-
-
-
- Data
-
-
-
-
- mdi-reload
-
-
- {{ `Reload Example Data` }}
-
-
-
-
- mdi-content-save
-
-
- {{ `Apply Change To Example Data` }}
-
-
-
-
-
-
-
-
-
-
-
- Internationalization
-
-
-
-
- mdi-reload
-
-
- {{ `Reload Example Internationalization` }}
-
-
-
-
- mdi-content-save
-
-
- {{ `Apply Change To Example Data` }}
-
-
-
-
-
-
-
-
-
-
- {{ snackbarText }}
-
- Close
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/packages/vue-vuetify/example-app/src/views/example/index.ts b/packages/vue-vuetify/example-app/src/views/example/index.ts
deleted file mode 100644
index b803b68d2a..0000000000
--- a/packages/vue-vuetify/example-app/src/views/example/index.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-import Example from './Example.vue';
-
-export default Example;
diff --git a/packages/vue-vuetify/example-app/src/views/home/index.ts b/packages/vue-vuetify/example-app/src/views/home/index.ts
deleted file mode 100644
index a94aeae41f..0000000000
--- a/packages/vue-vuetify/example-app/src/views/home/index.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-import Home from './Home.vue';
-
-export default Home;
diff --git a/packages/vue-vuetify/example-app/tsconfig.json b/packages/vue-vuetify/example-app/tsconfig.json
deleted file mode 100644
index b91d0a1bdc..0000000000
--- a/packages/vue-vuetify/example-app/tsconfig.json
+++ /dev/null
@@ -1,31 +0,0 @@
-{
- "compilerOptions": {
- "target": "esnext",
- "module": "esnext",
- "strict": true,
- "jsx": "preserve",
- "importHelpers": true,
- "moduleResolution": "node",
- "skipLibCheck": true,
- "esModuleInterop": true,
- "allowSyntheticDefaultImports": true,
- "sourceMap": true,
- "baseUrl": ".",
- "types": ["webpack-env", "vuex-pathify/types/vuex"],
- "paths": {
- "@/*": ["src/*"]
- },
- "lib": ["esnext", "dom", "dom.iterable", "scripthost"]
- },
- "include": [
- "src/**/*.ts",
- "src/**/*.tsx",
- "src/**/*.vue",
- "tests/**/*.ts",
- "tests/**/*.tsx"
- ],
- "exclude": ["node_modules"],
- "vueCompilerOptions": {
- "target": 3
- }
-}
diff --git a/packages/vue-vuetify/example-app/vue.config.js b/packages/vue-vuetify/example-app/vue.config.js
deleted file mode 100644
index fc34594565..0000000000
--- a/packages/vue-vuetify/example-app/vue.config.js
+++ /dev/null
@@ -1,38 +0,0 @@
-const MonacoWebpackPlugin = require('monaco-editor-webpack-plugin');
-const path = require('path');
-
-module.exports = {
- chainWebpack: (config) => {
- // remove typecheck
- config.plugins.delete('fork-ts-checker');
-
- config.plugin('monaco-editor').use(MonacoWebpackPlugin, [
- {
- // Languages are loaded on demand at runtime
- languages: ['json'],
- },
- ]);
-
- // config.resolve = {
- // ...config.revolve,
- // symlinks: false,
- // alias: {
- // vue: path.resolve(`../../node_modules/vue`),
- // },
- // };
-
- return config;
- },
- // devServer: {
- // watchOptions: {
- // ignored: ['node_modules'],
- // poll: true,
- // },
- // },
- transpileDependencies: ['vuetify', '@jsonforms/core', '@jsonforms/vue'],
- pluginOptions: {
- vuetify: {
- // https://github.com/vuetifyjs/vuetify-loader/tree/next/packages/vuetify-loader
- },
- },
-};
diff --git a/packages/vue-vuetify/example/index.bundled.html b/packages/vue-vuetify/example/index.bundled.html
new file mode 100644
index 0000000000..19cd2d30df
--- /dev/null
+++ b/packages/vue-vuetify/example/index.bundled.html
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+ JSON Forms Vue 3 Vuetify
+
+
+
+
+
+
diff --git a/packages/vue-vuetify/index.html b/packages/vue-vuetify/index.html
new file mode 100644
index 0000000000..a8f0512cdf
--- /dev/null
+++ b/packages/vue-vuetify/index.html
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+ JSON Forms Vue 3 Vuetify
+
+
+
+
+
+
diff --git a/packages/vue-vuetify/jest.config.js b/packages/vue-vuetify/jest.config.js
deleted file mode 100644
index 7395d8b01b..0000000000
--- a/packages/vue-vuetify/jest.config.js
+++ /dev/null
@@ -1,10 +0,0 @@
-module.exports = {
- preset: '@vue/cli-plugin-unit-jest/presets/typescript-and-babel',
- transformIgnorePatterns: ['node_modules/(?!vue-router|@babel|vuetify)'],
- moduleNameMapper: {
- '^.+.(css|styl|less|sass|scss|png|jpg|ttf|woff|woff2)$':
- 'jest-transform-stub',
- },
- snapshotSerializers: ['jest-serializer-html'],
- setupFiles: ['tests/index.ts'],
-};
diff --git a/packages/vue-vuetify/package.json b/packages/vue-vuetify/package.json
index 32279b5419..ecea88e27b 100644
--- a/packages/vue-vuetify/package.json
+++ b/packages/vue-vuetify/package.json
@@ -1,8 +1,8 @@
{
"name": "@jsonforms/vue-vuetify",
- "version": "3.3.0-preview.0",
+ "version": "3.4.0-alpha.0",
"description": "Vue Vuetify renderers for JSON Forms",
- "repository": "https://github.com/eclipsesource/jsonforms-vuetify-renderers",
+ "repository": "https://github.com/eclipsesource/jsonforms",
"bugs": "https://github.com/eclipsesource/jsonforms/issues",
"homepage": "http://jsonforms.io/",
"license": "MIT",
@@ -11,8 +11,6 @@
},
"keywords": [
"vue",
- "vue2",
- "vue 2",
"vuetify",
"form",
"forms",
@@ -30,72 +28,91 @@
],
"main": "lib/jsonforms-vue-vuetify.cjs.js",
"module": "lib/jsonforms-vue-vuetify.esm.js",
- "exports": {
- ".": {
- "import": "./lib/jsonforms-vue-vuetify.esm.js",
- "require": "./lib/jsonforms-vue-vuetify.cjs.js"
- },
- "./lib/jsonforms-vue-vuetify.esm.css": "./lib/jsonforms-vue-vuetify.esm.css",
- "./lib/jsonforms-vue-vuetify.cjs.css": "./lib/jsonforms-vue-vuetify.cjs.css"
- },
+ "jsdelivr": "lib/jsonforms-vue-vuetify.umd.js",
+ "unpkg": "lib/jsonforms-vue-vuetify.umd.js",
+ "styles": "lib/jsonforms-vue-vuetify.css",
"typings": "lib/index.d.ts",
+ "type": "module",
"files": [
"lib",
"src"
],
+ "exports": {
+ ".": {
+ "import": "./lib/jsonforms-vue-vuetify.esm.js",
+ "require": "./lib/jsonforms-vue-vuetify.cjs.js",
+ "types": "./lib/index.d.ts"
+ },
+ "./lib/jsonforms-vue-vuetify.css": "./lib/jsonforms-vue-vuetify.css"
+ },
"scripts": {
- "prebuild": "rimraf lib",
- "build": "cross-env NODE_ENV=production rollup --config rollup.config.mjs",
- "watch": "rollup --watch --config rollup.config.mjs",
- "test": "vue-cli-service test:unit"
+ "dev": "vite --config vite.example.config.ts",
+ "build": "run-p type-check \"build-only {@}\" --",
+ "build:examples-app": "run-p type-check \"build-only --config vite.example.config.ts {@}\" --",
+ "clean": "rimraf lib example/dist",
+ "lint": "eslint .",
+ "lint:fix": "eslint --fix .",
+ "doc": "typedoc --tsconfig tsconfig.typedoc.json --name 'JSON Forms Vue Vuetify Renderers' --out docs --entryPoints 'src/**/*.ts' 'lib/index.d.ts'",
+ "test": "vitest --watch=false",
+ "build-only": "NODE_OPTIONS=\"--max-old-space-size=4096\" vite build",
+ "type-check": "vue-tsc --build --force"
},
- "dependencies": {
+ "peerDependencies": {
+ "@jsonforms/core": "3.4.0-alpha.0",
+ "@jsonforms/vue": "3.4.0-alpha.0",
"ajv": "^8.6.1",
"dayjs": "^1.10.6",
- "lodash": "^4.17.15"
- },
- "peerDependencies": {
- "@jsonforms/core": "3.3.0",
- "@jsonforms/vue": "3.3.0",
- "@mdi/font": "^7.0.96",
- "vue": "^3.2.47",
- "vuetify": "^3.1.12"
+ "lodash": "^4.17.21",
+ "maska": "^2.1.11",
+ "vue": "^3.4.21",
+ "vuetify": "^3.6.6"
},
"devDependencies": {
- "@babel/core": "^7.14.6",
- "@babel/preset-env": "^7.14.7",
- "@babel/preset-typescript": "^7.14.5",
- "@jsonforms/core": "3.3.0",
- "@jsonforms/vue": "3.3.0",
- "@mdi/font": "^7.0.96",
- "@rollup/plugin-babel": "^6.0.3",
- "@rollup/plugin-node-resolve": "^15.0.1",
- "@types/jest": "^28.1.1",
+ "@fortawesome/fontawesome-free": "^6.5.2",
+ "@jsonforms/core": "workspace:*",
+ "@jsonforms/examples": "workspace:*",
+ "@jsonforms/vue": "workspace:*",
+ "@mdi/font": "^7.4.47",
+ "@rushstack/eslint-patch": "^1.8.0",
+ "@tsconfig/node20": "^20.1.4",
+ "@types/jsdom": "^21.1.6",
"@types/lodash": "^4.14.172",
- "@typescript-eslint/eslint-plugin": "^5.4.0",
- "@typescript-eslint/parser": "^5.4.0",
- "@vue/cli-plugin-unit-jest": "^5.0.0",
- "@vue/cli-service": "~5.0.0",
- "@vue/eslint-config-prettier": "^7.1.0",
- "@vue/eslint-config-typescript": "^11.0.0",
- "@vue/test-utils": "^2.3.2",
+ "@types/node": "^20.12.5",
+ "@vitejs/plugin-vue": "^5.0.4",
+ "@vitest/coverage-v8": "^1.6.0",
+ "@vue/eslint-config-prettier": "^9.0.0",
+ "@vue/eslint-config-typescript": "^13.0.0",
+ "@vue/test-utils": "^2.4.5",
+ "@vue/tsconfig": "^0.5.1",
"ajv": "^8.6.1",
+ "ajv-keywords": "^5.1.0",
"core-js": "^3.9.1",
"cross-env": "^7.0.2",
- "eslint": "^8.37.0",
- "eslint-plugin-prettier": "^4.0.0",
- "eslint-plugin-vue": "^9.10.0",
- "jest": "^28.1.1",
- "prettier": "^2.8.7",
+ "dayjs": "^1.10.6",
+ "eslint": "^8.57.0",
+ "eslint-plugin-vue": "^9.23.0",
+ "eslint-plugin-vue-scoped-css": "^2.8.0",
+ "jsdom": "^24.0.0",
+ "json-refs": "3.0.15",
+ "lodash": "^4.17.21",
+ "maska": "^2.1.11",
+ "monaco-editor": "^0.49.0",
+ "npm-run-all2": "^6.1.2",
+ "prettier": "^3.2.5",
+ "resize-observer-polyfill": "^1.5.1",
"rimraf": "^4.4.1",
- "rollup": "^3.20.2",
- "rollup-plugin-cleanup": "^3.2.1",
- "rollup-plugin-css-only": "^4.3.0",
- "rollup-plugin-typescript2": "^0.35.0",
- "rollup-plugin-visualizer": "^5.5.2",
- "rollup-plugin-vue": "^6.0.0",
- "typescript": "~4.7.4",
- "vue": "^3.2.47",
- "vuetify": "^3.1.12"
+ "rollup-plugin-postcss": "^4.0.2",
+ "typedoc": "~0.25.3",
+ "typescript": "~5.4.0",
+ "vite": "^5.2.8",
+ "vite-plugin-dts": "^3.9.1",
+ "vite-plugin-node-polyfills": "^0.21.0",
+ "vite-plugin-static-copy": "^1.0.5",
+ "vite-plugin-vuetify": "^2.0.3",
+ "vitest": "^1.4.0",
+ "vue": "^3.4.21",
+ "vue-eslint-parser": "^9.4.2",
+ "vue-tsc": "^2.0.11",
+ "vuetify": "^3.6.6"
}
}
diff --git a/packages/vue-vuetify/rollup.config.mjs b/packages/vue-vuetify/rollup.config.mjs
deleted file mode 100644
index 6eeb049d0e..0000000000
--- a/packages/vue-vuetify/rollup.config.mjs
+++ /dev/null
@@ -1,103 +0,0 @@
-import vue from 'rollup-plugin-vue';
-import babel from '@rollup/plugin-babel';
-import typescript from 'rollup-plugin-typescript2';
-import resolve from '@rollup/plugin-node-resolve';
-import cleanup from 'rollup-plugin-cleanup';
-import { visualizer } from 'rollup-plugin-visualizer';
-import css from 'rollup-plugin-css-only';
-
-import packageJson from './package.json' assert { type: 'json' };
-
-const baseConfig = {
- input: 'src/index.ts',
- external: [
- ...Object.keys(packageJson.dependencies),
- ...Object.keys(packageJson.peerDependencies),
- /^lodash\/.*/,
- 'vuetify/components',
- '@mdi/font',
- /^dayjs\/.*/,
- ],
-};
-
-const buildFormats = [
- {
- ...baseConfig,
- output: {
- file: packageJson.module,
- format: 'esm',
- sourcemap: true,
- assetFileNames: '[name][extname]',
- },
- plugins: [
- resolve({
- extensions: ['.js', '.jsx', '.ts', '.tsx', '.mts', '.vue'],
- }),
- css({
- output: `${packageJson.module.split('/')[1].split('.')[0]}.esm.css`,
- }),
- vue({
- css: false,
- template: {
- isProduction: true,
- },
- // rollup-plugin-vue can't handle Vue source maps in watch mode
- // https://github.com/vuejs/rollup-plugin-vue/issues/238
- needMap: !process.env.ROLLUP_WATCH,
- }),
- typescript({
- emitDeclarationOnly: true,
- tsconfig: 'tsconfig.compile.json',
- }),
- babel({
- exclude: 'node_modules/**',
- extensions: ['.js', '.jsx', '.ts', '.tsx', '.vue'],
- babelHelpers: 'bundled',
- }),
- cleanup({ extensions: ['js', 'ts', 'jsx', 'tsx', 'vue'] }),
- visualizer(),
- ],
- },
- {
- ...baseConfig,
- output: {
- file: packageJson.main,
- format: 'cjs',
- sourcemap: true,
- assetFileNames: '[name][extname]',
- },
- plugins: [
- resolve({
- extensions: ['.js', '.jsx', '.ts', '.tsx', '.mts', '.vue'],
- }),
- css({
- output: `${packageJson.module.split('/')[1].split('.')[0]}.cjs.css`,
- }),
- vue({
- css: false,
- template: {
- isProduction: true,
- },
- // rollup-plugin-vue can't handle Vue source maps in watch mode
- // https://github.com/vuejs/rollup-plugin-vue/issues/238
- needMap: !process.env.ROLLUP_WATCH,
- }),
- typescript({
- emitDeclarationOnly: true,
- tsconfigOverride: {
- target: 'ES5',
- },
- tsconfig: 'tsconfig.compile.json',
- }),
- babel({
- exclude: 'node_modules/**',
- extensions: ['.js', '.jsx', '.ts', '.tsx', '.vue'],
- babelHelpers: 'bundled',
- }),
- cleanup({ extensions: ['js', 'ts', 'jsx', 'tsx', 'vue'] }),
- css(),
- ],
- },
-];
-
-export default buildFormats;
diff --git a/packages/vue-vuetify/shims-vue.d.ts b/packages/vue-vuetify/shims-vue.d.ts
deleted file mode 100644
index 0a4c9aa0d8..0000000000
--- a/packages/vue-vuetify/shims-vue.d.ts
+++ /dev/null
@@ -1,6 +0,0 @@
-declare module '*.vue' {
- import type { DefineComponent } from 'vue';
- const component: DefineComponent<{}, {}, any>;
- export default component;
- export const entry;
-}
diff --git a/packages/vue-vuetify/src/additional/LabelRenderer.vue b/packages/vue-vuetify/src/additional/LabelRenderer.vue
index 163385ff8e..d39c916ef7 100644
--- a/packages/vue-vuetify/src/additional/LabelRenderer.vue
+++ b/packages/vue-vuetify/src/additional/LabelRenderer.vue
@@ -10,25 +10,23 @@
diff --git a/packages/vue-vuetify/src/complex/ObjectRenderer.vue b/packages/vue-vuetify/src/complex/ObjectRenderer.vue
index 20177daa9f..b693b9a6f3 100644
--- a/packages/vue-vuetify/src/complex/ObjectRenderer.vue
+++ b/packages/vue-vuetify/src/complex/ObjectRenderer.vue
@@ -18,20 +18,20 @@
+
+
diff --git a/packages/vue-vuetify/src/controls/EnumControlRenderer.vue b/packages/vue-vuetify/src/controls/EnumControlRenderer.vue
index c6191ce200..1bc174c46a 100644
--- a/packages/vue-vuetify/src/controls/EnumControlRenderer.vue
+++ b/packages/vue-vuetify/src/controls/EnumControlRenderer.vue
@@ -5,48 +5,46 @@
:isFocused="isFocused"
:appliedOptions="appliedOptions"
>
-
-
-
+
diff --git a/packages/vue-vuetify/src/controls/directives/DisabledIconFocus.ts b/packages/vue-vuetify/src/controls/directives/DisabledIconFocus.ts
index e6a23b77d9..828358b87a 100644
--- a/packages/vue-vuetify/src/controls/directives/DisabledIconFocus.ts
+++ b/packages/vue-vuetify/src/controls/directives/DisabledIconFocus.ts
@@ -1,7 +1,7 @@
export const DisabledIconFocus = {
updated(el: HTMLElement): void {
- el.querySelectorAll('.v-input__icon button').forEach((x) =>
- x.setAttribute('tabindex', '-1')
+ el.querySelectorAll('.v-field__clearable i').forEach((x) =>
+ x.setAttribute('tabindex', '-1'),
);
},
};
diff --git a/packages/vue-vuetify/src/controls/index.ts b/packages/vue-vuetify/src/controls/index.ts
index 9fbc345490..2ef1550c0b 100644
--- a/packages/vue-vuetify/src/controls/index.ts
+++ b/packages/vue-vuetify/src/controls/index.ts
@@ -17,7 +17,7 @@ export { default as PasswordControlRenderer } from './PasswordControlRenderer.vu
export { default as RadioGroupControlRenderer } from './RadioGroupControlRenderer.vue';
export { default as SliderControlRenderer } from './SliderControlRenderer.vue';
export { default as StringControlRenderer } from './StringControlRenderer.vue';
-// export { default as StringMaskControlRenderer } from './StringMaskControlRenderer.vue';
+export { default as StringMaskControlRenderer } from './StringMaskControlRenderer.vue';
export { default as TimeControlRenderer } from './TimeControlRenderer.vue';
import { entry as anyOfStringOrEnumControlRendererEntry } from './AnyOfStringOrEnumControlRenderer.vue';
@@ -35,7 +35,7 @@ import { entry as passwordControlRendererEntry } from './PasswordControlRenderer
import { entry as radioGroupControlRendererEntry } from './RadioGroupControlRenderer.vue';
import { entry as sliderControlRendererEntry } from './SliderControlRenderer.vue';
import { entry as stringControlRendererEntry } from './StringControlRenderer.vue';
-// import { entry as stringMaskControlRendererEntry } from './StringMaskControlRenderer.vue';
+import { entry as stringMaskControlRendererEntry } from './StringMaskControlRenderer.vue';
import { entry as timeControlRendererEntry } from './TimeControlRenderer.vue';
export const controlRenderers = [
@@ -54,9 +54,10 @@ export const controlRenderers = [
radioGroupControlRendererEntry,
sliderControlRendererEntry,
stringControlRendererEntry,
- // stringMaskControlRendererEntry,
+ stringMaskControlRendererEntry,
timeControlRendererEntry,
];
+
export {
anyOfStringOrEnumControlRendererEntry,
booleanControlRendererEntry,
@@ -73,6 +74,6 @@ export {
radioGroupControlRendererEntry,
sliderControlRendererEntry,
stringControlRendererEntry,
- // stringMaskControlRendererEntry,
+ stringMaskControlRendererEntry,
timeControlRendererEntry,
-};
\ No newline at end of file
+};
diff --git a/packages/vue-vuetify/src/extended/AutocompleteEnumControlRenderer.vue b/packages/vue-vuetify/src/extended/AutocompleteEnumControlRenderer.vue
index 10eb4d5b50..925e7b00ca 100644
--- a/packages/vue-vuetify/src/extended/AutocompleteEnumControlRenderer.vue
+++ b/packages/vue-vuetify/src/extended/AutocompleteEnumControlRenderer.vue
@@ -5,74 +5,72 @@
:isFocused="isFocused"
:appliedOptions="appliedOptions"
>
-
-
-
-
+
+
-
diff --git a/packages/vue-vuetify/package.json b/packages/vue-vuetify/package.json
index b44da41313..d857be825f 100644
--- a/packages/vue-vuetify/package.json
+++ b/packages/vue-vuetify/package.json
@@ -78,6 +78,7 @@
"@types/jsdom": "^21.1.6",
"@types/lodash": "^4.14.172",
"@types/node": "^20.12.5",
+ "@types/splitpanes": "^2.2.6",
"@vitejs/plugin-vue": "^5.0.4",
"@vitest/coverage-v8": "^1.6.0",
"@vue/eslint-config-prettier": "^9.0.0",
@@ -102,6 +103,7 @@
"resize-observer-polyfill": "^1.5.1",
"rimraf": "^4.4.1",
"rollup-plugin-postcss": "^4.0.2",
+ "splitpanes": "^3.1.5",
"typedoc": "~0.25.3",
"typescript": "~5.4.0",
"vite": "^5.2.8",
diff --git a/packages/vue-vuetify/src/complex/EnumArrayRenderer.vue b/packages/vue-vuetify/src/complex/EnumArrayRenderer.vue
index 4faf9142ae..6edec0418c 100644
--- a/packages/vue-vuetify/src/complex/EnumArrayRenderer.vue
+++ b/packages/vue-vuetify/src/complex/EnumArrayRenderer.vue
@@ -1,47 +1,73 @@
-
-
-
+
+
+
toggle(o.value)"
+ @focus="handleFocus"
+ @blur="handleBlur"
>
-
-
-
+
+
+
+
diff --git a/packages/vue-vuetify/src/complex/ObjectRenderer.vue b/packages/vue-vuetify/src/complex/ObjectRenderer.vue
index ea767759ff..81d0f7f4da 100644
--- a/packages/vue-vuetify/src/complex/ObjectRenderer.vue
+++ b/packages/vue-vuetify/src/complex/ObjectRenderer.vue
@@ -10,13 +10,14 @@
:cells="control.cells"
/>
diff --git a/packages/vue-vuetify/src/extended/AutocompleteEnumControlRenderer.vue b/packages/vue-vuetify/src/extended/AutocompleteEnumControlRenderer.vue
index 5654529230..9608262d73 100644
--- a/packages/vue-vuetify/src/extended/AutocompleteEnumControlRenderer.vue
+++ b/packages/vue-vuetify/src/extended/AutocompleteEnumControlRenderer.vue
@@ -65,7 +65,7 @@ import { defineComponent } from 'vue';
import { VAutocomplete, VSelect } from 'vuetify/components';
import { default as ControlWrapper } from '../controls/ControlWrapper.vue';
import { DisabledIconFocus } from '../controls/directives';
-import { useVuetifyControl } from '../util';
+import { determineClearValue, useVuetifyControl } from '../util';
const controlRenderer = defineComponent({
name: 'autocomplete-enum-control-renderer',
@@ -81,9 +81,10 @@ const controlRenderer = defineComponent({
...rendererProps(),
},
setup(props: RendererProps) {
+ const clearValue = determineClearValue('');
return useVuetifyControl(
useJsonFormsEnumControl(props),
- (value) => (value !== null ? value : undefined),
+ (value) => (value === null ? clearValue : value),
300,
);
},
diff --git a/packages/vue-vuetify/src/extended/AutocompleteOneOfEnumControlRenderer.vue b/packages/vue-vuetify/src/extended/AutocompleteOneOfEnumControlRenderer.vue
index e7eb31339f..03e9ed970a 100644
--- a/packages/vue-vuetify/src/extended/AutocompleteOneOfEnumControlRenderer.vue
+++ b/packages/vue-vuetify/src/extended/AutocompleteOneOfEnumControlRenderer.vue
@@ -65,7 +65,7 @@ import { defineComponent } from 'vue';
import { VAutocomplete, VSelect } from 'vuetify/components';
import { default as ControlWrapper } from '../controls/ControlWrapper.vue';
import { DisabledIconFocus } from '../controls/directives';
-import { useVuetifyControl } from '../util';
+import { determineClearValue, useVuetifyControl } from '../util';
const controlRenderer = defineComponent({
name: 'autocomplete-oneof-enum-control-renderer',
@@ -81,9 +81,10 @@ const controlRenderer = defineComponent({
...rendererProps(),
},
setup(props: RendererProps) {
+ const clearValue = determineClearValue('');
return useVuetifyControl(
useJsonFormsOneOfEnumControl(props),
- (value) => (value !== null ? value : undefined),
+ (value) => (value === null ? clearValue : value),
300,
);
},
diff --git a/packages/vue-vuetify/src/layouts/ArrayLayoutRenderer.vue b/packages/vue-vuetify/src/layouts/ArrayLayoutRenderer.vue
index f39a94e366..b0263a00c3 100644
--- a/packages/vue-vuetify/src/layouts/ArrayLayoutRenderer.vue
+++ b/packages/vue-vuetify/src/layouts/ArrayLayoutRenderer.vue
@@ -70,11 +70,13 @@
>
-
-
+
+
@@ -265,13 +267,11 @@