From 739497f824ef2d6aaaa31b28a0b22593baeb7e74 Mon Sep 17 00:00:00 2001 From: Mustafa Yontar Date: Fri, 12 Feb 2021 19:31:44 +0300 Subject: [PATCH] form generator , reference fields, list embeded fields , embeded fields created. --- scripts/generate_flutter_forms.py | 369 ++++++++++++++++++++++-------- 1 file changed, 277 insertions(+), 92 deletions(-) diff --git a/scripts/generate_flutter_forms.py b/scripts/generate_flutter_forms.py index bf539d4..c297498 100644 --- a/scripts/generate_flutter_forms.py +++ b/scripts/generate_flutter_forms.py @@ -1,3 +1,6 @@ +from random import randint, choice +from string import ascii_lowercase + from models.Account import Account from models.Payment import Payments from models.User import User @@ -7,13 +10,19 @@ from scripts.generate_flutter_model import build_class def mainBuilder(classlist): blist = [] for cls in classlist: - data = build_class(cls,blist) + data = build_class(cls, blist) blist = blist + data[1] clstypeList = [i.__class__.__name__ for i in blist] - + configlistNames = [] for classItem in data[0]: + saveAction = "" + imports = "import 'package:flutter/material.dart';\n" imports += "import 'package:flutter/services.dart';\n" + imports += "import 'package:dio/dio.dart';\n" + imports += "import 'package:horde/widgets/HorusBox.dart';\n" + imports += "import 'package:dropdown_search/dropdown_search.dart';\n" + imports += "import '../Models.dart';\n" controller = "" controllerInit = "" controllerDispose = "" @@ -29,118 +38,294 @@ def mainBuilder(classlist): req = "" if field.get('required'): req = """ - validator: (value) { - if (value.isEmpty) { - return 'Please enter some text'; - } - return null; - }, - """ + validator: (value) { + if (value.isEmpty) { + return 'Please enter some text'; + } + return null; + }, + """ if field.get("is_class"): - imports += "import 'package:adunationfe/data/forms/Form{}.dart';\n".format(field.get('class_name')) - imports += "import 'package:adunationfe/data/models/{}.dart';\n".format(field.get('class_name')) + # imports += "import 'package:adunationfe/data/models/{}.dart';\n".format(field.get('class_name')) if field.get('islist'): - controller += "\t\tList<{classname}> item{name};\n".format(classname=field.get('class_name'), - name=field.get('name')) - controllerInit += "\t\t\titem{name} = [];\n".format(name=field.get('name')) - else: + if field.get('embeded') == False: + controller += "\t\tList<{classname}> item{name};\n".format( + classname=field.get('class_name'), + name=field.get('name')) + controllerInit += "\t\t\titem{name} = [];\n".format(name=field.get('name')) + saveAction += "\t\tnew{classname}.{name} = item{name};\n".format(name=field.get('name'), + classname=classItem.get( + 'class')) + else: + imports += "import 'Form{}.dart';\n".format( + field.get('class_name')) + if field.get('class_name') not in configlistNames: + clsname = field.get('class_name') + configlistNames.append(field.get('class_name')) + else: + clsname = field.get('class_name') + ''.join( + [choice(ascii_lowercase) for i in range(randint(3, 6))]) + while clsname in configlistNames: + clsname = field.get('class_name') + ''.join( + [choice(ascii_lowercase) for i in range(randint(3, 6))]) + configlistNames.append(clsname) + saveAction += "\t\tnew{classname}.{name} = item{clist}List;\n".format(clist=clsname, + name=field.get( + 'name'), + classname=classItem.get( + 'class')) + controller += """ + List<{originclass}> item{classname}List = []; + + """.format(originclass=field.get("class_name"), classname=clsname) + textFields += """ + Padding(padding: EdgeInsets.only(left:40,right: 40), + child: Column( + children: [ + Text('{cname} list'), + Column( + children: List.generate(item{clsname}List.length, (index) {{ + return HorusBox( + child: + Row( + children: [ + Expanded(child: Text(item{clsname}List[index].name)), + GestureDetector( + onTap: () {{ + item{clsname}List.removeAt(index); + setState(() {{ + }}); + }}, + child: Icon(Icons.delete), + ) + + ], + ) + , + ); + }}), + ) + ], + ), + + ), + + ElevatedButton(onPressed: () + {{ + _showMaterialDialog(SingleChildScrollView(child:Container(width:500,height:500,child:new Form{classname}(onSave: ({classname} item) {{ + item{clsname}List.add(item); + Navigator.pop(context); + setState(() {{ + }}); + }}))),"Create {cname}"); + + + + }}, child: Text('Add {cname}')), + SizedBox( + height: 15, + ), + + """.format(classname=field.get('class_name'), cname=field.get('name'), clsname=clsname) + elif field.get("embeded") == False: controller += "\t\t{classname} item{name};\n".format(classname=field.get('class_name'), - name=field.get('name')) - controllerInit += "\t\t\titem{name} = {classname}();\n".format(classname=field.get('class_name'), - name=field.get('name')) + name=field.get('name')) + saveAction += "\t\tnew{classname}.{name} = item{name};\n".format(name=field.get('name'), + classname=classItem.get( + 'class')) + + controllerInit += "\t\t\titem{name} = {classname}();\n".format( + classname=field.get('class_name'), + name=field.get('name')) + + controller += "\t\tList<{classname}> {cname}List = [];".format( + classname=field.get('class_name'), cname=field.get('name')) + + controller += """ + Future> getData{classname}(filter) async {{ + print(filter); + var response = await Dio().get( + "${{apiurl}}/{cname}", + queryParameters: {{"{search}__contains": filter}}, + ); + List<{classname}> models = []; + response.data.forEach((element) {{ + {classname} cn = {classname}(); + cn.name = element['{search}']; + models.add(cn); + }}); + + return models; + }} + """.format(classname=field.get('class_name'), cname=field.get('name'), + search=field.get('search_field')) + textFields += """ + DropdownSearch<{classname}>( + mode: Mode.BOTTOM_SHEET, + showSearchBox: true, + onFind: (String filter) => getData{classname}(filter), + items: [], + itemAsString: ({classname} u) => u.{search}, + isFilteredOnline: true, + autoValidateMode: AutovalidateMode.onUserInteraction, + validator: ({classname} u) => + u == null ? "field is required " : null, + hint: "{cname} in menu mode", + onChanged: ({classname} selected) {{ + item{cname} = selected; + setState(() {{ + }}); + }}), + SizedBox( + height: 15, + ), + """.format(classname=field.get('class_name'), cname=field.get('name'), + search=field.get('search_field')) + elif field.get("embeded"): + imports += "import 'Form{}.dart';\n".format( + field.get('class_name')) + saveAction += "\t\tif(!_key{classname}.currentState.build{classname}()) return false;\n".format( + classname=field.get('class_name')) + saveAction += "\t\tnew{cname}.{name} = _key{classname}.currentState.new{classname};\n".format( + classname=field.get('class_name'), name=field.get('name'), cname=classItem.get('class')) + + textFields += "Form{classname}(key:_key{classname}),".format(classname=field.get('class_name')) + controller += "\tGlobalKey _key{} = GlobalKey();\n".format(field.get('class_name'), + field.get('class_name')) elif field.get('choices'): + saveAction += "\t\tnew{classname}.{name} = _{name}.text;\n".format(name=field.get('name'), + classname=classItem.get('class')) + imports += "import 'package:dropdown_search/dropdown_search.dart';\n" textFields += """ - DropdownSearch( - mode: Mode.BOTTOM_SHEET, - showClearButton: true, - showSearchBox: true, - label: '{name}', - showSelectedItem: true, - items: ['{items}'], - hint: "country in menu mode", - onChanged: print, - selectedItem: "") - , - SizedBox( - height: 15, - ), - """.format(items = "','".join(field.get('choices')),name=field.get('name')) + DropdownSearch( + mode: Mode.BOTTOM_SHEET, + showClearButton: true, + showSearchBox: true, + label: '{name}', + showSelectedItem: true, + items: ['{items}'], + hint: "country in menu mode", + onChanged: print, + selectedItem: "") + , + SizedBox( + height: 15, + ), + """.format(items="','".join(field.get('choices')), name=field.get('name')) elif field.get('type') == 'String': - textFields +=""" - new TextFormField( - decoration: new InputDecoration(labelText: "Enter your {name}"), - controller: _{name}, - {req} - ), - SizedBox( - height: 15, - ), - """.format(name=field.get('name'),req=req) + saveAction += "\t\tnew{classname}.{name} = _{name}.text;\n".format(name=field.get('name'), + classname=classItem.get('class')) + + textFields += """ + new TextFormField( + decoration: new InputDecoration(labelText: "Enter your {name}"), + controller: _{name}, + {req} + ), + SizedBox( + height: 15, + ), + """.format(name=field.get('name'), req=req) elif field.get('type') == 'int': + saveAction += "\t\tnew{classname}.{name} = int.tryParse(_{name}.text);\n".format( + name=field.get('name'), + classname=classItem.get('class')) + textFields += """ - new TextFormField( - decoration: new InputDecoration(labelText: "Enter your {name}"), - controller: _{name}, - keyboardType: TextInputType.number, - inputFormatters: < TextInputFormatter > [ - FilteringTextInputFormatter.digitsOnly - ], - {req} - ), - SizedBox( - height: 15, - ), - """.format(name=field.get('name'),req=req) + new TextFormField( + decoration: new InputDecoration(labelText: "Enter your {name}"), + controller: _{name}, + keyboardType: TextInputType.number, + inputFormatters: < TextInputFormatter > [ + FilteringTextInputFormatter.digitsOnly + ], + {req} + ), + SizedBox( + height: 15, + ), + """.format(name=field.get('name'), req=req) # elif field.get('is_class'): # print(field) # # exit() + cls_text = """ + {imports} + class Form{classname} extends StatefulWidget {{ + final Function onSave; - - cls_text = """ -{imports} -class Form{classname} extends StatefulWidget {{ - - @override - _Form{classname} createState() => _Form{classname}(); -}} -class _Form{classname} extends State {{ -{controller} - - final _{classname} = GlobalKey(); - @override - void initState() {{ -{initdata} - super.initState(); - }} - @override - void dispose() {{ -{dispose} - super.dispose(); - }} - @override - Widget build(BuildContext context) {{ - return new Form( - key:_{classname}, - child:new Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - {textfield} - ]) - ); + const Form{classname}({{Key key, this.onSave}}) : super(key: key); + @override + Form{classname}State createState() => Form{classname}State(); }} + class Form{classname}State extends State {{ + {controller} + var apiurl = ""; + {classname} new{classname} = new {classname}(); -}} + bool build{classname}() {{ + if (_{classname}.currentState.validate()) {{ + {saveact} + widget.onSave(new{classname}); + return true; + }} + return false; + }} + _showMaterialDialog(content, title) {{ + showDialog( + context: context, + builder: (_) => new AlertDialog( + title: new Text(title), + content: content, + )); + }} + + final _{classname} = GlobalKey(); + @override + void initState() {{ + {initdata} + super.initState(); + }} + @override + void dispose() {{ + {dispose} + super.dispose(); + }} + @override + Widget build(BuildContext context) {{ + return new Form( + key:_{classname}, + child:new Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + {textfield} + Row( + children: [ + widget.onSave !=null ? ElevatedButton( + child: Text('Save'), + onPressed: () {{ + build{classname}(); + }}, + ): Center() + ], + ) + ]) + ); + }} + + }} - """.format(imports=imports,classname=classItem.get('class'),controller=controller,initdata=controllerInit,dispose=controllerDispose,textfield=textFields) + """.format(imports=imports, classname=classItem.get('class'), controller=controller, + initdata=controllerInit, dispose=controllerDispose, textfield=textFields, saveact=saveAction) - f = open("flutter_out/Form{}.dart".format(classItem.get('class')),"w+") + f = open("flutter_out/Form{}.dart".format(classItem.get('class')), "w+") f.write(cls_text) f.close() import os os.chdir('../') print(os.getcwd()) -mainBuilder([User, Payments, Account]) \ No newline at end of file +mainBuilder([User, Payments, Account]) +os.system("flutter format flutter_out/") \ No newline at end of file