1+ function clone ( obj ) {
2+ if ( null == obj || "object" != typeof obj ) return obj ;
3+ var copy = obj . constructor ( ) ;
4+ for ( var attr in obj ) {
5+ if ( obj . hasOwnProperty ( attr ) ) copy [ attr ] = obj [ attr ] ;
6+ }
7+ return copy ;
8+ }
9+
110var app = new Vue ( {
211 el : '#app' ,
312 data : {
4- message : 'Hello Vue! ' ,
13+ code : '' ,
514 theme : 'bootstrap' ,
615 method : 'get' ,
7- fld : [ ] ,
16+ old : '' ,
17+ flds : [ ] ,
818 typ : [
919 'row' ,
1020 'input' ,
11- 'select'
21+ 'select' ,
22+ 'submit'
1223 ] ,
1324 raw : {
1425 type : 'input' ,
1526 name : '' ,
27+ label : '' ,
1628 size : 12 ,
1729 id : '' ,
30+ options : ''
1831 }
1932 } ,
2033 mounted ( ) {
2134 // sematicui
22- $ ( '.ui.dropdown' ) . dropdown ( ) ;
35+ this . initSemanticui ( ) ;
2336
2437 } , computed : {
2538 siz : function ( ) {
@@ -28,6 +41,133 @@ var app = new Vue({
2841 }
2942 return [ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 ] ;
3043 }
44+ } , methods : {
45+
46+ makeLabel : function ( field , inp ) {
47+
48+ var out = '' ;
49+ if ( field . id . trim ( ) == '' ) {
50+ field . id = field . name ;
51+ }
52+
53+ out += `\t\t <div class="col-md-${ field . size } ">\n` ;
54+
55+ out += `\t\t\t <label for="${ field . id } "> \n` ;
56+ out += `\t\t\t\t {{_('${ field . label } ')}} \n` ;
57+ out += `\t\t\t </label> \n` ;
58+
59+ out += inp ;
60+ out += `\t\t </div>\n` ;
61+ return out ;
62+ } ,
63+ generateForm : function ( ) {
64+ var out = '' ;
65+ var hasRowBefore = false ;
66+ // make method
67+ var method = 'get' ;
68+ var extMethod = '' ;
69+ if ( this . method != 'get' ) {
70+ method = 'post' ;
71+ if ( this . method != 'post' ) {
72+ extMethod = `@method('${ this . method . toUpperCase ( ) } ')` ;
73+ }
74+ }
75+ // make class
76+ var formClass = '' ;
77+ var generalClass = '' ;
78+ var rowClass = '' ;
79+ if ( this . theme == 'bootstrap' ) {
80+ generalClass = 'form-control' ;
81+ rowClass = 'form-group row' ;
82+ }
83+
84+ // make form html
85+ out += `<form method="${ method } " action=""> \n` ;
86+ out += `\t @csrf \n` ;
87+ out += `\t ${ extMethod } \n` ;
88+ for ( const i in this . flds ) {
89+ var field = this . flds [ i ] ;
90+ switch ( field . type ) {
91+ case "row" :
92+ if ( hasRowBefore ) {
93+ out += `\t </div>\n` ;
94+ } else {
95+ hasRowBefore = true ;
96+ }
97+ out += `\t <div class="${ rowClass } ">\n` ;
98+ break ;
99+ case 'input' :
100+ var old = '' ;
101+ if ( this . old . trim ( ) !== '' ) {
102+ old = ',' + this . old . replace ( '#name' , field . name ) ;
103+ }
104+ if ( this . theme == 'bootstrap' ) {
105+ var genClass = generalClass + ` @error('${ field . name } ') is-invalid @enderror` ;
106+ } else {
107+ var genClass = generalClass ;
108+ }
109+ var inp = `\t\t\t <input type="${ field . option } " class="${ genClass } " placeholder="{{_('${ field . label } ')}}" value="{{old('${ field . name } '${ old } )}}" /> \n` ;
110+ out += this . makeLabel ( field , inp ) ;
111+ break ;
112+ case 'select' :
113+ var old = '' ;
114+
115+ if ( this . theme == 'bootstrap' ) {
116+ var genClass = generalClass + ` @error('${ field . name } ') is-invalid @enderror` ;
117+ } else {
118+ var genClass = generalClass ;
119+ }
120+ var inp = `\t\t\t <select id="${ field . id } " class="${ genClass } " > \n` ;
121+ try {
122+ var ops = field . option . split ( ':' ) ;
123+ var rs = ops [ 0 ] ;
124+ var r = ops [ 1 ] ;
125+ var key = ops [ 2 ] ;
126+ var title = ops [ 3 ] ;
127+ } catch ( e ) {
128+ alert ( 'invalide options for ' + field . name ) ;
129+ }
130+
131+ if ( this . old . trim ( ) !== '' ) {
132+ old = ',' + this . old . replace ( '#name' , field . name ) ;
133+ old = ` @if (old('${ field . name } '${ old } ) == ${ r } ->${ key } ) selected @endif` ;
134+ } else {
135+ old = ` @if (old('${ field . name } ') == ${ r } ->${ key } ) selected @endif` ;
136+ }
137+ inp += `\t\t\t\t @foreach(${ rs } as ${ r } ) \n` ;
138+ inp += `\t\t\t\t\t <option value="{{ ${ r } ->${ key } }}" ${ old } > {{${ r } ->${ title } }} </option> \n` ;
139+ inp += `\t\t\t\t @endforeach \n` ;
140+
141+ out += this . makeLabel ( field , inp ) ;
142+ break ;
143+ case 'submit' :
144+ out += `\t\t <div class="col-md-${ field . size } ">\n` ;
145+
146+ out += `\t\t\t <label> </label> \n` ;
147+ var genClass = 'btn btn-primary mt-2' ;
148+ out += `\t\t\t <input type="submit" class="${ genClass } " value="{{_('${ field . label } ')}}" /> \n` ;
149+ out += `\t\t </div>\n` ;
150+ break ;
151+ }
152+ }
153+
154+ if ( hasRowBefore ) {
155+ out += `\t </div> \n` ;
156+ }
157+
158+ out += `</form>` ;
159+
160+ $ ( "#code" ) . text ( out ) ;
161+ } ,
162+ addField : function ( ) {
163+ this . flds . push ( clone ( this . raw ) ) ;
164+ this . initSemanticui ( ) ;
165+ } ,
166+ initSemanticui : function ( ) {
167+ setTimeout ( function ( ) {
168+ $ ( '.ui.dropdown' ) . dropdown ( ) ;
169+ } , 200 ) ;
170+ }
31171 }
32172} ) ;
33173
0 commit comments