|
|
|
@ -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 |
|
|
|
@ -10,10 +13,16 @@ def mainBuilder(classlist): |
|
|
|
|
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 = "" |
|
|
|
@ -38,18 +47,156 @@ def mainBuilder(classlist): |
|
|
|
|
""" |
|
|
|
|
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'), |
|
|
|
|
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'), |
|
|
|
|
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<List<{classname}>> 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<Form{}State> _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<String>( |
|
|
|
@ -68,6 +215,9 @@ def mainBuilder(classlist): |
|
|
|
|
), |
|
|
|
|
""".format(items="','".join(field.get('choices')), name=field.get('name')) |
|
|
|
|
elif field.get('type') == 'String': |
|
|
|
|
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}"), |
|
|
|
@ -79,6 +229,10 @@ def mainBuilder(classlist): |
|
|
|
|
), |
|
|
|
|
""".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}"), |
|
|
|
@ -97,18 +251,37 @@ def mainBuilder(classlist): |
|
|
|
|
# print(field) |
|
|
|
|
# # exit() |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
cls_text = """ |
|
|
|
|
{imports} |
|
|
|
|
class Form{classname} extends StatefulWidget {{ |
|
|
|
|
final Function onSave; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const Form{classname}({{Key key, this.onSave}}) : super(key: key); |
|
|
|
|
@override |
|
|
|
|
_Form{classname} createState() => _Form{classname}(); |
|
|
|
|
Form{classname}State createState() => Form{classname}State(); |
|
|
|
|
}} |
|
|
|
|
class _Form{classname} extends State<Form{classname}> {{ |
|
|
|
|
class Form{classname}State extends State<Form{classname}> {{ |
|
|
|
|
{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<FormState>(); |
|
|
|
|
@override |
|
|
|
@ -129,13 +302,24 @@ class _Form{classname} extends State<Form{classname}> {{ |
|
|
|
|
mainAxisAlignment: MainAxisAlignment.center, |
|
|
|
|
children: <Widget>[ |
|
|
|
|
{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.write(cls_text) |
|
|
|
@ -144,3 +328,4 @@ import os |
|
|
|
|
os.chdir('../') |
|
|
|
|
print(os.getcwd()) |
|
|
|
|
mainBuilder([User, Payments, Account]) |
|
|
|
|
os.system("flutter format flutter_out/") |