| @@ -4,6 +4,7 @@ class keyClass{ | |||
| static String duration = 'DURATION'; | |||
| static String loginId = 'LOGIN_ID'; | |||
| static String hostAddress = 'HOST'; | |||
| static String restTokenAddress = 'REST'; | |||
| static String company = 'COMPANY'; | |||
| static String user_id = 'USER'; | |||
| static String cabang_id = 'CABANG_ID'; | |||
| @@ -11,6 +12,8 @@ class keyClass{ | |||
| static String targetProccess = 'dbPath'; | |||
| static String submitProccess = 'SUBMIT'; | |||
| static String stock_id = 'STOCK_TAKING_UNIT_ID'; | |||
| static String client_credential = 'CLIENT_CREDENTIAL'; | |||
| static String rest_data = 'REST_DATA'; | |||
| } | |||
| class columnName{ | |||
| static String id = 'ID'; | |||
| @@ -2,31 +2,135 @@ import 'dart:async'; | |||
| import 'dart:convert'; | |||
| import 'dart:io'; | |||
| import 'package:flutter/services.dart'; | |||
| import 'package:http/http.dart'; | |||
| import 'package:flutter/material.dart'; | |||
| import 'package:flushbar/flushbar.dart'; | |||
| import 'package:http/io_client.dart'; | |||
| import '../main.dart'; | |||
| import 'package:location/location.dart'; | |||
| import 'package:permission_handler/permission_handler.dart' as pHandler; | |||
| // import 'package:app_settings/app_settings.dart'; | |||
| import 'Prefs.dart'; | |||
| import 'package:oauth2/oauth2.dart' as oauth2; | |||
| class Util{ | |||
| bool tokenValidity = true; | |||
| bool useLocal = false; | |||
| JsonDataPostRaw(Map jsonData, String url,{timeout:false}) async{ | |||
| getOauth2Client() async { | |||
| bool resetClient = false; | |||
| oauth2.Credentials restData = (prefs.getString(keyClass.rest_data)!=null&&prefs.getString(keyClass.rest_data).contains("accessToken"))?oauth2.Credentials.fromJson(prefs.getString(keyClass.rest_data)):null; | |||
| if(restData == null)resetClient = true; | |||
| else{ | |||
| if(DateTime.now().isAfter(restData.expiration))resetClient = true; | |||
| } | |||
| oauth2.Client client; | |||
| if(resetClient||!tokenValidity){ | |||
| final tokenEndpoint = Uri.parse(prefs.getString(keyClass.restTokenAddress)); | |||
| if(prefs.getString(keyClass.client_credential)==null){ | |||
| client = await initRest(); | |||
| } | |||
| else{ | |||
| var clients = JsonDecoder().convert(prefs.getString(keyClass.client_credential)); | |||
| client = await oauth2.clientCredentialsGrant(tokenEndpoint, clients["id"], clients["secret"],httpClient: http); | |||
| prefs.setString(keyClass.rest_data, client.credentials.toJson()); | |||
| } | |||
| } | |||
| else { | |||
| if (prefs.getString(keyClass.client_credential) == null) { | |||
| client = await initRest(); | |||
| } | |||
| else { | |||
| var clients = JsonDecoder().convert(prefs.getString(keyClass.client_credential)); | |||
| client = new oauth2.Client(restData, identifier: clients["id"], | |||
| secret: clients["secret"], | |||
| httpClient: http); | |||
| } | |||
| } | |||
| return client; | |||
| } | |||
| JsonDataPostRaw(Map jsonData, String url,{secure:true,timeout:false}) async{ | |||
| var httpClient; | |||
| const JsonDecoder decoder = const JsonDecoder(); | |||
| var headers = {'Content-type': 'application/json'}; | |||
| try { | |||
| var response; | |||
| if(secure) { | |||
| httpClient = await getOauth2Client(); | |||
| oauth2.Credentials tokenRestData = oauth2.Credentials.fromJson(prefs.getString(keyClass.rest_data)); | |||
| headers["Authorization"] = | |||
| "bearer ${tokenRestData.accessToken}"; | |||
| } | |||
| else { | |||
| httpClient = http; | |||
| } | |||
| if (timeout) | |||
| response = await http.post( | |||
| response = await httpClient.post( | |||
| Uri.parse(url), headers: headers, | |||
| body: json.encode(jsonData)).timeout( | |||
| const Duration(seconds: 10)); | |||
| else | |||
| response = await httpClient.post( | |||
| Uri.parse(url), headers: {'Content-type': 'application/json'}, | |||
| body: json.encode(jsonData)); | |||
| if(response.statusCode == 403) tokenValidity = false; | |||
| if(htmlErrorTitle(response.body.toString())!=""){ | |||
| return {"STATUS":(response.statusCode != 200)?0:1,"DATA":htmlErrorTitle(response.body.toString())}; | |||
| } | |||
| final Map data = decoder.convert(response.body); | |||
| try{data["DATA"] = decoder.convert(data["DATA"]);}catch(e){} | |||
| return data; | |||
| } on TimeoutException catch(e){ | |||
| return {"STATUS":0,"DATA":"Request Timeout"}; | |||
| } | |||
| on HandshakeException catch(e){ | |||
| if(useLocal){ | |||
| return {"STATUS":0,"DATA":"Not Connected to Server. $e"}; | |||
| } | |||
| else{ | |||
| useLocal = true; | |||
| http = IOClient(HttpClient(context: clientContext)); | |||
| return await JsonDataPostRaw(jsonData, url,timeout:timeout,secure: secure); | |||
| } | |||
| } | |||
| on Exception catch(exception){ | |||
| print(url); | |||
| // Toast("Not Connected to Server", Colors.red); | |||
| return {"STATUS":0,"DATA":"Not Connected to Server. $exception"}; | |||
| } | |||
| } | |||
| JsonDataPutRaw(Map jsonData, String url,{secure:true,timeout:false}) async{ | |||
| var httpClient; | |||
| const JsonDecoder decoder = const JsonDecoder(); | |||
| var headers = {'Content-type': 'application/json'}; | |||
| try { | |||
| var response; | |||
| if(secure) { | |||
| httpClient = await getOauth2Client(); | |||
| oauth2.Credentials tokenRestData = oauth2.Credentials.fromJson(prefs.getString(keyClass.rest_data)); | |||
| headers["Authorization"] = | |||
| "bearer ${tokenRestData.accessToken}"; | |||
| } | |||
| else { | |||
| httpClient = http; | |||
| } | |||
| if (timeout) | |||
| response = await httpClient.put( | |||
| Uri.parse(url), headers: headers, | |||
| body: json.encode(jsonData)).timeout( | |||
| const Duration(seconds: 10)); | |||
| else | |||
| response = await http.post( | |||
| response = await httpClient.put( | |||
| Uri.parse(url), headers: {'Content-type': 'application/json'}, | |||
| body: json.encode(jsonData)); | |||
| if(response.statusCode == 403) tokenValidity = false; | |||
| if(htmlErrorTitle(response.body.toString())!=""){ | |||
| return {"STATUS":(response.statusCode != 200)?0:1,"DATA":htmlErrorTitle(response.body.toString())}; | |||
| } | |||
| final Map data = decoder.convert(response.body); | |||
| try{data["DATA"] = decoder.convert(data["DATA"]);}catch(e){} | |||
| return data; | |||
| } on TimeoutException catch(e){ | |||
| return {"STATUS":0,"DATA":"Request Timeout"}; | |||
| @@ -38,7 +142,7 @@ class Util{ | |||
| else{ | |||
| useLocal = true; | |||
| http = IOClient(HttpClient(context: clientContext)); | |||
| return await JsonDataPostRaw(jsonData, url,timeout:timeout); | |||
| return await JsonDataPostRaw(jsonData, url,timeout:timeout,secure: secure); | |||
| } | |||
| } | |||
| @@ -49,6 +153,33 @@ class Util{ | |||
| } | |||
| } | |||
| htmlErrorTitle(String html){ | |||
| try{ | |||
| if(html.contains('<title>')) { | |||
| String titleElement = html.substring(html.indexOf("<title>")+7,html.indexOf("<\/title>")); | |||
| return titleElement; | |||
| } | |||
| else return ''; | |||
| } | |||
| catch(e){ | |||
| return ''; | |||
| } | |||
| } | |||
| initRest()async{ | |||
| try{ | |||
| if(prefs.getString(keyClass.client_credential)==null){ | |||
| prefs.setString(keyClass.client_credential, json.encode({ | |||
| "id": "IZ4W8u8YZmLtUV0p1zd-_A..", | |||
| "secret" : "AQ16v4bzGWm9AsWHvUcu2Q.." | |||
| }).toString()); | |||
| } | |||
| return await getOauth2Client(); | |||
| } | |||
| catch(e){ | |||
| print(e); | |||
| print("error fetching Rest token"); | |||
| } | |||
| } | |||
| showLoading(context,{dissmissable=false,onwillpop}){ | |||
| showDialog( | |||
| context: context, | |||
| @@ -5,7 +5,10 @@ import 'dart:typed_data'; | |||
| import 'package:http/io_client.dart'; | |||
| import 'package:path_provider/path_provider.dart'; | |||
| import 'package:http/http.dart'; | |||
| import 'package:unitstocks/Util/Prefs.dart'; | |||
| import '../main.dart'; | |||
| import 'package:oauth2/oauth2.dart' as oauth2; | |||
| class file_Trans_Handler { | |||
| // double _progress = 0; | |||
| @@ -17,32 +20,54 @@ class file_Trans_Handler { | |||
| StreamController _progress = new StreamController<double>(); | |||
| Stream<double> get progress =>_progress.stream; | |||
| bool useLocal = false; | |||
| var httpClient; | |||
| downloadFile(String fileName,String link) async { | |||
| StreamedResponse _response; | |||
| List<int> _bytes = []; | |||
| int _total = 0; | |||
| httpClient = await util.getOauth2Client(); | |||
| print('Start Download'); | |||
| _progress.add(null); | |||
| try { | |||
| Request req = new Request('GET', Uri.parse(link)); | |||
| // req.headers = ''; | |||
| _response = await http.send(req).timeout( | |||
| _response = await httpClient.send(req).timeout( | |||
| Duration(seconds: 20)); | |||
| // _response = await client.get('$link',headers: 'application/json') | |||
| _total = _response.contentLength; | |||
| print('${_total / 1024} KB'); | |||
| if(_response.statusCode==200){ | |||
| _total = _response.contentLength?? int.parse(_response.headers['file-size']); | |||
| } | |||
| // print('${_total / 1024} KB'); | |||
| _error = ''; | |||
| dlulStream = _response.stream.listen((value) { | |||
| _bytes.addAll(value); | |||
| _progress.add(((_bytes.length / _total))); | |||
| if(_response.statusCode==200){ | |||
| _bytes.addAll(value); | |||
| _progress.add(((_bytes.length / _total))); | |||
| } | |||
| else{ | |||
| String resString = utf8.decode(value); | |||
| if(util.htmlErrorTitle(resString)!=""){ | |||
| _error = util.htmlErrorTitle(resString); | |||
| } | |||
| _error = resString; | |||
| } | |||
| }) | |||
| ..onDone(() async { | |||
| _progress.add(0.0); | |||
| print('Finish Download'); | |||
| final file = File( | |||
| "${(await getApplicationDocumentsDirectory()).path}/$fileName"); | |||
| await file.writeAsBytes(_bytes); | |||
| _path = file.path; | |||
| if(_error==''){ | |||
| _progress.add(0.0); | |||
| print('Finish Download'); | |||
| final file = File( | |||
| "${(await getApplicationDocumentsDirectory()).path}/$fileName"); | |||
| await file.writeAsBytes(_bytes); | |||
| _path = file.path; | |||
| } | |||
| else{ | |||
| print('Error Download, $_error'); | |||
| _progress.add(-1.0); | |||
| } | |||
| }) | |||
| ..onError((e) async { | |||
| print('Error Download, $e'); | |||
| @@ -70,18 +95,27 @@ class file_Trans_Handler { | |||
| } | |||
| uploadFile(String fileName,String link,String company,String cabang_id) async{ | |||
| httpClient = await util.getOauth2Client(); | |||
| oauth2.Credentials tokenRestData = oauth2.Credentials.fromJson(prefs.getString(keyClass.rest_data)); | |||
| final file = File( | |||
| "${(await getApplicationDocumentsDirectory()).path}/$fileName"); | |||
| String mimeType = 'application/vnd.sqlite3'; | |||
| if(file.existsSync()){ | |||
| Uint8List byte = file.readAsBytesSync(); | |||
| // print("file size ${file.lengthSync()/1024}"); | |||
| try{ | |||
| var _reponse = await http.post( | |||
| Uri.parse(link), headers: {'Content-type': 'application/json'}, | |||
| body: json.encode({"byte":byte,"cabangId":cabang_id,"company":company})); | |||
| var _response = await httpClient.put( | |||
| Uri.parse(link), headers: {"cabangId":cabang_id,"company":company,'Content-type': mimeType,'Authorization':'Bearer ${tokenRestData.accessToken}'}, | |||
| body: byte); | |||
| print('File send ${file.lengthSync()/1024} KB'); | |||
| final Map data = JsonDecoder().convert(_reponse.body); | |||
| // print(_reponse.body); | |||
| if(_response.statusCode!=200){ | |||
| if(util.htmlErrorTitle(_response.body.toString())!=""){ | |||
| return {"STATUS":0,"DATA":util.htmlErrorTitle(_response.body.toString())}; | |||
| } | |||
| throw _response.body.toString(); | |||
| } | |||
| final Map data = JsonDecoder().convert(_response.body); | |||
| // print(_response.body); | |||
| // if(data['STATUS']==1){ | |||
| // return {"STATUS":1,"DATA":'File send ${file.lengthSync()/1024} KB'}; | |||
| // } | |||
| @@ -110,11 +144,12 @@ class file_Trans_Handler { | |||
| } | |||
| unPackDb(String link,String company,String cabang_id,String dbPath) async{ | |||
| try{ | |||
| var _reponse = await http.post( | |||
| var _response = await http.post( | |||
| Uri.parse(link), headers: {'Content-type': 'application/json'}, | |||
| body: json.encode({"cabangId":cabang_id,"company":company,"dbPath":dbPath})); | |||
| final Map data = JsonDecoder().convert(_reponse.body); | |||
| final Map data = JsonDecoder().convert(_response.body); | |||
| return data; | |||
| } | |||
| on HandshakeException catch(e){ | |||
| @@ -135,10 +170,10 @@ class file_Trans_Handler { | |||
| submitDb(String link,String company,String stock_id) async{ | |||
| try{ | |||
| var _reponse = await http.post( | |||
| var _response = await http.post( | |||
| Uri.parse(link), headers: {'Content-type': 'application/json'}, | |||
| body: json.encode({"stockTakingId":stock_id,"company":company})); | |||
| final Map data = JsonDecoder().convert(_reponse.body); | |||
| final Map data = JsonDecoder().convert(_response.body); | |||
| return data; | |||
| } | |||
| on HandshakeException catch(e){ | |||
| @@ -156,20 +191,21 @@ class file_Trans_Handler { | |||
| return {"STATUS":0,"DATA":'Request timeout. Make sure server is up and running'}; | |||
| } | |||
| } | |||
| // apex rest blm support multipart | |||
| uploadMultipart(String fileName,String link)async{ | |||
| httpClient = await util.getOauth2Client(); | |||
| StreamedResponse _response; | |||
| List<int> _bytes = []; | |||
| int _total = 0; | |||
| try{ | |||
| var request = MultipartRequest('POST', Uri.parse(link)); | |||
| var request = MultipartRequest('PUT', Uri.parse(link)); | |||
| request.files.add( | |||
| await MultipartFile.fromPath( | |||
| 'picture', | |||
| "${(await getApplicationDocumentsDirectory()).path}/$fileName" | |||
| ) | |||
| ); | |||
| _response = await http.send(request); | |||
| _response = await httpClient.send(request); | |||
| _total = File("${(await getApplicationDocumentsDirectory()).path}/$fileName").lengthSync(); | |||
| dlulStream = _response.stream.listen((value) { | |||
| _bytes.addAll(value); | |||
| @@ -105,14 +105,17 @@ class _HomePageState extends State<HomePage> { | |||
| loadState()async{ | |||
| String company = prefs.getString(keyClass.company); | |||
| if(prefs.getString(keyClass.stock_id) == null) | |||
| { | |||
| valueTab value = await DBHelper.database.getValue(keyClass.stock_id); | |||
| await prefs.setString(keyClass.stock_id, value.value); | |||
| } | |||
| String stock_taking_id = prefs.getString(keyClass.stock_id); | |||
| if(company!=null&&stock_taking_id!=null){ | |||
| var result = await util.JsonDataPostRaw({"company":company,"stockTakingId":stock_taking_id}, '${prefs.getString(keyClass.hostAddress)??'https://unitstocksbackend.thamringroup.web.id'}/getStateStockUnit'); | |||
| print(result); | |||
| var result = await util.JsonDataPostRaw({"company":company,"stockTakingId":stock_taking_id}, '${prefs.getString(keyClass.hostAddress)}/stock_taking/state/'); | |||
| if(result['STATUS']==1){ | |||
| setState(() { | |||
| state = result['DATA']['STATE']; | |||
| state = result['DATA']; | |||
| }); | |||
| } | |||
| } | |||
| @@ -129,7 +132,7 @@ class _HomePageState extends State<HomePage> { | |||
| changeCabang(context)async{ | |||
| util.showLoading(context); | |||
| var result = await util.JsonDataPostRaw({"company":prefs.getString(keyClass.company),"User":prefs.getString(keyClass.user_id)}, '${prefs.getString(keyClass.hostAddress)??'https://unitstocksbackend.thamringroup.web.id'}/getCabangByUser'); | |||
| var result = await util.JsonDataPostRaw({"company":prefs.getString(keyClass.company),"User":prefs.getString(keyClass.loginId)}, '${prefs.getString(keyClass.hostAddress)}/user/cabangs/'); | |||
| Navigator.pop(context); | |||
| if(result['STATUS']==1){ | |||
| var selected = prefs.getString(keyClass.cabang_id)??result['DATA'][0]["RETURN_VALUE"]; | |||
| @@ -472,7 +475,7 @@ class _HomePageState extends State<HomePage> { | |||
| }, | |||
| onSelected: (value)async{ | |||
| if(value == 'hostChange'){ | |||
| hostAddress.text = prefs.getString(keyClass.hostAddress)??'https://unitstocksbackend.thamringroup.web.id'; | |||
| hostAddress.text = prefs.getString(keyClass.hostAddress); | |||
| await showDialog(context: context,builder: (context)=> | |||
| Material( | |||
| color: Colors.white.withOpacity(0.9), | |||
| @@ -533,7 +536,7 @@ class _HomePageState extends State<HomePage> { | |||
| contentPadding: EdgeInsets.all(8), | |||
| ), | |||
| onSubmitted: (value){ | |||
| prefs.setString(keyClass.hostAddress,(value=='')?'https://unitstocksbackend.thamringroup.web.id':value); | |||
| prefs.setString(keyClass.hostAddress,(value=='')?'https://tbg.thamringroup.web.id/ords/tbs/unit/v1':value); | |||
| Navigator.pop(context); | |||
| }, | |||
| ), | |||
| @@ -549,7 +552,7 @@ class _HomePageState extends State<HomePage> { | |||
| TextButton( | |||
| child: Text('OK',style: TextStyle(color: Colors.indigo),), | |||
| onPressed: (){ | |||
| prefs.setString(keyClass.hostAddress,(hostAddress.text=='')?'https://unitstocksbackend.thamringroup.web.id':hostAddress.text); | |||
| prefs.setString(keyClass.hostAddress,(hostAddress.text=='')?'https://tbg.thamringroup.web.id/ords/tbs/unit/v1':hostAddress.text); | |||
| Navigator.pop(context); | |||
| }, | |||
| ) | |||
| @@ -593,7 +596,7 @@ class _HomePageState extends State<HomePage> { | |||
| if(value == 'logout'){ | |||
| prefs.remove(keyClass.cabang_id); | |||
| prefs.remove(keyClass.company); | |||
| prefs.remove(keyClass.user_id); | |||
| prefs.remove(keyClass.loginId); | |||
| prefs.setBool(keyClass.logged_in, false); | |||
| Navigator.pushNamed(context, '/login'); | |||
| } | |||
| @@ -678,7 +681,8 @@ class _HomePageState extends State<HomePage> { | |||
| print('fetching'); | |||
| util.showLoading(context); | |||
| file_Trans_Handler trans = new file_Trans_Handler(); | |||
| trans.downloadFile('UnitStocking.db',"${prefs.getString(keyClass.hostAddress)??'https://unitstocksbackend.thamringroup.web.id'}/getSqliteDb/${prefs.getString(keyClass.company)}/${prefs.getString(keyClass.cabang_id)}"); | |||
| // trans.downloadFile('UnitStocking.db',"http://172.16.1.8:14002/getSqliteDbtest/TBS/02"); | |||
| trans.downloadFile('UnitStocking.db',"${prefs.getString(keyClass.hostAddress)}/stock_taking/get_units/${prefs.getString(keyClass.company)}/${prefs.getString(keyClass.cabang_id)}"); | |||
| progressDLStream = trans.progress.listen((value)async { | |||
| if(progressDL==null) { | |||
| // print(['test',value]); | |||
| @@ -810,7 +814,7 @@ class _HomePageState extends State<HomePage> { | |||
| popped = true; | |||
| return true; | |||
| }); | |||
| var upload = await trans.uploadFile('UnitStocking.db',"${prefs.getString(keyClass.hostAddress)??'https://unitstocksbackend.thamringroup.web.id'}/uploadSqlitedb",prefs.getString(keyClass.company),prefs.getString(keyClass.cabang_id)); | |||
| var upload = await trans.uploadFile('UnitStocking.db',"${prefs.getString(keyClass.hostAddress)}/stock_taking/upload/",prefs.getString(keyClass.company),prefs.getString(keyClass.cabang_id)); | |||
| if(!popped){ | |||
| Navigator.pop(context); | |||
| util.showFlushbar(context, upload['DATA'],color:(upload['STATUS']!=1)?Colors.red:Colors.grey); | |||
| @@ -845,7 +849,7 @@ class _HomePageState extends State<HomePage> { | |||
| children: <Widget>[ | |||
| Container( | |||
| alignment: (progressUL!=null)?Alignment.bottomCenter:Alignment.bottomLeft, | |||
| padding: EdgeInsets.only(left: 10,right: 10,top: 10,bottom: 15), | |||
| padding: EdgeInsets.only(left: 10,right: 10,top: 10,bottom: 0), | |||
| child: (progressUL!=null)?Column( | |||
| mainAxisSize: MainAxisSize.min, | |||
| children: <Widget>[ | |||
| @@ -926,11 +930,10 @@ class _HomePageState extends State<HomePage> { | |||
| )); | |||
| if(result){ | |||
| util.showLoading(context); | |||
| file_Trans_Handler trans = new file_Trans_Handler(); | |||
| var upload = await trans.unPackDb("${prefs.getString(keyClass.hostAddress)??'https://unitstocksbackend.thamringroup.web.id'}/unpackDb",prefs.getString(keyClass.company),prefs.getString(keyClass.cabang_id),prefs.getString(keyClass.targetProccess)); | |||
| var unpack = await util.JsonDataPutRaw({"cabangId":prefs.getString(keyClass.cabang_id),"company":prefs.getString(keyClass.company),"dbPath":prefs.getString(keyClass.targetProccess)}, '${prefs.getString(keyClass.hostAddress)}/stock_taking/add_collection/'); | |||
| Navigator.pop(context); | |||
| util.showFlushbar(context, upload['DATA'],color:(upload['STATUS']!=1)?Colors.red:Colors.grey); | |||
| if(upload['STATUS']==1){ | |||
| util.showFlushbar(context, unpack['DATA'],color:(unpack['STATUS']!=1)?Colors.red:Colors.grey); | |||
| if(unpack['STATUS']==1){ | |||
| prefs.remove(keyClass.targetProccess); | |||
| prefs.setBool(keyClass.submitProccess,true); | |||
| } | |||
| @@ -989,11 +992,15 @@ class _HomePageState extends State<HomePage> { | |||
| )); | |||
| if(result){ | |||
| util.showLoading(context); | |||
| file_Trans_Handler trans = new file_Trans_Handler(); | |||
| var upload = await trans.submitDb("${prefs.getString(keyClass.hostAddress)??'https://unitstocksbackend.thamringroup.web.id'}/submitStock",prefs.getString(keyClass.company),prefs.getString(keyClass.stock_id)); | |||
| if(prefs.getString(keyClass.stock_id) == null) | |||
| { | |||
| valueTab value = await DBHelper.database.getValue(keyClass.stock_id); | |||
| await prefs.setString(keyClass.stock_id, value.value); | |||
| } | |||
| var submits = await util.JsonDataPostRaw({"stockTakingId":prefs.getString(keyClass.stock_id),"company":prefs.getString(keyClass.company),"user_id":prefs.getString(keyClass.loginId)}, '${prefs.getString(keyClass.hostAddress)}/stock_taking/submit/'); | |||
| Navigator.pop(context); | |||
| util.showFlushbar(context, upload['DATA'],color:(upload['STATUS']!=1)?Colors.red:Colors.grey); | |||
| if(upload['STATUS']==1){ | |||
| util.showFlushbar(context, submits['DATA'],color:(submits['STATUS']!=1)?Colors.red:Colors.grey); | |||
| if(submits['STATUS']==1){ | |||
| loadState(); | |||
| prefs.remove(keyClass.submitProccess); | |||
| } | |||
| @@ -1,5 +1,4 @@ | |||
| import 'dart:io'; | |||
| import 'package:flutter/cupertino.dart'; | |||
| import 'package:flutter/material.dart'; | |||
| import 'main.dart'; | |||
| @@ -23,12 +22,12 @@ class _LoginPageState extends State<LoginPage> { | |||
| Login()async{ | |||
| util.showLoading(context); | |||
| var result = await util.JsonDataPostRaw({"User":userCon.text,"Pass":passCon.text}, '${prefs.getString(keyClass.hostAddress)??'https://unitstocksbackend.thamringroup.web.id'}/login'); | |||
| var result = await util.JsonDataPostRaw({"User":userCon.text,"Pass":passCon.text}, '${prefs.getString(keyClass.hostAddress)}/user//login/'); | |||
| if(result['STATUS']==1){ | |||
| prefs.setString(keyClass.user_id, result['DATA'][keyClass.user_id]); | |||
| prefs.setString(keyClass.company, result['DATA'][keyClass.company]); | |||
| prefs.setString(keyClass.loginId, result['DATA'][keyClass.loginId.toLowerCase()]); | |||
| prefs.setString(keyClass.company, result['DATA'][keyClass.company.toLowerCase()]); | |||
| prefs.setBool(keyClass.logged_in, true); | |||
| var cabangList = await util.JsonDataPostRaw({"company":prefs.getString(keyClass.company),"User":prefs.getString(keyClass.user_id)}, '${prefs.getString(keyClass.hostAddress)??'https://unitstocksbackend.thamringroup.web.id'}/getCabangByUser'); | |||
| var cabangList = await util.JsonDataPostRaw({"company":prefs.getString(keyClass.company),"User":prefs.getString(keyClass.loginId)}, '${prefs.getString(keyClass.hostAddress)}/user/cabangs/'); | |||
| Navigator.pop(context); | |||
| if(cabangList['STATUS']==1){ | |||
| cabangDrop = cabangList['DATA']; | |||
| @@ -82,7 +81,7 @@ class _LoginPageState extends State<LoginPage> { | |||
| prefs.setBool(keyClass.logged_in, false); | |||
| prefs.remove(keyClass.cabang_id); | |||
| prefs.remove(keyClass.company); | |||
| prefs.remove(keyClass.user_id); | |||
| prefs.remove(keyClass.loginId); | |||
| }); | |||
| } | |||
| return false; | |||
| @@ -104,13 +103,13 @@ class _LoginPageState extends State<LoginPage> { | |||
| flex: 3, | |||
| child: InkWell( | |||
| onLongPress: ()async{ | |||
| hostAddress.text = prefs.getString(keyClass.hostAddress)??'https://unitstocksbackend.thamringroup.web.id'; | |||
| hostAddress.text = prefs.getString(keyClass.hostAddress); | |||
| await showDialog(context: context,builder: (context)=>AlertDialog( | |||
| title: Text('Set IP Address'), | |||
| content: TextField( | |||
| controller: hostAddress, | |||
| onSubmitted: (value){ | |||
| prefs.setString(keyClass.hostAddress,(value=='')?'https://unitstocksbackend.thamringroup.web.id':value); | |||
| prefs.setString(keyClass.hostAddress,(value=='')?'https://tbg.thamringroup.web.id/ords/tbs/unit/v1':value); | |||
| Navigator.pop(context); | |||
| }, | |||
| ), | |||
| @@ -118,7 +117,7 @@ class _LoginPageState extends State<LoginPage> { | |||
| TextButton( | |||
| child: Text('OK'), | |||
| onPressed: (){ | |||
| prefs.setString(keyClass.hostAddress,(hostAddress.text=='')?'https://unitstocksbackend.thamringroup.web.id':hostAddress.text); | |||
| prefs.setString(keyClass.hostAddress,(hostAddress.text=='')?'https://tbg.thamringroup.web.id/ords/tbs/unit/v1':hostAddress.text); | |||
| Navigator.pop(context); | |||
| }, | |||
| ) | |||
| @@ -306,7 +305,7 @@ class _LoginPageState extends State<LoginPage> { | |||
| prefs.setBool(keyClass.logged_in, false); | |||
| prefs.remove(keyClass.cabang_id); | |||
| prefs.remove(keyClass.company); | |||
| prefs.remove(keyClass.user_id); | |||
| prefs.remove(keyClass.loginId); | |||
| }); | |||
| }, | |||
| child: Text('Cancel',style: TextStyle(color: Colors.indigo)), | |||
| @@ -334,7 +333,7 @@ class _LoginPageState extends State<LoginPage> { | |||
| // prefs.setBool(keyClass.logged_in, false); | |||
| // prefs.remove(keyClass.cabang_id); | |||
| // prefs.remove(keyClass.company); | |||
| // prefs.remove(keyClass.user_id); | |||
| // prefs.remove(keyClass.loginId); | |||
| // }); | |||
| // return false; | |||
| // }, | |||
| @@ -424,7 +423,7 @@ class _LoginPageState extends State<LoginPage> { | |||
| // prefs.setBool(keyClass.logged_in, false); | |||
| // prefs.remove(keyClass.cabang_id); | |||
| // prefs.remove(keyClass.company); | |||
| // prefs.remove(keyClass.user_id); | |||
| // prefs.remove(keyClass.loginId); | |||
| // }); | |||
| // }, | |||
| // child: Text('Cancel',style: TextStyle(color: Colors.indigo)), | |||
| @@ -31,6 +31,8 @@ void main() async{ | |||
| WidgetsFlutterBinding.ensureInitialized(); | |||
| prefs = await SharedPreferences.getInstance(); | |||
| await registerCert(); | |||
| if( prefs.getString(keyClass.hostAddress) ==null)await prefs.setString(keyClass.hostAddress, "https://tbg.thamringroup.web.id/ords/tbs/unit/v1"); | |||
| await prefs.setString(keyClass.restTokenAddress, "https://tbg.thamringroup.web.id/ords/tbs/oauth/token"); | |||
| SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]) | |||
| .then((_) { | |||
| runApp(new MyApp()); | |||
| @@ -7,14 +7,14 @@ packages: | |||
| name: archive | |||
| url: "https://pub.dartlang.org" | |||
| source: hosted | |||
| version: "2.0.13" | |||
| version: "3.1.5" | |||
| args: | |||
| dependency: transitive | |||
| description: | |||
| name: args | |||
| url: "https://pub.dartlang.org" | |||
| source: hosted | |||
| version: "1.6.0" | |||
| version: "2.3.0" | |||
| async: | |||
| dependency: transitive | |||
| description: | |||
| @@ -64,13 +64,6 @@ packages: | |||
| url: "https://pub.dartlang.org" | |||
| source: hosted | |||
| version: "1.15.0" | |||
| convert: | |||
| dependency: transitive | |||
| description: | |||
| name: convert | |||
| url: "https://pub.dartlang.org" | |||
| source: hosted | |||
| version: "2.1.1" | |||
| cross_file: | |||
| dependency: transitive | |||
| description: | |||
| @@ -84,7 +77,7 @@ packages: | |||
| name: crypto | |||
| url: "https://pub.dartlang.org" | |||
| source: hosted | |||
| version: "2.1.4" | |||
| version: "3.0.1" | |||
| cupertino_icons: | |||
| dependency: "direct main" | |||
| description: | |||
| @@ -138,7 +131,7 @@ packages: | |||
| name: flutter_launcher_icons | |||
| url: "https://pub.dartlang.org" | |||
| source: hosted | |||
| version: "0.7.5" | |||
| version: "0.9.2" | |||
| flutter_plugin_android_lifecycle: | |||
| dependency: transitive | |||
| description: | |||
| @@ -176,7 +169,7 @@ packages: | |||
| name: image | |||
| url: "https://pub.dartlang.org" | |||
| source: hosted | |||
| version: "2.1.12" | |||
| version: "3.0.8" | |||
| image_picker: | |||
| dependency: "direct main" | |||
| description: | |||
| @@ -247,6 +240,13 @@ packages: | |||
| url: "https://pub.dartlang.org" | |||
| source: hosted | |||
| version: "1.7.0" | |||
| oauth2: | |||
| dependency: "direct main" | |||
| description: | |||
| name: oauth2 | |||
| url: "https://pub.dartlang.org" | |||
| source: hosted | |||
| version: "2.0.0" | |||
| path: | |||
| dependency: transitive | |||
| description: | |||
| @@ -309,7 +309,7 @@ packages: | |||
| name: petitparser | |||
| url: "https://pub.dartlang.org" | |||
| source: hosted | |||
| version: "2.4.0" | |||
| version: "4.3.0" | |||
| photo_view: | |||
| dependency: "direct main" | |||
| description: | |||
| @@ -489,14 +489,14 @@ packages: | |||
| name: xml | |||
| url: "https://pub.dartlang.org" | |||
| source: hosted | |||
| version: "3.6.1" | |||
| version: "5.3.0" | |||
| yaml: | |||
| dependency: transitive | |||
| description: | |||
| name: yaml | |||
| url: "https://pub.dartlang.org" | |||
| source: hosted | |||
| version: "2.2.1" | |||
| version: "3.1.0" | |||
| sdks: | |||
| dart: ">=2.14.0 <3.0.0" | |||
| flutter: ">=2.5.0" | |||
| @@ -1,7 +1,7 @@ | |||
| name: unitstocks | |||
| description: App to stock Thamrin Brothers Units | |||
| # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html | |||
| version: 1.0.3+6 | |||
| version: 1.0.4+7 | |||
| environment: | |||
| sdk: ">=2.1.0 <3.0.0" | |||
| @@ -27,6 +27,7 @@ dependencies: | |||
| # app_settings: | |||
| # autocomplete_textfield: | |||
| barcode_scan: ^3.0.1 | |||
| oauth2: ^2.0.0 | |||
| dev_dependencies: | |||