10 Incheckningar ba1083c79c ... 7a63bc624d

Upphovsman SHA1 Meddelande Datum
  athrainsky 7a63bc624d ok 7 månader sedan
  athrainsky a178a9d6b0 masih belum edit 7 månader sedan
  athrainsky df7d91a535 add delete 7 månader sedan
  athrainsky 7827689163 add delete 7 månader sedan
  athrainsky ff0360a6e3 login ok 7 månader sedan
  athrainsky 07f45dc47c ok 8 månader sedan
  athrainsky 1db7cdac0f ok 8 månader sedan
  athrainsky 55944720fa koneksi dio+java 8 månader sedan
  athrainsky 6f44f0763b ok 8 månader sedan
  athrainsky a2a061ceb8 ok 8 månader sedan
72 ändrade filer med 4253 tillägg och 1797 borttagningar
  1. 25 0
      .vscode/launch.json
  2. 1 1
      README.md
  3. 1 1
      android/app/build.gradle
  4. 1 1
      android/app/src/debug/AndroidManifest.xml
  5. 2 2
      android/app/src/main/AndroidManifest.xml
  6. 1 1
      android/app/src/main/kotlin/com/example/telneo_lat/MainActivity.kt
  7. 1 1
      android/app/src/profile/AndroidManifest.xml
  8. BIN
      assets/images/additional.png
  9. BIN
      assets/images/bathtub.png
  10. BIN
      assets/images/building.jpg
  11. BIN
      assets/images/danger-sign.png
  12. BIN
      assets/images/database.png
  13. BIN
      assets/images/firstaid.png
  14. BIN
      assets/images/food.png
  15. BIN
      assets/images/noise-pollution.png
  16. BIN
      assets/images/scan_icon_183865.png
  17. BIN
      assets/images/service.png
  18. BIN
      assets/images/ticket.png
  19. BIN
      assets/images/transportation.png
  20. BIN
      assets/images/vacation.png
  21. 2 2
      ios/Runner/Info.plist
  22. 0 248
      lib/account.dart
  23. 296 0
      lib/bug/addbug.dart
  24. 114 0
      lib/bug/addcomment.dart
  25. 276 0
      lib/bug/editbug.dart
  26. 171 0
      lib/bug/listbug.dart
  27. 122 0
      lib/bug/listcomment.dart
  28. 0 92
      lib/data.dart
  29. 19 0
      lib/data/datatable.dart
  30. 0 396
      lib/detail.dart
  31. 30 0
      lib/footer.dart
  32. 13 0
      lib/globals.dart
  33. 443 0
      lib/header.dart
  34. 0 60
      lib/lang.dart
  35. 0 222
      lib/list.dart
  36. 0 188
      lib/listblock.dart
  37. 86 0
      lib/listtable.dart
  38. 78 133
      lib/login.dart
  39. 176 149
      lib/main.dart
  40. 105 0
      lib/platform/addplatform.dart
  41. 122 0
      lib/platform/editplatform.dart
  42. 128 0
      lib/platform/listplatform.dart
  43. 130 0
      lib/project/addmember.dart
  44. 105 0
      lib/project/addproject.dart
  45. 100 0
      lib/project/editproject.dart
  46. 126 0
      lib/project/listmember.dart
  47. 147 0
      lib/project/listproject.dart
  48. 0 289
      lib/search.dart
  49. 46 0
      lib/service/addbug_serv.dart
  50. 46 0
      lib/service/addcomment_serv.dart
  51. 45 0
      lib/service/addmember_serv.dart
  52. 46 0
      lib/service/addplatform_serv.dart
  53. 46 0
      lib/service/addproj_serv.dart
  54. 49 0
      lib/service/delete_bug.dart
  55. 49 0
      lib/service/delete_comment.dart
  56. 49 0
      lib/service/delete_member.dart
  57. 49 0
      lib/service/delete_platform.dart
  58. 49 0
      lib/service/delete_project.dart
  59. 49 0
      lib/service/delete_user.dart
  60. 51 0
      lib/service/edit_user.dart
  61. 52 0
      lib/service/get_user.dart
  62. 55 0
      lib/service/login_serv.dart
  63. 46 0
      lib/service/signup_serv.dart
  64. 100 0
      lib/user/chgpass.dart
  65. 145 0
      lib/user/edituser.dart
  66. 120 0
      lib/user/listuser.dart
  67. 138 0
      lib/user/signup.dart
  68. 2 0
      macos/Flutter/GeneratedPluginRegistrant.swift
  69. 182 6
      pubspec.lock
  70. 10 2
      pubspec.yaml
  71. 2 2
      test/widget_test.dart
  72. 6 1
      windows/flutter/CMakeLists.txt

+ 25 - 0
.vscode/launch.json

@@ -0,0 +1,25 @@
+{
+    // Use IntelliSense to learn about possible attributes.
+    // Hover to view descriptions of existing attributes.
+    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
+    "version": "0.2.0",
+    "configurations": [
+        {
+            "name": "bug",
+            "request": "launch",
+            "type": "dart"
+        },
+        {
+            "name": "bug (profile mode)",
+            "request": "launch",
+            "type": "dart",
+            "flutterMode": "profile"
+        },
+        {
+            "name": "bug (release mode)",
+            "request": "launch",
+            "type": "dart",
+            "flutterMode": "release"
+        }
+    ]
+}

+ 1 - 1
README.md

@@ -1,4 +1,4 @@
-# telneo_lat
+# bug_listing
 
 A new Flutter project.
 

+ 1 - 1
android/app/build.gradle

