init
This commit is contained in:
56
lib/backend/DataManager.dart
Normal file
56
lib/backend/DataManager.dart
Normal file
@@ -0,0 +1,56 @@
|
||||
import 'dart:convert';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:http/http.dart' as http;
|
||||
import 'package:queue_mgr/backend/DebugHelper.dart';
|
||||
// DateFormat dateFormat;
|
||||
|
||||
final String API_ENDPOINT= "https://vps.playpoolstudios.com/qms/api/";
|
||||
|
||||
class DataManager{
|
||||
static _DataManager? m_instance = null;
|
||||
static _DataManager instance(){
|
||||
m_instance ??= _DataManager();
|
||||
return m_instance!;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
class _DataManager{
|
||||
_DataManager();
|
||||
|
||||
List<dynamic> services = [];
|
||||
|
||||
|
||||
Future<void> GetData() async{
|
||||
try{
|
||||
var response = (await http.post(
|
||||
Uri.parse('${API_ENDPOINT}get_services.php'),
|
||||
body: <String, String>{}));
|
||||
Debug.LogResponse(response.body.toString());
|
||||
services = jsonDecode(response.body.toString());
|
||||
Debug.LogResponse(services);
|
||||
}catch(e){
|
||||
Debug.LogError(e);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Future<void> AddService(String name, DateTime sTime, DateTime eTime,TimeOfDay duration) async {
|
||||
try{
|
||||
var response = (await http.post(
|
||||
Uri.parse('${API_ENDPOINT}add_service.php'),
|
||||
body: <String, String>{
|
||||
'name':name,
|
||||
'stime':sTime.toString(),
|
||||
'etime':eTime.toString(),
|
||||
'duration':"${duration.hour}:${duration.minute}"
|
||||
}));
|
||||
Debug.LogResponse(response.body.toString());
|
||||
services = jsonDecode(response.body.toString());
|
||||
Debug.LogResponse(services);
|
||||
}catch(e){
|
||||
Debug.LogError(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
32
lib/backend/DebugHelper.dart
Normal file
32
lib/backend/DebugHelper.dart
Normal file
@@ -0,0 +1,32 @@
|
||||
import 'dart:developer';
|
||||
|
||||
class Debug{
|
||||
static bool enableLogging = true;
|
||||
static bool enableResponseLogging = true;
|
||||
static bool enableErrorLoggin = true;
|
||||
static bool enableTestLogging = true;
|
||||
|
||||
static void LogResponse(Object? response, {Object src= ''}){
|
||||
if(!enableLogging){return;}
|
||||
if(!enableResponseLogging) {return;}
|
||||
print('\x1B[32m$src response\n$response\x1B[0m');
|
||||
}
|
||||
|
||||
static void LogError(Object? msg){
|
||||
if(!enableLogging){return;}
|
||||
if(!enableErrorLoggin) {return;}
|
||||
print('\x1B[31m$msg\x1B[0m');
|
||||
}
|
||||
|
||||
static void Log(Object? msg){
|
||||
if(!enableLogging) {return;}
|
||||
print('\x1B[36m$msg\x1B[0m');
|
||||
}
|
||||
|
||||
static void LogTest(Object? msg){
|
||||
if(!enableLogging){return;}
|
||||
if(!enableTestLogging) {return;}
|
||||
print('\x1B[35m$msg\x1B[0m');
|
||||
}
|
||||
|
||||
}
|
||||
109
lib/main.dart
Normal file
109
lib/main.dart
Normal file
@@ -0,0 +1,109 @@
|
||||
import 'dart:convert';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:queue_mgr/backend/DataManager.dart';
|
||||
import 'package:queue_mgr/new_service.dart';
|
||||
|
||||
import 'backend/DebugHelper.dart';
|
||||
|
||||
void main() {
|
||||
DataManager.instance().GetData();
|
||||
runApp(const MyApp());
|
||||
}
|
||||
|
||||
class MyApp extends StatelessWidget {
|
||||
const MyApp({super.key});
|
||||
|
||||
// This widget is the root of your application.
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return MaterialApp(
|
||||
title: 'Flutter Demo',
|
||||
theme: ThemeData(
|
||||
colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple, brightness: Brightness.dark),
|
||||
useMaterial3: true,
|
||||
),
|
||||
home: const Home(),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
class Home extends StatefulWidget {
|
||||
const Home({Key? key}) : super(key: key);
|
||||
|
||||
@override
|
||||
State<Home> createState() => _HomeState();
|
||||
}
|
||||
|
||||
class _HomeState extends State<Home> {
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
// TODO: implement initState
|
||||
super.initState();
|
||||
|
||||
refresh();
|
||||
}
|
||||
|
||||
void refresh()async{
|
||||
await DataManager.instance().GetData();
|
||||
setState(() {
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
appBar: AppBar(title: Text("Queue Management - Admin"),),
|
||||
body: Container(
|
||||
padding: EdgeInsets.all(20),
|
||||
child: Column(
|
||||
children: [
|
||||
ListView.builder(
|
||||
physics: NeverScrollableScrollPhysics(),
|
||||
shrinkWrap: true,
|
||||
itemCount:DataManager.instance().services.length,
|
||||
itemBuilder: (context,index){
|
||||
dynamic service = jsonDecode(DataManager.instance().services[index]);
|
||||
return Card(
|
||||
child: Center(
|
||||
child: Container(
|
||||
padding: EdgeInsets.all(10),
|
||||
child: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Text(service['start_time']),
|
||||
Text(service['name']),
|
||||
Container(decoration: BoxDecoration(borderRadius: BorderRadius.circular(50),color: Colors.deepPurple), child: SizedBox(width:20,height: 20,child: Center(child: Text(service['members'].toString().split(',').length.toString()))),)
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
),
|
||||
SizedBox(height: 50,),
|
||||
InkWell(
|
||||
onTap: (){
|
||||
Navigator.of(context).push(MaterialPageRoute(builder: (context)=> NewService()));
|
||||
},
|
||||
child: Card(
|
||||
child: Container(
|
||||
padding: EdgeInsets.all(10),
|
||||
child: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.center,children: [
|
||||
Icon(Icons.add),
|
||||
Text("New Service")
|
||||
],),
|
||||
),
|
||||
),
|
||||
)
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
118
lib/new_service.dart
Normal file
118
lib/new_service.dart
Normal file
@@ -0,0 +1,118 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:queue_mgr/backend/DataManager.dart';
|
||||
|
||||
class NewService extends StatefulWidget {
|
||||
const NewService({Key? key}) : super(key: key);
|
||||
|
||||
@override
|
||||
State<NewService> createState() => _NewServiceState();
|
||||
}
|
||||
|
||||
class _NewServiceState extends State<NewService> {
|
||||
TextEditingController nameController = TextEditingController();
|
||||
DateTime sDate = DateTime.now();
|
||||
TimeOfDay sTime = TimeOfDay(hour: 2, minute: 2);
|
||||
DateTime eDate = DateTime.now();
|
||||
TimeOfDay eTime = TimeOfDay(hour: 2, minute: 2);
|
||||
TimeOfDay duration = TimeOfDay(hour:0, minute: 15);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
appBar: AppBar(title: Text("New Service")),
|
||||
body: Container(
|
||||
padding: EdgeInsets.all(20),
|
||||
child: Column(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Column(
|
||||
children: [
|
||||
ListTile(
|
||||
title: Text("Service Name"),
|
||||
subtitle: TextField(
|
||||
controller: nameController,
|
||||
),
|
||||
),
|
||||
ListTile(
|
||||
title: Text("Starting Time"),
|
||||
subtitle: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: [
|
||||
ElevatedButton(
|
||||
child: Text("${sDate.year}-${sDate.month}-${sDate.day}"),
|
||||
onPressed: () async{
|
||||
sDate = await showDatePicker(context: context, initialDate: DateTime.now(), firstDate: DateTime.now().subtract(const Duration(days: 350)), lastDate: DateTime.now().add(const Duration(days: 350))) ?? sDate;
|
||||
setState(() {
|
||||
|
||||
});
|
||||
},
|
||||
),
|
||||
ElevatedButton(
|
||||
child: Text("${sTime.hour}:${sTime.minute}"),
|
||||
onPressed: () async{
|
||||
sTime = await showTimePicker(context: context, initialTime: sTime) ?? sTime;
|
||||
setState(() {
|
||||
|
||||
});
|
||||
},
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
ListTile(
|
||||
title: Text("Ending Time"),
|
||||
subtitle: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: [
|
||||
ElevatedButton(
|
||||
child: Text("${eDate.year}-${eDate.month}-${eDate.day}"),
|
||||
onPressed: () async{
|
||||
eDate = await showDatePicker(context: context, initialDate: DateTime.now(), firstDate: DateTime.now().subtract(const Duration(days: 350)), lastDate: DateTime.now().add(const Duration(days: 350))) ?? eDate;
|
||||
setState(() {
|
||||
|
||||
});
|
||||
},
|
||||
),
|
||||
ElevatedButton(
|
||||
child: Text("${eTime.hour}:${eTime.minute}"),
|
||||
onPressed: () async{
|
||||
eTime = await showTimePicker(context: context, initialTime: eTime) ?? eTime;
|
||||
setState(() {
|
||||
|
||||
});
|
||||
},
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
ListTile(
|
||||
title:Text("Duration for each"),
|
||||
subtitle: ElevatedButton(
|
||||
child: Text("${duration.hour}:${duration.minute}"),
|
||||
onPressed: () async{
|
||||
duration = await showTimePicker(context: context, initialTime: duration) ?? duration;
|
||||
setState(() {
|
||||
|
||||
});
|
||||
},
|
||||
),
|
||||
)
|
||||
],
|
||||
),
|
||||
Container(margin: EdgeInsets.all(20),width:200,height:50,child: ElevatedButton(onPressed: () async{
|
||||
DateTime s_date = DateTime(sDate.year, sDate.month, sDate.day, sTime.hour, sTime.minute);
|
||||
DateTime e_date = DateTime(eDate.year, eDate.month, eDate.day, eTime.hour, eTime.minute);
|
||||
await DataManager.instance().AddService(nameController.text, s_date, e_date,duration);
|
||||
setState(() {
|
||||
|
||||
});
|
||||
|
||||
Navigator.pop(context);
|
||||
|
||||
}, child: Text("Add")))
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user