From e5a6527d18038d7e74ffb3c171f53ae8b6291b25 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Hru=C5=A1ka?= Date: Sat, 4 Aug 2018 11:48:35 +0200 Subject: [PATCH] simple vue-based column editor --- .env.example | 2 - app/Http/Controllers/TableController.php | 43 +++--- app/helpers.php | 24 +++ config/app.php | 1 - porklib/Providers/BladeExtensionsProvider.php | 6 +- public/fonts/fa-dtbl-1-preview.html | 144 ++++++++++++------ public/fonts/fa-dtbl-1.css | 51 ++++--- public/fonts/fa-dtbl-1.eot | Bin 9364 -> 9984 bytes public/fonts/fa-dtbl-1.svg | 63 ++++---- public/fonts/fa-dtbl-1.ttf | Bin 9184 -> 9804 bytes public/fonts/fa-dtbl-1.woff2 | Bin 4656 -> 4996 bytes resources/assets/js/app.js | 25 ++- .../assets/js/components/ColumnEditor.vue | 89 +++++++++++ .../assets/js/components/ExampleComponent.vue | 23 --- resources/assets/js/components/Icon.vue | 21 +++ resources/assets/js/components/_base.scss | 1 + resources/assets/sass/_bootstrap-base.scss | 5 + resources/assets/sass/_bootstrap.scss | 6 +- resources/assets/sass/_mixins.scss | 55 +++++++ .../bootstrap-customizations/_variables.scss | 5 +- resources/views/form/input.blade.php | 4 +- resources/views/table/create.blade.php | 31 +++- 22 files changed, 422 insertions(+), 177 deletions(-) create mode 100644 resources/assets/js/components/ColumnEditor.vue delete mode 100644 resources/assets/js/components/ExampleComponent.vue create mode 100644 resources/assets/js/components/Icon.vue create mode 100644 resources/assets/js/components/_base.scss create mode 100644 resources/assets/sass/_bootstrap-base.scss create mode 100644 resources/assets/sass/_mixins.scss diff --git a/.env.example b/.env.example index 355194e..bb9353a 100644 --- a/.env.example +++ b/.env.example @@ -38,8 +38,6 @@ MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}" MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}" -PRETTY_JSON=true - OAUTH_GITHUB_ID= OAUTH_GITHUB_SECRET= OAUTH_GITHUB_REDIRECT=https://datatable.directory/auth/github/callback diff --git a/app/Http/Controllers/TableController.php b/app/Http/Controllers/TableController.php index 60e21d8..0a621c3 100644 --- a/app/Http/Controllers/TableController.php +++ b/app/Http/Controllers/TableController.php @@ -72,19 +72,22 @@ class TableController extends Controller */ public function create() { - $exampleColumns = - "latin,string,Latin Name\n" . - "common,string,Common Name\n" . - "lifespan,int,Lifespan (years)"; - $exampleData = "Mercenaria mercenaria,hard clam,40\n" . "Magallana gigas,pacific oyster,30\n" . "Patella vulgata,common limpet,20"; - return view('table.create', - compact('exampleColumns', 'exampleData') - ); + $columns = Column::columnsFromJson([ + ['name' => 'latin', 'type' => 'string', 'title' => 'Latin Name'], + ['name' => 'common', 'type' => 'string', 'title' => 'Common Name'], + ['name' => 'lifespan', 'type' => 'int', 'title' => 'Lifespan (years)'] + ]); + + return view('table.create', [ + 'exampleColumns' => '', + 'columns' => $columns, + 'exampleData' => $exampleData, + ]); } public function settings(Request $request, User $user, string $table) @@ -141,7 +144,7 @@ class TableController extends Controller 'description' => ['nullable', VALI_TEXT], 'license' => ['nullable', VALI_TEXT], 'origin' => ['nullable', VALI_TEXT], - 'columns' => 'required|string', + 'columns' => 'required|json', 'data' => 'string|nullable', ]); @@ -156,28 +159,24 @@ class TableController extends Controller /** @var Column[] $columns */ $columns = []; $column_keys = []; // for checking duplicates - $colTable = array_map('str_getcsv', explode("\n", $input->columns)); + $colsArray = fromJSON($input->columns); // prevent griefing via long list of columns - if (count($colTable) > 100) return $this->backWithErrors(['columns' => "Too many columns"]); + if (count($colsArray) > 100) return $this->backWithErrors(['columns' => "Too many columns"]); - foreach ($colTable as $col) { - $col = array_map('trim', $col); - if (count($col) < 2 || strlen($col[0])==0) { + foreach ($colsArray as $col) { + if (!isset($col->name) || !isset($col->type) || empty($col->name) || empty($col->type)) { return $this->backWithErrors(['columns' => "All columns must have at least name and type."]); } try { - if (in_array($col[0], $column_keys)) { - return $this->backWithErrors(['columns' => "Duplicate column: $col[0]"]); + if (in_array($col->name, $column_keys)) { + return $this->backWithErrors(['columns' => "Duplicate column: $col->name"]); } - $column_keys[] = $col[0]; + $column_keys[] = $col->name; - $columns[] = new Column([ - 'name' => $col[0], - 'type' => $col[1], - 'title' => count($col) >= 3 ? $col[2] : $col[0], // title falls back to =name if not specified, - ]); + if (!isset($col->title)) $col->title = $col->name; + $columns[] = new Column($col); } catch (\Exception $e) { return $this->backWithErrors(['columns' => $e->getMessage()]); } diff --git a/app/helpers.php b/app/helpers.php index dacd548..178ffa1 100644 --- a/app/helpers.php +++ b/app/helpers.php @@ -67,3 +67,27 @@ function vali($arr) { } return $result; } + + + +/** + * like old(), but decodes stringified json + * + * @param string $name + * @param object|array $default + * @return object|array + */ +function old_json($name, $default) { + $old = old($name, null); + if (is_string($old)) return json_decode($old); + return $default; +} + +// Safe JSON funcs +function toJSON($object) { + return \GuzzleHttp\json_encode($object, JSON_UNESCAPED_SLASHES + JSON_UNESCAPED_UNICODE); +} + +function fromJSON($object, $assoc=false) { + return \GuzzleHttp\json_decode($object, $assoc); +} diff --git a/config/app.php b/config/app.php index 13c3b78..692b7d2 100644 --- a/config/app.php +++ b/config/app.php @@ -222,7 +222,6 @@ return [ ], // -------------- added keys -------------- - 'pretty_json' => env('PRETTY_JSON', false), 'debug_blacklist' => [ '_COOKIE' => array_keys($_COOKIE), diff --git a/porklib/Providers/BladeExtensionsProvider.php b/porklib/Providers/BladeExtensionsProvider.php index 8aff1e5..a0c34cf 100644 --- a/porklib/Providers/BladeExtensionsProvider.php +++ b/porklib/Providers/BladeExtensionsProvider.php @@ -44,11 +44,7 @@ class BladeExtensionsProvider extends ServiceProvider // json encode Blade::directive('json', function ($x) { - if (config('app.pretty_json')) { - return ""; - } else { - return ""; - } + return ""; }); // json encode, escaped diff --git a/public/fonts/fa-dtbl-1-preview.html b/public/fonts/fa-dtbl-1-preview.html index c171c3a..60afadf 100644 --- a/public/fonts/fa-dtbl-1-preview.html +++ b/public/fonts/fa-dtbl-1-preview.html @@ -166,6 +166,7 @@ .fa-code-fork:before, .fa-comment:before, .fa-download:before, +.fa-exclamation-triangle:before, .fa-eye:before, .fa-facebook-square:before, .fa-floppy-o:before, @@ -178,6 +179,7 @@ .fa-key-modern:before, .fa-link:before, .fa-pencil:before, +.fa-plus:before, .fa-question-circle:before, .fa-sign-in:before, .fa-sign-out:before, @@ -185,6 +187,7 @@ .fa-star-o:before, .fa-table:before, .fa-th-list:before, +.fa-trash-o:before, .fa-user:before, .fa-user-circle-o:before, .fa-user-plus:before, @@ -209,30 +212,33 @@ .fa-code-fork:before { content: "\f102"; } .fa-comment:before { content: "\f103"; } .fa-download:before { content: "\f104"; } -.fa-eye:before { content: "\f105"; } -.fa-facebook-square:before { content: "\f106"; } -.fa-floppy-o:before { content: "\f107"; } -.fa-github:before { content: "\f108"; } -.fa-globe:before { content: "\f109"; } -.fa-google:before { content: "\f10a"; } -.fa-history:before { content: "\f10b"; } -.fa-home:before { content: "\f10c"; } -.fa-inbox:before { content: "\f10d"; } -.fa-key-modern:before { content: "\f10e"; } -.fa-link:before { content: "\f10f"; } -.fa-pencil:before { content: "\f110"; } -.fa-question-circle:before { content: "\f111"; } -.fa-sign-in:before { content: "\f112"; } -.fa-sign-out:before { content: "\f113"; } -.fa-star:before { content: "\f114"; } -.fa-star-o:before { content: "\f115"; } -.fa-table:before { content: "\f116"; } -.fa-th-list:before { content: "\f117"; } -.fa-user:before { content: "\f118"; } -.fa-user-circle-o:before { content: "\f119"; } -.fa-user-plus:before { content: "\f11a"; } -.fa-users:before { content: "\f11b"; } -.fa-wrench:before { content: "\f11c"; } +.fa-exclamation-triangle:before { content: "\f105"; } +.fa-eye:before { content: "\f106"; } +.fa-facebook-square:before { content: "\f107"; } +.fa-floppy-o:before { content: "\f108"; } +.fa-github:before { content: "\f109"; } +.fa-globe:before { content: "\f10a"; } +.fa-google:before { content: "\f10b"; } +.fa-history:before { content: "\f10c"; } +.fa-home:before { content: "\f10d"; } +.fa-inbox:before { content: "\f10e"; } +.fa-key-modern:before { content: "\f10f"; } +.fa-link:before { content: "\f110"; } +.fa-pencil:before { content: "\f111"; } +.fa-plus:before { content: "\f112"; } +.fa-question-circle:before { content: "\f113"; } +.fa-sign-in:before { content: "\f114"; } +.fa-sign-out:before { content: "\f115"; } +.fa-star:before { content: "\f116"; } +.fa-star-o:before { content: "\f117"; } +.fa-table:before { content: "\f118"; } +.fa-th-list:before { content: "\f119"; } +.fa-trash-o:before { content: "\f11a"; } +.fa-user:before { content: "\f11b"; } +.fa-user-circle-o:before { content: "\f11c"; } +.fa-user-plus:before { content: "\f11d"; } +.fa-users:before { content: "\f11e"; } +.fa-wrench:before { content: "\f11f"; } @@ -248,7 +254,7 @@
-