@@ -44,7 +44,7 @@ android {
 
     defaultConfig {
         // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
-        applicationId "com.example.telneo_lat"
+        applicationId "com.example.bug_listing"
         // You can update the following values to match your application needs.
         // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-build-configuration.
         minSdkVersion flutter.minSdkVersion

+ 1 - 1
android/app/src/debug/AndroidManifest.xml

@@ -1,5 +1,5 @@
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="com.example.telneo_lat">
+    package="com.example.bug_listing">
     <!-- The INTERNET permission is required for development. Specifically,
          the Flutter tool needs it to communicate with the running application
          to allow setting breakpoints, to provide hot reload, etc.

+ 2 - 2
android/app/src/main/AndroidManifest.xml

@@ -1,7 +1,7 @@
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="com.example.telneo_lat">
+    package="com.example.bug_listing">
    <application
-        android:label="telneo_lat"
+        android:label="bug_listing"
         android:name="${applicationName}"
         android:icon="@mipmap/ic_launcher">
         <activity

+ 1 - 1
android/app/src/main/kotlin/com/example/telneo_lat/MainActivity.kt

@@ -1,4 +1,4 @@
-package com.example.telneo_lat
+package com.example.bug_listing
 
 import io.flutter.embedding.android.FlutterActivity
 

+ 1 - 1
android/app/src/profile/AndroidManifest.xml

@@ -1,5 +1,5 @@
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="com.example.telneo_lat">
+    package="com.example.bug_listing">
     <!-- The INTERNET permission is required for development. Specifically,
          the Flutter tool needs it to communicate with the running application
          to allow setting breakpoints, to provide hot reload, etc.

BIN
assets/images/additional.png


BIN
assets/images/bathtub.png


BIN
assets/images/building.jpg


BIN
assets/images/danger-sign.png


BIN
assets/images/database.png


BIN
assets/images/firstaid.png


BIN
assets/images/food.png


BIN
assets/images/noise-pollution.png


BIN
assets/images/scan_icon_183865.png


BIN
assets/images/service.png


BIN
assets/images/ticket.png


BIN
assets/images/transportation.png


BIN
assets/images/vacation.png


+ 2 - 2
ios/Runner/Info.plist

@@ -5,7 +5,7 @@
 	<key>CFBundleDevelopmentRegion</key>
 	<string>$(DEVELOPMENT_LANGUAGE)</string>
 	<key>CFBundleDisplayName</key>
-	<string>Telneo Lat</string>
+	<string>bug_listing</string>
 	<key>CFBundleExecutable</key>
 	<string>$(EXECUTABLE_NAME)</string>
 	<key>CFBundleIdentifier</key>
@@ -13,7 +13,7 @@
 	<key>CFBundleInfoDictionaryVersion</key>
 	<string>6.0</string>
 	<key>CFBundleName</key>
-	<string>telneo_lat</string>
+	<string>bug_listing</string>
 	<key>CFBundlePackageType</key>
 	<string>APPL</string>
 	<key>CFBundleShortVersionString</key>

+ 0 - 248
lib/account.dart

@@ -1,248 +0,0 @@
-import 'package:flutter/material.dart';
-import 'package:date_format/date_format.dart';
-
-var date = formatDate(DateTime.now(), [HH, ':', nn]);
-
-class AccountPage extends StatefulWidget {
-  const AccountPage({super.key});
-
-  @override
-  State<AccountPage> createState() => _AccountPageState();
-}
-
-class _AccountPageState extends State<AccountPage> {
-  int _selectedNavbar = 2;
-
-  void _changeSelectedNavBar(int index) {
-    setState(() {
-      _selectedNavbar = index;
-    });
-  }
-
-  @override
-  Widget build(BuildContext context) {
-    return Scaffold(
-      appBar: AppBar(
-        backgroundColor: Colors.white,
-        automaticallyImplyLeading: false,
-        elevation: 0,
-        toolbarHeight: 44,
-        title: Text(
-          date,
-          style: TextStyle(color: Color(0xff303336), fontSize: 15),
-        ),
-        actions: [
-          Icon(
-            Icons.signal_cellular_alt,
-            color: Color(0xff303336),
-          ),
-          Icon(
-            Icons.wifi,
-            color: Color(0xff303336),
-          ),
-          RotatedBox(
-            quarterTurns: -3,
-            child: Icon(
-              Icons.battery_std,
-              color: Color(0xff303336),
-            ),
-          )
-        ],
-      ),
-      bottomNavigationBar: BottomNavigationBar(
-        items: [
-          BottomNavigationBarItem(icon: Icon(Icons.home), label: 'Home'),
-          BottomNavigationBarItem(icon: Icon(Icons.history), label: 'History'),
-          BottomNavigationBarItem(icon: Icon(Icons.person), label: 'Account')
-        ],
-        currentIndex: _selectedNavbar,
-        onTap: _changeSelectedNavBar,
-      ),
-      body: Column(
-        children: [
-          Container(
-            height: 44,
-            alignment: Alignment.centerLeft,
-            padding: EdgeInsets.symmetric(horizontal: 10),
-            child: Text(
-              'Account',
-              style: TextStyle(fontWeight: FontWeight.bold),
-            ),
-          ),
-          Divider(),
-          Container(
-            padding: EdgeInsets.all(10),
-            child: Row(
-              children: [
-                CircleAvatar(
-                  backgroundColor: Color(0xff078C84),
-                  child: Text('J'),
-                ),
-                Padding(
-                  padding: const EdgeInsets.symmetric(horizontal: 10),
-                  child: Text(
-                    'James Triyono',
-                    style: TextStyle(fontWeight: FontWeight.bold),
-                  ),
-                )
-              ],
-            ),
-          ),
-          Divider(
-            thickness: 8,
-          ),
-          Container(
-            alignment: Alignment.centerLeft,
-            padding: EdgeInsets.all(10),
-            child: Text(
-              'Info',
-              style: TextStyle(fontWeight: FontWeight.bold),
-            ),
-          ),
-          Container(
-            height: 5,
-          ),
-          Container(
-            padding: EdgeInsets.symmetric(horizontal: 10),
-            child: Row(
-              children: [
-                Text(
-                  'User ID',
-                  style: TextStyle(color: Color(0xff292D32).withOpacity(0.75)),
-                ),
-                Spacer(),
-                Text(
-                  'jamet',
-                  style: TextStyle(color: Color(0xff292D32)),
-                )
-              ],
-            ),
-          ),
-          Container(
-            height: 8,
-          ),
-          Container(
-            padding: EdgeInsets.symmetric(horizontal: 10),
-            child: Row(
-              children: [
-                Text(
-                  'Location',
-                  style: TextStyle(color: Color(0xff292D32).withOpacity(0.75)),
-                ),
-                Spacer(),
-                Text(
-                  'Room 331',
-                  style: TextStyle(color: Color(0xff292D32)),
-                )
-              ],
-            ),
-          ),
-          Container(
-            height: 8,
-          ),
-          Container(
-            padding: EdgeInsets.symmetric(horizontal: 10),
-            child: Row(
-              children: [
-                Text(
-                  'Request Group',
-                  style: TextStyle(color: Color(0xff292D32).withOpacity(0.75)),
-                ),
-                Spacer(),
-                Text(
-                  'All',
-                  style: TextStyle(color: Color(0xff292D32)),
-                )
-              ],
-            ),
-          ),
-          Container(
-            height: 10,
-          ),
-          Divider(
-            thickness: 8,
-          ),
-          Container(
-            alignment: Alignment.centerLeft,
-            padding: EdgeInsets.all(10),
-            child: Text(
-              'Setting',
-              style: TextStyle(fontWeight: FontWeight.bold),
-            ),
-          ),
-          Container(
-            padding: EdgeInsets.symmetric(horizontal: 10),
-            child: Row(
-              children: [
-                Icon(
-                  Icons.language,
-                  color: Color(0xff292D32).withOpacity(0.75),
-                ),
-                Container(
-                    margin: EdgeInsets.symmetric(horizontal: 5),
-                    child: Text('Language')),
-                Spacer(),
-                Text('English'),
-                Icon(Icons.chevron_right)
-              ],
-            ),
-          ),
-          Container(
-            margin: EdgeInsets.all(10),
-            color: Color(0xff514844).withOpacity(0.5),
-            height: 1,
-            width: MediaQuery.of(context).size.width * 0.95,
-          ),
-          Container(
-            padding: EdgeInsets.symmetric(horizontal: 10),
-            child: Row(
-              children: [
-                RotationTransition(
-                  turns: AlwaysStoppedAnimation(135 / 360),
-                  child: Icon(
-                    Icons.vpn_key,
-                    color: Color(0xff292D32).withOpacity(0.75),
-                  ),
-                ),
-                Container(
-                    margin: EdgeInsets.symmetric(horizontal: 5),
-                    child: Text('Password')),
-                Spacer(),
-                Text('Change password'),
-                Icon(Icons.chevron_right)
-              ],
-            ),
-          ),
-          Container(
-            margin: EdgeInsets.all(10),
-            color: Color(0xff514844).withOpacity(0.5),
-            height: 1,
-            width: MediaQuery.of(context).size.width * 0.95,
-          ),
-          Container(
-            padding: EdgeInsets.symmetric(horizontal: 10),
-            child: Row(
-              children: [
-                Icon(
-                  Icons.logout,
-                  color: Color(0xff292D32).withOpacity(0.75),
-                ),
-                Container(
-                    margin: EdgeInsets.symmetric(horizontal: 5),
-                    child: Text('Logout')),
-                Spacer(),
-                Icon(Icons.chevron_right)
-              ],
-            ),
-          ),
-          Container(
-            height: 10,
-          ),
-          Divider(
-            thickness: 8,
-          ),
-        ],
-      ),
-    );
-  }
-}

+ 296 - 0
lib/bug/addbug.dart

@@ -0,0 +1,296 @@
+import 'package:flutter/material.dart';
+import 'package:namer_app/footer.dart';
+import 'package:namer_app/header.dart';
+
+import '../service/addbug_serv.dart';
+
+class AddBugPage extends StatelessWidget {
+  const AddBugPage({super.key});
+
+  @override
+  Widget build(BuildContext context) {
+    var bugdesc = TextEditingController();
+    var bugqc = TextEditingController();
+    var bugdev = TextEditingController();
+    var bugplatform = TextEditingController();
+    var buggoodday = TextEditingController();
+    var bugimage = TextEditingController();
+    var buglevel = TextEditingController();
+    var bugstatus = TextEditingController();
+    var bugdevStatus = TextEditingController();
+    return Scaffold(
+      appBar: CustomAppbar(),
+      backgroundColor: Colors.white,
+      body: Stack(children: [
+        SingleChildScrollView(
+          child: Column(
+            mainAxisAlignment: MainAxisAlignment.spaceEvenly,
+            children: [
+              Center(
+                  child: Row(
+                mainAxisAlignment: MainAxisAlignment.center,
+                children: [
+                  Text(
+                    'ADD BUG',
+                    style: TextStyle(color: Colors.black, fontSize: 48),
+                  ),
+                ],
+              )),
+              Column(
+                children: [
+                  Padding(
+                    padding: const EdgeInsets.all(8.0),
+                    child: SizedBox(
+                      width: 396,
+                      child: TextField(
+                        decoration: InputDecoration(
+                            border: OutlineInputBorder(),
+                            focusedBorder: OutlineInputBorder(
+                                borderRadius:
+                                    BorderRadius.all(Radius.circular(12)),
+                                borderSide: BorderSide(color: Colors.black)),
+                            enabledBorder: OutlineInputBorder(
+                                borderRadius:
+                                    BorderRadius.all(Radius.circular(12)),
+                                borderSide: BorderSide(color: Colors.black)),
+                            labelText: 'Enter Description',  
+                            labelStyle: TextStyle(color: Colors.black),
+                            filled: true,
+                            fillColor: Colors.white.withOpacity(0.25)),
+                        cursorColor: Colors.black,
+                        style: TextStyle(color: Colors.black),
+                        controller: bugdesc,
+                      ),
+                    ),
+                  ),
+                  Padding(
+                    padding: const EdgeInsets.all(8.0),
+                    child: SizedBox(
+                      width: 396,
+                      child: TextField(
+                        decoration: InputDecoration(
+                            border: OutlineInputBorder(),
+                            focusedBorder: OutlineInputBorder(
+                                borderRadius:
+                                    BorderRadius.all(Radius.circular(12)),
+                                borderSide: BorderSide(color: Colors.black)),
+                            enabledBorder: OutlineInputBorder(
+                                borderRadius:
+                                    BorderRadius.all(Radius.circular(12)),
+                                borderSide: BorderSide(color: Colors.black)),
+                            labelText: 'Enter QC', //todo get data
+                            labelStyle: TextStyle(color: Colors.black),
+                            filled: true,
+                            fillColor: Colors.white.withOpacity(0.25)),
+                        cursorColor: Colors.black,
+                        style: TextStyle(color: Colors.black),
+                        controller: bugqc,
+                      ),
+                    ),
+                  ),
+                  Padding(
+                    padding: const EdgeInsets.all(8.0),
+                    child: SizedBox(
+                      width: 396,
+                      child: TextField(
+                        decoration: InputDecoration(
+                            border: OutlineInputBorder(),
+                            focusedBorder: OutlineInputBorder(
+                                borderRadius:
+                                    BorderRadius.all(Radius.circular(12)),
+                                borderSide: BorderSide(color: Colors.black)),
+                            enabledBorder: OutlineInputBorder(
+                                borderRadius:
+                                    BorderRadius.all(Radius.circular(12)),
+                                borderSide: BorderSide(color: Colors.black)),
+                            labelText: 'Enter Dev', //todo get data
+                            labelStyle: TextStyle(color: Colors.black),
+                            filled: true,
+                            fillColor: Colors.white.withOpacity(0.25)),
+                        cursorColor: Colors.black,
+                        style: TextStyle(color: Colors.black),
+                        controller: bugdev,
+                      ),
+                    ),
+                  ),
+                  Padding(
+                    padding: const EdgeInsets.all(8.0),
+                    child: SizedBox(
+                      width: 396,
+                      child: TextField(
+                        decoration: InputDecoration(
+                            border: OutlineInputBorder(),
+                            focusedBorder: OutlineInputBorder(
+                                borderRadius:
+                                    BorderRadius.all(Radius.circular(12)),
+                                borderSide: BorderSide(color: Colors.black)),
+                            enabledBorder: OutlineInputBorder(
+                                borderRadius:
+                                    BorderRadius.all(Radius.circular(12)),
+                                borderSide: BorderSide(color: Colors.black)),
+                            labelText: 'Enter Platform', //todo get data
+                            labelStyle: TextStyle(color: Colors.black),
+                            filled: true,
+                            fillColor: Colors.white.withOpacity(0.25)),
+                        cursorColor: Colors.black,
+                        style: TextStyle(color: Colors.black),
+                        controller: bugplatform,
+                      ),
+                    ),
+                  ),
+                  Padding(
+                    padding: const EdgeInsets.all(8.0),
+                    child: SizedBox(
+                      width: 396,
+                      child: TextField(
+                        decoration: InputDecoration(
+                            border: OutlineInputBorder(),
+                            focusedBorder: OutlineInputBorder(
+                                borderRadius:
+                                    BorderRadius.all(Radius.circular(12)),
+                                borderSide: BorderSide(color: Colors.black)),
+                            enabledBorder: OutlineInputBorder(
+                                borderRadius:
+                                    BorderRadius.all(Radius.circular(12)),
+                                borderSide: BorderSide(color: Colors.black)),
+                            labelText: 'Enter Goodday URL', 
+                            labelStyle: TextStyle(color: Colors.black),
+                            filled: true,
+                            fillColor: Colors.white.withOpacity(0.25)),
+                        cursorColor: Colors.black,
+                        style: TextStyle(color: Colors.black),
+                        controller: buggoodday,
+                      ),
+                    ),
+                  ),
+                  Padding(
+                    padding: const EdgeInsets.all(8.0),
+                    child: SizedBox(
+                      width: 396,
+                      child: TextField(
+                        decoration: InputDecoration(
+                            border: OutlineInputBorder(),
+                            focusedBorder: OutlineInputBorder(
+                                borderRadius:
+                                    BorderRadius.all(Radius.circular(12)),
+                                borderSide: BorderSide(color: Colors.black)),
+                            enabledBorder: OutlineInputBorder(
+                                borderRadius:
+                                    BorderRadius.all(Radius.circular(12)),
+                                borderSide: BorderSide(color: Colors.black)),
+                            labelText: 'Enter Image URL', 
+                            labelStyle: TextStyle(color: Colors.black),
+                            filled: true,
+                            fillColor: Colors.white.withOpacity(0.25)),
+                        cursorColor: Colors.black,
+                        style: TextStyle(color: Colors.black),
+                        controller: bugimage,
+                      ),
+                    ),
+                  ),
+                  Padding(
+                    padding: const EdgeInsets.all(8.0),
+                    child: SizedBox(
+                      width: 396,
+                      child: TextField(
+                        decoration: InputDecoration(
+                            border: OutlineInputBorder(),
+                            focusedBorder: OutlineInputBorder(
+                                borderRadius:
+                                    BorderRadius.all(Radius.circular(12)),
+                                borderSide: BorderSide(color: Colors.black)),
+                            enabledBorder: OutlineInputBorder(
+                                borderRadius:
+                                    BorderRadius.all(Radius.circular(12)),
+                                borderSide: BorderSide(color: Colors.black)),
+                            labelText: 'Enter Level', //todo get data
+                            labelStyle: TextStyle(color: Colors.black),
+                            filled: true,
+                            fillColor: Colors.white.withOpacity(0.25)),
+                        cursorColor: Colors.black,
+                        style: TextStyle(color: Colors.black),
+                        controller: buglevel,
+                      ),
+                    ),
+                  ),
+                  Padding(
+                    padding: const EdgeInsets.all(8.0),
+                    child: SizedBox(
+                      width: 396,
+                      child: TextField(
+                        decoration: InputDecoration(
+                            border: OutlineInputBorder(),
+                            focusedBorder: OutlineInputBorder(
+                                borderRadius:
+                                    BorderRadius.all(Radius.circular(12)),
+                                borderSide: BorderSide(color: Colors.black)),
+                            enabledBorder: OutlineInputBorder(
+                                borderRadius:
+                                    BorderRadius.all(Radius.circular(12)),
+                                borderSide: BorderSide(color: Colors.black)),
+                            labelText: 'Enter Status', //todo get data
+                            labelStyle: TextStyle(color: Colors.black),
+                            filled: true,
+                            fillColor: Colors.white.withOpacity(0.25)),
+                        cursorColor: Colors.black,
+                        style: TextStyle(color: Colors.black),
+                        controller: bugstatus,
+                      ),
+                    ),
+                  ),
+                  Padding(
+                    padding: const EdgeInsets.all(8.0),
+                    child: SizedBox(
+                      width: 396,
+                      child: TextField(
+                        decoration: InputDecoration(
+                            border: OutlineInputBorder(),
+                            focusedBorder: OutlineInputBorder(
+                                borderRadius:
+                                    BorderRadius.all(Radius.circular(12)),
+                                borderSide: BorderSide(color: Colors.black)),
+                            enabledBorder: OutlineInputBorder(
+                                borderRadius:
+                                    BorderRadius.all(Radius.circular(12)),
+                                borderSide: BorderSide(color: Colors.black)),
+                            labelText: 'Enter Dev Status', //todo get data
+                            labelStyle: TextStyle(color: Colors.black),
+                            filled: true,
+                            fillColor: Colors.white.withOpacity(0.25)),
+                        cursorColor: Colors.black,
+                        style: TextStyle(color: Colors.black),
+                        controller: bugdevStatus,
+                      ),
+                    ),
+                  ),
+                  Padding(
+                    padding: const EdgeInsets.all(20.0),
+                    child: SizedBox(
+                      width: 396,
+                      height: 61,
+                      child: ElevatedButton(
+                        onPressed: () => addbug(context, bugdesc.text, bugqc.text, bugdev.text, bugplatform.text, buggoodday.text, bugimage.text, buglevel.text, bugstatus.text, bugdevStatus.text), //todo save edit
+                        style: ElevatedButton.styleFrom(
+                          backgroundColor: Colors.black, 
+                          side: BorderSide(color: Colors.white),
+                          shape: RoundedRectangleBorder(
+                            borderRadius: BorderRadius.circular(12.0),
+                          ),
+                        ),
+                        child: Text(
+                          'Save',
+                          style: TextStyle(color: Colors.white),
+                        ),
+                      ),
+                    ),
+                  ),
+                ],
+              ),
+            ],
+          ),
+        ),
+      ]),
+      bottomNavigationBar: Footer(),
+    );
+  }
+}

+ 114 - 0
lib/bug/addcomment.dart

@@ -0,0 +1,114 @@
+import 'package:flutter/material.dart';
+import 'package:namer_app/footer.dart';
+import 'package:namer_app/header.dart';
+import 'package:namer_app/service/addcomment_serv.dart';
+
+class AddCommentPage extends StatelessWidget {
+  final int bugId;
+  const AddCommentPage({super.key, required this.bugId});
+
+  @override
+  Widget build(BuildContext context) {
+    // var bugId = TextEditingController();
+    var content = TextEditingController();
+    return Scaffold(
+      appBar: CustomAppbar(),
+      backgroundColor: Colors.white,
+      body: Stack(children: [
+        SingleChildScrollView(
+          child: Column(
+            mainAxisAlignment: MainAxisAlignment.spaceEvenly,
+            children: [
+              Center(
+                  child: Row(
+                mainAxisAlignment: MainAxisAlignment.center,
+                children: [
+                  Text(
+                    'ADD COMMENT',
+                    style: TextStyle(color: Colors.black, fontSize: 48),
+                  ),
+                ],
+              )),
+              Column(
+                children: [
+                  // Padding(
+                  //   padding: const EdgeInsets.all(8.0),
+                  //   child: SizedBox(
+                  //     width: 396,
+                  //     child: TextField(
+                  //       decoration: InputDecoration(
+                  //           border: OutlineInputBorder(),
+                  //           focusedBorder: OutlineInputBorder(
+                  //               borderRadius:
+                  //                   BorderRadius.all(Radius.circular(12)),
+                  //               borderSide: BorderSide(color: Colors.black)),
+                  //           enabledBorder: OutlineInputBorder(
+                  //               borderRadius:
+                  //                   BorderRadius.all(Radius.circular(12)),
+                  //               borderSide: BorderSide(color: Colors.black)),
+                  //           labelText: 'Enter Description',  
+                  //           labelStyle: TextStyle(color: Colors.black),
+                  //           filled: true,
+                  //           fillColor: Colors.white.withOpacity(0.25)),
+                  //       cursorColor: Colors.black,
+                  //       style: TextStyle(color: Colors.black),
+                  //       controller: bugId,
+                  //     ),
+                  //   ),
+                  // ),
+                  Padding(
+                    padding: const EdgeInsets.all(8.0),
+                    child: SizedBox(
+                      width: 396,
+                      child: TextField(
+                        decoration: InputDecoration(
+                            border: OutlineInputBorder(),
+                            focusedBorder: OutlineInputBorder(
+                                borderRadius:
+                                    BorderRadius.all(Radius.circular(12)),
+                                borderSide: BorderSide(color: Colors.black)),
+                            enabledBorder: OutlineInputBorder(
+                                borderRadius:
+                                    BorderRadius.all(Radius.circular(12)),
+                                borderSide: BorderSide(color: Colors.black)),
+                            labelText: 'Enter Content', //todo get data
+                            labelStyle: TextStyle(color: Colors.black),
+                            filled: true,
+                            fillColor: Colors.white.withOpacity(0.25)),
+                        cursorColor: Colors.black,
+                        style: TextStyle(color: Colors.black),
+                        controller: content,
+                      ),
+                    ),
+                  ),
+                  Padding(
+                    padding: const EdgeInsets.all(20.0),
+                    child: SizedBox(
+                      width: 396,
+                      height: 61,
+                      child: ElevatedButton(
+                        onPressed: () => addcomment(context, bugId, content.text), //todo save edit
+                        style: ElevatedButton.styleFrom(
+                          backgroundColor: Colors.black, 
+                          side: BorderSide(color: Colors.white),
+                          shape: RoundedRectangleBorder(
+                            borderRadius: BorderRadius.circular(12.0),
+                          ),
+                        ),
+                        child: Text(
+                          'Save',
+                          style: TextStyle(color: Colors.white),
+                        ),
+                      ),
+                    ),
+                  ),
+                ],
+              ),
+            ],
+          ),
+        ),
+      ]),
+      bottomNavigationBar: Footer(),
+    );
+  }
+}

+ 276 - 0
lib/bug/editbug.dart

@@ -0,0 +1,276 @@
+import 'package:flutter/material.dart';
+import 'package:namer_app/footer.dart';
+import 'package:namer_app/header.dart';
+
+class EditBugPage extends StatelessWidget {
+  const EditBugPage({super.key});
+
+  @override
+  Widget build(BuildContext context) {
+    return Scaffold(
+      appBar: CustomAppbar(),
+      backgroundColor: Colors.white,
+      body: Stack(children: [
+        SingleChildScrollView(
+          child: Column(
+            mainAxisAlignment: MainAxisAlignment.spaceEvenly,
+            children: [
+              Center(
+                  child: Row(
+                mainAxisAlignment: MainAxisAlignment.center,
+                children: [
+                  Text(
+                    'EDIT BUG',
+                    style: TextStyle(color: Colors.black, fontSize: 48),
+                  ),
+                ],
+              )),
+              Column(
+                children: [
+                  Padding(
+                    padding: const EdgeInsets.all(8.0),
+                    child: SizedBox(
+                      width: 396,
+                      child: TextField(
+                        decoration: InputDecoration(
+                            border: OutlineInputBorder(),
+                            focusedBorder: OutlineInputBorder(
+                                borderRadius:
+                                    BorderRadius.all(Radius.circular(12)),
+                                borderSide: BorderSide(color: Colors.black)),
+                            enabledBorder: OutlineInputBorder(
+                                borderRadius:
+                                    BorderRadius.all(Radius.circular(12)),
+                                borderSide: BorderSide(color: Colors.black)),
+                            labelText: 'Enter Description', //todo get data
+                            labelStyle: TextStyle(color: Colors.black),
+                            filled: true,
+                            fillColor: Colors.white.withOpacity(0.25)),
+                        cursorColor: Colors.black,
+                        style: TextStyle(color: Colors.black),
+                      ),
+                    ),
+                  ),
+                  Padding(
+                    padding: const EdgeInsets.all(8.0),
+                    child: SizedBox(
+                      width: 396,
+                      child: TextField(
+                        decoration: InputDecoration(
+                            border: OutlineInputBorder(),
+                            focusedBorder: OutlineInputBorder(
+                                borderRadius:
+                                    BorderRadius.all(Radius.circular(12)),
+                                borderSide: BorderSide(color: Colors.black)),
+                            enabledBorder: OutlineInputBorder(
+                                borderRadius:
+                                    BorderRadius.all(Radius.circular(12)),
+                                borderSide: BorderSide(color: Colors.black)),
+                            labelText: 'Enter QC', //todo get data
+                            labelStyle: TextStyle(color: Colors.black),
+                            filled: true,
+                            fillColor: Colors.white.withOpacity(0.25)),
+                        cursorColor: Colors.black,
+                        style: TextStyle(color: Colors.black),
+                      ),
+                    ),
+                  ),
+                  Padding(
+                    padding: const EdgeInsets.all(8.0),
+                    child: SizedBox(
+                      width: 396,
+                      child: TextField(
+                        decoration: InputDecoration(
+                            border: OutlineInputBorder(),
+                            focusedBorder: OutlineInputBorder(
+                                borderRadius:
+                                    BorderRadius.all(Radius.circular(12)),
+                                borderSide: BorderSide(color: Colors.black)),
+                            enabledBorder: OutlineInputBorder(
+                                borderRadius:
+                                    BorderRadius.all(Radius.circular(12)),
+                                borderSide: BorderSide(color: Colors.black)),
+                            labelText: 'Enter Dev', //todo get data
+                            labelStyle: TextStyle(color: Colors.black),
+                            filled: true,
+                            fillColor: Colors.white.withOpacity(0.25)),
+                        cursorColor: Colors.black,
+                        style: TextStyle(color: Colors.black),
+                      ),
+                    ),
+                  ),
+                  Padding(
+                    padding: const EdgeInsets.all(8.0),
+                    child: SizedBox(
+                      width: 396,
+                      child: TextField(
+                        decoration: InputDecoration(
+                            border: OutlineInputBorder(),
+                            focusedBorder: OutlineInputBorder(
+                                borderRadius:
+                                    BorderRadius.all(Radius.circular(12)),
+                                borderSide: BorderSide(color: Colors.black)),
+                            enabledBorder: OutlineInputBorder(
+                                borderRadius:
+                                    BorderRadius.all(Radius.circular(12)),
+                                borderSide: BorderSide(color: Colors.black)),
+                            labelText: 'Enter Platform', //todo get data
+                            labelStyle: TextStyle(color: Colors.black),
+                            filled: true,
+                            fillColor: Colors.white.withOpacity(0.25)),
+                        cursorColor: Colors.black,
+                        style: TextStyle(color: Colors.black),
+                      ),
+                    ),
+                  ),
+                  Padding(
+                    padding: const EdgeInsets.all(8.0),
+                    child: SizedBox(
+                      width: 396,
+                      child: TextField(
+                        decoration: InputDecoration(
+                            border: OutlineInputBorder(),
+                            focusedBorder: OutlineInputBorder(
+                                borderRadius:
+                                    BorderRadius.all(Radius.circular(12)),
+                                borderSide: BorderSide(color: Colors.black)),
+                            enabledBorder: OutlineInputBorder(
+                                borderRadius:
+                                    BorderRadius.all(Radius.circular(12)),
+                                borderSide: BorderSide(color: Colors.black)),
+                            labelText: 'Enter Goodday URL', //todo get data
+                            labelStyle: TextStyle(color: Colors.black),
+                            filled: true,
+                            fillColor: Colors.white.withOpacity(0.25)),
+                        cursorColor: Colors.black,
+                        style: TextStyle(color: Colors.black),
+                      ),
+                    ),
+                  ),
+                  Padding(
+                    padding: const EdgeInsets.all(8.0),
+                    child: SizedBox(
+                      width: 396,
+                      child: TextField(
+                        decoration: InputDecoration(
+                            border: OutlineInputBorder(),
+                            focusedBorder: OutlineInputBorder(
+                                borderRadius:
+                                    BorderRadius.all(Radius.circular(12)),
+                                borderSide: BorderSide(color: Colors.black)),
+                            enabledBorder: OutlineInputBorder(
+                                borderRadius:
+                                    BorderRadius.all(Radius.circular(12)),
+                                borderSide: BorderSide(color: Colors.black)),
+                            labelText: 'Enter Image URL', //todo get data
+                            labelStyle: TextStyle(color: Colors.black),
+                            filled: true,
+                            fillColor: Colors.white.withOpacity(0.25)),
+                        cursorColor: Colors.black,
+                        style: TextStyle(color: Colors.black),
+                      ),
+                    ),
+                  ),
+                  Padding(
+                    padding: const EdgeInsets.all(8.0),
+                    child: SizedBox(
+                      width: 396,
+                      child: TextField(
+                        decoration: InputDecoration(
+                            border: OutlineInputBorder(),
+                            focusedBorder: OutlineInputBorder(
+                                borderRadius:
+                                    BorderRadius.all(Radius.circular(12)),
+                                borderSide: BorderSide(color: Colors.black)),
+                            enabledBorder: OutlineInputBorder(
+                                borderRadius:
+                                    BorderRadius.all(Radius.circular(12)),
+                                borderSide: BorderSide(color: Colors.black)),
+                            labelText: 'Enter Level', //todo get data
+                            labelStyle: TextStyle(color: Colors.black),
+                            filled: true,
+                            fillColor: Colors.white.withOpacity(0.25)),
+                        cursorColor: Colors.black,
+                        style: TextStyle(color: Colors.black),
+                      ),
+                    ),
+                  ),
+                  Padding(
+                    padding: const EdgeInsets.all(8.0),
+                    child: SizedBox(
+                      width: 396,
+                      child: TextField(
+                        decoration: InputDecoration(
+                            border: OutlineInputBorder(),
+                            focusedBorder: OutlineInputBorder(
+                                borderRadius:
+                                    BorderRadius.all(Radius.circular(12)),
+                                borderSide: BorderSide(color: Colors.black)),
+                            enabledBorder: OutlineInputBorder(
+                                borderRadius:
+                                    BorderRadius.all(Radius.circular(12)),
+                                borderSide: BorderSide(color: Colors.black)),
+                            labelText: 'Enter Status', //todo get data
+                            labelStyle: TextStyle(color: Colors.black),
+                            filled: true,
+                            fillColor: Colors.white.withOpacity(0.25)),
+                        cursorColor: Colors.black,
+                        style: TextStyle(color: Colors.black),
+                      ),
+                    ),
+                  ),
+                  Padding(
+                    padding: const EdgeInsets.all(8.0),
+                    child: SizedBox(
+                      width: 396,
+                      child: TextField(
+                        decoration: InputDecoration(
+                            border: OutlineInputBorder(),
+                            focusedBorder: OutlineInputBorder(
+                                borderRadius:
+                                    BorderRadius.all(Radius.circular(12)),
+                                borderSide: BorderSide(color: Colors.black)),
+                            enabledBorder: OutlineInputBorder(
+                                borderRadius:
+                                    BorderRadius.all(Radius.circular(12)),
+                                borderSide: BorderSide(color: Colors.black)),
+                            labelText: 'Enter Dev Status', //todo get data
+                            labelStyle: TextStyle(color: Colors.black),
+                            filled: true,
+                            fillColor: Colors.white.withOpacity(0.25)),
+                        cursorColor: Colors.black,
+                        style: TextStyle(color: Colors.black),
+                      ),
+                    ),
+                  ),
+                  Padding(
+                    padding: const EdgeInsets.all(20.0),
+                    child: SizedBox(
+                      width: 396,
+                      height: 61,
+                      child: ElevatedButton(
+                        onPressed: null, //todo save edit
+                        style: ElevatedButton.styleFrom(
+                          backgroundColor: Colors.black, //todo putih lage
+                          side: BorderSide(color: Colors.white),
+                          shape: RoundedRectangleBorder(
+                            borderRadius: BorderRadius.circular(12.0),
+                          ),
+                        ),
+                        child: Text(
+                          'Edit',
+                          style: TextStyle(color: Colors.white),
+                        ),
+                      ),
+                    ),
+                  ),
+                ],
+              ),
+            ],
+          ),
+        ),
+      ]),
+      bottomNavigationBar: Footer(),
+    );
+  }
+}

+ 171 - 0
lib/bug/listbug.dart

@@ -0,0 +1,171 @@
+// ignore_for_file: prefer_typing_uninitialized_variables, must_call_super
+
+import 'package:dio/dio.dart';
+import 'package:flutter/material.dart';
+import 'package:go_router/go_router.dart';
+import 'package:namer_app/footer.dart';
+import 'package:namer_app/header.dart';
+import 'package:namer_app/service/delete_bug.dart';
+import '../globals.dart';
+
+class ListBugPage extends StatefulWidget {
+  const ListBugPage({super.key});
+
+  @override
+  State<ListBugPage> createState() => _ListBugPageState();
+}
+
+class _ListBugPageState extends State<ListBugPage> {
+  var jsonList;
+  @override
+void initState(){
+  getData();
+}
+
+void getData() async { 
+    try { 
+      var response = await Dio() 
+          .get('http://localhost:8080/api/v1/bugs',
+          options: Options(headers: headers)); 
+      if (response.statusCode == 200) { 
+        setState(() { 
+          jsonList = response.data['results'] as List; 
+        }); 
+      } else { 
+        print(response.statusCode); 
+      } 
+    } catch (e) { 
+      print(e); 
+    } 
+  } 
+  @override
+  Widget build(BuildContext context) {
+    return Scaffold(
+      appBar: CustomAppbar(),
+      body: Stack(children: [
+        SingleChildScrollView(
+          child: Column(
+            children: [
+              Center(
+                  child: Row(
+                mainAxisAlignment: MainAxisAlignment.center,
+                children: [
+                  Text(
+                    'LIST BUG',
+                    style: TextStyle(color: Colors.black, fontSize: 48),
+                  ),
+                ],
+              )),
+              Column(
+                children: List.generate(
+                    jsonList == null ? 0 : jsonList.length,
+                    (i) => SizedBox(
+                          child: ListTile(                          
+                            leading: SizedBox(
+                              child: Icon(Icons.bug_report),
+                            ),
+                            title: Text(jsonList[i]['description']),
+                            subtitle: Column(
+                              crossAxisAlignment: CrossAxisAlignment.start,
+                              children: [
+                                Text(jsonList[i]['goodday_url']),
+                                Row(
+                                  children: [
+                                    Text(jsonList[i]['created']),
+                                    Container(
+                                      width: 30,
+                                    ),
+                                    Text(jsonList[i]['level']),
+                                  ],
+                                ),
+                                Row(
+                                  children: [
+                                    Text(jsonList[i]['qc']),
+                                    Container(
+                                      width: 20,
+                                    ),
+                                    Text(jsonList[i]['status']),
+                                    Container(
+                                      width: 20,
+                                    ),
+                                    Text(jsonList[i]['dev']),
+                                    Container(
+                                      width: 20,
+                                    ),
+                                    Text(jsonList[i]['dev_status'])
+                                  ],
+                                )
+                              ],
+                            ),
+                            trailing: ButtonUser(
+                              items: jsonList[i],
+                            ),
+                          ),
+                        )),
+              ),
+            ],
+          ),
+        ),
+      ]),
+      bottomNavigationBar: Footer(),
+    );
+  }
+}
+
+class ButtonUser extends StatelessWidget {
+  final Map<String, dynamic> items;
+  ButtonUser({
+    required this.items,
+    super.key,
+  });
+  //todo tombol item
+  //todo tombol delete
+  @override
+  Widget build(BuildContext context) {
+    return Row(
+      mainAxisSize: MainAxisSize.min,
+      children: [
+        ElevatedButton(
+          onPressed: () => context.go('/login/bug/editbug'),
+          style: ElevatedButton.styleFrom(
+            backgroundColor: Colors.black,
+          ),
+          child: Text(
+            'Edit',
+            style: TextStyle(color: Colors.white),
+          ),
+        ),
+        ElevatedButton(
+          onPressed: () => delbug(context, items['id']),
+          style: ElevatedButton.styleFrom(
+            backgroundColor: Colors.black,
+          ),
+          child: Text(
+            'Delete',
+            style: TextStyle(color: Colors.white),
+          ),
+        ),
+        ElevatedButton(
+          onPressed: () => context.go('/addcomment'),
+          style: ElevatedButton.styleFrom(
+            backgroundColor: Colors.black,
+          ),
+          child: Text(
+            'Add Comment',
+            style: TextStyle(color: Colors.white),
+          ),
+        ),        
+        ElevatedButton(
+          onPressed: () => context.go('/login/bug/comment'),
+          style: ElevatedButton.styleFrom(
+            backgroundColor: Colors.black,
+          ),
+          child: Text(
+            'List Comment',
+            style: TextStyle(color: Colors.white),
+          ),
+        ),
+      ],
+    );
+  }
+}

+ 122 - 0
lib/bug/listcomment.dart

@@ -0,0 +1,122 @@
+// ignore_for_file: must_call_super, prefer_typing_uninitialized_variables, no_logic_in_create_state
+
+import 'package:dio/dio.dart';
+import 'package:flutter/material.dart';
+import 'package:namer_app/footer.dart';
+import 'package:namer_app/header.dart';
+import 'package:namer_app/service/delete_comment.dart';
+
+import '../globals.dart';
+
+class ListCommentPage extends StatefulWidget {
+  final int bugId;
+  const ListCommentPage({super.key, required this.bugId});
+
+  @override
+  State<ListCommentPage> createState() => _ListCommentPageState(
+    bugId: bugId
+    );
+}
+
+class _ListCommentPageState extends State<ListCommentPage> {
+  int bugId;
+  _ListCommentPageState({required this.bugId});
+    var comments;
+  @override
+void initState(){
+  getData(bugId);
+}
+
+void getData(int bugId) async { 
+    try { 
+      var response = await Dio() 
+          .get('http://localhost:8080/api/v1/bugs/$bugId/comment',
+          options: Options(headers: headers)); 
+      if (response.statusCode == 200) { 
+        setState(() { 
+          comments = response.data['results'] as List; 
+        }); 
+        print(comments);
+      } else { 
+        print(response.statusCode); 
+      } 
+    } catch (e) { 
+      print(e); 
+    } 
+  } 
+  @override
+  Widget build(BuildContext context) {
+    return Scaffold(
+      appBar: CustomAppbar(),
+      body: Stack(children: [
+        SingleChildScrollView(
+          child: Column(
+            children: [
+              Center(
+                  child: Row(
+                mainAxisAlignment: MainAxisAlignment.center,
+                children: [
+                  Text(
+                    'LIST COMMENT',
+                    style: TextStyle(color: Colors.black, fontSize: 48),
+                  ),
+                ],
+              )),
+              Column(
+                children: List.generate(
+                    comments == null ? 0 : comments.length,
+                    (i) => SizedBox(
+                          child: ListTile(
+                            leading: SizedBox(
+                              child: Icon(Icons.chat),
+                            ),
+                            title: Text(comments[i]['content']),
+                            subtitle: Column(
+                              crossAxisAlignment: CrossAxisAlignment.start,
+                              children: [
+                                Text(comments[i]['created']),
+                                Text(comments[i]['creator'])
+                              ],
+                            ),
+                            trailing: ButtonUser(
+                              items: comments[i],
+                            ),
+                          ),
+                        )),
+              ),
+            ],
+          ),
+        ),
+      ]),
+      bottomNavigationBar: Footer(),
+    );
+  }
+}
+
+class ButtonUser extends StatelessWidget {
+  final Map<String, dynamic> items;
+  ButtonUser({
+    required this.items,
+    super.key,
+  });
+  //todo tombol item
+  //todo tombol delete
+  @override
+  Widget build(BuildContext context) {
+    return Row(
+      mainAxisSize: MainAxisSize.min,
+      children: [
+        ElevatedButton(
+          onPressed: () => delcomment(context, items['id']),
+          style: ElevatedButton.styleFrom(
+            backgroundColor: Colors.black,
+          ),
+          child: Text(
+            'Delete',
+            style: TextStyle(color: Colors.white),
+          ),
+        ),
+      ],
+    );
+  }
+}

+ 0 - 92
lib/data.dart

@@ -1,92 +0,0 @@
-import 'package:flutter/material.dart';
-
-final List items = [
-  {
-    'type': 'Foods & Drinks',
-    'color': Color(0xffCCA600),
-    'smallText': 'Fresh smoked tuna with traditional recipe ...',
-    'longText':
-        'Fresh tuna meat prepared with traditional recipes from North Maluku. All recipes mixed together ...',
-    'image': 'assets/images/food.png',
-  },
-  {
-    'type': 'Services',
-    'color': Color(0xff90D8F9),
-    'smallText': 'Great services with bla bla bla ...',
-    'longText':
-        'Great services with great service with great service with great service with great service with ...',
-    'image': 'assets/images/service.png'
-  },
-  {
-    'type': 'Additional',
-    'color': Color(0xffAACEE0),
-    'smallText': 'Additional service with bla bla bla ...',
-    'longText':
-        'Additional service with additional service with additional service with additional service with additional service with ...',
-    'image': 'assets/images/additional.png'
-  },
-  {
-    'type': 'First Aid',
-    'color': Color(0xffFF1111),
-    'smallText': 'First Aid with bla bla bla ...',
-    'longText':
-        'First Aid service with first Aid service with first Aid service with first Aid service with first Aid service with ...',
-    'image': 'assets/images/firstaid.png'
-  },
-  {
-    'type': 'Ticket',
-    'color': Color(0xff5ED8F6),
-    'smallText': 'Ticket service with ...',
-    'longText':
-        'Ticket service with ticket service with ticket service with ticket service with ticket service with ticket service with ...',
-    'image': 'assets/images/ticket.png'
-  },
-  {
-    'type': 'Vacation',
-    'color': Color(0xffCCA600),
-    'smallText': 'Vacation service with ...',
-    'longText':
-        'Vacation service with vacation service with vacation service with vacation service with vacation service with vacation service with ...',
-    'image': 'assets/images/vacation.png'
-  },
-  {
-    'type': 'Transportation',
-    'color': Color(0xffCCA600),
-    'smallText': 'Transportation service with ...',
-    'longText':
-        'Transportation service with transportation service with transportation service with transportation service with transportation service with ...',
-    'image': 'assets/images/transportation.png'
-  },
-  {
-    'type': 'Bathtub',
-    'color': Color(0xffFF1150),
-    'smallText': 'Bathtub service with ...',
-    'longText':
-        'Bathtub service with bathtub service with bathtub service with bathtub service with bathtub service with bathtub service with bathtub service with ...',
-    'image': 'assets/images/bathtub.png'
-  },
-  {
-    'type': 'Danger',
-    'color': Color(0xffCCA600),
-    'smallText': 'Danger service with ...',
-    'longText':
-        'Danger service with danger service with danger service with danger service with danger service with danger service with danger service with danger service with ...',
-    'image': 'assets/images/danger-sign.png'
-  },
-  {
-    'type': 'Database',
-    'color': Color(0xff90D8F9),
-    'smallText': 'Database service with ...',
-    'longText':
-        'Database service with database service with database service with database service with database service with database service with database service with database service with ...',
-    'image': 'assets/images/database.png'
-  },
-  {
-    'type': 'Noise',
-    'color': Color(0xffAACEE0),
-    'smallText': 'Noise service with ...',
-    'longText':
-        'Noise service with noise service with noise service with noise service with noise service with noise service with noise service with noise service with noise service with noise service with ...',
-    'image': 'assets/images/noise-pollution.png'
-  },
-];

+ 19 - 0
lib/data/datatable.dart

@@ -0,0 +1,19 @@
+// ignore_for_file: file_names
+
+final List tables = [
+  {
+    'table': 'project',
+  },
+  {
+    'table': 'platform',
+  },
+  {
+    'table': 'bug',
+  },
+  {
+    'table': 'project_member',
+  },
+  {
+    'table': 'user',
+  },
+];

+ 0 - 396
lib/detail.dart

@@ -1,396 +0,0 @@
-import 'package:dotted_line/dotted_line.dart';
-import 'package:flutter/material.dart';
-import 'package:date_format/date_format.dart';
-import 'package:timeline_tile/timeline_tile.dart';
-
-var date = formatDate(DateTime.now(), [HH, ':', nn]);
-
-class DetailPage extends StatelessWidget {
-  final Map<String, dynamic> items;
-  DetailPage({super.key, required this.items});
-
-  @override
-  Widget build(BuildContext context) {
-    return Scaffold(
-      appBar: AppBar(
-        backgroundColor: Colors.white,
-        automaticallyImplyLeading: false,
-        elevation: 0,
-        toolbarHeight: 44,
-        title: Text(
-          date,
-          style: TextStyle(color: Color(0xff303336), fontSize: 15),
-        ),
-        actions: [
-          Icon(
-            Icons.signal_cellular_alt,
-            color: Color(0xff303336),
-          ),
-          Icon(
-            Icons.wifi,
-            color: Color(0xff303336),
-          ),
-          RotatedBox(
-            quarterTurns: -3,
-            child: Icon(
-              Icons.battery_std,
-              color: Color(0xff303336),
-            ),
-          )
-        ],
-      ),
-      body: SingleChildScrollView(
-        child: Column(
-          children: [
-            Row(
-              children: [
-                BackButton(),
-                Text(
-                  'Detail',
-                  style: TextStyle(fontWeight: FontWeight.bold, fontSize: 17),
-                ),
-                Spacer(),
-                ElevatedButton(
-                  onPressed: () {},
-                  style: ElevatedButton.styleFrom(
-                      backgroundColor: Color(0xff078C84).withOpacity(0.1),
-                      side: BorderSide(color: Color(0xff078C84)),
-                      shape: RoundedRectangleBorder(
-                          borderRadius: BorderRadius.circular(35))),
-                  child: Row(
-                    children: [
-                      Text(
-                        'Forum',
-                        style:
-                            TextStyle(color: Color(0xff078C84), fontSize: 15),
-                      ),
-                      SizedBox(
-                        width: 5,
-                      ),
-                      Icon(
-                        Icons.message_outlined,
-                        color: Color(0xff078C84),
-                      )
-                    ],
-                  ),
-                )
-              ],
-            ),
-            Divider(),
-            Container(
-              height: 44,
-              alignment: Alignment.centerLeft,
-              padding: EdgeInsets.symmetric(horizontal: 10),
-              child: Text(
-                items['type'],
-                style: TextStyle(fontWeight: FontWeight.bold, fontSize: 14),
-              ),
-            ),
-            Row(
-              children: [
-                Container(
-                  width: 400,
-                  margin: EdgeInsets.symmetric(horizontal: 10),
-                  decoration: BoxDecoration(
-                      border: Border.all(color: Colors.black.withOpacity(0.1)),
-                      shape: BoxShape.rectangle,
-                      borderRadius: BorderRadius.circular(12)),
-                  child: Row(
-                    children: [
-                      SizedBox(
-                        width: 100,
-                        height: 79.17,
-                        child: gambar(items),
-                      ),
-                      Container(
-                        width: 5,
-                      ),
-                      Column(
-                        children: [
-                          Container(
-                            margin: EdgeInsets.all(5),
-                            child: Text(
-                              items['smallText'],
-                              overflow: TextOverflow.clip,
-                              style: TextStyle(
-                                  fontWeight: FontWeight.w400,
-                                  color: Color(0xff292D32),
-                                  fontSize: 14),
-                            ),
-                          ),
-                          DottedLine(
-                            lineLength: 272,
-                          ),
-                          Container(
-                            margin: EdgeInsets.all(5),
-                            width: 272,
-                            child: Text(
-                              items['longText'],
-                              overflow: TextOverflow.clip,
-                              style: TextStyle(
-                                  fontWeight: FontWeight.w300,
-                                  color: Color(0xff292D32),
-                                  fontSize: 13),
-                            ),
-                          )
-                        ],
-                      )
-                    ],
-                  ),
-                ),
-              ],
-            ),
-            Container(
-              height: 10,
-            ),
-            Container(
-              padding: EdgeInsets.symmetric(horizontal: 10),
-              child: Row(
-                children: [
-                  Text(
-                    'Ticket Number',
-                    style: TextStyle(color: Color(0xff292D32), fontSize: 14),
-                  ),
-                  Spacer(),
-                  Text(
-                    '202209270254',
-                    style: TextStyle(color: Color(0xff292D32), fontSize: 14),
-                  )
-                ],
-              ),
-            ),
-            Container(
-              height: 10,
-            ),
-            Container(
-              padding: EdgeInsets.symmetric(horizontal: 10),
-              child: Row(
-                children: [
-                  Text(
-                    'Location',
-                    style: TextStyle(color: Color(0xff292D32), fontSize: 14),
-                  ),
-                  Spacer(),
-                  Text(
-                    'Room 331',
-                    style: TextStyle(color: Color(0xff292D32), fontSize: 14),
-                  )
-                ],
-              ),
-            ),
-            Container(
-              margin: EdgeInsets.all(10),
-              height: 1,
-              color: Color(0xff292D32).withOpacity(0.5),
-            ),
-            Container(
-              alignment: Alignment.centerLeft,
-              padding: EdgeInsets.symmetric(horizontal: 10),
-              child: Text(
-                'Image',
-                style: TextStyle(fontWeight: FontWeight.w400, fontSize: 14),
-              ),
-            ),
-            Container(
-              height: 5,
-            ),
-            Container(
-              alignment: Alignment.centerLeft,
-              padding: EdgeInsets.symmetric(horizontal: 10),
-              child: Text(
-                'No image attached.',
-                style: TextStyle(
-                    fontWeight: FontWeight.w400,
-                    fontSize: 12,
-                    color: Color(0xff292D32).withOpacity(0.85)),
-              ),
-            ),
-            Container(
-              height: 10,
-            ),
-            Container(
-              alignment: Alignment.centerLeft,
-              padding: EdgeInsets.symmetric(horizontal: 10),
-              child: Text(
-                'Note',
-                style: TextStyle(fontWeight: FontWeight.w400, fontSize: 14),
-              ),
-            ),
-            Container(
-              height: 5,
-            ),
-            Container(
-              alignment: Alignment.centerLeft,
-              padding: EdgeInsets.symmetric(horizontal: 10),
-              child: Text(
-                '-',
-                style: TextStyle(
-                    fontWeight: FontWeight.w400,
-                    fontSize: 12,
-                    color: Color(0xff292D32).withOpacity(0.85)),
-              ),
-            ),
-            Divider(
-              thickness: 8,
-            ),
-            Container(
-              height: 10,
-            ),
-            Container(
-              alignment: Alignment.centerLeft,
-              padding: EdgeInsets.symmetric(horizontal: 10),
-              child: Text(
-                'Activity',
-                style: TextStyle(fontWeight: FontWeight.bold, fontSize: 14),
-              ),
-            ),
-            Container(
-              height: 10,
-            ),
-            Container(
-              padding: EdgeInsets.symmetric(horizontal: 10),
-              child: Row(
-                children: [
-                  Text(
-                    'Servant',
-                    style: TextStyle(color: Color(0xff292D32), fontSize: 14),
-                  ),
-                  Spacer(),
-                  Text(
-                    'Rendra WS',
-                    style: TextStyle(color: Color(0xff292D32), fontSize: 14),
-                  )
-                ],
-              ),
-            ),
-            Container(
-              margin: EdgeInsets.all(10),
-              height: 1,
-              color: Color(0xff292D32).withOpacity(0.5),
-            ),
-            Container(
-              alignment: Alignment.centerLeft,
-              padding: EdgeInsets.symmetric(horizontal: 10),
-              child: Text(
-                'Timeline',
-                style: TextStyle(fontWeight: FontWeight.w400, fontSize: 14),
-              ),
-            ),
-            Container(
-              margin: EdgeInsets.all(10),
-              child: Column(
-                children: [
-                  SizedBox(
-                      child: TimelineTile(
-                          isFirst: true,
-                          endChild: Container(
-                            margin:
-                                EdgeInsets.only(bottom: 10, top: 10, left: 10),
-                            child: Row(
-                              children: [
-                                Text('Requested'),
-                                Spacer(),
-                                Text('31 Jan 12:43')
-                              ],
-                            ),
-                          ))),
-                  SizedBox(
-                      child: TimelineTile(
-                          endChild: Container(
-                    margin: EdgeInsets.only(bottom: 10, top: 10, left: 10),
-                    child: Row(
-                      children: [
-                        Text('On Process'),
-                        Spacer(),
-                        Text('31 Jan 14:43')
-                      ],
-                    ),
-                  ))),
-                  SizedBox(
-                      child: TimelineTile(
-                    indicatorStyle:
-                        IndicatorStyle(color: Color(0xff078C84), width: 25),
-                    isLast: true,
-                    endChild: Container(
-                      margin: EdgeInsets.only(bottom: 10, top: 10, left: 10),
-                      child: Row(
-                        children: [
-                          Text('Finish'),
-                          Spacer(),
-                          Text('31 Jan 15:43')
-                        ],
-                      ),
-                    ),
-                  )),
-                ],
-              ),
-            ),
-            Container(
-              alignment: Alignment.centerRight,
-              padding: EdgeInsets.symmetric(horizontal: 10),
-              child: Text(
-                'tamu minta dibungkus untuk dibawa keluar',
-                style: TextStyle(
-                  fontWeight: FontWeight.w400,
-                  fontSize: 12,
-                  color: Color(0xff078C84),
-                ),
-              ),
-            ),
-            Container(
-              height: 10,
-            ),
-            Container(
-              margin: EdgeInsets.all(10),
-              height: 1,
-              color: Color(0xff292D32).withOpacity(0.5),
-            ),
-            Container(
-              height: 10,
-            ),
-            Container(
-              padding: EdgeInsets.symmetric(horizontal: 10),
-              child: Row(
-                children: [
-                  Container(
-                    width: 10,
-                  ),
-                  Text(
-                    'Rate',
-                    style: TextStyle(color: Color(0xff292D32), fontSize: 14),
-                  ),
-                  Spacer(),
-                  Text(
-                    'Really pleased',
-                    style: TextStyle(color: Color(0xff292D32), fontSize: 14),
-                  ),
-                  Container(
-                    width: 10,
-                  ),
-                  Icon(Icons.tag_faces)
-                ],
-              ),
-            ),
-            Divider(
-              thickness: 8,
-            ),
-          ],
-        ),
-      ),
-    );
-  }
-
-  Container gambar(items) {
-    return Container(
-      decoration: BoxDecoration(
-          border: Border.all(color: items['color']),
-          borderRadius: BorderRadius.all(Radius.circular(20)),
-          color: items['color'].withOpacity(0.4)),
-      padding: const EdgeInsets.all(5.0),
-      child: Image.asset(
-        items['image'],
-        fit: BoxFit.cover,
-      ),
-    );
-  }
-}

+ 30 - 0
lib/footer.dart

@@ -0,0 +1,30 @@
+import 'package:flutter/material.dart';
+
+class Footer extends StatelessWidget {
+  const Footer({super.key});
+
+  @override
+  Widget build(BuildContext context) {
+    return BottomAppBar(
+      height: 50,
+      child: Row(
+        mainAxisAlignment: MainAxisAlignment.center,
+        children: [
+          //todo clickable
+          Padding(
+            padding: const EdgeInsets.symmetric(horizontal: 8),
+            child: Text('About Us'),
+          ),
+          Padding(
+            padding: const EdgeInsets.symmetric(horizontal: 8),
+            child: Text('Contact'),
+          ),
+          Padding(
+            padding: const EdgeInsets.symmetric(horizontal: 8),
+            child: Text('Privacy Policy'),
+          )
+        ],
+      ),
+    );
+  }
+}

+ 13 - 0
lib/globals.dart

@@ -0,0 +1,13 @@
+library my_prj.globals;
+import 'dart:convert';
+
+String USER_LOGIN = 'user';
+String PASS_LOGIN = 'password';
+var path = 'http://localhost:8080/api/v1/';
+
+var auth = 'Basic ${base64Encode(utf8.encode('$USER_LOGIN:$PASS_LOGIN'))}';
+Map<String, String> headers = {
+  'content-type': 'application/json',
+  'accept': 'application/json',
+  'authorization': auth
+};

+ 443 - 0
lib/header.dart

@@ -0,0 +1,443 @@
+import 'package:dropdown_button2/dropdown_button2.dart';
+import 'package:flutter/material.dart';
+import 'package:go_router/go_router.dart';
+
+class CustomAppbar extends StatefulWidget implements PreferredSizeWidget {
+  final bool? isBack;
+  final TextEditingController? controller;
+
+  const CustomAppbar({super.key, this.isBack, this.controller});
+
+  @override
+  State<CustomAppbar> createState() => _CustomAppbarState();
+
+  @override
+  Size get preferredSize => Size(15, 50);
+}
+
+class _CustomAppbarState extends State<CustomAppbar> {
+  @override
+  Widget build(BuildContext context) {
+    return AppBar(
+      backgroundColor: Colors.white,
+      leading: Icon(Icons.bug_report),
+      titleSpacing: 0,
+      title: Text(
+        'Bug Listing',
+        style: TextStyle(fontSize: 28, fontWeight: FontWeight.w500),
+      ),
+      actions: [
+        Padding(
+          padding: const EdgeInsets.symmetric(horizontal: 8.0),
+          child: DropdownButtonHideUnderline(
+            child: DropdownButton2(
+              customButton: const Icon(Icons.home),
+              onChanged: (value) => context.go('/'), 
+              items: [
+                DropdownMenuItem(
+                  child: Text('Home'),
+                )
+              ],
+              dropdownStyleData: DropdownStyleData(
+                width: 80,
+                padding: const EdgeInsets.symmetric(vertical: 6),
+                decoration: BoxDecoration(
+                  borderRadius: BorderRadius.circular(4),
+                ),
+                offset: const Offset(0, 8),
+              ),
+            ),
+          ),
+        ),
+        Padding(
+          padding: const EdgeInsets.symmetric(horizontal: 8.0),
+          child: DropdownButtonHideUnderline(
+            child: DropdownButton2(
+              customButton: const Icon(Icons.person),
+              items: [
+                ...UserItems.firstItems.map(
+                  (item) => DropdownMenuItem<MenuItem>(
+                    value: item,
+                    child: UserItems.buildItem(item),
+                  ),
+                ),
+              ],
+              onChanged: (value) {
+                UserItems.onChanged(context, value!);
+              },
+              dropdownStyleData: DropdownStyleData(
+                width: 100,
+                padding: const EdgeInsets.symmetric(vertical: 6),
+                decoration: BoxDecoration(
+                  borderRadius: BorderRadius.circular(4),
+                ),
+                offset: const Offset(0, 8),
+              ),
+              menuItemStyleData: MenuItemStyleData(
+                customHeights: [
+                  ...List<double>.filled(UserItems.firstItems.length, 48),
+                ],
+                padding: const EdgeInsets.only(left: 16, right: 16),
+              ),
+            ),
+          ),
+        ),
+        Padding(
+          padding: const EdgeInsets.symmetric(horizontal: 8.0),
+          child: DropdownButtonHideUnderline(
+            child: DropdownButton2(
+              customButton: const Icon(Icons.bug_report),
+              items: [
+                ...BugItems.firstItems.map(
+                  (item) => DropdownMenuItem<MenuItem>(
+                    value: item,
+                    child: BugItems.buildItem(item),
+                  ),
+                ),
+              ],
+              onChanged: (value) {
+                BugItems.onChanged(context, value!);
+              },
+              dropdownStyleData: DropdownStyleData(
+                width: 120,
+                padding: const EdgeInsets.symmetric(vertical: 6),
+                decoration: BoxDecoration(
+                  borderRadius: BorderRadius.circular(4),
+                ),
+                offset: const Offset(0, 8),
+              ),
+              menuItemStyleData: MenuItemStyleData(
+                customHeights: [
+                  ...List<double>.filled(BugItems.firstItems.length, 48),
+                ],
+                padding: const EdgeInsets.only(left: 16, right: 16),
+              ),
+            ),
+          ),
+        ),
+        Padding(
+          padding: const EdgeInsets.symmetric(horizontal: 8.0),
+          child: DropdownButtonHideUnderline(
+            child: DropdownButton2(
+              customButton: const Icon(Icons.build),
+              items: [
+                ...ProjectItems.firstItems.map(
+                  (item) => DropdownMenuItem<MenuItem>(
+                    value: item,
+                    child: ProjectItems.buildItem(item),
+                  ),
+                ),
+              ],
+              onChanged: (value) {
+                ProjectItems.onChanged(context, value!);
+              },
+              dropdownStyleData: DropdownStyleData(
+                width: 150,
+                padding: const EdgeInsets.symmetric(vertical: 6),
+                decoration: BoxDecoration(
+                  borderRadius: BorderRadius.circular(4),
+                ),
+                offset: const Offset(0, 8),
+              ),
+              menuItemStyleData: MenuItemStyleData(
+                customHeights: [
+                  ...List<double>.filled(ProjectItems.firstItems.length, 48),
+                ],
+                padding: const EdgeInsets.only(left: 16, right: 16),
+              ),
+            ),
+          ),
+        ),
+        Padding(
+          padding: const EdgeInsets.symmetric(horizontal: 8.0),
+          child: DropdownButtonHideUnderline(
+            child: DropdownButton2(
+              customButton: const Icon(Icons.dynamic_form),
+              items: [
+                ...PlatformItems.firstItems.map(
+                  (item) => DropdownMenuItem<MenuItem>(
+                    value: item,
+                    child: PlatformItems.buildItem(item),
+                  ),
+                ),
+              ],
+              onChanged: (value) {
+                PlatformItems.onChanged(context, value!);
+              },
+              dropdownStyleData: DropdownStyleData(
+                width: 150,
+                padding: const EdgeInsets.symmetric(vertical: 6),
+                decoration: BoxDecoration(
+                  borderRadius: BorderRadius.circular(4),
+                ),
+                offset: const Offset(0, 8),
+              ),
+              menuItemStyleData: MenuItemStyleData(
+                customHeights: [
+                  ...List<double>.filled(PlatformItems.firstItems.length, 48),
+                ],
+                padding: const EdgeInsets.only(left: 16, right: 16),
+              ),
+            ),
+          ),
+        ),
+        Padding(
+          padding: const EdgeInsets.symmetric(horizontal: 8),
+          child: DropdownButtonHideUnderline(
+            child: DropdownButton2(
+              customButton: const Icon(Icons.pan_tool),
+              items: [
+                DropdownMenuItem(
+                  child: Text('Maintenance'),
+                )
+              ],
+              onChanged: (value) => context.go('/maintenance'),
+              dropdownStyleData: DropdownStyleData(
+                width: 130,
+                padding: const EdgeInsets.symmetric(vertical: 6),
+                decoration: BoxDecoration(
+                  borderRadius: BorderRadius.circular(4),
+                ),
+                offset: const Offset(0, 8),
+              ),
+            ),
+          ),
+        ),
+                Padding(
+          padding: const EdgeInsets.symmetric(horizontal: 8.0),
+          child: DropdownButtonHideUnderline(
+            child: DropdownButton2(
+              customButton: const Icon(Icons.logout),
+              items: [
+                ...LogoutItems.firstItems.map(
+                  (item) => DropdownMenuItem<MenuItem>(
+                    value: item,
+                    child: LogoutItems.buildItem(item),
+                  ),
+                ),
+              ],
+              onChanged: (value) {
+                LogoutItems.onChanged(context, value!);
+              },
+              dropdownStyleData: DropdownStyleData(
+                width: 170,
+                padding: const EdgeInsets.symmetric(vertical: 6),
+                decoration: BoxDecoration(
+                  borderRadius: BorderRadius.circular(4),
+                ),
+                offset: const Offset(0, 8),
+              ),
+              menuItemStyleData: MenuItemStyleData(
+                customHeights: [
+                  ...List<double>.filled(LogoutItems.firstItems.length, 48),
+                ],
+                padding: const EdgeInsets.only(left: 16, right: 16),
+              ),
+            ),
+          ),
+        ),
+      ],
+    );
+  }
+}
+
+class MenuItem {
+  const MenuItem({
+    required this.text,
+  });
+
+  final String text;
+}
+
+mixin PlatformItems {
+  static const List<MenuItem> firstItems = [add, edit, list];
+
+  static const add = MenuItem(text: 'Add Platform');
+  static const edit = MenuItem(text: 'Edit Platform');
+  static const list = MenuItem(text: 'List Platform');
+
+  static Widget buildItem(MenuItem item) {
+    return Row(
+      children: [
+        Expanded(
+          child: Text(
+            item.text,
+            style: const TextStyle(
+              color: Colors.black,
+            ),
+          ),
+        ),
+      ],
+    );
+  }
+
+  static void onChanged(BuildContext context, MenuItem item) {
+    switch (item) {
+      case PlatformItems.add:
+        context.go('/addplatform');
+        break;
+      case PlatformItems.edit:
+        context.go('/listplatform/editplatform');
+        break;
+      case PlatformItems.list:
+        context.go('/listplatform');
+        break;
+    }
+  }
+}
+
+mixin BugItems {
+  static const List<MenuItem> firstItems = [add, edit, list/*, listcomment*/];
+
+  static const add = MenuItem(text: 'Add Bug');
+  static const edit = MenuItem(text: 'Edit Bug');
+  static const list = MenuItem(text: 'List Bug');
+  static const listcomment = MenuItem(text: 'List Comment');
+
+  static Widget buildItem(MenuItem item) {
+    return Row(
+      children: [
+        Expanded(
+          child: Text(
+            item.text,
+            style: const TextStyle(
+              color: Colors.black,
+            ),
+          ),
+        ),
+      ],
+    );
+  }
+
+  static void onChanged(BuildContext context, MenuItem item) {
+    switch (item) {
+      case BugItems.add:
+        context.go('/addbug');
+        break;
+      case BugItems.edit:
+        context.go('/login/bug/editbug');
+        break;
+      case BugItems.list:
+        context.go('/login/bug');
+        break;
+      case BugItems.listcomment:
+        context.go('/listcomment');
+        break;
+    }
+  }
+}
+
+mixin UserItems {
+  static const List<MenuItem> firstItems = [/*edit, change,*/ list];
+
+  static const edit = MenuItem(text: 'Edit User');
+  static const change = MenuItem(text: 'Edit Password');
+  static const list = MenuItem(text: 'List User');
+
+  static Widget buildItem(MenuItem item) {
+    return Row(
+      children: [
+        Expanded(
+          child: Text(
+            item.text,
+            style: const TextStyle(
+              color: Colors.black,
+            ),
+          ),
+        ),
+      ],
+    );
+  }
+
+  static void onChanged(BuildContext context, MenuItem item) {
+    switch (item) {
+      // case UserItems.edit:
+      //   context.go('/signup/listuser/edit');
+      //   break;
+      // case UserItems.change:
+      //   context.go('/login/bug/editbug');
+      //   break;
+      case UserItems.list:
+        context.go('/signup/listuser');
+        break;
+    }
+  }
+}
+
+mixin ProjectItems {
+  static const List<MenuItem> firstItems = [add, edit, list, /*addMember, listMember*/];
+
+  static const add = MenuItem(text: 'Add Project');
+  static const edit = MenuItem(text: 'Edit Project');
+  static const list = MenuItem(text: 'List Project');
+  static const addMember = MenuItem(text: 'Add Member');
+  static const listMember = MenuItem(text: 'List Member');
+
+  static Widget buildItem(MenuItem item) {
+    return Row(
+      children: [
+        Expanded(
+          child: Text(
+            item.text,
+            style: const TextStyle(
+              color: Colors.black,
+            ),
+          ),
+        ),
+      ],
+    );
+  }
+
+  static void onChanged(BuildContext context, MenuItem item) {
+    switch (item) {
+      case ProjectItems.add:
+        context.go('/addproject');
+        break;
+      case ProjectItems.edit:
+        context.go('/editproject');
+        break;
+      case ProjectItems.list:
+        context.go('/listproject');
+        break;
+      case ProjectItems.addMember:
+        context.go('/addmember');
+        break;
+      case ProjectItems.listMember:
+        context.go('/listplatform/listmember');
+        break;
+    }
+  }
+}
+
+mixin LogoutItems {
+  static const List<MenuItem> firstItems = [changepass, logout];
+
+  static const logout = MenuItem(text: 'Log Out');
+  static const changepass = MenuItem(text: 'Change Password');
+
+  static Widget buildItem(MenuItem item) {
+    return Row(
+      children: [
+        Expanded(
+          child: Text(
+            item.text,
+            style: const TextStyle(
+              color: Colors.black,
+            ),
+          ),
+        ),
+      ],
+    );
+  }
+
+  static void onChanged(BuildContext context, MenuItem item) {
+    switch (item) {
+      case LogoutItems.changepass:
+        context.go('/changepass');
+        break;
+      case LogoutItems.logout:
+        // context.go('/editproject');
+        break;
+    }
+  }
+}

+ 0 - 60
lib/lang.dart

@@ -1,60 +0,0 @@
-import 'package:flutter/material.dart';
-
-class Lang extends StatefulWidget {
-  const Lang({
-    super.key,
-  });
-
-  @override
-  State<Lang> createState() => _LangState();
-}
-
-class _LangState extends State<Lang> {
-  bool _hasBeenPressed = false;
-  @override
-  Widget build(BuildContext context) {
-    return Padding(
-      padding: const EdgeInsets.all(8.0),
-      child: Row(
-        children: [
-          ElevatedButton(
-              onPressed: () => {
-                    setState(() {
-                      _hasBeenPressed = !_hasBeenPressed;
-                    })
-                  },
-              style: ElevatedButton.styleFrom(
-                  backgroundColor: _hasBeenPressed
-                      ? Colors.white.withOpacity(0.4)
-                      : Color(0xffFF6600),
-                  shape: RoundedRectangleBorder(
-                      borderRadius: BorderRadius.only(
-                          topLeft: Radius.circular(30),
-                          bottomLeft: Radius.circular(30)))),
-              child: Text(
-                'EN',
-                style: TextStyle(color: Colors.white),
-              )),
-          ElevatedButton(
-              onPressed: () => {
-                    setState(() {
-                      _hasBeenPressed = !_hasBeenPressed;
-                    })
-                  },
-              style: ElevatedButton.styleFrom(
-                  backgroundColor: _hasBeenPressed
-                      ? Color(0xffFF6600)
-                      : Colors.white.withOpacity(0.4),
-                  shape: RoundedRectangleBorder(
-                      borderRadius: BorderRadius.only(
-                          topRight: Radius.circular(30),
-                          bottomRight: Radius.circular(30)))),
-              child: Text(
-                'ID',
-                style: TextStyle(color: Colors.white),
-              )),
-        ],
-      ),
-    );
-  }
-}

+ 0 - 222
lib/list.dart

@@ -1,222 +0,0 @@
-import 'package:flutter/material.dart';
-import 'package:go_router/go_router.dart';
-import 'package:namer_app/data.dart';
-import 'package:date_format/date_format.dart';
-
-var date = formatDate(DateTime.now(), [HH, ':', nn]);
-
-class ListPage extends StatelessWidget {
-  const ListPage({super.key});
-
-  @override
-  Widget build(BuildContext context) {
-    return Scaffold(
-        appBar: AppBar(
-          backgroundColor: Color(0xff078C84),
-          automaticallyImplyLeading: false,
-          elevation: 0,
-          toolbarHeight: 44,
-          title: Text(
-            date,
-            style: TextStyle(color: Colors.white, fontSize: 15),
-          ),
-          actions: [
-            Icon(
-              Icons.signal_cellular_alt,
-              color: Colors.white,
-            ),
-            Icon(
-              Icons.wifi,
-              color: Colors.white,
-            ),
-            RotatedBox(
-              quarterTurns: -3,
-              child: Icon(
-                Icons.battery_std,
-                color: Colors.white,
-              ),
-            )
-          ],
-        ),
-        body: Stack(children: [
-          Container(
-            decoration: BoxDecoration(color: Color(0xff078C84)),
-          ),
-          SingleChildScrollView(
-            child: Container(
-              decoration: BoxDecoration(
-                  color: Colors.white,
-                  borderRadius: BorderRadius.only(
-                      topLeft: Radius.circular(16),
-                      topRight: Radius.circular(16)),
-                  border: Border.all(color: Color(0xff078C84))),
-              child: Column(
-                children: [
-                  Container(
-                    margin: EdgeInsets.symmetric(vertical: 5),
-                    color: Color(0xff292D32).withOpacity(0.15),
-                    height: 1,
-                    width: 24,
-                  ),
-                  TopMenu(),
-                  Column(
-                    children: List.generate(
-                        7,
-                        (i) => SizedBox(
-                              child: ListTile(
-                                leading: SizedBox(
-                                  width: 60,
-                                  height: 60,
-                                  child: gambar(items[i]),
-                                ),
-                                title: Text(items[i]['type']),
-                                subtitle: Text(
-                                    'Description of ${items[i]['type'].toLowerCase()}'),
-                                trailing: IconDelete(
-                                  items: items[i],
-                                ),
-                              ),
-                            )),
-                  ),
-                  Divider(
-                    thickness: 8,
-                  ),
-                  AvailableMenu(),
-                  Column(
-                    children: List.generate(
-                        items.length,
-                        (i) => SizedBox(
-                              child: ListTile(
-                                leading: SizedBox(
-                                  width: 60,
-                                  height: 60,
-                                  child: gambar(items[i]),
-                                ),
-                                title: Text(items[i]['type']),
-                                subtitle: Text(
-                                    'Description of ${items[i]['type'].toLowerCase()}'),
-                                trailing: IconAdd(),
-                              ),
-                            )),
-                  )
-                ],
-              ),
-            ),
-          ),
-        ]));
-  }
-
-  Container gambar(items) {
-    return Container(
-      decoration: BoxDecoration(
-          border: Border.all(color: items['color']),
-          borderRadius: BorderRadius.all(Radius.circular(20)),
-          color: items['color'].withOpacity(0.4)),
-      padding: const EdgeInsets.all(5.0),
-      child: Image.asset(
-        items['image'],
-        fit: BoxFit.cover,
-      ),
-    );
-  }
-}
-
-class AvailableMenu extends StatelessWidget {
-  const AvailableMenu({
-    super.key,
-  });
-
-  @override
-  Widget build(BuildContext context) {
-    return Container(
-      padding: const EdgeInsets.all(5.0),
-      child: Row(
-        children: [
-          Text(
-            'Available Menu',
-            textAlign: TextAlign.left,
-            style: TextStyle(
-                fontWeight: FontWeight.bold, color: Color(0xff292D32)),
-          ),
-        ],
-      ),
-    );
-  }
-}
-
-class TopMenu extends StatelessWidget {
-  const TopMenu({
-    super.key,
-  });
-
-  @override
-  Widget build(BuildContext context) {
-    return Container(
-      padding: const EdgeInsets.all(5.0),
-      child: Row(
-        children: [
-          Text(
-            'Top Menu',
-            textAlign: TextAlign.left,
-            style: TextStyle(
-                fontWeight: FontWeight.bold, color: Color(0xff292D32)),
-          ),
-          Spacer(),
-          ElevatedButton(
-              style: ElevatedButton.styleFrom(
-                  backgroundColor: Color(0xff078C84).withOpacity(0.1)),
-              onPressed: () => context.go('/list/listblock'),
-              child: Text(
-                'Done',
-                style: TextStyle(
-                    color: Color(0xff078C84), fontWeight: FontWeight.w300),
-              ))
-        ],
-      ),
-    );
-  }
-}
-
-class IconAdd extends StatelessWidget {
-  const IconAdd({
-    super.key,
-  });
-
-  @override
-  Widget build(BuildContext context) {
-    return IconButton(
-      color: Colors.red,
-      onPressed: () {},
-      icon: Icon(Icons.add_circle),
-    );
-  }
-}
-
-class IconDelete extends StatelessWidget {
-  final Map<String, dynamic> items;
-  IconDelete({
-    required this.items,
-    super.key,
-  });
-
-  @override
-  Widget build(BuildContext context) {
-    return Row(
-      mainAxisSize: MainAxisSize.min,
-      children: [
-        IconButton(
-          icon: Icon(Icons.remove_circle),
-          color: Colors.red,
-          onPressed: () {
-            print(items);
-          },
-        ),
-        SizedBox(width: 10),
-        IconButton(
-          onPressed: () => context.go("/list/detail/${items['type']}"),
-          icon: Icon(Icons.menu),
-        )
-      ],
-    );
-  }
-}

+ 0 - 188
lib/listblock.dart

@@ -1,188 +0,0 @@
-import 'package:flutter/material.dart';
-import 'package:go_router/go_router.dart';
-import 'package:namer_app/data.dart';
-import 'package:date_format/date_format.dart';
-
-var date = formatDate(DateTime.now(), [HH, ':', nn]);
-
-class ListBlockPage extends StatelessWidget {
-  const ListBlockPage({super.key});
-
-  @override
-  Widget build(BuildContext context) {
-    return Scaffold(
-        appBar: AppBar(
-          backgroundColor: Color(0xff078C84),
-          automaticallyImplyLeading: false,
-          elevation: 0,
-          toolbarHeight: 44,
-          title: Text(
-            date,
-            style: TextStyle(color: Colors.white, fontSize: 15),
-          ),
-          actions: [
-            Icon(
-              Icons.signal_cellular_alt,
-              color: Colors.white,
-            ),
-            Icon(
-              Icons.wifi,
-              color: Colors.white,
-            ),
-            RotatedBox(
-              quarterTurns: -3,
-              child: Icon(
-                Icons.battery_std,
-                color: Colors.white,
-              ),
-            )
-          ],
-        ),
-        body: Stack(children: [
-          Container(
-            decoration: BoxDecoration(
-              // color: Color(0xff078C84),
-              gradient: LinearGradient(
-                  begin: Alignment.topCenter,
-                  end: Alignment.bottomCenter,
-                  colors: [
-                    Color(0xff078C84),
-                    Colors.white,
-                  ]),
-            ),
-          ),
-          Container(
-            decoration: BoxDecoration(
-                color: Colors.white,
-                borderRadius: BorderRadius.only(
-                    topLeft: Radius.circular(16),
-                    topRight: Radius.circular(16)),
-                border: Border.all(color: Color(0xff078C84))),
-            child: Column(
-              children: [
-                Container(
-                  margin: EdgeInsets.symmetric(vertical: 5),
-                  color: Color(0xff292D32).withOpacity(0.15),
-                  height: 1,
-                  width: 24,
-                ),
-                TopMenu(),
-                GridView.builder(
-                  shrinkWrap: true,
-                  gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
-                      crossAxisCount: 4, childAspectRatio: 16 / 9),
-                  itemBuilder: (context, index) => Column(
-                    mainAxisAlignment: MainAxisAlignment.spaceEvenly,
-                    children: [
-                      InkWell(
-                        onTap: () => context.go(
-                            "/list/listblock/search/${items[index]['type']}"),
-                        child: SizedBox(
-                          width: 60,
-                          height: 60,
-                          child: gambar(items[index]),
-                        ),
-                      ),
-                      Text(items[index]['type']),
-                    ],
-                  ),
-                  itemCount: 7,
-                ),
-                AvailableMenu(),
-                GridView.builder(
-                  shrinkWrap: true,
-                  gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
-                      crossAxisCount: 4, childAspectRatio: 16 / 9),
-                  itemBuilder: (context, index) => Column(
-                    mainAxisAlignment: MainAxisAlignment.spaceEvenly,
-                    children: [
-                      InkWell(
-                        onTap: () => context.go(
-                            "/list/listblock/search/${items[index]['type']}"),
-                        child: SizedBox(
-                          width: 60,
-                          height: 60,
-                          child: gambar(items[index]),
-                        ),
-                      ),
-                      Text(items[index]['type']),
-                    ],
-                  ),
-                  itemCount: items.length,
-                ),
-              ],
-            ),
-          ),
-        ]));
-  }
-
-  Container gambar(items) {
-    return Container(
-      decoration: BoxDecoration(
-          border: Border.all(color: items['color']),
-          borderRadius: BorderRadius.all(Radius.circular(20)),
-          color: items['color'].withOpacity(0.4)),
-      padding: const EdgeInsets.all(5.0),
-      child: Image.asset(
-        items['image'],
-        fit: BoxFit.cover,
-      ),
-    );
-  }
-}
-
-class AvailableMenu extends StatelessWidget {
-  const AvailableMenu({
-    super.key,
-  });
-
-  @override
-  Widget build(BuildContext context) {
-    return Container(
-      padding: const EdgeInsets.all(5.0),
-      child: Row(
-        children: [
-          Text(
-            'Available Menu',
-            textAlign: TextAlign.left,
-            style: TextStyle(
-                fontWeight: FontWeight.bold, color: Color(0xff292D32)),
-          ),
-        ],
-      ),
-    );
-  }
-}
-
-class TopMenu extends StatelessWidget {
-  const TopMenu({
-    super.key,
-  });
-
-  @override
-  Widget build(BuildContext context) {
-    return Container(
-      padding: const EdgeInsets.all(5.0),
-      child: Row(
-        children: [
-          Text(
-            'Top Menu',
-            textAlign: TextAlign.left,
-            style: TextStyle(
-                fontWeight: FontWeight.bold, color: Color(0xff292D32)),
-          ),
-          Spacer(),
-          ElevatedButton(
-              style: ElevatedButton.styleFrom(
-                  backgroundColor: Color(0xff078C84).withOpacity(0.1)),
-              onPressed: () => context.go('/account'),
-              child: Text(
-                'Customize',
-                style: TextStyle(
-                    color: Color(0xff078C84), fontWeight: FontWeight.w300),
-              ))
-        ],
-      ),
-    );
-  }
-}

+ 86 - 0
lib/listtable.dart

@@ -0,0 +1,86 @@
+import 'package:flutter/material.dart';
+import 'package:namer_app/data/datatable.dart';
+import 'package:namer_app/footer.dart';
+import 'package:namer_app/header.dart';
+
+class ListTablePage extends StatelessWidget {
+  const ListTablePage({super.key});
+
+  @override
+  Widget build(BuildContext context) {
+    return Scaffold(
+      appBar: CustomAppbar(),
+      body: Stack(children: [
+        SingleChildScrollView(
+          child: Column(
+            children: [
+              Center(
+                  child: Row(
+                mainAxisAlignment: MainAxisAlignment.center,
+                children: [
+                  Text(
+                    'Maintenance',
+                    style: TextStyle(color: Colors.black, fontSize: 48),
+                  ),
+                ],
+              )),
+              Column(
+                children: List.generate(
+                    5,
+                    (i) => SizedBox(
+                          child: ListTile(
+                            leading: SizedBox(
+                              child: Icon(Icons.table_bar),
+                            ),
+                            title: Text(tables[i]['table']),
+                            trailing: ButtonUser(
+                              items: tables[i],
+                            ),
+                          ),
+                        )),
+              ),
+            ],
+          ),
+        ),
+      ]),
+      bottomNavigationBar: Footer(),
+    );
+  }
+}
+
+class ButtonUser extends StatelessWidget {
+  final Map<String, dynamic> items;
+  ButtonUser({
+    required this.items,
+    super.key,
+  });
+  //todo tombol item
+  @override
+  Widget build(BuildContext context) {
+    return Row(
+      mainAxisSize: MainAxisSize.min,
+      children: [
+        ElevatedButton(
+          onPressed: null,
+          style: ElevatedButton.styleFrom(
+            backgroundColor: Colors.black,
+          ),
+          child: Text(
+            'Backup',
+            style: TextStyle(color: Colors.white),
+          ),
+        ),
+        ElevatedButton(
+          onPressed: null,
+          style: ElevatedButton.styleFrom(
+            backgroundColor: Colors.black,
+          ),
+          child: Text(
+            'Restore',
+            style: TextStyle(color: Colors.white),
+          ),
+        ),
+      ],
+    );
+  }
+}