fa-dtbl-1 contains 29 glyphs:

+

fa-dtbl-1 contains 32 glyphs:

Toggle Preview Characters
@@ -319,6 +325,20 @@
+
+
+ PpPpPpPpPpPpPpPpPpPp +
+
+ 12141618212436486072 +
+
+ + + +
+
+
PpPpPpPpPpPpPpPpPpPp @@ -328,7 +348,7 @@
- +
@@ -341,7 +361,7 @@
- +
@@ -355,7 +375,7 @@
- +
@@ -368,7 +388,7 @@
- +
@@ -381,7 +401,7 @@
- +
@@ -394,7 +414,7 @@
- +
@@ -407,7 +427,7 @@
- +
@@ -420,7 +440,7 @@
- +
@@ -433,7 +453,7 @@
- +
@@ -446,7 +466,7 @@
- +
@@ -459,7 +479,7 @@
- +
@@ -472,7 +492,20 @@
- + +
+ + +
+
+ PpPpPpPpPpPpPpPpPpPp +
+
+ 12141618212436486072 +
+
+ +
@@ -485,7 +518,7 @@
- +
@@ -498,7 +531,7 @@
- +
@@ -511,7 +544,7 @@
- +
@@ -524,7 +557,7 @@
- +
@@ -537,7 +570,7 @@
- +
@@ -550,7 +583,7 @@
- +
@@ -563,7 +596,20 @@
- + +
+ + +
+
+ PpPpPpPpPpPpPpPpPpPp +
+
+ 12141618212436486072 +
+
+ +
@@ -576,7 +622,7 @@
- +
@@ -589,7 +635,7 @@
- +
@@ -602,7 +648,7 @@
- +
@@ -615,7 +661,7 @@
- +
@@ -628,7 +674,7 @@
- +
diff --git a/public/fonts/fa-dtbl-1.css b/public/fonts/fa-dtbl-1.css index 134b96f..2a98041 100644 --- a/public/fonts/fa-dtbl-1.css +++ b/public/fonts/fa-dtbl-1.css @@ -43,27 +43,30 @@ .fa-code-fork::before { content: "\f102"; } .fa-comment::before { content: "\f103"; } .fa-download::before { content: "\f104"; } -.fa-eye::before { content: "\f105"; } -.fa-facebook-square::before { content: "\f106"; } -.fa-floppy-o::before, .fa-save::before { content: "\f107"; } -.fa-github::before { content: "\f108"; } -.fa-globe::before { content: "\f109"; } -.fa-google::before { content: "\f10a"; } -.fa-history::before { content: "\f10b"; } -.fa-home::before { content: "\f10c"; } -.fa-inbox::before { content: "\f10d"; } -.fa-key-modern::before { content: "\f10e"; } -.fa-link::before { content: "\f10f"; } -.fa-pencil::before { content: "\f110"; } -.fa-question-circle::before { content: "\f111"; } -.fa-sign-in::before { content: "\f112"; } -.fa-sign-out::before { content: "\f113"; } -.fa-star::before { content: "\f114"; } -.fa-star-o::before { content: "\f115"; } -.fa-table::before { content: "\f116"; } -.fa-th-list::before { content: "\f117"; } -.fa-user::before { content: "\f118"; } -.fa-user-circle-o::before { content: "\f119"; } -.fa-user-plus::before { content: "\f11a"; } -.fa-users::before { content: "\f11b"; } -.fa-wrench::before { content: "\f11c"; } +.fa-exclamation-triangle::before, .fa-warning::before { content: "\f105"; } +.fa-eye::before { content: "\f106"; } +.fa-facebook-square::before { content: "\f107"; } +.fa-floppy-o::before, .fa-save::before { content: "\f108"; } +.fa-github::before { content: "\f109"; } +.fa-globe::before { content: "\f10a"; } +.fa-google::before { content: "\f10b"; } +.fa-history::before { content: "\f10c"; } +.fa-home::before { content: "\f10d"; } +.fa-inbox::before { content: "\f10e"; } +.fa-key-modern::before { content: "\f10f"; } +.fa-link::before { content: "\f110"; } +.fa-pencil::before { content: "\f111"; } +.fa-plus::before { content: "\f112"; } +.fa-question-circle::before { content: "\f113"; } +.fa-sign-in::before { content: "\f114"; } +.fa-sign-out::before { content: "\f115"; } +.fa-star::before { content: "\f116"; } +.fa-star-o::before { content: "\f117"; } +.fa-table::before { content: "\f118"; } +.fa-th-list::before { content: "\f119"; } +.fa-trash-o::before { content: "\f11a"; } +.fa-user::before { content: "\f11b"; } +.fa-user-circle-o::before { content: "\f11c"; } +.fa-user-plus::before { content: "\f11d"; } +.fa-users::before { content: "\f11e"; } +.fa-wrench::before { content: "\f11f"; } diff --git a/public/fonts/fa-dtbl-1.eot b/public/fonts/fa-dtbl-1.eot index 30831906aafe49935c8aa70ebcbe124b42646a3a..71ba15c9aff0698f1d15cb6712f4467917f0d623 100644 GIT binary patch delta 1190 zcmah|O>7%Q6n<~VyX&8L-SyfIZ4&>i|5j?<1jlxkIE_sTX^Emx6sf8NDmEb`g(NnK z6D0`Mdni2shlDLv#i^WniA1F!Q7)C09#B;wi3?Q~B{pxZAaS7LFmK-X zy>Gsmd84`UhA|;P5@0;BA>?ekg{S8>il5cDb5(#u9{_Z}IoX>o?R>NefR_lDrsm7l zCyKuXz?~;$B74_XFzH z52^N;MsAh}X+w;Xmyd94cD}Y+-`NBLc#nwnxyn?z{?*!-WN?e{*nD}l3d{H!)pf$* zh4TFLJB^>yl-6i}y;@nSEw5bqn7ph*e*#D<8t0xCcHi|3{RJ+O2!LO{IPt?jb8D~J zw1Z$N?ZAQg0JV6my)cFfcq|#wmW?GT!fA^Dn{diJ#uYGRUf@Q!)}Fb}^>Msm-seJS zn7iCr3~dEj4s~vyU0~PQpSEp57iz*2aZp?px9u10-`IB?gN|E{XU>fCy6ZjHA01aa z?z%bmqWif--QBuoyU5pDdo4p$1fX+7pdTQf%_L5uD)gW)kjHe6DVd~2h=N}^VlW^| z7>%fjWMTk^F&(gh;%>N=cHq2Dx9hRX?Ua4ekCNhM5RJ=ubsyBc9FH=Phen6Ky)P+> zWCaXe!$%#W%Oy(90jJx|?(Q3fLXWEU6bif%ip92mb-e2GSbYKB;0>@|(r;F~gJex*tVYT-sw*Zb-HznOv%;*A?SrXoP`)T})u*f+RTF10lk1NR3|qQD2r1M# z@JdC=+Yb1G+&C~K4`W5+8l?5Jl#!=g6f8O5yR zW#Pky#dB@@7vv`ogY5f*@jzUbJ72gfe_zvG3i(XNLq z8RMQo`z^o*4%T~=^Kgv4eUuBt8)hz)N}lI7>7Sy_L0T{CI?8znvsaFCf%v(t&qKd+ zd<_NstOc zORL~P#QI{CH=^#e-DAqo9|@Nr~WLc;Da5JZ9;1{S>bUft~(U zo=|-2qOqF3wP?@11p40r@SQn-ES}w(+W@2~;@Mo$Dt~n!ZUJ(Nv`p?=Er3y_1hCuW zE3;O$+-iYQe}lL>JAZvI~4VL&SrHVr^mZ z)e{VmK%cI zZ<;cbkSImf5bM6n-Kk&Dog@HXR$g5E_qKlS?Wy4HqzW10trRwm{YFFTL3cYwa(hfW zl18*GK;c8eEsse)aaKMl*5s)8DEq~CIW76@qbwoC7+8WmRw|BN9_07=4`z1y4 -Created by FontForge 20170805 at Sun Jul 29 20:18:03 2018 +Created by FontForge 20170805 at Sat Aug 4 10:56:23 2018 By ondra The Fork Awesome font is licensed under the SIL OFL 1.1 (http://scripts.sil.org/OFL). Fork Awesome is a fork based of off Font Awesome 4.7.0 by Dave Gandy. More info on licenses at https://forkawesome.github.io @@ -22,7 +22,7 @@ The Fork Awesome font is licensed under the SIL OFL 1.1 (http://scripts.sil.org/ bbox="-0.14014 -256.168 2048 1536.01" underline-thickness="89.6" underline-position="-179.2" - unicode-range="U+0020-F11C" + unicode-range="U+0020-F11F" /> - + - - - - - - - - - - - - + - - - - - - - + - - - - diff --git a/public/fonts/fa-dtbl-1.ttf b/public/fonts/fa-dtbl-1.ttf index 24830b531e66aa14f105ac91c097220181020f5d..922505025bc07b4e50ff4167e682227baa623105 100644 GIT binary patch delta 1163 zcmah|OKcle6uozzXU3n*xZ_{JN&FdqrPd^JY-gy`IHbs}qEITOs*0$J2V>$EJ2r_E zB`oR@s2<7DYx%k*dlv8>)ij9TLg{6&7rY*ib=8V%`{w6%~uQbI!T< zoj3R0c|V^1cD@M+00L-0;9Nd`{*~*UOdTLPPSufD7sir>?mOE6c#-l#v8vV|JKa41 z<_y*5iffGkWKA^y@)6CO7S)w{uScCA8mHX6SlM{n^Qilf=6|MkH_9dTEsuQdD$VWE zCsQt$nyPq{4^cB06~g6eW4*f#6yrV0Z&YeUwYjzNAvL%~`CL_9ufr<7O!ErmfhDzC zy43zINnwNTuheTRjn%b_?@}w{qu=W{M;ko-Q|^a1>{Gvkji<{1zW>0x^Us^{?rh;C zAMRI%^=TZ%wL$2!ThPYYdK-LWqE2%SvPHO+I|_jHgs2Dgk|9mkse#COD?d@-jkljJ2?P5 z1YrUol1@dBq0Eh<%ag@qhB#9(L*O~LbD*Gy7cmr+qp|2DPGizz0;kXxoc+K!tb%RV zCRinx_?74s2!tY1R^9_SD@8&Cq^bPW=MO}uQ#1nluj8X3-e%*)!%3?kkh^*z%IiZu}a+YODsvgxvc5Vc$t9nDnrk5+Z^so9 z_%F3zPkS%Al3bH^-J_<|)((CcgDjkaMY@6H;%LXww3N!wBk-{Q!<|x4a`|u~n4Cro z#-gzx$Fpw3gDy1ADJ_NM=t)dvCW4dGMxDoxG&C7-h%=(2AMhDi+t)-pAv44-9u%-W z&RY+^w(_Lr5DS-Q_uI3V3x)xv^Y*iGoQa>c=P@lhNZ_Dt=uF@K8TiF@gzi8IVLy?|)4&{_u>9$*#%Xtf*DB qaizADXe?h*mli7}{V(|wGv8QNSIUW+elzrf{vdSJ_U|S1?)(j<+4VgD delta 609 zcmYLHL1+_E5S`hd>}H!(OKhUXZP>LNnnP356_S<)D_ScAMa9w5cF>7!8PEaco6keLN6jnz*5%$b4-kzKIdglY>cK||@R?eIa9cD`x1Hx(-5$}Sjd`l^}L@N+$TJeHb!CtsZ?tM`gH^iS(R4REyPulZZ_RB?ivklrB z-kaXX-XFekU!%R({?5kT_7{2BYu^pTMf;obk@ZA`-_9Vk3&_l9#ct?e)2&z}evQ}F zSS&46NojP+RO@HqR_q3qrCPB_d;!M5f*jx0y6g+uJ3%sF5Mq$zK0PWMgRx}Hi1!ch z2fE6q^lQATYpC(M-W$YD3}6tC;xRmqAv}Q!NfYM5$Z0+udBXoh`ZT1s7D$|bKL|cm L(eVe;)-rzqCm(|H diff --git a/public/fonts/fa-dtbl-1.woff2 b/public/fonts/fa-dtbl-1.woff2 index 49d56af72df677834974ee71e58021512fe9ce91..855516621b8b0b872094bc04bc2a23fa062df914 100644 GIT binary patch literal 4996 zcmV-~6MO7;Pew8T0RR910271&4FCWD047WT023?#0RR9100000000000000000000 z0000#Mn+Uk90p(jf=UPk5eN#o5Un5!N&o>i0we>05Ck9vh&Ts=dK)btBLnqhug;37 z)_juvGr=Y@=L~UOO(sM|RXNOM-2MmWF4*)sz3{(Z z>&*q2JK!R8RD6Vqk*DwE&42LU6w!zN6PgZo2LL(%;DCjiNwT{g?wLiFD?FfFNlvbo z{E$t-inFj*aqst=%QjA)o^@a$Mvc|i4BNJmShu7}C6v1tg`t3EbM1^^^o>J}t~@)W zE;=egI6TkcH@v!ELca2cBYJM5RRi)?X55)hzG?BPc>*PlB}u=uQZ117hH5hJ3uBbF zeY14vn+Ve7BFfIZ+i+R=q!F&oN_avNI=Z@8I{ult4H+DEl17zf&D*zWJE6_?F2#nP zRqD6R2X-S}$f(}B5CxA1m1FJh%A^MB4W8q*4ftauy95Z)S}A z#rJ1%069mLXDEw{+QNtZalGka>Yb4i9#_cZ3ug$0(LPKsdL(NW-9I+gKLQrAZfnqe zBl*5;uJ4tN;DmRa!-Fsbkr@o%JjM+AG)BTqofCIa4Txc&ci<9n#nJB&5EM0mkx@3G z24+eBKx`0%+Yvv)3gIWHXW%xtT4w>dSrJA^8>AV)W^TqIyT%tI^HC>MSHXp72nuD; z=!Ig>JZP)#SVZ{em(g$=4C^ewnH50@yIRys8J)^k=iOElM<8=4K>--dgpDWh4|Pwm zXT&sg{O(CgjEoY!qvJDAsYT1VW7{5 zbR~m$R(48MV9|+-Z1c_p5N$JJ5ktUrDGgM?4%nGlIN#{FxO%V<>+L`D{%ZA@)bbFn z);$(qPtw?*5RWuY1qE#C(B}}YB<0krrpe!N8>}ONSqXbfd^W^i*lcp@@aKxt_&nDa zM?OO}1O<|jFzkgWVFl-07T04F z&%nywNNxA7rqaY#OT`visp+OyFMv(Sdu$Nyg78guT!gzSg-g*##>YE#a^rnxB#Dy1 zDEQJ-2IV~$b7%#W{Gxw4&g7=dcIL$;u+@5^9%I0 zl}_;TjTr4~g|aCa+ymiAe~O`}B}AnNP&4j6^m?N9<#ydg-DO>m*{tV7u;yk%nO^%y zzr)^&x8TCZsDiori(GPCevfCMAZk8ozFv#D*=jZPTASOuc+{MMwI)}qtE1I)i?z1m zkQSTGxJKXQ%Y5VQ+i)@G-z_bz5S~d2OgCW3Y9;XZyR7R5UWCE!xeM!*kx)2F&9WMd z+k42Hkv$em&sB>VYscEKGQIH;JI`Ry>$!T11(?-(%HQmCI=MaO=2h7N9%VqADQZme zU~|I-+~-0EZiIqb`9|C6meaP2Uj`0&YvCqAzr8$jlfDPy>Uppsi zU%DodCRFZ(btG9sQ3&CpWy0vwHRB|?vBKCYP?`_}FFcPsoqSJ~qt@9cVY+S@qT$OO zvFPwGQRN<(CBSq=5}|1XuE92g4K%ukU=1c{?{0%quIIu!{=N!5-^kB?g-SaSi$Yf) z;N}{dH4LMXpUKS77Zn*OV`q9*o%Z!C%4vOqu!%e6f2At_uF%NJ}lyhoPNMdzt{ zV0k$~R?+!Z((<#;5OcQX-qIB3WoD=fGxBpecW@>1+oU7C4a19ur&Z`#P3=z6Y0?#R_GW}lw02Z8 z6h=N>&s77OJ_C}a^GUERlxHYAIyXy&pfY9E5HZ|EQy^56lAzwm-!Eg<4VW6^ZbvbP6lPyL`mfTEs0BL}u6|f3g%Emz z41c;mi@gK7IOvS!}*=dOCfn33svX+F)JXo=-`FYWOtL&zux?8H(kRZK<&=1)*Dgub4SMiaBM6UzbimaYZ%Xv4{w6DAFp=ByTY z`>mErfw{S!AQ01zNIqYgj?#v^!onFshEy=f&ZVU%%{YkxKt~H3iG7%M1Bk?}UmuqN zY=+{PssvJM?yYjo#6r+qAgjDL((10V)RnYVFjG$4qKvCh=%?={MKy@EFu<}r=w+;F`t}F=`hv^9w%ULU^u?j~R8*9+c5j$eR4Lj9 zz(j1#XAO;}HdABc({asYmhZPCBb>z?S>an>Z!s7RL<2z=9R;{h3c7}w-KLrFsX?{u z`*h=dyCm>eMdhJB!V^hot= zI`Zfj8+uF}8aTc(cSU`sKqZlG64juUn-r0mvv*xBjVV@c3%I>4;P1`5XJ4JYD>8GF zq7oJ1t2e78nS%QK8HsEEN|cIA=JhXH$on&UsGwkLztMQ>lQeoFNY9T31)dyJ&leja zk4`^(r1DC~m(=T{BaiE^Dw=f#s9Bf$PC#A5egafE?l)FBu7TyxXzxt^I)bnu2Eu}l z2mG<*=bs3_?Jp_+fa419|Ce)+8T&YKK>;-xSyRV2$ELED;b<2tXm8gEP7=Ln=Eq(> z-sjFKo)sp4;76|xXtu2lo)>&_3nz+(FJfPCq?M}b2(Vk#SKd6+M6H2 z*~;UawQRW3wl?B_~!2V7L@NOByr`7 zOLE!BM0-%xqeoRi%Mb|V*FM{M_vzj0eOK@aT>FVH0&BpP$L3|HrDTP_DZdC-(1PRD zLhnr7c2aV*ytdT0^1Xv*zn@Ciy!E`evSd(p@Stq)DFUG!C3zQ8Qxa0e@4S7))9n`> z74K4gf@5U`oE<0Hg4B;5d6`CEq)E5Rv4J8l++Av87%=R1xFH&}>IEwceIi}CwrY&V z*mptNSXa)DRhgC4fu_fbzcT*%<-v_VDJNg^#3fT8SpBnfg-5K%^B->V3eYTQ#akoN zoUYePE(7o@`+C)(?_$gefzrSP^IX*-fTge`jsOtBhA;^TJBFB>_4w3j% z;eYnn5f0u`O0KaQv8K_zTZahbZR0j1flgsNzrNjwL^b{V3lu zIks%6Qg4y>=G~%EqDpR6SEZ-dL+p5*19+L4Uw;kHc^kuG@;mu_xF{r~2nJuty^fAJ znzXa?t@Cb4a&NEogx(&>VhQ^7SE(R_7C!niApNj|P7%b@+1OheU&{ZdGIkhx-&Fph zCBMk6%`c?0h`1ylLEQXxi{6Mn@Y^>f6-kkTUw7t7kDs_lzxQ9OUGda1_5^V4(Gn*N z3lqknf#IXWfJP1vmlTrNvrzAm7F*pj%yaFx4C&i+<8X-U4W%2G`G%S`rvYt_=fEmc zo!>H#g@pzIB{Vg^xhxm`#hby~z@52%^cxn<;;1aoJH#*lcCL;WRrT8%_ifP%k;GH3 z3Z!wk3q-vu2M-)L@NT-MM}52McJN*}gA-gByGsAxF+CV~9mYrdfA{+A;WTFaZV=yb znF;O2mdncl*ly|01^LPZL zPr7MRnwu1Rt{a_KQF3hMv696<8ps8zi|N@_6=|wSzxw0mlBD!aZCvz&!+^urHL>n~qA zwEoVnKfJ?qeg9+Ay7H!O#Z+=Y|M2fNohswCB2={PZ?}+;`eTNt|7iInpVK6tG1RzP zrFyIHsFV0~^$*`W{61+xahdwqLAAuYfLjrkFL^5^u^?vU%=w#E7+0L+w2e$w(v@w!;= z{n}FTG;n|MKBRThYE72J6_mc6zF2}%OM%ueY}B-SDBmg?~p{ z+@ocQCo-#3r&4NoZhjX<_aVPo;9akaDc)6Gy+f#-Zx@lsCjHe)QTY@Y-)jHI-_)GO z?zg-$$Gc#!W}Uj$(=GhZQSohpzz&|NDZGQQcPIY#tH@KBo>CK<{JIUfB$kb6mtjInwiluvHM**6hnj;Y5I_@9WS6vv3OC6R~cqw~e&S z%YJd?_U`}SeC!g)l9b{5&{!NN-E638F_Y9~WQ%Wg{hUsRN zq8xl}TH4HGMvSyqK{kY1Oe+TM!c&SQT3ozTM>SBR-5rywm_*9kleG;~iR6Uqti?90 zk34$RGlUH2-(z7Bk1gP*KAeliOSnX*#W7fb z`UTS8oTX(Uv?#}f2%b=6j%Qtn7ZRl{U zORQ?KDa3M>Sb8Pd5kxey4zWCBw&|p%&ac8I(m$Zh)ya8}ot`SYa44~9jNIL@Y~f21X(Q0_)yv5%C@Lvau0j>6R25ZKHC0y)vBl9$>Z&82_!7up z0SZ)*f)%1rg(v(9~`EotN>2Xuj4%PhCf<{b8Ag?`yH1_1PBmaT7+4-KX{ zegkf6hy{oM$n*tYsRaCV;C-6~gT* O2j-W}_acL7HUIz&_sn$0RR9100000000000000000000 z0000#Mn+Uk90p(jf=UPk5eN#jSgCFcL;wLc0we>01Oy-jh&u;@R~t_qv!fMk9DqpR zMIx#t%YpwQfj1Oyxd(S*U!(63%c}Ax(UDXp3~)bs z5MTm&0zsykHj>LRFep8ay#Qh)a_@x$)r$aJpx(G?XgCCx>9LK3of;7W7}1;}=yWA| z|Cvb!hT$Wi9x<6}pskM*6&l%*v!R=XSmE^R4`_i6Hnof_vAg7O3^bLPj7|ztFb9Iq zG3>x_9JY}t^xq{!dQB`6lPEQcMKUi5m^ zeOIfqM3>L0kT?_B)?^Y%M1sauzWlaJk3G-Fq$1NJLI`A?O`bhTPoGbpZ$vrIVJ0il z0Kgg9kHm$LWKl77Anz`L+QgMg%nUf#L9!r(8Ua65F4L@03p1VRL45^*49Zp6SGXqc zxDrhn_5FZeImnWCZ3-}`afWP>n0{lcOF`q#nd5&cDDV?Xw^y$WfomXef zu4~<1ha2dIF5C1XnDO;6JdJ}smVbssX9|B8{O~t%C6j?1nuSCl`XBDjK7RFCJ4AYk zFJFIB4a&jBOp>Z2U4rB~(%~)1WPk)vwIb7lHHkp7-&ZGqYLa6O*V^Z#sKQ0M#8YHv z^V6r`uHp2S8lg)=saoD;jl=W7cP~I6m4pk4fMn)v5rC`GgqC812YaSs-}Bltm4UdK z6E289(i5iF(|y#jqZzWS1`U!|n>6|HA?KYsVGhc4^gcsU6$mx78-*KKJ#ec}$h{b2 zSo#cXrsC!~0ZR!;PZ^%Ifk#q(?fZmChuuMW6B>(U!7pW{Ch z8#aqKwB19oLoU=$EgiBek#M8*0LyXGz+^U?UIlsHzG4pQq*cE6a%ENG0}85&Cz*_u za*n77Em{@k|4OE{wr0m0>0x9w5L?9a)bFXNPWK9_(7XhFWZ3yGYL_nZ%>_8qV8cI! ze1lv!JanPXS6E=tiZI-@!_t*deaURNcXz0v-7uSl`?9o)Ix9FwwW5Y>ckP8m^F!ih zS(Uf>ktIGJr{A*pW8|j~n=CnM2(I!M%AQPSkJLwI!WYumd(F#L=|VLb=2Q^RAYCY_S`cGI(awK7VE&uz0~kUTGW@}#rD`Tww@Fke#BJVCS!rGesg+2ohSJvv65gnmkG~h65C$WrF zZApoAQLRIk7 zt{P^IQJKWz@i3C9fYph|B6LjI(?#Wc8;(XIp__XmF4*o47{$QC9HC><+M?Waqi3yN zU`_ii%#JIUC!~DyjTWs%&oXJ%qQkVuf)zK7bt@OnU%qDksuc!XcoD1WCQ=xZ-F&>s zt#K{U*`79&^SLcroW#2R10VGaLh}4zPkp>_AW|pf-;)v@H{UUDU^ZwW(ZWQC2X)Gy zy#|K{Zn9glR496ywwXAK=pFEGztIB?)|`LS)6j4tvQ z!KwcoTs*$m?Ju1QwS14R$Zh4#03f2$%aO6#%4-Bfy4{3V!9E)wSKM!X(OiS}>i zYXj56W8HSMMUiyGh$Tr#72HI;Z~ig2#7jZDB>T;+u}wX`FpR|d7rYOczxGR968rc@ zR+JUZMpg_$e1~F-$o+N|t=DOp>>0mmLC$tocYW8J_v?~NcYc|_7NoFJBumr&{=~{F zylF~B6#zU$1-jJSqFbPAX}L(LVr)5Y4jv>2lc2&I4#9^*ZZbC*<{_v9RHC%*^^>uZ z3e6sZ7)=m+Gy@dqV&l2#pRT4#NgXRbT-;#7u%Rvei9fDnXX z80&#^U0mjVw)rLgWtK3&0)|tsHPIc6;R!7%mYKy(0?X(xoRS9`oShAUa^QVsmMVIC z6_>YP`%6o6S9NzEzaMWI1sNp)P>Pef<J^z=J7G~o~k-KYsPX3b_;C7t@{}LEHc`%-2NVm zO>Ehcb*U_7sg30X*STvGJqCEJPbdAcI-%V*gWT@-w8?IkvF{Jele6VQ4!w9+PlIet z&qSs>|1%@B+inQ3n;f#UZtGVe0(PXGFXDw0L-KVYq}YzM^~n$j%QTh)!-88AC5L!E zcV*Wtn%9Sk#E5C_L@ah_^ln8(u21b zx~qG8)$XAQj?!;o-|MF?o|-UzSKaM8?R}2JTTz!iV?beiY(6(Fb2}(7j}VRai)j|D z7f-KksN$$v+j?w1RwWc&sZdq!leV=<_g!>2N=Ie!wz$|xN%LER%^x(s>LLC}#r-;_ zx|AF~Yk|9_x0j_mG#{pn3ZevA#a!c&62kz)V22UGkRi9CCvu+-PgEbqtj2GnFMHSK z!)mIM#!YuV>u1i-&u5SR1M=wGb9;x*4I)0#5;O?C^8Q$=fb>BmMF(lQ{?R9&1Asgq z4e5Lv*c0hSyG8b_sycxe099~On(}{TMVx0q^R;Uc!r*<+H9x#-Z0>C`o-;PxZ8r9P zYTvV`Ilw*cLhy-qPI9TNT)Z&jb5vnr<1L$>?<3?PG-bGO!9ejJ@cyj}s$Y8WQ4WQmiLdAX-&xjF7DKD~Ic2&0!QDcWij$E;Yv zTzkcG@nEs+)yp^tfhD!MA^b>88*+xvS&^3gS$p-lvZ18R(zZhs&2|~*)D;buIx(g(s^F%yvZ=Oiz#y!-|)HQT2AVG4pU|yqHYI)on zPkduVuXSs45eEXv=nmxwHSKYrl{5BCWqo>~s37woP>E@r=2k0Zp9$G9#lb%L(CcXC zlV#44@Z`N~laPjL6O@DkD7@4VPdW^uR)p`Hys=TOo3LDSLVdzxjJcyD6a-x| zrp5iA;cioT2Q!Vjo}7zWt8E9nEzdit{l5mSOo01_^eixWA6iow?sk)xl%mvz@Cc=t zp4&~H2S}l9*rfS6SvkOGn9R1jUr$`^*qD@hZEez13J@UCSjrYVJj7@Oe$aO%)FyYm zf8Uk7b4O<~&LvMBPL;j;(3Mo%HI|IKx@Y#eUkj!#5i}F=A0^RZYfVv269~0A+XgosK}KsQyi_R(5T3o-K3=cmFTm zFTd5sL)B5U@+QQY*u%WzL(vLjVHN~A0{K%*L}noX@H<^U zEAOVH;R8^O&0kmUd;6#){} zs3=&XIu(N?biIlLiFv6k;9?R^xaSDSgi0s_F2sT5@0Ze{dw_@`+RvECBYPprsok0AfEPmXO6F@0gLyY*kooxNk(DXBX?ME`iiB&h^PM< zqkL8>pNDBWqe6tEN+QT`4Y5)^4r3nG4vyJiP>ui|&XHAIqRTJvxRXJ-@ff>fv15Bd zh7mC2h@HZQ%(AgwGK(7-6&E{}X)rfrvkW(vXVymUQG>NCF!=BunLfr*8Upm1>U@CgWsh)GDv$SEkP zsA*{F=otbYDFBW(09&9)vE+{e;$_SkYVCq#E*$&4zsK-3Ktat#&|RV^dSJ7#8q?y- zQvQrJ8*|nvCZsbrjp^AXx>f4;fPlq>#;!9feCo#89)}w6jeIeusXA!nqTS4DKEcIe m)&L`?ytH}FBOtJ10$j!RV9!G&mpue# +
+ + + + + + + + + + + + + + + + + + + + + +
NameTypeTitle
+ + + + + + + + + + + +
+
+ + + + + diff --git a/resources/assets/js/components/ExampleComponent.vue b/resources/assets/js/components/ExampleComponent.vue deleted file mode 100644 index 2805329..0000000 --- a/resources/assets/js/components/ExampleComponent.vue +++ /dev/null @@ -1,23 +0,0 @@ - - - diff --git a/resources/assets/js/components/Icon.vue b/resources/assets/js/components/Icon.vue new file mode 100644 index 0000000..d69f391 --- /dev/null +++ b/resources/assets/js/components/Icon.vue @@ -0,0 +1,21 @@ + + + diff --git a/resources/assets/js/components/_base.scss b/resources/assets/js/components/_base.scss new file mode 100644 index 0000000..f926487 --- /dev/null +++ b/resources/assets/js/components/_base.scss @@ -0,0 +1 @@ +@import "../../sass/bootstrap-base"; diff --git a/resources/assets/sass/_bootstrap-base.scss b/resources/assets/sass/_bootstrap-base.scss new file mode 100644 index 0000000..56da852 --- /dev/null +++ b/resources/assets/sass/_bootstrap-base.scss @@ -0,0 +1,5 @@ +@import "~bootstrap/scss/functions"; +@import "~bootstrap/scss/variables"; +@import "~bootstrap/scss/mixins"; +@import "mixins"; +@import "bootstrap-customizations/variables"; diff --git a/resources/assets/sass/_bootstrap.scss b/resources/assets/sass/_bootstrap.scss index 53bb168..f970e95 100644 --- a/resources/assets/sass/_bootstrap.scss +++ b/resources/assets/sass/_bootstrap.scss @@ -1,8 +1,4 @@ -@import "~bootstrap/scss/functions"; -@import "~bootstrap/scss/variables"; -@import "~bootstrap/scss/mixins"; - -@import "bootstrap-customizations/variables"; +@import "bootstrap-base"; @import "bootstrap-customizations/_helpers-before"; @import "~bootstrap/scss/root"; diff --git a/resources/assets/sass/_mixins.scss b/resources/assets/sass/_mixins.scss new file mode 100644 index 0000000..117bba1 --- /dev/null +++ b/resources/assets/sass/_mixins.scss @@ -0,0 +1,55 @@ +@function dist($x) { + @return $spacer*.25*$x; +} + +@mixin py($n) { + padding-top: dist($n); + padding-bottom: dist($n); +} + +@mixin px($n) { + padding-left: dist($n); + padding-right: dist($n); +} + +@mixin my($n) { + margin-top: dist($n); + margin-bottom: dist($n); +} + +@mixin mx($n) { + margin-left: dist($n); + margin-right: dist($n); +} + +@mixin pl($n) { + padding-left: dist($n); +} + +@mixin pr($n) { + padding-right: dist($n); +} + +@mixin pt($n) { + padding-top: dist($n); +} + +@mixin pb($n) { + padding-bottom: dist($n); +} + +@mixin ml($n) { + margin-left: dist($n); +} + +@mixin mr($n) { + margin-right: dist($n); +} + +@mixin mt($n) { + margin-top: dist($n); +} + +@mixin mb($n) { + margin-bottom: dist($n); +} diff --git a/resources/assets/sass/bootstrap-customizations/_variables.scss b/resources/assets/sass/bootstrap-customizations/_variables.scss index e58d4e8..49fd85a 100644 --- a/resources/assets/sass/bootstrap-customizations/_variables.scss +++ b/resources/assets/sass/bootstrap-customizations/_variables.scss @@ -1,7 +1,10 @@ $sp0: 0; $sp1_2: $spacer*.25; -$sp1: $spacer*.5; + +$sp1_4: $spacer*.125; +$sp2_4: $sp1_2; $sp3_4: $spacer*.75; + $sp1: $spacer*.5; $sp2: $spacer*1; $sp3: $spacer*1.5; diff --git a/resources/views/form/input.blade.php b/resources/views/form/input.blade.php index 175a395..99ff9a5 100644 --- a/resources/views/form/input.blade.php +++ b/resources/views/form/input.blade.php @@ -29,8 +29,8 @@ @if ($errors->has($w->name)) - {{ $errors->first($w->name) }} - + {{ $errors->first($w->name) }} + @endif diff --git a/resources/views/table/create.blade.php b/resources/views/table/create.blade.php index b64fb4b..9eb9602 100644 --- a/resources/views/table/create.blade.php +++ b/resources/views/table/create.blade.php @@ -30,7 +30,7 @@ ->help('If you took the data from some external site, a book, etc., write it here. URLs in a full format will be clickable.') !!} - {!! Widget::textarea('columns', 'Columns')->value($exampleColumns)->height('8em') + {{--!! Widget::textarea('columns', 'Columns')->value($exampleColumns)->height('8em') ->help('
Column parameters in CSV format: @@ -39,7 +39,34 @@
  • column data type
    int, string, float, bool
  • column title
    used for display (optional) -
  • ') !!} + ') !!--}} + +
    + +
    + + + + + @if ($errors->has('columns')) + + {{ $errors->first('columns') }} + + @endif + + @if($errors->has('columns')) + + @icon(fa-warning, sr:Validation error:) + {{$errors->first('columns')}} + + @endif +
    +
    {!! Widget::textarea('data', 'Initial data')->value($exampleData)->height('12em') ->help('