+ 78 - 133
lib/login.dart

@@ -1,166 +1,111 @@
+// ignore_for_file: use_build_context_synchronously
+
 import 'package:flutter/material.dart';
-import 'package:go_router/go_router.dart';
-import 'package:namer_app/lang.dart';
+import 'package:namer_app/footer.dart';
+import 'package:namer_app/header.dart';
+import 'package:namer_app/service/login_serv.dart';
 
 class LoginPage extends StatelessWidget {
   const LoginPage({super.key});
 
   @override
   Widget build(BuildContext context) {
+
+    final usernameController = TextEditingController();
+    final passwordController = TextEditingController();
     return Scaffold(
-      backgroundColor: Theme.of(context).colorScheme.primaryContainer,
-      body: Container(
-        decoration: BoxDecoration(
-            gradient: LinearGradient(
-                begin: Alignment.topCenter,
-                end: Alignment.bottomCenter,
-                colors: [
-                  Color(0xffD9D9D9),
-                  Color(0xff0F968E),
-                  Color(0xff000000)
-                ]),
-            image: DecorationImage(
-              image: AssetImage("assets/images/building.jpg"),
-              fit: BoxFit.cover,
-            )),
-        child: Column(
-          mainAxisAlignment: MainAxisAlignment.spaceEvenly,
-          children: [
-            Row(
+      appBar: CustomAppbar(),
+      backgroundColor: Colors.white,
+      body: Column(
+        mainAxisAlignment: MainAxisAlignment.spaceEvenly,
+        children: [
+          Expanded(
+            child: Center(
+                child: Row(
+              mainAxisAlignment: MainAxisAlignment.center,
               children: [
-                BackButton(color: Colors.white),
-                Column(
-                  crossAxisAlignment: CrossAxisAlignment.start,
-                  children: [
-                    Text(
-                      'Kembali',
-                      style: TextStyle(color: Colors.white),
-                    ),
-                    Text(
-                      'pindai QR',
-                      style: TextStyle(color: Colors.white),
-                    ),
-                  ],
+                Text(
+                  'LOGIN',
+                  style: TextStyle(color: Colors.black, fontSize: 48),
                 ),
-                Expanded(child: Container()),
-                Lang(),
               ],
-            ),
-            Expanded(
-              child: Center(
-                  child: Row(
-                mainAxisAlignment: MainAxisAlignment.center,
-                children: [
-                  Text(
-                    'tel',
-                    style: TextStyle(color: Color(0xffFF6600), fontSize: 48),
-                  ),
-                  Text(
-                    'now',
-                    style: TextStyle(color: Color(0xffFFFFFF), fontSize: 48),
-                  ),
-                ],
-              )),
-            ),
-            Expanded(
-                child: Column(
-              children: [
-                Padding(
-                  padding: const EdgeInsets.all(8.0),
-                  child: SizedBox(
-                    width: 396,
-                    height: 51,
-                    child: TextField(
-                      decoration: InputDecoration(
-                          border: OutlineInputBorder(),
-                          focusedBorder: OutlineInputBorder(
-                              borderRadius:
-                                  BorderRadius.all(Radius.circular(12)),
-                              borderSide: BorderSide(color: Colors.white)),
-                          enabledBorder: OutlineInputBorder(
-                              borderRadius:
-                                  BorderRadius.all(Radius.circular(12)),
-                              borderSide: BorderSide(color: Colors.white)),
-                          labelText: 'Nama Pengguna',
-                          labelStyle: TextStyle(color: Colors.white),
-                          filled: true,
-                          fillColor: Colors.white.withOpacity(0.25)),
-                      cursorColor: Colors.white,
-                      style: TextStyle(color: Colors.white),
-                    ),
-                  ),
-                ),
-                SizedBox(
+            )),
+          ),
+          Expanded(
+              child: Column(
+            children: [
+              Padding(
+                padding: const EdgeInsets.all(8.0),
+                child: SizedBox(
                   width: 396,
                   height: 51,
                   child: TextField(
-                    obscureText: true,
                     decoration: InputDecoration(
                         border: OutlineInputBorder(),
                         focusedBorder: OutlineInputBorder(
                             borderRadius: BorderRadius.all(Radius.circular(12)),
-                            borderSide: BorderSide(color: Colors.white)),
+                            borderSide: BorderSide(color: Colors.black)),
                         enabledBorder: OutlineInputBorder(
                             borderRadius: BorderRadius.all(Radius.circular(12)),
-                            borderSide: BorderSide(color: Colors.white)),
-                        labelText: 'Kata Sandi',
-                        labelStyle: TextStyle(color: Colors.white),
+                            borderSide: BorderSide(color: Colors.black)),
+                        labelText: 'Enter Username',
+                        labelStyle: TextStyle(color: Colors.black),
                         filled: true,
                         fillColor: Colors.white.withOpacity(0.25)),
-                    cursorColor: Colors.white,
-                    style: TextStyle(color: Colors.white),
+                    cursorColor: Colors.black,
+                    style: TextStyle(color: Colors.black),
+                    controller: usernameController,
                   ),
                 ),
-                Padding(
-                  padding: const EdgeInsets.all(20.0),
-                  child: SizedBox(
-                    width: 396,
-                    height: 61,
-                    child: ElevatedButton(
-                      onPressed: () => context.go('/list'),
-                      style: ElevatedButton.styleFrom(
-                        backgroundColor: Color(0xff078C84).withOpacity(0.76),
-                        side: BorderSide(color: Colors.white),
-                        shape: RoundedRectangleBorder(
-                          borderRadius: BorderRadius.circular(12.0),
-                        ),
-                      ),
-                      child: Text(
-                        'Masuk',
-                        style: TextStyle(color: Colors.white),
+              ),
+              SizedBox(
+                width: 396,
+                height: 51,
+                child: TextField(
+                  obscureText: true,
+                  decoration: InputDecoration(
+                      border: OutlineInputBorder(),
+                      focusedBorder: OutlineInputBorder(
+                          borderRadius: BorderRadius.all(Radius.circular(12)),
+                          borderSide: BorderSide(color: Colors.black)),
+                      enabledBorder: OutlineInputBorder(
+                          borderRadius: BorderRadius.all(Radius.circular(12)),
+                          borderSide: BorderSide(color: Colors.black)),
+                      labelText: 'Enter Password',
+                      labelStyle: TextStyle(color: Colors.black),
+                      filled: true,
+                      fillColor: Colors.white.withOpacity(0.25)),
+                  cursorColor: Colors.black,
+                  style: TextStyle(color: Colors.black),
+                  controller: passwordController,
+                ),
+              ),
+              Padding(
+                padding: const EdgeInsets.all(20.0),
+                child: SizedBox(
+                  width: 396,
+                  height: 61,
+                  child: ElevatedButton(
+                    onPressed: () => submit(context, usernameController.text, passwordController.text),
+                    style: ElevatedButton.styleFrom(
+                      backgroundColor: Colors.black,
+                      side: BorderSide(color: Colors.white),
+                      shape: RoundedRectangleBorder(
+                        borderRadius: BorderRadius.circular(12.0),
                       ),
                     ),
+                    child: Text(
+                      'Login',
+                      style: TextStyle(color: Colors.white),
+                    ),
                   ),
                 ),
-                Text(
-                  'Frisian Flag Indonesia, Tbk.',
-                  style: TextStyle(color: Colors.white),
-                ),
-              ],
-            )),
-            Padding(
-              padding: const EdgeInsets.all(8.0),
-              child: Column(
-                children: [
-                  Text('Kebijakan Privasi',
-                      style: TextStyle(
-                          fontSize: 16,
-                          decoration: TextDecoration.underline,
-                          fontWeight: FontWeight.w400,
-                          color: Colors.white,
-                          decorationColor: Colors.white)),
-                  Text('Versi 4.0.0.0',
-                      style: TextStyle(
-                        fontSize: 16,
-                        fontWeight: FontWeight.w400,
-                        color: Colors.white,
-                      ))
-                ],
               ),
-            ),
-          ],
-        ),
+            ],
+          )),
+        ],
       ),
+      bottomNavigationBar: Footer(),
     );
   }
 }

+ 176 - 149
lib/main.dart

@@ -1,68 +1,148 @@
+// ignore_for_file: must_call_super, prefer_typing_uninitialized_variables
+
 import 'package:flutter/material.dart';
 import 'package:go_router/go_router.dart';
-import 'package:namer_app/account.dart';
-import 'package:namer_app/data.dart';
-import 'package:namer_app/list.dart';
+import 'package:namer_app/bug/addbug.dart';
+import 'package:namer_app/platform/addplatform.dart';
+import 'package:namer_app/bug/editbug.dart';
+import 'package:namer_app/platform/editplatform.dart';
+import 'package:namer_app/project/addmember.dart';
+import 'package:namer_app/project/addproject.dart';
+import 'package:namer_app/project/editproject.dart';
+import 'package:namer_app/project/listproject.dart';
+import 'package:namer_app/user/chgpass.dart';
+import 'package:namer_app/user/edituser.dart';
+import 'package:namer_app/footer.dart';
+import 'package:namer_app/header.dart';
+import 'package:namer_app/bug/listbug.dart';
+import 'package:namer_app/bug/listcomment.dart';
+import 'package:namer_app/project/listmember.dart';
+import 'package:namer_app/platform/listplatform.dart';
+import 'package:namer_app/listtable.dart';
+import 'package:namer_app/user/listuser.dart';
 import 'package:namer_app/login.dart';
-import 'package:namer_app/lang.dart';
-import 'package:namer_app/listblock.dart';
 import 'package:flutter/rendering.dart';
-import 'package:namer_app/detail.dart';
-import 'package:namer_app/search.dart';
+import 'package:namer_app/user/signup.dart';
+
+import 'bug/addcomment.dart';
+
 
 void main() {
+  
   runApp(MyApp());
 }
 
-final _router = GoRouter(
+// @override
+// void initState(){
+  
+//   getData();
+// }
+// var jsonList;
+// void getData() async { 
+//     try { 
+//       var response = await Dio() 
+//           .get('http://localhost:8080/api/v1/projects',
+//           options: Options(headers: headers)); 
+//       if (response.statusCode == 200) { 
+//         setState(() { 
+//           jsonList = response.data['results'] as List; 
+//         }); 
+//       } else { 
+//         print(response.statusCode); 
+//       } 
+//     } catch (e) { 
+//       print(e); 
+//     } 
+//   } 
+
+  // var jsonList;
+  final _router = GoRouter(
   routes: [
     GoRoute(path: '/', builder: (context, state) => MyHomePage(), routes: [
+      GoRoute(path: 'login', builder: (context, state) => LoginPage(), routes: [
+        GoRoute(
+            path: 'bug',
+            builder: (context, state) => ListBugPage(),
+            routes: [
+              GoRoute(
+                path: 'comment',
+                builder: (context, state) => ListCommentPage(bugId: 1,),
+              ),
+              GoRoute(
+                path: 'editbug',
+                builder: (context, state) => EditBugPage(),
+              )
+            ])
+      ]),
+      GoRoute(
+          path: 'signup',
+          builder: (context, state) => SignupPage(),
+          routes: [
+            GoRoute(
+                path: 'listuser',
+                builder: (context, state) => ListUserPage(),
+                routes: [
+                  GoRoute(
+                    path: 'edit/:id',
+                    builder: (context, state) {
+                      // var item = jsonList.firstWhere(
+                      //   (element) => element('id') == state.pathParameters['id']);
+                        return EditUserPage(id: state.pathParameters['id']);
+                        // return EditUserPage(json: null);
+                    })
+                ])
+          ]),
       GoRoute(
-        path: 'login',
-        builder: (context, state) => LoginPage(),
+        path: 'maintenance',
+        builder: (context, state) => ListTablePage(),
       ),
       GoRoute(
-        path: 'list',
-        builder: (context, state) => ListPage(),
-        routes: [
-          GoRoute(
-            path: 'listblock',
-            builder: (context, state) => ListBlockPage(),
-            routes: [
-              GoRoute(
-                  path: 'search/:type',
-                  builder: (context, state) {
-                    var item = items.firstWhere((element) =>
-                        element['type'] == state.pathParameters['type']);
-                    return SearchPage(items: item);
-                  })
-            ],
-          ),
-          GoRoute(
-              path: 'detail/:type',
-              builder: (context, state) {
-                var item = items.firstWhere((element) =>
-                    element['type'] == state.pathParameters['type']);
-                return DetailPage(items: item);
-              })
-        ],
+          path: 'listplatform',
+          builder: (context, state) => ListPlatformPage(),
+          routes: [
+            GoRoute(
+              path: 'listmember',
+              builder: (context, state) => ListMemberPage(projId: 1,),
+            ),
+            GoRoute(
+              path: 'editplatform',
+              builder: (context, state) => EditPlatformPage(),
+            )
+          ]),
+      GoRoute(
+        path: 'addbug',
+        builder: (context, state) => AddBugPage(),
       ),
       GoRoute(
-        path: 'account',
-        builder: (context, state) => AccountPage(),
+        path: 'addplatform',
+        builder: (context, state) => AddPlatformPage(),
       ),
+      GoRoute(path: 'listproject',
+        builder: (context, state) => ListProjectPage(),
+        ),
+      GoRoute(path: 'addproject',
+        builder: (context, state) => AddProjectPage(),
+        ),
+      GoRoute(path: 'editproject',
+        builder: (context, state) => EditProjectPage(),
+        ),
+      GoRoute(path: 'addmember',
+        builder: (context, state) => AddMemberPage(projId: 1),
+        ),
+      GoRoute(path: 'changepass',
+        builder: (context, state) => ChangepassPage(), ),
+      GoRoute(path: 'addcomment',
+        builder: (context, state) => AddCommentPage(bugId: 1),),
     ]),
   ],
-);
-
+); 
 class MyApp extends StatelessWidget {
   const MyApp({super.key});
-
   @override
   Widget build(BuildContext context) {
     return MaterialApp.router(
       debugShowCheckedModeBanner: false,
-      title: 'TelNow Lat',
+      title: 'Bug Listing',
       routerConfig: _router,
     );
   }
@@ -73,122 +153,69 @@ class MyHomePage extends StatelessWidget {
   Widget build(BuildContext context) {
     debugPaintSizeEnabled = false;
     return Scaffold(
-      body: Container(
-        decoration: BoxDecoration(
-            gradient: LinearGradient(
-                begin: Alignment.topCenter,
-                end: Alignment.bottomCenter,
-                colors: [
-                  Color(0xffD9D9D9),
-                  Color(0xff0F968E),
-                  Color(0xff000000)
-                ]),
-            image: DecorationImage(
-              image: AssetImage("assets/images/building.jpg"),
-              fit: BoxFit.cover,
-            )),
-        child: Column(
-          mainAxisAlignment: MainAxisAlignment.spaceEvenly,
-          children: [
-            Row(
-              mainAxisAlignment: MainAxisAlignment.end,
-              children: [
-                Lang(),
-              ],
-            ),
-            Expanded(
-              child: Center(
-                  child: Row(
+        appBar: CustomAppbar(),
+        body: Container(
+          decoration: BoxDecoration(color: Colors.black.withOpacity(0.6)),
+          child: Column(
+            mainAxisAlignment: MainAxisAlignment.spaceEvenly,
+            children: [
+              Expanded(
+                child: Center(
+                    child: Row(
+                  mainAxisAlignment: MainAxisAlignment.center,
+                  children: [
+                    Text(
+                      'Welcome to Bug Tracker',
+                      style: TextStyle(
+                          color: Colors.white,
+                          fontSize: 40,
+                          fontWeight: FontWeight.bold),
+                    ),
+                  ],
+                )),
+              ),
+              Padding(
+                padding: const EdgeInsets.all(8.0),
+                child: Text(
+                  'Track, manage, and resolve bugs efficiently',
+                  style: TextStyle(color: Colors.white, fontSize: 16),
+                ),
+              ),
+              Row(
                 mainAxisAlignment: MainAxisAlignment.center,
                 children: [
-                  Text(
-                    'tel',
-                    style: TextStyle(color: Color(0xffFF6600), fontSize: 48),
+                  Padding(
+                    padding: const EdgeInsets.symmetric(horizontal: 10),
+                    child: ElevatedButton(
+                      onPressed: () => context.go('/signup'),
+                      style: ElevatedButton.styleFrom(
+                          side: BorderSide(color: Colors.white),
+                          backgroundColor: Colors.transparent),
+                      child: Text(
+                        'Sign Up',
+                        style: TextStyle(color: Colors.white),
+                      ),
+                    ),
                   ),
-                  Text(
-                    'now',
-                    style: TextStyle(color: Color(0xffFFFFFF), fontSize: 48),
+                  Padding(
+                    padding: const EdgeInsets.symmetric(horizontal: 10),
+                    child: ElevatedButton(
+                      onPressed: () => context.go('/login'),
+                      style: ElevatedButton.styleFrom(
+                        backgroundColor: Colors.black,
+                      ),
+                      child: Text(
+                        'Login',
+                        style: TextStyle(color: Colors.white),
+                      ),
+                    ),
                   ),
                 ],
-              )),
-            ),
-            Padding(
-              padding: const EdgeInsets.only(left: 180, right: 180),
-              child: Text(
-                'Silakan pindai QR terlebih dulu untuk mulai menggunakan aplikasi.',
-                softWrap: true,
-                textAlign: TextAlign.center,
-                style: TextStyle(fontSize: 16, color: Colors.white),
-              ),
-            ),
-            Expanded(
-              child: Center(child: Pindai()),
-            ),
-            Padding(
-              padding: const EdgeInsets.all(8.0),
-              child: Column(
-                children: [
-                  Text('Kebijakan Privasi',
-                      style: TextStyle(
-                          fontSize: 16,
-                          decoration: TextDecoration.underline,
-                          fontWeight: FontWeight.w400,
-                          decorationColor: Colors.white,
-                          color: Colors.white)),
-                  Text('Versi 4.0.0.0',
-                      style: TextStyle(
-                        fontSize: 16,
-                        fontWeight: FontWeight.w400,
-                        color: Colors.white,
-                      ))
-                ],
-              ),
-            ),
-          ],
-        ),
-      ),
-    );
-  }
-}
-
-class Pindai extends StatelessWidget {
-  const Pindai({
-    super.key,
-  });
-
-  @override
-  Widget build(BuildContext context) {
-    return SizedBox(
-        width: 257,
-        height: 96,
-        child: ElevatedButton(
-          onPressed: () => context.go('/login'),
-          style: ElevatedButton.styleFrom(
-            backgroundColor: Color(0xff078C84).withOpacity(0.76),
-            side: BorderSide(color: Colors.white),
-            shape: RoundedRectangleBorder(
-              borderRadius: BorderRadius.circular(12.0),
-            ),
-          ),
-          child: Row(
-            mainAxisAlignment: MainAxisAlignment.center,
-            children: [
-              Text(
-                'Pindai QR',
-                style: TextStyle(color: Colors.white, fontSize: 20),
               ),
-              Container(
-                width: 5,
-              ),
-              Image.asset(
-                'assets/images/scan_icon_183865.png',
-                width: 32,
-                height: 32,
-                fit: BoxFit.cover,
-                color: Color(0xffFFFFFF),
-              )
+              Expanded(child: Container())
             ],
           ),
-        ));
+        ),
+        bottomNavigationBar: Footer());
   }
 }

+ 105 - 0
lib/platform/addplatform.dart

@@ -0,0 +1,105 @@
+import 'package:flutter/material.dart';
+import 'package:namer_app/footer.dart';
+import 'package:namer_app/header.dart';
+import 'package:namer_app/service/addplatform_serv.dart';
+
+class AddPlatformPage extends StatelessWidget {
+  const AddPlatformPage({super.key});
+
+  @override
+  Widget build(BuildContext context) {
+    var platname = TextEditingController();
+    var projname = TextEditingController();
+    return Scaffold(
+      appBar: CustomAppbar(),
+      backgroundColor: Colors.white,
+      body: Column(
+        mainAxisAlignment: MainAxisAlignment.spaceEvenly,
+        children: [
+          Center(
+              child: Row(
+            mainAxisAlignment: MainAxisAlignment.center,
+            children: [
+              Text(
+                'ADD PLATFORM',
+                style: TextStyle(color: Colors.black, fontSize: 48),
+              ),
+            ],
+          )),
+          Column(
+            children: [
+              Padding(
+                padding: const EdgeInsets.all(8.0),
+                child: SizedBox(
+                  width: 396,
+                  child: TextField(
+                    decoration: InputDecoration(
+                        border: OutlineInputBorder(),
+                        focusedBorder: OutlineInputBorder(
+                            borderRadius: BorderRadius.all(Radius.circular(12)),
+                            borderSide: BorderSide(color: Colors.black)),
+                        enabledBorder: OutlineInputBorder(
+                            borderRadius: BorderRadius.all(Radius.circular(12)),
+                            borderSide: BorderSide(color: Colors.black)),
+                        labelText: 'Enter Platform Name', //todo get data
+                        labelStyle: TextStyle(color: Colors.black),
+                        filled: true,
+                        fillColor: Colors.white.withOpacity(0.25)),
+                    cursorColor: Colors.black,
+                    style: TextStyle(color: Colors.black),
+                    controller: platname,
+                  ),
+                ),
+              ),
+              Padding(
+                padding: const EdgeInsets.all(8.0),
+                child: SizedBox(
+                  width: 396,
+                  child: TextField(
+                    decoration: InputDecoration(
+                        border: OutlineInputBorder(),
+                        focusedBorder: OutlineInputBorder(
+                            borderRadius: BorderRadius.all(Radius.circular(12)),
+                            borderSide: BorderSide(color: Colors.black)),
+                        enabledBorder: OutlineInputBorder(
+                            borderRadius: BorderRadius.all(Radius.circular(12)),
+                            borderSide: BorderSide(color: Colors.black)),
+                        labelText: 'Enter Project Name', //todo get data
+                        labelStyle: TextStyle(color: Colors.black),
+                        filled: true,
+                        fillColor: Colors.white.withOpacity(0.25)),
+                    cursorColor: Colors.black,
+                    style: TextStyle(color: Colors.black),
+                    controller: projname,
+                  ),
+                ),
+              ),
+              Padding(
+                padding: const EdgeInsets.all(20.0),
+                child: SizedBox(
+                  width: 396,
+                  height: 61,
+                  child: ElevatedButton(
+                    onPressed: () => addplatform(context, platname.text, projname.text), 
+                    style: ElevatedButton.styleFrom(
+                      backgroundColor: Colors.black, //todo putih lage
+                      side: BorderSide(color: Colors.white),
+                      shape: RoundedRectangleBorder(
+                        borderRadius: BorderRadius.circular(12.0),
+                      ),
+                    ),
+                    child: Text(
+                      'Save',
+                      style: TextStyle(color: Colors.white),
+                    ),
+                  ),
+                ),
+              ),
+            ],
+          ),
+        ],
+      ),
+      bottomNavigationBar: Footer(),
+    );
+  }
+}

+ 122 - 0
lib/platform/editplatform.dart

@@ -0,0 +1,122 @@
+import 'package:flutter/material.dart';
+import 'package:namer_app/footer.dart';
+import 'package:namer_app/header.dart';
+
+class EditPlatformPage extends StatelessWidget {
+  const EditPlatformPage({super.key});
+
+  @override
+  Widget build(BuildContext context) {
+    return Scaffold(
+      appBar: CustomAppbar(),
+      backgroundColor: Colors.white,
+      body: Column(
+        mainAxisAlignment: MainAxisAlignment.spaceEvenly,
+        children: [
+          Center(
+              child: Row(
+            mainAxisAlignment: MainAxisAlignment.center,
+            children: [
+              Text(
+                'EDIT PLATFORM',
+                style: TextStyle(color: Colors.black, fontSize: 48),
+              ),
+            ],
+          )),
+          Column(
+            children: [
+              Padding(
+                padding: const EdgeInsets.all(8.0),
+                child: SizedBox(
+                  width: 396,
+                  child: TextField(
+                    decoration: InputDecoration(
+                        border: OutlineInputBorder(),
+                        focusedBorder: OutlineInputBorder(
+                            borderRadius: BorderRadius.all(Radius.circular(12)),
+                            borderSide: BorderSide(color: Colors.black)),
+                        enabledBorder: OutlineInputBorder(
+                            borderRadius: BorderRadius.all(Radius.circular(12)),
+                            borderSide: BorderSide(color: Colors.black)),
+                        labelText: 'Enter Platform Name', //todo get data
+                        labelStyle: TextStyle(color: Colors.black),
+                        filled: true,
+                        fillColor: Colors.white.withOpacity(0.25)),
+                    cursorColor: Colors.black,
+                    style: TextStyle(color: Colors.black),
+                  ),
+                ),
+              ),
+              Padding(
+                padding: const EdgeInsets.all(8.0),
+                child: SizedBox(
+                  width: 396,
+                  child: TextField(
+                    decoration: InputDecoration(
+                        border: OutlineInputBorder(),
+                        focusedBorder: OutlineInputBorder(
+                            borderRadius: BorderRadius.all(Radius.circular(12)),
+                            borderSide: BorderSide(color: Colors.black)),
+                        enabledBorder: OutlineInputBorder(
+                            borderRadius: BorderRadius.all(Radius.circular(12)),
+                            borderSide: BorderSide(color: Colors.black)),
+                        labelText: 'Enter Project Name', //todo get data
+                        labelStyle: TextStyle(color: Colors.black),
+                        filled: true,
+                        fillColor: Colors.white.withOpacity(0.25)),
+                    cursorColor: Colors.black,
+                    style: TextStyle(color: Colors.black),
+                  ),
+                ),
+              ),
+              Padding(
+                padding: const EdgeInsets.all(8.0),
+                child: SizedBox(
+                  width: 396,
+                  child: TextField(
+                    decoration: InputDecoration(
+                        border: OutlineInputBorder(),
+                        focusedBorder: OutlineInputBorder(
+                            borderRadius: BorderRadius.all(Radius.circular(12)),
+                            borderSide: BorderSide(color: Colors.black)),
+                        enabledBorder: OutlineInputBorder(
+                            borderRadius: BorderRadius.all(Radius.circular(12)),
+                            borderSide: BorderSide(color: Colors.black)),
+                        labelText: 'Enter Project Description', //todo get data
+                        labelStyle: TextStyle(color: Colors.black),
+                        filled: true,
+                        fillColor: Colors.white.withOpacity(0.25)),
+                    cursorColor: Colors.black,
+                    style: TextStyle(color: Colors.black),
+                  ),
+                ),
+              ),
+              Padding(
+                padding: const EdgeInsets.all(20.0),
+                child: SizedBox(
+                  width: 396,
+                  height: 61,
+                  child: ElevatedButton(
+                    onPressed: null, //todo save edit
+                    style: ElevatedButton.styleFrom(
+                      backgroundColor: Colors.black, //todo putih lage
+                      side: BorderSide(color: Colors.white),
+                      shape: RoundedRectangleBorder(
+                        borderRadius: BorderRadius.circular(12.0),
+                      ),
+                    ),
+                    child: Text(
+                      'Edit',
+                      style: TextStyle(color: Colors.white),
+                    ),
+                  ),
+                ),
+              ),
+            ],
+          ),
+        ],
+      ),
+      bottomNavigationBar: Footer(),
+    );
+  }
+}

+ 128 - 0
lib/platform/listplatform.dart

@@ -0,0 +1,128 @@
+// ignore_for_file: prefer_typing_uninitialized_variables, must_call_super
+
+
+import 'package:dio/dio.dart';
+import 'package:flutter/material.dart';
+import 'package:go_router/go_router.dart';
+import 'package:namer_app/footer.dart';
+import 'package:namer_app/header.dart';
+import 'package:namer_app/service/delete_platform.dart';
+import '../globals.dart';
+
+class ListPlatformPage extends StatefulWidget {
+  const ListPlatformPage({super.key});
+
+  @override
+  State<ListPlatformPage> createState() => _ListPlatformPageState();
+}
+
+class _ListPlatformPageState extends State<ListPlatformPage> {
+    var jsonList;
+  @override
+void initState(){
+  getData();
+}
+
+void getData() async { 
+    try { 
+      var response = await Dio() 
+          .get('http://localhost:8080/api/v1/platforms',
+          options: Options(headers: headers)); 
+      if (response.statusCode == 200) { 
+        setState(() { 
+          jsonList = response.data['results'] as List; 
+        }); 
+      } else { 
+        print(response.statusCode); 
+      } 
+    } catch (e) { 
+      print(e); 
+    } 
+  } 
+  @override
+  Widget build(BuildContext context) {
+    return Scaffold(
+      appBar: CustomAppbar(),
+      body: Stack(children: [
+        SingleChildScrollView(
+          child: Column(
+            children: [
+              Center(
+                  child: Row(
+                mainAxisAlignment: MainAxisAlignment.center,
+                children: [
+                  Text(
+                    'LIST PLATFORM',
+                    style: TextStyle(color: Colors.black, fontSize: 48),
+                  ),
+                ],
+              )),
+              Column(
+                children: List.generate(
+                    jsonList == null ? 0 : jsonList.length,
+                    (i) => SizedBox(
+                          child: ListTile(
+                            leading: SizedBox(
+                              child: Icon(Icons.phone),
+                            ),
+                            title: Text(jsonList[i]['name']),
+                            subtitle: Column(
+                              crossAxisAlignment: CrossAxisAlignment.start,
+                              children: [
+                                Text(jsonList[i]['project'])
+                              ],
+                            ),
+                            trailing: ButtonUser(
+                              items: jsonList[i],
+                            ),
+                          ),
+                        )),
+              ),
+            ],
+          ),
+        ),
+      ]),
+      bottomNavigationBar: Footer(),
+    );
+  }
+}
+
+class ButtonUser extends StatelessWidget {
+  final Map<String, dynamic> items;
+  ButtonUser({
+    required this.items,
+    super.key,
+  });
+//todo edit platform
+  //todo tombol item
+  //todo tombol delete
+  @override
+  Widget build(BuildContext context) {
+    return Row(
+      mainAxisSize: MainAxisSize.min,
+      children: [
+        ElevatedButton(
+          onPressed: () => context.go('/listplatform/editplatform'),
+          style: ElevatedButton.styleFrom(
+            backgroundColor: Colors.black,
+          ),
+          child: Text(
+            'Edit',
+            style: TextStyle(color: Colors.white),
+          ),
+        ),
+        ElevatedButton(
+          onPressed: () => delplatform(context, items['id']),
+          style: ElevatedButton.styleFrom(
+            backgroundColor: Colors.black,
+          ),
+          child: Text(
+            'Delete',
+            style: TextStyle(color: Colors.white),
+          ),
+        ),
+
+      ],
+    );
+  }
+}

+ 130 - 0
lib/project/addmember.dart

@@ -0,0 +1,130 @@
+import 'package:flutter/material.dart';
+import 'package:namer_app/footer.dart';
+import 'package:namer_app/header.dart';
+import '../service/addmember_serv.dart';
+
+class AddMemberPage extends StatelessWidget {
+  final int projId;
+  const AddMemberPage({super.key, required this.projId});
+
+  @override
+  Widget build(BuildContext context) {
+    // var projId = TextEditingController();
+    var userId = TextEditingController();
+    var role = TextEditingController();
+    return Scaffold(
+      appBar: CustomAppbar(),
+      backgroundColor: Colors.white,
+      body: Column(
+        mainAxisAlignment: MainAxisAlignment.spaceEvenly,
+        children: [
+          Center(
+              child: Row(
+            mainAxisAlignment: MainAxisAlignment.center,
+            children: [
+              Text(
+                'ADD MEMBER',
+                style: TextStyle(color: Colors.black, fontSize: 48),
+              ),
+            ],
+          )),
+          Column(
+            children: [
+              // Padding(
+              //   padding: const EdgeInsets.all(8.0),
+              //   child: SizedBox(
+              //     width: 396,
+              //     child: TextField(
+              //       decoration: InputDecoration(
+              //           border: OutlineInputBorder(),
+              //           focusedBorder: OutlineInputBorder(
+              //               borderRadius: BorderRadius.all(Radius.circular(12)),
+              //               borderSide: BorderSide(color: Colors.black)),
+              //           enabledBorder: OutlineInputBorder(
+              //               borderRadius: BorderRadius.all(Radius.circular(12)),
+              //               borderSide: BorderSide(color: Colors.black)),
+              //           labelText: 'Enter Project ID', //todo get data
+              //           labelStyle: TextStyle(color: Colors.black),
+              //           filled: true,
+              //           fillColor: Colors.white.withOpacity(0.25)),
+              //       cursorColor: Colors.black,
+              //       style: TextStyle(color: Colors.black),
+              //       controller: projId,
+              //     ),
+              //   ),
+              // ),
+              Padding(
+                padding: const EdgeInsets.all(8.0),
+                child: SizedBox(
+                  width: 396,
+                  child: TextField(
+                    decoration: InputDecoration(
+                        border: OutlineInputBorder(),
+                        focusedBorder: OutlineInputBorder(
+                            borderRadius: BorderRadius.all(Radius.circular(12)),
+                            borderSide: BorderSide(color: Colors.black)),
+                        enabledBorder: OutlineInputBorder(
+                            borderRadius: BorderRadius.all(Radius.circular(12)),
+                            borderSide: BorderSide(color: Colors.black)),
+                        labelText: 'Enter User ID', //todo get data
+                        labelStyle: TextStyle(color: Colors.black),
+                        filled: true,
+                        fillColor: Colors.white.withOpacity(0.25)),
+                    cursorColor: Colors.black,
+                    style: TextStyle(color: Colors.black),
+                    controller: userId,
+                  ),
+                ),
+              ),
+              Padding(
+                padding: const EdgeInsets.all(8.0),
+                child: SizedBox(
+                  width: 396,
+                  child: TextField(
+                    decoration: InputDecoration(
+                        border: OutlineInputBorder(),
+                        focusedBorder: OutlineInputBorder(
+                            borderRadius: BorderRadius.all(Radius.circular(12)),
+                            borderSide: BorderSide(color: Colors.black)),
+                        enabledBorder: OutlineInputBorder(
+                            borderRadius: BorderRadius.all(Radius.circular(12)),
+                            borderSide: BorderSide(color: Colors.black)),
+                        labelText: 'Enter Role', //todo get data
+                        labelStyle: TextStyle(color: Colors.black),
+                        filled: true,
+                        fillColor: Colors.white.withOpacity(0.25)),
+                    cursorColor: Colors.black,
+                    style: TextStyle(color: Colors.black),
+                    controller: role,
+                  ),
+                ),
+              ),
+              Padding(
+                padding: const EdgeInsets.all(20.0),
+                child: SizedBox(
+                  width: 396,
+                  height: 61,
+                  child: ElevatedButton(
+                    onPressed: () => addmember(context, projId, int.parse(userId.text), role.text), 
+                    style: ElevatedButton.styleFrom(
+                      backgroundColor: Colors.black, //todo putih lage
+                      side: BorderSide(color: Colors.white),
+                      shape: RoundedRectangleBorder(
+                        borderRadius: BorderRadius.circular(12.0),
+                      ),
+                    ),
+                    child: Text(
+                      'Save',
+                      style: TextStyle(color: Colors.white),
+                    ),
+                  ),
+                ),
+              ),
+            ],
+          ),
+        ],
+      ),
+      bottomNavigationBar: Footer(),
+    );
+  }
+}

+ 105 - 0
lib/project/addproject.dart

@@ -0,0 +1,105 @@
+import 'package:flutter/material.dart';
+import 'package:namer_app/footer.dart';
+import 'package:namer_app/header.dart';
+import 'package:namer_app/service/addproj_serv.dart';
+
+class AddProjectPage extends StatelessWidget {
+  const AddProjectPage({super.key});
+
+  @override
+  Widget build(BuildContext context) {
+    var projname = TextEditingController();
+    var projdesc = TextEditingController();
+    return Scaffold(
+      appBar: CustomAppbar(),
+      backgroundColor: Colors.white,
+      body: Column(
+        mainAxisAlignment: MainAxisAlignment.spaceEvenly,
+        children: [
+          Center(
+              child: Row(
+            mainAxisAlignment: MainAxisAlignment.center,
+            children: [
+              Text(
+                'ADD PROJECT',
+                style: TextStyle(color: Colors.black, fontSize: 48),
+              ),
+            ],
+          )),
+          Column(
+            children: [
+              Padding(
+                padding: const EdgeInsets.all(8.0),
+                child: SizedBox(
+                  width: 396,
+                  child: TextField(
+                    decoration: InputDecoration(
+                        border: OutlineInputBorder(),
+                        focusedBorder: OutlineInputBorder(
+                            borderRadius: BorderRadius.all(Radius.circular(12)),
+                            borderSide: BorderSide(color: Colors.black)),
+                        enabledBorder: OutlineInputBorder(
+                            borderRadius: BorderRadius.all(Radius.circular(12)),
+                            borderSide: BorderSide(color: Colors.black)),
+                        labelText: 'Enter Project Name', //todo get data
+                        labelStyle: TextStyle(color: Colors.black),
+                        filled: true,
+                        fillColor: Colors.white.withOpacity(0.25)),
+                    cursorColor: Colors.black,
+                    style: TextStyle(color: Colors.black),
+                    controller: projname,
+                  ),
+                ),
+              ),
+              Padding(
+                padding: const EdgeInsets.all(8.0),
+                child: SizedBox(
+                  width: 396,
+                  child: TextField(
+                    decoration: InputDecoration(
+                        border: OutlineInputBorder(),
+                        focusedBorder: OutlineInputBorder(
+                            borderRadius: BorderRadius.all(Radius.circular(12)),
+                            borderSide: BorderSide(color: Colors.black)),
+                        enabledBorder: OutlineInputBorder(
+                            borderRadius: BorderRadius.all(Radius.circular(12)),
+                            borderSide: BorderSide(color: Colors.black)),
+                        labelText: 'Enter Project Description', //todo get data
+                        labelStyle: TextStyle(color: Colors.black),
+                        filled: true,
+                        fillColor: Colors.white.withOpacity(0.25)),
+                    cursorColor: Colors.black,
+                    style: TextStyle(color: Colors.black),
+                    controller: projdesc,
+                  ),
+                ),
+              ),
+              Padding(
+                padding: const EdgeInsets.all(20.0),
+                child: SizedBox(
+                  width: 396,
+                  height: 61,
+                  child: ElevatedButton(
+                    onPressed: () => addproject(context, projname.text, projdesc.text), 
+                    style: ElevatedButton.styleFrom(
+                      backgroundColor: Colors.black, //todo putih lage
+                      side: BorderSide(color: Colors.white),
+                      shape: RoundedRectangleBorder(
+                        borderRadius: BorderRadius.circular(12.0),
+                      ),
+                    ),
+                    child: Text(
+                      'Save',
+                      style: TextStyle(color: Colors.white),
+                    ),
+                  ),
+                ),
+              ),
+            ],
+          ),
+        ],
+      ),
+      bottomNavigationBar: Footer(),
+    );
+  }
+}

+ 100 - 0
lib/project/editproject.dart

@@ -0,0 +1,100 @@
+import 'package:flutter/material.dart';
+import 'package:namer_app/footer.dart';
+import 'package:namer_app/header.dart';
+
+class EditProjectPage extends StatelessWidget {
+  const EditProjectPage({super.key});
+
+  @override
+  Widget build(BuildContext context) {
+    return Scaffold(
+      appBar: CustomAppbar(),
+      backgroundColor: Colors.white,
+      body: Column(
+        mainAxisAlignment: MainAxisAlignment.spaceEvenly,
+        children: [
+          Center(
+              child: Row(
+            mainAxisAlignment: MainAxisAlignment.center,
+            children: [
+              Text(
+                'EDIT PROJECT',
+                style: TextStyle(color: Colors.black, fontSize: 48),
+              ),
+            ],
+          )),
+          Column(
+            children: [
+              Padding(
+                padding: const EdgeInsets.all(8.0),
+                child: SizedBox(
+                  width: 396,
+                  child: TextField(
+                    decoration: InputDecoration(
+                        border: OutlineInputBorder(),
+                        focusedBorder: OutlineInputBorder(
+                            borderRadius: BorderRadius.all(Radius.circular(12)),
+                            borderSide: BorderSide(color: Colors.black)),
+                        enabledBorder: OutlineInputBorder(
+                            borderRadius: BorderRadius.all(Radius.circular(12)),
+                            borderSide: BorderSide(color: Colors.black)),
+                        labelText: 'Enter Project Name', //todo get data
+                        labelStyle: TextStyle(color: Colors.black),
+                        filled: true,
+                        fillColor: Colors.white.withOpacity(0.25)),
+                    cursorColor: Colors.black,
+                    style: TextStyle(color: Colors.black),
+                  ),
+                ),
+              ),
+              Padding(
+                padding: const EdgeInsets.all(8.0),
+                child: SizedBox(
+                  width: 396,
+                  child: TextField(
+                    decoration: InputDecoration(
+                        border: OutlineInputBorder(),
+                        focusedBorder: OutlineInputBorder(
+                            borderRadius: BorderRadius.all(Radius.circular(12)),
+                            borderSide: BorderSide(color: Colors.black)),
+                        enabledBorder: OutlineInputBorder(
+                            borderRadius: BorderRadius.all(Radius.circular(12)),
+                            borderSide: BorderSide(color: Colors.black)),
+                        labelText: 'Enter Project Description', //todo get data
+                        labelStyle: TextStyle(color: Colors.black),
+                        filled: true,
+                        fillColor: Colors.white.withOpacity(0.25)),
+                    cursorColor: Colors.black,
+                    style: TextStyle(color: Colors.black),
+                  ),
+                ),
+              ),
+              Padding(
+                padding: const EdgeInsets.all(20.0),
+                child: SizedBox(
+                  width: 396,
+                  height: 61,
+                  child: ElevatedButton(
+                    onPressed: null, //todo save edit
+                    style: ElevatedButton.styleFrom(
+                      backgroundColor: Colors.black, //todo putih lage
+                      side: BorderSide(color: Colors.white),
+                      shape: RoundedRectangleBorder(
+                        borderRadius: BorderRadius.circular(12.0),
+                      ),
+                    ),
+                    child: Text(
+                      'Edit',
+                      style: TextStyle(color: Colors.white),
+                    ),
+                  ),
+                ),
+              ),
+            ],
+          ),
+        ],
+      ),
+      bottomNavigationBar: Footer(),
+    );
+  }
+}

+ 126 - 0
lib/project/listmember.dart

@@ -0,0 +1,126 @@
+// ignore_for_file: must_call_super, prefer_typing_uninitialized_variables, no_logic_in_create_state
+
+import 'package:dio/dio.dart';
+import 'package:flutter/material.dart';
+import 'package:namer_app/footer.dart';
+import 'package:namer_app/header.dart';
+import 'package:namer_app/service/delete_member.dart';
+import '../globals.dart';
+
+class ListMemberPage extends StatefulWidget {
+  final int projId;
+  const ListMemberPage({super.key, required this.projId});
+
+  @override
+  State<ListMemberPage> createState() => _ListMemberPageState(
+    bugId: projId
+  );
+}
+
+class _ListMemberPageState extends State<ListMemberPage> {
+ int bugId;
+ _ListMemberPageState({required this.bugId});
+var members;
+@override
+void initState(){
+  getData(bugId);
+}
+
+void getData(int bugId) async { 
+    try { 
+      var response = await Dio() 
+          .get('http://localhost:8080/api/v1/projects/$bugId/member',
+          options: Options(headers: headers)); 
+      if (response.statusCode == 200) { 
+        setState(() { 
+          members = response.data['results'] as List; 
+        }); 
+      } else { 
+        print(response.statusCode); 
+      } 
+    } catch (e) { 
+      print(e); 
+    } 
+  } 
+  @override
+  Widget build(BuildContext context) {
+    return Scaffold(
+      appBar: CustomAppbar(),
+      body: Stack(children: [
+        SingleChildScrollView(
+          child: Column(
+            children: [
+              Center(
+                  child: Row(
+                mainAxisAlignment: MainAxisAlignment.center,
+                children: [
+                  Text(
+                    'LIST MEMBER',
+                    style: TextStyle(color: Colors.black, fontSize: 48),
+                  ),
+                ],
+              )),
+              Column(
+                children: List.generate(
+                    members == null ? 0 : members.length,
+                    (i) => SizedBox(
+                          child: ListTile(
+                            leading: SizedBox(
+                              child: Icon(Icons.group_work),
+                            ),
+                            title: Text(members[i]['project']),
+                            subtitle: Column(
+                              crossAxisAlignment: CrossAxisAlignment.start,
+                              children: [
+                                Row(
+                                  children: [
+                                    Text(members[i]['user']),
+                                    Expanded(child: Container()),
+                                    Text(members[i]['role'])
+                                  ],
+                                ),
+                              ],
+                            ),
+                            trailing: ButtonUser(
+                              items: members[i],
+                            ),
+                          ),
+                        )),
+              ),
+            ],
+          ),
+        ),
+      ]),
+      bottomNavigationBar: Footer(),
+    );
+  }
+}
+
+class ButtonUser extends StatelessWidget {
+  final Map<String, dynamic> items;
+  ButtonUser({
+    required this.items,
+    super.key,
+  });
+//todo delete
+  //todo tombol item
+  @override
+  Widget build(BuildContext context) {
+    return Row(
+      // crossAxisAlignment: CrossAxisAlignment.center,
+      mainAxisSize: MainAxisSize.min,
+      children: [
+        ElevatedButton(
+          onPressed: () => delmember(context, items['id']),
+          style: ElevatedButton.styleFrom(
+            backgroundColor: Colors.black,
+          ),
+          child: Text(
+            'Delete',
+            style: TextStyle(color: Colors.white),
+          ),
+        ),
+      ],
+    );
+  }
+}

+ 147 - 0
lib/project/listproject.dart

@@ -0,0 +1,147 @@
+// ignore_for_file: must_call_super, prefer_typing_uninitialized_variables
+
+import 'package:dio/dio.dart';
+import 'package:flutter/material.dart';
+import 'package:go_router/go_router.dart';
+import 'package:namer_app/footer.dart';
+import 'package:namer_app/header.dart';
+import 'package:namer_app/service/delete_project.dart';
+import '../globals.dart';
+
+class ListProjectPage extends StatefulWidget {
+  const ListProjectPage({super.key});
+
+  @override
+  State<ListProjectPage> createState() => _ListProjectPageState();
+}
+
+class _ListProjectPageState extends State<ListProjectPage> {
+  var jsonList;
+@override
+void initState(){
+  getData();
+}
+
+void getData() async { 
+    try { 
+      var response = await Dio() 
+          .get('http://localhost:8080/api/v1/projects',
+          options: Options(headers: headers)); 
+      if (response.statusCode == 200) { 
+        setState(() { 
+          jsonList = response.data['results'] as List; 
+        }); 
+      } else { 
+        print(response.statusCode); 
+      } 
+    } catch (e) { 
+      print(e); 
+    } 
+  } 
+  @override
+  Widget build(BuildContext context) {
+    return Scaffold(
+      appBar: CustomAppbar(),
+      body: Stack(children: [
+        SingleChildScrollView(
+          child: Column(
+            children: [
+              Center(
+                  child: Row(
+                mainAxisAlignment: MainAxisAlignment.center,
+                children: [
+                  Text(
+                    'LIST PROJECT',
+                    style: TextStyle(color: Colors.black, fontSize: 48),
+                  ),
+                ],
+              )),
+              Column(
+                children: List.generate(
+                    jsonList == null ? 0 : jsonList.length,
+                    (i) => SizedBox(
+                          child: ListTile(
+                            leading: SizedBox(
+                              child: Icon(Icons.phone),
+                            ),
+                            title: Text(jsonList[i]['name']),
+                            subtitle: Column(
+                              crossAxisAlignment: CrossAxisAlignment.start,
+                              children: [
+                                Text(jsonList[i]['description']),
+                                Text(jsonList[i]['owner']['name'])
+                              ],
+                            ),
+                            trailing: ButtonUser(
+                              items: jsonList[i],
+                            ),
+                          ),
+                        )),
+              ),
+            ],
+          ),
+        ),
+      ]),
+      bottomNavigationBar: Footer(),
+    );
+  }
+}
+
+class ButtonUser extends StatelessWidget {
+  final Map<String, dynamic> items;
+  ButtonUser({
+    required this.items,
+    super.key,
+  });
+//todo edit platform
+  //todo tombol item
+  //todo tombol delete
+  @override
+  Widget build(BuildContext context) {
+    return Row(
+      mainAxisSize: MainAxisSize.min,
+      children: [
+        ElevatedButton(
+          onPressed: () => context.go('/editproject'),
+          style: ElevatedButton.styleFrom(
+            backgroundColor: Colors.black,
+          ),
+          child: Text(
+            'Edit',
+            style: TextStyle(color: Colors.white),
+          ),
+        ),
+        ElevatedButton(
+          onPressed: () => delproject(context, items['id']),
+          style: ElevatedButton.styleFrom(
+            backgroundColor: Colors.black,
+          ),
+          child: Text(
+            'Delete',
+            style: TextStyle(color: Colors.white),
+          ),
+        ),
+        ElevatedButton(
+          onPressed: () => context.go('/addmember'),
+          style: ElevatedButton.styleFrom(
+            backgroundColor: Colors.black,
+          ),
+          child: Text(
+            'Add Member',
+            style: TextStyle(color: Colors.white),
+          ),
+        ),
+        ElevatedButton(
+          onPressed: () => context.go('/listplatform/listmember'),
+          style: ElevatedButton.styleFrom(
+            backgroundColor: Colors.black,
+          ),
+          child: Text(
+            'List Member',
+            style: TextStyle(color: Colors.white),
+          ),
+        ),
+      ],
+    );
+  }
+}

+ 0 - 289
lib/search.dart

@@ -1,289 +0,0 @@
-import 'package:flutter/material.dart';
-import 'package:date_format/date_format.dart';
-import 'package:dotted_line/dotted_line.dart';
-
-var date = formatDate(DateTime.now(), [HH, ':', nn]);
-
-class SearchPage extends StatelessWidget {
-  final Map<String, dynamic> items;
-  SearchPage({super.key, required this.items});
-
-  @override
-  Widget build(BuildContext context) {
-    return Scaffold(
-      appBar: AppBar(
-        backgroundColor: Colors.white,
-        automaticallyImplyLeading: false,
-        elevation: 0,
-        toolbarHeight: 44,
-        title: Text(
-          date,
-          style: TextStyle(color: Color(0xff303336), fontSize: 15),
-        ),
-        actions: [
-          Icon(
-            Icons.signal_cellular_alt,
-            color: Color(0xff303336),
-          ),
-          Icon(
-            Icons.wifi,
-            color: Color(0xff303336),
-          ),
-          RotatedBox(
-            quarterTurns: -3,
-            child: Icon(
-              Icons.battery_std,
-              color: Color(0xff303336),
-            ),
-          )
-        ],
-      ),
-      body: SingleChildScrollView(
-        child: Column(
-          crossAxisAlignment: CrossAxisAlignment.start,
-          children: [
-            Row(
-              children: [
-                BackButton(),
-                Container(
-                  height: 44,
-                  alignment: Alignment.centerLeft,
-                  padding: EdgeInsets.symmetric(horizontal: 10),
-                  child: Text(
-                    items['type'],
-                    style: TextStyle(fontWeight: FontWeight.w500, fontSize: 17),
-                  ),
-                ),
-              ],
-            ),
-            Padding(
-              padding: const EdgeInsets.symmetric(horizontal: 10),
-              child: SizedBox(
-                width: 396,
-                height: 267.72,
-                child: gambar(items),
-              ),
-            ),
-            Container(
-              width: 396,
-              margin: EdgeInsets.all(5),
-              decoration: BoxDecoration(
-                  border: Border.all(color: Colors.black.withOpacity(0.1)),
-                  shape: BoxShape.rectangle,
-                  borderRadius: BorderRadius.circular(12)),
-              child: Column(
-                crossAxisAlignment: CrossAxisAlignment.start,
-                children: [
-                  Container(
-                    margin: EdgeInsets.all(5),
-                    child: Text(
-                      items['type'],
-                      overflow: TextOverflow.clip,
-                      style: TextStyle(
-                          fontWeight: FontWeight.w400,
-                          color: Color(0xff292D32),
-                          fontSize: 14),
-                    ),
-                  ),
-                  Padding(
-                    padding: const EdgeInsets.symmetric(horizontal: 5),
-                    child: DottedLine(),
-                  ),
-                  Container(
-                    margin: EdgeInsets.all(5),
-                    child: Text(
-                      items['longText'],
-                      overflow: TextOverflow.clip,
-                      style: TextStyle(
-                          fontWeight: FontWeight.w300,
-                          color: Color(0xff292D32),
-                          fontSize: 13),
-                    ),
-                  ),
-                ],
-              ),
-            ),
-            Container(
-              margin: EdgeInsets.all(10),
-              child: Text(
-                'Your Location',
-                style: TextStyle(fontWeight: FontWeight.w500, fontSize: 14),
-              ),
-            ),
-            Container(
-                width: 396,
-                margin: EdgeInsets.symmetric(horizontal: 10),
-                decoration: BoxDecoration(
-                    color: Color(0xff078C84).withOpacity(0.85),
-                    border: Border.all(color: Color(0xff078C84)),
-                    shape: BoxShape.rectangle,
-                    borderRadius: BorderRadius.only(
-                        topLeft: Radius.circular(12),
-                        topRight: Radius.circular(12))),
-                child: Padding(
-                    padding: const EdgeInsets.all(5),
-                    child: Column(
-                        crossAxisAlignment: CrossAxisAlignment.start,
-                        children: [
-                          Row(
-                            children: [
-                              Icon(Icons.remove),
-                              Column(
-                                crossAxisAlignment: CrossAxisAlignment.start,
-                                children: [
-                                  Text('Default Location'),
-                                  Container(
-                                    height: 5,
-                                  ),
-                                  Text('Room 331')
-                                ],
-                              )
-                            ],
-                          ),
-                        ]))),
-            Container(
-                width: 396,
-                margin: EdgeInsets.symmetric(
-                  horizontal: 10,
-                ),
-                decoration: BoxDecoration(
-                    border: Border.all(color: Colors.black.withOpacity(0.1)),
-                    shape: BoxShape.rectangle,
-                    borderRadius: BorderRadius.only(
-                        bottomLeft: Radius.circular(12),
-                        bottomRight: Radius.circular(12))),
-                child: Padding(
-                    padding: const EdgeInsets.all(5),
-                    child: Column(
-                      crossAxisAlignment: CrossAxisAlignment.start,
-                      children: [
-                        Row(
-                          children: [
-                            Icon(Icons.add),
-                            Column(
-                              crossAxisAlignment: CrossAxisAlignment.start,
-                              children: [
-                                Text('I moved to other location'),
-                                Container(
-                                  width: 350,
-                                  margin: EdgeInsets.symmetric(vertical: 5),
-                                  decoration: BoxDecoration(
-                                      border: Border.all(
-                                          color: Colors.black.withOpacity(0.1)),
-                                      shape: BoxShape.rectangle,
-                                      borderRadius: BorderRadius.circular(12)),
-                                  child: Row(
-                                    children: [
-                                      Padding(
-                                        padding: const EdgeInsets.symmetric(
-                                            horizontal: 5),
-                                        child: Icon(
-                                          Icons.location_on_outlined,
-                                          color: Color(0xffD91B1B),
-                                        ),
-                                      ),
-                                      Text(
-                                        'Where are you?',
-                                        style: TextStyle(
-                                            fontWeight: FontWeight.w300,
-                                            fontSize: 13,
-                                            color: Color(0xff292D32)
-                                                .withOpacity(0.5)),
-                                      )
-                                    ],
-                                  ),
-                                )
-                              ],
-                            )
-                          ],
-                        ),
-                      ],
-                    ))),
-            Container(
-              margin: EdgeInsets.all(10),
-              child: Text(
-                'Add Image',
-                style: TextStyle(fontWeight: FontWeight.w500, fontSize: 14),
-              ),
-            ),
-            Container(
-              margin: EdgeInsets.symmetric(horizontal: 10),
-              child: Row(
-                children: [
-                  Text(
-                    'You can send us a picture as a clue or something..',
-                    style: TextStyle(
-                        fontWeight: FontWeight.w300,
-                        fontSize: 12,
-                        color: Color(0xff292D32).withOpacity(0.85)),
-                  ),
-                  Spacer(),
-                  Icon(
-                    Icons.photo_camera,
-                    color: Color(0xff078C84),
-                  )
-                ],
-              ),
-            ),
-            Divider(),
-            Container(
-              width: 394,
-              margin: EdgeInsets.symmetric(horizontal: 10, vertical: 5),
-              decoration: BoxDecoration(
-                  border: Border.all(color: Colors.black.withOpacity(0.1)),
-                  shape: BoxShape.rectangle,
-                  borderRadius: BorderRadius.circular(12)),
-              child: Padding(
-                padding: const EdgeInsets.all(5),
-                child: Row(
-                  children: [
-                    Icon(Icons.edit),
-                    Container(
-                      width: 5,
-                    ),
-                    Text('Add note..',
-                        style: TextStyle(
-                            fontWeight: FontWeight.w300,
-                            fontSize: 13,
-                            color: Color(0xff292D32).withOpacity(0.5))),
-                  ],
-                ),
-              ),
-            ),
-            Container(
-              margin: EdgeInsets.symmetric(horizontal: 10, vertical: 5),
-              width: 396,
-              height: 51,
-              child: ElevatedButton(
-                  style: ElevatedButton.styleFrom(
-                    backgroundColor: Color(0xff078C84),
-                  ),
-                  onPressed: () {},
-                  child: Text(
-                    'Send Request',
-                    style: TextStyle(
-                        fontWeight: FontWeight.w600,
-                        fontSize: 16,
-                        color: Colors.white),
-                  )),
-            )
-          ],
-        ),
-      ),
-    );
-  }
-
-  Container gambar(items) {
-    return Container(
-      decoration: BoxDecoration(
-          border: Border.all(color: items['color']),
-          borderRadius: BorderRadius.all(Radius.circular(20)),
-          color: items['color'].withOpacity(0.4)),
-      padding: const EdgeInsets.all(5.0),
-      child: Image.asset(
-        items['image'],
-        fit: BoxFit.cover,
-      ),
-    );
-  }
-}

+ 46 - 0
lib/service/addbug_serv.dart

@@ -0,0 +1,46 @@
+// ignore_for_file: use_build_context_synchronously
+
+import 'dart:convert';
+
+import 'package:dio/dio.dart';
+import 'package:flutter/material.dart';
+import 'package:go_router/go_router.dart';
+import '../globals.dart';
+
+Future<void> addbug(BuildContext context, String desc, String qc, String dev, String platform, String goodday, String image, String level, String status, String devStatus /*Map data*/) async {
+    final dio = Dio();
+    Response response;
+
+    AlertDialog alert2 = AlertDialog(
+      title: Text("Add Bug Gagal"),
+      content: Text("Data Invalid"),
+      actions: [
+        TextButton( 
+          child: Text('Ok'),
+          onPressed: () => Navigator.of(context).pop(),
+        ),
+      ],
+    );
+        var auth = 'Basic ${base64Encode(utf8.encode('$USER_LOGIN:$PASS_LOGIN'))}';
+        Map<String, String> headers = {
+          'content-type': 'application/json',
+          'accept': 'application/json',
+          'authorization': auth
+      };
+    try{
+      response = await dio.post("http://localhost:8080/api/v1/bugs", 
+                  options: Options(headers: headers),
+                  data: 
+                  // data 
+                  {'description':desc, 'qc': qc, 'dev': dev, 'platform':platform, 'goodday_url':goodday, 'image_url':image, 'level':level, 'status':status, 'dev_status':devStatus}
+                  );    
+      if (response.statusCode == 201){
+          return context.go('/listbug');
+      } 
+    } catch (error){     
+      
+      showDialog(context: context, builder: (context) => alert2);
+      }
+          
+  }
+

+ 46 - 0
lib/service/addcomment_serv.dart

@@ -0,0 +1,46 @@
+// ignore_for_file: use_build_context_synchronously
+
+import 'dart:convert';
+
+import 'package:dio/dio.dart';
+import 'package:flutter/material.dart';
+import 'package:go_router/go_router.dart';
+import '../globals.dart';
+
+Future<void> addcomment(BuildContext context, int bugId, String content /*Map data*/) async {
+    final dio = Dio();
+    Response response;
+
+    AlertDialog alert2 = AlertDialog(
+      title: Text("Add Comment Gagal"),
+      content: Text("Data Invalid"),
+      actions: [
+        TextButton( 
+          child: Text('Ok'),
+          onPressed: () => Navigator.of(context).pop(),
+        ),
+      ],
+    );
+        var auth = 'Basic ${base64Encode(utf8.encode('$USER_LOGIN:$PASS_LOGIN'))}';
+        Map<String, String> headers = {
+          'content-type': 'application/json',
+          'accept': 'application/json',
+          'authorization': auth
+      };
+    try{
+      response = await dio.post("http://localhost:8080/api/v1/bugs/$bugId/comment", 
+                  options: Options(headers: headers),
+                  data: 
+                  // data 
+                  {'content':content}
+                  );    
+      if (response.statusCode == 201){
+          return context.go('/login/bug/comment');
+      } 
+    } catch (error){     
+      
+      showDialog(context: context, builder: (context) => alert2);
+      }
+          
+  }
+

+ 45 - 0
lib/service/addmember_serv.dart

@@ -0,0 +1,45 @@
+// ignore_for_file: use_build_context_synchronously
+
+import 'dart:convert';
+import 'package:dio/dio.dart';
+import 'package:flutter/material.dart';
+import 'package:go_router/go_router.dart';
+import '../globals.dart';
+
+Future<void> addmember(BuildContext context, int projId, int userId, String role /*Map data*/) async {
+    final dio = Dio();
+    Response response;
+
+    AlertDialog alert2 = AlertDialog(
+      title: Text("Add Member Gagal"),
+      content: Text("Data Invalid"),
+      actions: [
+        TextButton( 
+          child: Text('Ok'),
+          onPressed: () => Navigator.of(context).pop(),
+        ),
+      ],
+    );
+        var auth = 'Basic ${base64Encode(utf8.encode('$USER_LOGIN:$PASS_LOGIN'))}';
+        Map<String, String> headers = {
+          'content-type': 'application/json',
+          'accept': 'application/json',
+          'authorization': auth
+      };
+    try{
+      response = await dio.post("http://localhost:8080/api/v1/projects/$projId/member", 
+                  options: Options(headers: headers),
+                  data: 
+                  // data 
+                  {'user_id':userId,'role':role}
+                  );    
+      if (response.statusCode == 201){
+          return context.go('/listplatform/listmember');
+      } 
+    } catch (error){     
+      
+      showDialog(context: context, builder: (context) => alert2);
+      }
+          
+  }
+

+ 46 - 0
lib/service/addplatform_serv.dart

@@ -0,0 +1,46 @@
+// ignore_for_file: use_build_context_synchronously
+
+import 'dart:convert';
+
+import 'package:dio/dio.dart';
+import 'package:flutter/material.dart';
+import 'package:go_router/go_router.dart';
+import '../globals.dart';
+
+Future<void> addplatform(BuildContext context, String name, String projName /*Map data*/) async {
+    final dio = Dio();
+    Response response;
+
+    AlertDialog alert2 = AlertDialog(
+      title: Text("Add Platform Gagal"),
+      content: Text("Data Invalid"),
+      actions: [
+        TextButton( 
+          child: Text('Ok'),
+          onPressed: () => Navigator.of(context).pop(),
+        ),
+      ],
+    );
+        var auth = 'Basic ${base64Encode(utf8.encode('$USER_LOGIN:$PASS_LOGIN'))}';
+        Map<String, String> headers = {
+          'content-type': 'application/json',
+          'accept': 'application/json',
+          'authorization': auth
+      };
+    try{
+      response = await dio.post("http://localhost:8080/api/v1/platforms", 
+                  options: Options(headers: headers),
+                  data: 
+                  // data 
+                  {'name':name,'project_name':projName}
+                  );    
+      if (response.statusCode == 201){
+          return context.go('/listplatform');
+      } 
+    } catch (error){     
+      
+      showDialog(context: context, builder: (context) => alert2);
+      }
+          
+  }
+

+ 46 - 0
lib/service/addproj_serv.dart

@@ -0,0 +1,46 @@
+// ignore_for_file: use_build_context_synchronously
+
+import 'dart:convert';
+
+import 'package:dio/dio.dart';
+import 'package:flutter/material.dart';
+import 'package:go_router/go_router.dart';
+import '../globals.dart';
+
+Future<void> addproject(BuildContext context, String name, String description /*Map data*/) async {
+    final dio = Dio();
+    Response response;
+
+    AlertDialog alert2 = AlertDialog(
+      title: Text("Add Project Gagal"),
+      content: Text("Data Invalid"),
+      actions: [
+        TextButton( 
+          child: Text('Ok'),
+          onPressed: () => Navigator.of(context).pop(),
+        ),
+      ],
+    );
+        var auth = 'Basic ${base64Encode(utf8.encode('$USER_LOGIN:$PASS_LOGIN'))}';
+        Map<String, String> headers = {
+          'content-type': 'application/json',
+          'accept': 'application/json',
+          'authorization': auth
+      };
+    try{
+      response = await dio.post("http://localhost:8080/api/v1/projects", 
+                  options: Options(headers: headers),
+                  data: 
+                  // data 
+                  {'name':name,'description':description}
+                  );    
+      if (response.statusCode == 201){
+          return context.go('/listproject');
+      } 
+    } catch (error){     
+      
+      showDialog(context: context, builder: (context) => alert2);
+      }
+          
+  }
+

+ 49 - 0
lib/service/delete_bug.dart

@@ -0,0 +1,49 @@
+
+// ignore_for_file: use_build_context_synchronously
+
+import 'dart:convert';
+import 'package:dio/dio.dart';
+import 'package:flutter/material.dart';
+import '../globals.dart';
+
+Future<void> delbug(BuildContext context, int id) async{
+  final dio = Dio();
+  Response response;
+    AlertDialog alert = AlertDialog(
+      title: Text("Delete Sukses"),
+      content: Text("Data terhapus"),
+      actions: [
+        TextButton( 
+          child: Text('Ok'),
+          onPressed: () => Navigator.of(context).pop(),
+        ),
+      ],
+    );
+        AlertDialog alert2 = AlertDialog(
+      title: Text("Delete Gagal"),
+      content: Text("Data Invalid"),
+      actions: [
+        TextButton( 
+          child: Text('Ok'),
+          onPressed: () => Navigator.of(context).pop(),
+        ),
+      ],
+    );
+            var auth = 'Basic ${base64Encode(utf8.encode('$USER_LOGIN:$PASS_LOGIN'))}';
+        Map<String, String> headers = {
+          'content-type': 'application/json',
+          'accept': 'application/json',
+          'authorization': auth
+      };
+try {
+  response = await dio.delete("http://localhost:8080/api/v1/bugs/$id",
+              options: Options(headers: headers)
+              );
+  if(response.statusCode == 200){
+    showDialog(context: context, builder: (context) => alert);
+    
+  }
+} catch (error){
+  showDialog(context: context, builder: (context) => alert2);
+}
+} 

+ 49 - 0
lib/service/delete_comment.dart

@@ -0,0 +1,49 @@
+
+// ignore_for_file: use_build_context_synchronously
+
+import 'dart:convert';
+import 'package:dio/dio.dart';
+import 'package:flutter/material.dart';
+import '../globals.dart';
+
+Future<void> delcomment(BuildContext context, int id) async{
+  final dio = Dio();
+  Response response;
+    AlertDialog alert = AlertDialog(
+      title: Text("Delete Sukses"),
+      content: Text("Data terhapus"),
+      actions: [
+        TextButton( 
+          child: Text('Ok'),
+          onPressed: () => Navigator.of(context).pop(),
+        ),
+      ],
+    );
+        AlertDialog alert2 = AlertDialog(
+      title: Text("Delete Gagal"),
+      content: Text("Data Invalid"),
+      actions: [
+        TextButton( 
+          child: Text('Ok'),
+          onPressed: () => Navigator.of(context).pop(),
+        ),
+      ],
+    );
+            var auth = 'Basic ${base64Encode(utf8.encode('$USER_LOGIN:$PASS_LOGIN'))}';
+        Map<String, String> headers = {
+          'content-type': 'application/json',
+          'accept': 'application/json',
+          'authorization': auth
+      };
+try {
+  response = await dio.delete("http://localhost:8080/api/v1/comments/$id",
+              options: Options(headers: headers)
+              );
+  if(response.statusCode == 200){
+    showDialog(context: context, builder: (context) => alert);
+    
+  }
+} catch (error){
+  showDialog(context: context, builder: (context) => alert2);
+}
+} 

+ 49 - 0
lib/service/delete_member.dart

@@ -0,0 +1,49 @@
+
+// ignore_for_file: use_build_context_synchronously
+
+import 'dart:convert';
+import 'package:dio/dio.dart';
+import 'package:flutter/material.dart';
+import '../globals.dart';
+
+Future<void> delmember(BuildContext context, int id) async{
+  final dio = Dio();
+  Response response;
+    AlertDialog alert = AlertDialog(
+      title: Text("Delete Sukses"),
+      content: Text("Data terhapus"),
+      actions: [
+        TextButton( 
+          child: Text('Ok'),
+          onPressed: () => Navigator.of(context).pop(),
+        ),
+      ],
+    );
+        AlertDialog alert2 = AlertDialog(
+      title: Text("Delete Gagal"),
+      content: Text("Data Invalid"),
+      actions: [
+        TextButton( 
+          child: Text('Ok'),
+          onPressed: () => Navigator.of(context).pop(),
+        ),
+      ],
+    );
+            var auth = 'Basic ${base64Encode(utf8.encode('$USER_LOGIN:$PASS_LOGIN'))}';
+        Map<String, String> headers = {
+          'content-type': 'application/json',
+          'accept': 'application/json',
+          'authorization': auth
+      };
+try {
+  response = await dio.delete("http://localhost:8080/api/v1/projects/member/$id",
+              options: Options(headers: headers)
+              );
+  if(response.statusCode == 200){
+    showDialog(context: context, builder: (context) => alert);
+    
+  }
+} catch (error){
+  showDialog(context: context, builder: (context) => alert2);
+}
+} 

+ 49 - 0
lib/service/delete_platform.dart

@@ -0,0 +1,49 @@
+
+// ignore_for_file: use_build_context_synchronously
+
+import 'dart:convert';
+import 'package:dio/dio.dart';
+import 'package:flutter/material.dart';
+import '../globals.dart';
+
+Future<void> delplatform(BuildContext context, int id) async{
+  final dio = Dio();
+  Response response;
+    AlertDialog alert = AlertDialog(
+      title: Text("Delete Sukses"),
+      content: Text("Data terhapus"),
+      actions: [
+        TextButton( 
+          child: Text('Ok'),
+          onPressed: () => Navigator.of(context).pop(),
+        ),
+      ],
+    );
+        AlertDialog alert2 = AlertDialog(
+      title: Text("Delete Gagal"),
+      content: Text("Data Invalid"),
+      actions: [
+        TextButton( 
+          child: Text('Ok'),
+          onPressed: () => Navigator.of(context).pop(),
+        ),
+      ],
+    );
+            var auth = 'Basic ${base64Encode(utf8.encode('$USER_LOGIN:$PASS_LOGIN'))}';
+        Map<String, String> headers = {
+          'content-type': 'application/json',
+          'accept': 'application/json',
+          'authorization': auth
+      };
+try {
+  response = await dio.delete("http://localhost:8080/api/v1/platforms/$id",
+              options: Options(headers: headers)
+              );
+  if(response.statusCode == 200){
+    showDialog(context: context, builder: (context) => alert);
+    
+  }
+} catch (error){
+  showDialog(context: context, builder: (context) => alert2);
+}
+} 

+ 49 - 0
lib/service/delete_project.dart

@@ -0,0 +1,49 @@
+
+// ignore_for_file: use_build_context_synchronously
+
+import 'dart:convert';
+import 'package:dio/dio.dart';
+import 'package:flutter/material.dart';
+import '../globals.dart';
+
+Future<void> delproject(BuildContext context, int id) async{
+  final dio = Dio();
+  Response response;
+    AlertDialog alert = AlertDialog(
+      title: Text("Delete Sukses"),
+      content: Text("Data terhapus"),
+      actions: [
+        TextButton( 
+          child: Text('Ok'),
+          onPressed: () => Navigator.of(context).pop(),
+        ),
+      ],
+    );
+        AlertDialog alert2 = AlertDialog(
+      title: Text("Delete Gagal"),
+      content: Text("Data Invalid"),
+      actions: [
+        TextButton( 
+          child: Text('Ok'),
+          onPressed: () => Navigator.of(context).pop(),
+        ),
+      ],
+    );
+            var auth = 'Basic ${base64Encode(utf8.encode('$USER_LOGIN:$PASS_LOGIN'))}';
+        Map<String, String> headers = {
+          'content-type': 'application/json',
+          'accept': 'application/json',
+          'authorization': auth
+      };
+try {
+  response = await dio.delete("http://localhost:8080/api/v1/projects/$id",
+              options: Options(headers: headers)
+              );
+  if(response.statusCode == 200){
+    showDialog(context: context, builder: (context) => alert);
+    
+  }
+} catch (error){
+  showDialog(context: context, builder: (context) => alert2);
+}
+} 

+ 49 - 0
lib/service/delete_user.dart

@@ -0,0 +1,49 @@
+
+// ignore_for_file: use_build_context_synchronously
+
+import 'dart:convert';
+import 'package:dio/dio.dart';
+import 'package:flutter/material.dart';
+import '../globals.dart';
+
+Future<void> deluser(BuildContext context, int id) async{
+  final dio = Dio();
+  Response response;
+    AlertDialog alert = AlertDialog(
+      title: Text("Delete Sukses"),
+      content: Text("Data terhapus"),
+      actions: [
+        TextButton( 
+          child: Text('Ok'),
+          onPressed: () => Navigator.of(context).pop(),
+        ),
+      ],
+    );
+        AlertDialog alert2 = AlertDialog(
+      title: Text("Delete Gagal"),
+      content: Text("Data Invalid"),
+      actions: [
+        TextButton( 
+          child: Text('Ok'),
+          onPressed: () => Navigator.of(context).pop(),
+        ),
+      ],
+    );
+            var auth = 'Basic ${base64Encode(utf8.encode('$USER_LOGIN:$PASS_LOGIN'))}';
+        Map<String, String> headers = {
+          'content-type': 'application/json',
+          'accept': 'application/json',
+          'authorization': auth
+      };
+try {
+  response = await dio.delete("http://localhost:8080/api/v1/users/$id",
+              options: Options(headers: headers)
+              );
+  if(response.statusCode == 200){
+    showDialog(context: context, builder: (context) => alert);
+    
+  }
+} catch (error){
+  showDialog(context: context, builder: (context) => alert2);
+}
+} 

+ 51 - 0
lib/service/edit_user.dart

@@ -0,0 +1,51 @@
+
+// ignore_for_file: use_build_context_synchronously
+
+import 'dart:convert';
+import 'package:dio/dio.dart';
+import 'package:flutter/material.dart';
+import '../globals.dart';
+
+Future<void> edit(BuildContext context, int id, String username, String name) async{
+  final dio = Dio();
+  Response response;
+    AlertDialog alert = AlertDialog(
+      title: Text("Edit Sukses"),
+      content: Text("Data teredit"),
+      actions: [
+        TextButton( 
+          child: Text('Ok'),
+          onPressed: () => Navigator.of(context).pop(),
+        ),
+      ],
+    );
+        AlertDialog alert2 = AlertDialog(
+      title: Text("Edit Gagal"),
+      content: Text("Data Invalid"),
+      actions: [
+        TextButton( 
+          child: Text('Ok'),
+          onPressed: () => Navigator.of(context).pop(),
+        ),
+      ],
+    );
+            var auth = 'Basic ${base64Encode(utf8.encode('$USER_LOGIN:$PASS_LOGIN'))}';
+        Map<String, String> headers = {
+          'content-type': 'application/json',
+          'accept': 'application/json',
+          'authorization': auth
+      };
+try {
+  response = await dio.put("http://localhost:8080/api/v1/users/$id",
+              options: Options(headers: headers),
+              data: {'username':username, 'name':name}
+              );
+              print(response);
+  if(response.statusCode == 200){
+    showDialog(context: context, builder: (context) => alert);
+    
+  }
+} catch (error){
+  showDialog(context: context, builder: (context) => alert2);
+}
+} 

+ 52 - 0
lib/service/get_user.dart

@@ -0,0 +1,52 @@
+
+
+// ignore_for_file: library_private_types_in_public_api
+
+import 'package:dio/dio.dart';
+import 'package:flutter/material.dart';
+import 'package:namer_app/globals.dart';
+
+final globalState = _GlobalsState();
+
+void main() {
+  globalState.getuser();//call this way
+  runApp(
+    MaterialApp(
+      debugShowCheckedModeBanner: false,
+      title: "Taxiyee_Messaging_app",
+      home: Container(),
+    ),
+  );
+}
+
+class Globals extends StatefulWidget {
+  const Globals({super.key});
+
+  @override
+  _GlobalsState createState() => _GlobalsState();
+}
+
+class _GlobalsState extends State<Globals> {
+  // int counter = 0;
+  var jsonList = '';
+  @override
+  Widget build(BuildContext context) {
+    return Container();
+  }
+
+  getuser() async{
+    try {
+  var response = await Dio()
+      .get('http://localhost:8080/api/v1/users',
+      options: Options(headers: headers));
+  // print('Method Call');
+  if (response.statusCode == 200) {
+  setState(() {
+    // counter++;
+    jsonList = response.data['results'];
+  });}
+} on Exception catch (e) {
+  print(e);
+}
+  }
+}

+ 55 - 0
lib/service/login_serv.dart

@@ -0,0 +1,55 @@
+// ignore_for_file: use_build_context_synchronously
+
+import 'dart:convert';
+import 'package:dio/dio.dart';
+import 'package:flutter/material.dart';
+import 'package:go_router/go_router.dart';
+import 'package:namer_app/globals.dart';
+
+
+Future<void> submit(BuildContext context, String email, String password) async {
+    final dio = Dio();
+    Response response;
+
+// AlertDialog alert = AlertDialog(
+//       title: Text("Login Sukses"),
+//       content: Text("Sukses"),
+//       actions: [
+//         TextButton( 
+//           child: Text('Ok'),
+//           onPressed: () => Navigator.of(context).pop(),
+//         ),
+//       ],
+//     );
+    AlertDialog alert2 = AlertDialog(
+      title: Text("Login Gagal"),
+      content: Text("Username atau Password salah"),
+      actions: [
+        TextButton( 
+          child: Text('Ok'),
+          onPressed: () => Navigator.of(context).pop(),
+        ),
+      ],
+    );
+
+      var auth = 'Basic ${base64Encode(utf8.encode('$email:$password'))}';
+      Map<String, String> headers = {
+        'content-type': 'application/json',
+        'accept': 'application/json',
+        'authorization': auth
+      };
+    try{
+      response = await dio.get("http://localhost:8080/api/v1/users", 
+          options: Options(headers: headers));
+          if (response.statusCode == 200){
+              USER_LOGIN = email;
+              PASS_LOGIN = password;
+              // showDialog(context: context, builder: (context) => alert);
+              return context.go('/login/bug');
+          } 
+     }  catch (error){
+      showDialog(context: context, builder: (context) => alert2);
+      }
+          
+  }
+

+ 46 - 0
lib/service/signup_serv.dart

@@ -0,0 +1,46 @@
+// ignore_for_file: use_build_context_synchronously
+
+import 'dart:convert';
+
+import 'package:dio/dio.dart';
+import 'package:flutter/material.dart';
+import 'package:go_router/go_router.dart';
+import '../globals.dart';
+
+Future<void> signup(BuildContext context, String email, String password, String name, /*Map data*/) async {
+    final dio = Dio();
+    Response response;
+
+    AlertDialog alert2 = AlertDialog(
+      title: Text("SignUp Gagal"),
+      content: Text("Data Invalid"),
+      actions: [
+        TextButton( 
+          child: Text('Ok'),
+          onPressed: () => Navigator.of(context).pop(),
+        ),
+      ],
+    );
+        var auth = 'Basic ${base64Encode(utf8.encode('$USER_LOGIN:$PASS_LOGIN'))}';
+        Map<String, String> headers = {
+          'content-type': 'application/json',
+          'accept': 'application/json',
+          'authorization': auth
+      };
+    try{
+      response = await dio.post("http://localhost:8080/api/v1/users", 
+                  options: Options(headers: headers),
+                  data: 
+                  // data 
+                  {'username':email,'password':password,'name':name}
+                  );    
+      if (response.statusCode == 201){
+          return context.go('/signup/listuser');
+      } 
+    } catch (error){     
+      
+      showDialog(context: context, builder: (context) => alert2);
+      }
+          
+  }
+

+ 100 - 0
lib/user/chgpass.dart

@@ -0,0 +1,100 @@
+import 'package:flutter/material.dart';
+import 'package:namer_app/footer.dart';
+import '../header.dart';
+
+class ChangepassPage extends StatelessWidget {
+  const ChangepassPage({super.key});
+
+  @override
+  Widget build(BuildContext context) {
+    return Scaffold(
+      appBar: CustomAppbar(),
+      backgroundColor: Colors.white,
+      body: Column(
+        mainAxisAlignment: MainAxisAlignment.spaceEvenly,
+        children: [
+          Center(
+              child: Row(
+            mainAxisAlignment: MainAxisAlignment.center,
+            children: [
+              Text(
+                'CHANGE PASSWORD',
+                style: TextStyle(color: Colors.black, fontSize: 48),
+              ),
+            ],
+          )),
+          Column(
+            children: [
+              Padding(
+                padding: const EdgeInsets.all(8.0),
+                child: SizedBox(
+                  width: 396,
+                  child: TextField(
+                    decoration: InputDecoration(
+                        border: OutlineInputBorder(),
+                        focusedBorder: OutlineInputBorder(
+                            borderRadius: BorderRadius.all(Radius.circular(12)),
+                            borderSide: BorderSide(color: Colors.black)),
+                        enabledBorder: OutlineInputBorder(
+                            borderRadius: BorderRadius.all(Radius.circular(12)),
+                            borderSide: BorderSide(color: Colors.black)),
+                        labelText: 'Enter Old Password', //todo get data
+                        labelStyle: TextStyle(color: Colors.black),
+                        filled: true,
+                        fillColor: Colors.white.withOpacity(0.25)),
+                    cursorColor: Colors.black,
+                    style: TextStyle(color: Colors.black),
+                  ),
+                ),
+              ),
+              Padding(
+                padding: const EdgeInsets.all(8.0),
+                child: SizedBox(
+                  width: 396,
+                  child: TextField(
+                    decoration: InputDecoration(
+                        border: OutlineInputBorder(),
+                        focusedBorder: OutlineInputBorder(
+                            borderRadius: BorderRadius.all(Radius.circular(12)),
+                            borderSide: BorderSide(color: Colors.black)),
+                        enabledBorder: OutlineInputBorder(
+                            borderRadius: BorderRadius.all(Radius.circular(12)),
+                            borderSide: BorderSide(color: Colors.black)),
+                        labelText: 'Enter New Password', //todo get data
+                        labelStyle: TextStyle(color: Colors.black),
+                        filled: true,
+                        fillColor: Colors.white.withOpacity(0.25)),
+                    cursorColor: Colors.black,
+                    style: TextStyle(color: Colors.black),
+                  ),
+                ),
+              ),
+              Padding(
+                padding: const EdgeInsets.all(20.0),
+                child: SizedBox(
+                  width: 396,
+                  height: 61,
+                  child: ElevatedButton(
+                    onPressed: null, //todo save chgpass
+                    style: ElevatedButton.styleFrom(
+                      backgroundColor: Colors.black, //todo putih lage
+                      side: BorderSide(color: Colors.white),
+                      shape: RoundedRectangleBorder(
+                        borderRadius: BorderRadius.circular(12.0),
+                      ),
+                    ),
+                    child: Text(
+                      'Edit',
+                      style: TextStyle(color: Colors.white),
+                    ),
+                  ),
+                ),
+              ),
+            ],
+          ),
+        ],
+      ),
+      bottomNavigationBar: Footer(),
+    );
+  }
+}

+ 145 - 0
lib/user/edituser.dart

@@ -0,0 +1,145 @@
+// ignore_for_file: must_call_super, prefer_typing_uninitialized_variables
+
+
+import 'package:dio/dio.dart';
+import 'package:flutter/material.dart';
+import 'package:namer_app/footer.dart';
+import 'package:namer_app/header.dart';
+import 'package:namer_app/service/edit_user.dart';
+import '../globals.dart';
+
+
+// ignore: must_be_immutable
+class EditUserPage extends StatefulWidget {
+  var id;
+  EditUserPage({super.key, required this.id});
+
+@override
+State<EditUserPage> createState() => _EditUserPageState();
+}
+
+class _EditUserPageState extends State<EditUserPage>{
+var jsonList;
+@override
+void initState(){
+  getData();
+}
+
+void getData() async { 
+    try { 
+      var response = await Dio() 
+          .get('http://localhost:8080/api/v1/users/${widget.id}',
+          options: Options(headers: headers)); 
+      if (response.statusCode == 200) { 
+        setState(() { 
+          jsonList = response.data['results'] as List; 
+        }); 
+      } else { 
+        print(response.statusCode); 
+      } 
+    } catch (e) { 
+      print(e); 
+    } 
+  } 
+
+  @override
+  Widget build(BuildContext context) {
+    // TextEditingController usernameController = jsonList['username'];
+    // TextEditingController nameController = jsonList['name'];
+    var usernameController = TextEditingController();
+    var nameController = TextEditingController();
+    // usernameController.text = jsonList['username'];
+    // nameController.text = jsonList['name'];
+    return Scaffold(
+      appBar: CustomAppbar(),
+      backgroundColor: Colors.white,
+      body: Column(
+        mainAxisAlignment: MainAxisAlignment.spaceEvenly,
+        children: [
+          Center(
+              child: Row(
+            mainAxisAlignment: MainAxisAlignment.center,
+            children: [
+              Text(
+                'EDIT USER',
+                style: TextStyle(color: Colors.black, fontSize: 48),
+              ),
+            ],
+          )),
+          Column(
+            children: [
+              Padding(
+                padding: const EdgeInsets.all(8.0),
+                child: SizedBox(
+                  width: 396,
+                  child: TextField(
+                    decoration: InputDecoration(
+                        border: OutlineInputBorder(),
+                        focusedBorder: OutlineInputBorder(
+                            borderRadius: BorderRadius.all(Radius.circular(12)),
+                            borderSide: BorderSide(color: Colors.black)),
+                        enabledBorder: OutlineInputBorder(
+                            borderRadius: BorderRadius.all(Radius.circular(12)),
+                            borderSide: BorderSide(color: Colors.black)),
+                        labelText: 'Enter Username', //todo get data
+                        labelStyle: TextStyle(color: Colors.black),
+                        filled: true,
+                        fillColor: Colors.white.withOpacity(0.25)),
+                    cursorColor: Colors.black,
+                    style: TextStyle(color: Colors.black),
+                    controller: usernameController,
+                  ),
+                ),
+              ),
+              Padding(
+                padding: const EdgeInsets.all(8.0),
+                child: SizedBox(
+                  width: 396,
+                  child: TextField(
+                    decoration: InputDecoration(
+                        border: OutlineInputBorder(),
+                        focusedBorder: OutlineInputBorder(
+                            borderRadius: BorderRadius.all(Radius.circular(12)),
+                            borderSide: BorderSide(color: Colors.black)),
+                        enabledBorder: OutlineInputBorder(
+                            borderRadius: BorderRadius.all(Radius.circular(12)),
+                            borderSide: BorderSide(color: Colors.black)),
+                        labelText: 'Enter Name', //todo get data
+                        labelStyle: TextStyle(color: Colors.black),
+                        filled: true,
+                        fillColor: Colors.white.withOpacity(0.25)),
+                    cursorColor: Colors.black,
+                    style: TextStyle(color: Colors.black),
+                    controller: nameController,
+                  ),
+                ),
+              ),
+              Padding(
+                padding: const EdgeInsets.all(20.0),
+                child: SizedBox(
+                  width: 396,
+                  height: 61,
+                  child: ElevatedButton(
+                    onPressed: () => edit(context, jsonList['id'], usernameController.text, nameController.text),
+                    style: ElevatedButton.styleFrom(
+                      backgroundColor: Colors.black, //todo putih lage
+                      side: BorderSide(color: Colors.white),
+                      shape: RoundedRectangleBorder(
+                        borderRadius: BorderRadius.circular(12.0),
+                      ),
+                    ),
+                    child: Text(
+                      'Edit',
+                      style: TextStyle(color: Colors.white),
+                    ),
+                  ),
+                ),
+              ),
+            ],
+          ),
+        ],
+      ),
+      bottomNavigationBar: Footer(),
+    );
+  }
+}

+ 120 - 0
lib/user/listuser.dart

@@ -0,0 +1,120 @@
+// ignore_for_file: must_call_super, prefer_typing_uninitialized_variables
+
+import 'package:dio/dio.dart';
+import 'package:flutter/material.dart';
+import 'package:go_router/go_router.dart';
+import 'package:namer_app/footer.dart';
+import 'package:namer_app/globals.dart';
+import 'package:namer_app/header.dart';
+import '../service/delete_user.dart';
+
+class ListUserPage extends StatefulWidget {
+  const ListUserPage({super.key});
+
+@override
+State<ListUserPage> createState() => _ListUserPageState();
+}
+
+class _ListUserPageState extends State<ListUserPage> {
+var jsonList;
+@override
+void initState(){
+  getData();
+}
+
+void getData() async { 
+    try { 
+      var response = await Dio() 
+          .get('http://localhost:8080/api/v1/users',
+          options: Options(headers: headers)); 
+      if (response.statusCode == 200) { 
+        setState(() { 
+          jsonList = response.data['results'] as List; 
+        }); 
+      } else { 
+        print(response.statusCode); 
+      } 
+    } catch (e) { 
+      print(e); 
+    } 
+  } 
+
+  @override
+  Widget build(BuildContext context) {
+    return Scaffold(
+      appBar: CustomAppbar(),
+      body: Stack(children: [
+        SingleChildScrollView(
+          child: Column(
+            children: [
+              Center(
+                  child: Row(
+                mainAxisAlignment: MainAxisAlignment.center,
+                children: [
+                  Text(
+                    'LIST USER',
+                    style: TextStyle(color: Colors.black, fontSize: 48),
+                  ),
+                ],
+              )),
+              Column(
+                children: 
+                List.generate(
+                  jsonList == null ? 0 : jsonList.length,
+                  (index) => SizedBox(
+                    child: ListTile(
+                      leading: SizedBox(
+                        child: Icon(Icons.person),
+                      ),
+                      title: Text(jsonList[index]['username']),
+                      subtitle: Text(jsonList[index]['name']),
+                      trailing: ButtonUser(items: jsonList[index]),
+                    ),
+                  ))
+              ),
+            ],
+          ),
+        ),
+      ]),
+      bottomNavigationBar: Footer(),
+    );
+  }
+}
+
+class ButtonUser extends StatelessWidget {
+  final Map<String, dynamic> items;
+  ButtonUser({
+    required this.items,
+    super.key,
+  });
+
+  @override
+  Widget build(BuildContext context) {
+    return Row(
+      mainAxisSize: MainAxisSize.min,
+      children: [
+        ElevatedButton(
+          onPressed: () => context.go("/signup/listuser/edit/$items['id']"),
+          style: ElevatedButton.styleFrom(
+            backgroundColor: Colors.black,
+          ),
+          child: Text(
+            'Edit',
+            style: TextStyle(color: Colors.white),
+          ),
+        ),
+        ElevatedButton(
+          //todo tombol item
+          onPressed: () => deluser(context, items['id']),
+          style: ElevatedButton.styleFrom(
+            backgroundColor: Colors.black,
+          ),
+          child: Text(
+            'Delete',
+            style: TextStyle(color: Colors.white),
+          ),
+        ),
+      ],
+    );
+  }
+}

+ 138 - 0
lib/user/signup.dart

@@ -0,0 +1,138 @@
+import 'package:flutter/material.dart';
+import 'package:namer_app/footer.dart';
+import 'package:namer_app/header.dart';
+import 'package:namer_app/service/signup_serv.dart';
+
+class SignupPage extends StatelessWidget {
+  const SignupPage({super.key});
+
+  @override
+  Widget build(BuildContext context) {
+    var usernameController = TextEditingController();
+    final nameController = TextEditingController();
+    final passwordController = TextEditingController();
+    return Scaffold(
+      appBar: CustomAppbar(),
+      backgroundColor: Colors.white,
+      body: Form(
+        child: Column(
+          mainAxisAlignment: MainAxisAlignment.spaceEvenly,
+          children: [
+            Center(
+                child: Row(
+              mainAxisAlignment: MainAxisAlignment.center,
+              children: [
+                Text(
+                  'SIGN UP',
+                  style: TextStyle(color: Colors.black, fontSize: 48),
+                ),
+              ],
+            )),
+            Column(
+              children: [
+                Padding(
+                  padding: const EdgeInsets.all(8.0),
+                  child: SizedBox(
+                    width: 396,
+                    child: TextFormField(
+                      decoration: InputDecoration(
+                          border: OutlineInputBorder(),
+                          focusedBorder: OutlineInputBorder(
+                              borderRadius: BorderRadius.all(Radius.circular(12)),
+                              borderSide: BorderSide(color: Colors.black)),
+                          enabledBorder: OutlineInputBorder(
+                              borderRadius: BorderRadius.all(Radius.circular(12)),
+                              borderSide: BorderSide(color: Colors.black)),
+                          labelText: 'Enter Username',
+                          labelStyle: TextStyle(color: Colors.black),
+                          filled: true,
+                          fillColor: Colors.white.withOpacity(0.25)),
+                      cursorColor: Colors.black,
+                      style: TextStyle(color: Colors.black),
+                      controller: usernameController,
+                    ),
+                  ),
+                ),
+                Padding(
+                  padding: const EdgeInsets.all(8.0),
+                  child: SizedBox(
+                    width: 396,
+                    child: TextFormField(
+                      decoration: InputDecoration(
+                          border: OutlineInputBorder(),
+                          focusedBorder: OutlineInputBorder(
+                              borderRadius: BorderRadius.all(Radius.circular(12)),
+                              borderSide: BorderSide(color: Colors.black)),
+                          enabledBorder: OutlineInputBorder(
+                              borderRadius: BorderRadius.all(Radius.circular(12)),
+                              borderSide: BorderSide(color: Colors.black)),
+                          labelText: 'Enter Name',
+                          labelStyle: TextStyle(color: Colors.black),
+                          filled: true,
+                          fillColor: Colors.white.withOpacity(0.25)),
+                      cursorColor: Colors.black,
+                      style: TextStyle(color: Colors.black),
+                      controller: nameController,
+                    ),
+                  ),
+                ),
+                SizedBox(
+                  width: 396,
+                  child: TextFormField(
+                    obscureText: true,
+                    decoration: InputDecoration(
+                        border: OutlineInputBorder(),
+                        focusedBorder: OutlineInputBorder(
+                            borderRadius: BorderRadius.all(Radius.circular(12)),
+                            borderSide: BorderSide(color: Colors.black)),
+                        enabledBorder: OutlineInputBorder(
+                            borderRadius: BorderRadius.all(Radius.circular(12)),
+                            borderSide: BorderSide(color: Colors.black)),
+                        labelText: 'Enter Password',
+                        labelStyle: TextStyle(color: Colors.black),
+                        filled: true,
+                        fillColor: Colors.white.withOpacity(0.25)),
+                    cursorColor: Colors.black,
+                    style: TextStyle(color: Colors.black),
+                    
+                    controller: passwordController,
+                  ),
+                ),
+                Padding(
+                  padding: const EdgeInsets.all(20.0),
+                  child: SizedBox(
+                    width: 396,
+                    height: 61,
+                    child: ElevatedButton(
+                      onPressed: () => signup(context, 
+                      // formData
+                      usernameController.text,
+                      passwordController.text,
+                      nameController.text
+                      ),
+                      style: ElevatedButton.styleFrom(//todo putih lage
+                        backgroundColor: Colors.black, 
+                        side: BorderSide(color: Colors.white),
+                        shape: RoundedRectangleBorder(
+                          borderRadius: BorderRadius.circular(12.0),
+                        ),
+                      ),
+                      child: Text(
+                        'Save',
+                        style: TextStyle(color: Colors.white),
+                      ),
+                    ),
+                  ),
+                ),
+              ],
+            ),
+          ],
+        ),
+      ),
+      bottomNavigationBar: Footer(),
+    );
+     
+  }
+
+ 
+}

+ 2 - 0
macos/Flutter/GeneratedPluginRegistrant.swift

@@ -5,6 +5,8 @@
 import FlutterMacOS
 import Foundation
 
+import shared_preferences_foundation
 
 func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
+  SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin"))
 }

+ 182 - 6
pubspec.lock

@@ -49,6 +49,14 @@ packages:
       url: "https://pub.dev"
     source: hosted
     version: "2.0.7"
+  dio:
+    dependency: "direct main"
+    description:
+      name: dio
+      sha256: "50fec96118958b97c727d0d8f67255d3683f16cc1f90d9bc917b5d4fe3abeca9"
+      url: "https://pub.dev"
+    source: hosted
+    version: "5.4.2"
   dotted_line:
     dependency: "direct main"
     description:
@@ -57,6 +65,14 @@ packages:
       url: "https://pub.dev"
     source: hosted
     version: "3.2.2"
+  dropdown_button2:
+    dependency: "direct main"
+    description:
+      name: dropdown_button2
+      sha256: b0fe8d49a030315e9eef6c7ac84ca964250155a6224d491c1365061bc974a9e1
+      url: "https://pub.dev"
+    source: hosted
+    version: "2.3.9"
   english_words:
     dependency: "direct main"
     description:
@@ -73,6 +89,22 @@ packages:
       url: "https://pub.dev"
     source: hosted
     version: "1.3.1"
+  ffi:
+    dependency: transitive
+    description:
+      name: ffi
+      sha256: "493f37e7df1804778ff3a53bd691d8692ddf69702cf4c1c1096a2e41b4779e21"
+      url: "https://pub.dev"
+    source: hosted
+    version: "2.1.2"
+  file:
+    dependency: transitive
+    description:
+      name: file
+      sha256: "5fc22d7c25582e38ad9a8515372cd9a93834027aacf1801cf01164dac0ffa08c"
+      url: "https://pub.dev"
+    source: hosted
+    version: "7.0.0"
   flutter:
     dependency: "direct main"
     description: flutter
@@ -90,10 +122,10 @@ packages:
     dependency: "direct dev"
     description:
       name: flutter_lints
-      sha256: e2a421b7e59244faef694ba7b30562e489c2b489866e505074eb005cd7060db7
+      sha256: "9e8c3858111da373efc5aa341de011d9bd23e2c5c5e0c62bccf32438e192d7b1"
       url: "https://pub.dev"
     source: hosted
-    version: "3.0.1"
+    version: "3.0.2"
   flutter_test:
     dependency: "direct dev"
     description: flutter
@@ -108,10 +140,26 @@ packages:
     dependency: "direct main"
     description:
       name: go_router
-      sha256: "170c46e237d6eb0e6e9f0e8b3f56101e14fb64f787016e42edd74c39cf8b176a"
+      sha256: "7ecb2f391edbca5473db591b48555a8912dde60edd0fb3013bd6743033b2d3f8"
+      url: "https://pub.dev"
+    source: hosted
+    version: "13.2.1"
+  http:
+    dependency: "direct main"
+    description:
+      name: http
+      sha256: "761a297c042deedc1ffbb156d6e2af13886bb305c2a343a4d972504cd67dd938"
+      url: "https://pub.dev"
+    source: hosted
+    version: "1.2.1"
+  http_parser:
+    dependency: transitive
+    description:
+      name: http_parser
+      sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b"
       url: "https://pub.dev"
     source: hosted
-    version: "13.2.0"
+    version: "4.0.2"
   leak_tracker:
     dependency: transitive
     description:
@@ -200,6 +248,46 @@ packages:
       url: "https://pub.dev"
     source: hosted
     version: "1.9.0"
+  path_provider_linux:
+    dependency: transitive
+    description:
+      name: path_provider_linux
+      sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279
+      url: "https://pub.dev"
+    source: hosted
+    version: "2.2.1"
+  path_provider_platform_interface:
+    dependency: transitive
+    description:
+      name: path_provider_platform_interface
+      sha256: "88f5779f72ba699763fa3a3b06aa4bf6de76c8e5de842cf6f29e2e06476c2334"
+      url: "https://pub.dev"
+    source: hosted
+    version: "2.1.2"
+  path_provider_windows:
+    dependency: transitive
+    description:
+      name: path_provider_windows
+      sha256: "8bc9f22eee8690981c22aa7fc602f5c85b497a6fb2ceb35ee5a5e5ed85ad8170"
+      url: "https://pub.dev"
+    source: hosted
+    version: "2.2.1"
+  platform:
+    dependency: transitive
+    description:
+      name: platform
+      sha256: "12220bb4b65720483f8fa9450b4332347737cf8213dd2840d8b2c823e47243ec"
+      url: "https://pub.dev"
+    source: hosted
+    version: "3.1.4"
+  plugin_platform_interface:
+    dependency: transitive
+    description:
+      name: plugin_platform_interface
+      sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02"
+      url: "https://pub.dev"
+    source: hosted
+    version: "2.1.8"
   provider:
     dependency: "direct main"
     description:
@@ -216,6 +304,62 @@ packages:
       url: "https://pub.dev"
     source: hosted
     version: "3.2.1"
+  shared_preferences:
+    dependency: "direct main"
+    description:
+      name: shared_preferences
+      sha256: "81429e4481e1ccfb51ede496e916348668fd0921627779233bd24cc3ff6abd02"
+      url: "https://pub.dev"
+    source: hosted
+    version: "2.2.2"
+  shared_preferences_android:
+    dependency: transitive
+    description:
+      name: shared_preferences_android
+      sha256: "8568a389334b6e83415b6aae55378e158fbc2314e074983362d20c562780fb06"
+      url: "https://pub.dev"
+    source: hosted
+    version: "2.2.1"
+  shared_preferences_foundation:
+    dependency: transitive
+    description:
+      name: shared_preferences_foundation
+      sha256: "7708d83064f38060c7b39db12aefe449cb8cdc031d6062280087bc4cdb988f5c"
+      url: "https://pub.dev"
+    source: hosted
+    version: "2.3.5"
+  shared_preferences_linux:
+    dependency: transitive
+    description:
+      name: shared_preferences_linux
+      sha256: "9f2cbcf46d4270ea8be39fa156d86379077c8a5228d9dfdb1164ae0bb93f1faa"
+      url: "https://pub.dev"
+    source: hosted
+    version: "2.3.2"
+  shared_preferences_platform_interface:
+    dependency: transitive
+    description:
+      name: shared_preferences_platform_interface
+      sha256: "22e2ecac9419b4246d7c22bfbbda589e3acf5c0351137d87dd2939d984d37c3b"
+      url: "https://pub.dev"
+    source: hosted
+    version: "2.3.2"
+  shared_preferences_web:
+    dependency: transitive
+    description:
+      name: shared_preferences_web
+      sha256: "9aee1089b36bd2aafe06582b7d7817fd317ef05fc30e6ba14bff247d0933042a"
+      url: "https://pub.dev"
+    source: hosted
+    version: "2.3.0"
+  shared_preferences_windows:
+    dependency: transitive
+    description:
+      name: shared_preferences_windows
+      sha256: "841ad54f3c8381c480d0c9b508b89a34036f512482c407e6df7a9c4aa2ef8f59"
+      url: "https://pub.dev"
+    source: hosted
+    version: "2.3.2"
   sky_engine:
     dependency: transitive
     description: flutter
@@ -285,6 +429,14 @@ packages:
       url: "https://pub.dev"
     source: hosted
     version: "0.1.0"
+  typed_data:
+    dependency: transitive
+    description:
+      name: typed_data
+      sha256: facc8d6582f16042dd49f2463ff1bd6e2c9ef9f3d5da3d9b087e244a7b564b3c
+      url: "https://pub.dev"
+    source: hosted
+    version: "1.3.2"
   vector_math:
     dependency: transitive
     description:
@@ -301,6 +453,30 @@ packages:
       url: "https://pub.dev"
     source: hosted
     version: "13.0.0"
+  web:
+    dependency: transitive
+    description:
+      name: web
+      sha256: "97da13628db363c635202ad97068d47c5b8aa555808e7a9411963c533b449b27"
+      url: "https://pub.dev"
+    source: hosted
+    version: "0.5.1"
+  win32:
+    dependency: transitive
+    description:
+      name: win32
+      sha256: "8cb58b45c47dcb42ab3651533626161d6b67a2921917d8d429791f76972b3480"
+      url: "https://pub.dev"
+    source: hosted
+    version: "5.3.0"
+  xdg_directories:
+    dependency: transitive
+    description:
+      name: xdg_directories
+      sha256: faea9dee56b520b55a566385b84f2e8de55e7496104adada9962e0bd11bcff1d
+      url: "https://pub.dev"
+    source: hosted
+    version: "1.0.4"
 sdks:
-  dart: ">=3.2.0 <4.0.0"
-  flutter: ">=3.13.0"
+  dart: ">=3.3.0 <4.0.0"
+  flutter: ">=3.19.0"

+ 10 - 2
pubspec.yaml

@@ -13,19 +13,27 @@ dependencies:
     sdk: flutter
   english_words: ^4.0.0
   provider: ^6.0.0
-  go_router: ^13.2.0
+  go_router: ^13.2.1
   flutter_layout_grid: ^2.0.5
   date_format: ^2.0.7
   dotted_line: ^3.1.0
   timelines: ^0.1.0
   timeline_tile: ^2.0.0
   lint: ^2.3.0  
+  dropdown_button2: ^2.3.9
+  dio: ^5.4.2
+  http: ^1.2.1
+  shared_preferences: ^2.2.2
+  # get: ^4.6.6
+
+my_storage:
+  path: '../my_storage'
 
 dev_dependencies:
   flutter_test:
     sdk: flutter
 
-  flutter_lints: ^3.0.1
+  flutter_lints: ^3.0.2
 
 flutter:
   uses-material-design: true

+ 2 - 2
test/widget_test.dart

@@ -5,12 +5,12 @@
 // gestures. You can also use WidgetTester to find child widgets in the widget
 // tree, read text, and verify that the values of widget properties are correct.
 
+// ignore_for_file: depend_on_referenced_packages
+
 import 'package:flutter/material.dart';
 import 'package:flutter_test/flutter_test.dart';
 import 'package:namer_app/main.dart';
 
-import 'package:telneo_lat/main.dart';
-
 void main() {
   testWidgets('Counter increments smoke test', (WidgetTester tester) async {
     // Build our app and trigger a frame.

+ 6 - 1
windows/flutter/CMakeLists.txt

@@ -10,6 +10,11 @@ include(${EPHEMERAL_DIR}/generated_config.cmake)
 # https://github.com/flutter/flutter/issues/57146.
 set(WRAPPER_ROOT "${EPHEMERAL_DIR}/cpp_client_wrapper")
 
+# Set fallback configurations for older versions of the flutter tool.
+if (NOT DEFINED FLUTTER_TARGET_PLATFORM)
+  set(FLUTTER_TARGET_PLATFORM "windows-x64")
+endif()
+
 # === Flutter Library ===
 set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/flutter_windows.dll")
 
@@ -92,7 +97,7 @@ add_custom_command(
   COMMAND ${CMAKE_COMMAND} -E env
     ${FLUTTER_TOOL_ENVIRONMENT}
     "${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.bat"
-      windows-x64 $<CONFIG>
+      ${FLUTTER_TARGET_PLATFORM} $<CONFIG>
   VERBATIM
 )
 add_custom_target(flutter_assemble DEPENDS