From 1cfa015d1e33b8991e5038904dd21255d3d5708f Mon Sep 17 00:00:00 2001 From: bharathan06 Date: Sat, 11 Jan 2025 23:28:44 +0530 Subject: [PATCH 01/63] requirements changes --- backend/myproject/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/myproject/requirements.txt b/backend/myproject/requirements.txt index beccf13..2444e13 100644 --- a/backend/myproject/requirements.txt +++ b/backend/myproject/requirements.txt @@ -35,7 +35,6 @@ phonenumberslite==8.13.42 platformdirs==4.2.2 prompt-toolkit==3.0.43 psutil==5.9.8 -psycopg2==2.9.9 pure-eval==0.2.2 pycparser==2.22 pydantic==2.8.2 @@ -56,3 +55,4 @@ tzdata==2024.1 wcwidth==0.2.13 wheel==0.43.0 whitenoise==6.7.0 + From 1e998caa5c8f0e202cd0b15f70c5ed2cd2f650a6 Mon Sep 17 00:00:00 2001 From: bharathan06 Date: Wed, 29 Jan 2025 22:00:35 +0530 Subject: [PATCH 02/63] testing from android studio --- frontend/lib/components/bottomNav.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/lib/components/bottomNav.dart b/frontend/lib/components/bottomNav.dart index b38a23b..6631550 100644 --- a/frontend/lib/components/bottomNav.dart +++ b/frontend/lib/components/bottomNav.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; - +//Testing change import 'package:dev_track_app/pages/domain.dart'; import 'package:dev_track_app/pages/home.dart'; From eaf3729ccbfd5f5e164998a6d6742f8195ae1a09 Mon Sep 17 00:00:00 2001 From: bharathan06 Date: Sat, 1 Feb 2025 17:29:49 +0530 Subject: [PATCH 03/63] Fixed version issue of gradle --- frontend/android/app/build.gradle | 7 +- frontend/android/build.gradle | 10 + .../gradle/wrapper/gradle-wrapper.properties | 2 +- frontend/android/settings.gradle | 4 +- frontend/lib/pages/home.dart | 165 ++--------- .../Flutter/GeneratedPluginRegistrant.swift | 2 + frontend/pubspec.lock | 268 +++++++----------- frontend/pubspec.yaml | 3 +- 8 files changed, 150 insertions(+), 311 deletions(-) diff --git a/frontend/android/app/build.gradle b/frontend/android/app/build.gradle index 896fb11..7ff43b9 100644 --- a/frontend/android/app/build.gradle +++ b/frontend/android/app/build.gradle @@ -46,7 +46,7 @@ android { // You can update the following values to match your application needs. // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration. minSdkVersion flutter.minSdkVersion - targetSdkVersion flutter.targetSdkVersion + targetSdkVersion (flutter.targetSdkVersion - 1) versionCode flutterVersionCode.toInteger() versionName flutterVersionName } @@ -64,4 +64,7 @@ flutter { source '../..' } -dependencies {} +dependencies { + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.8.0" + implementation 'com.android.support:multidex:1.0.3' +} diff --git a/frontend/android/build.gradle b/frontend/android/build.gradle index bc157bd..ceaf90e 100644 --- a/frontend/android/build.gradle +++ b/frontend/android/build.gradle @@ -1,3 +1,13 @@ +buildscript { + repositories { + google() + mavenCentral() + } + dependencies { + classpath 'com.android.tools.build:gradle:8.1.0' + } +} + allprojects { repositories { google() diff --git a/frontend/android/gradle/wrapper/gradle-wrapper.properties b/frontend/android/gradle/wrapper/gradle-wrapper.properties index e1ca574..b115ac1 100644 --- a/frontend/android/gradle/wrapper/gradle-wrapper.properties +++ b/frontend/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.3-all.zip +distributionUrl=https://services.gradle.org/distributions/gradle-8.12.1-bin.zip diff --git a/frontend/android/settings.gradle b/frontend/android/settings.gradle index 1d6d19b..8a87a89 100644 --- a/frontend/android/settings.gradle +++ b/frontend/android/settings.gradle @@ -19,8 +19,8 @@ pluginManagement { plugins { id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "7.3.0" apply false - id "org.jetbrains.kotlin.android" version "1.7.10" apply false + id "com.android.application" version "8.1.0" apply false + id "org.jetbrains.kotlin.android" version "2.1.10" apply false } include ":app" diff --git a/frontend/lib/pages/home.dart b/frontend/lib/pages/home.dart index b8d30e4..77ecdea 100644 --- a/frontend/lib/pages/home.dart +++ b/frontend/lib/pages/home.dart @@ -11,7 +11,6 @@ import 'package:dev_track_app/pages/tracker.dart'; import 'package:dev_track_app/pages/studentview.dart'; import 'package:dev_track_app/pages/submission_page.dart'; - class HomePag extends StatelessWidget { const HomePag({super.key}); @@ -32,16 +31,11 @@ class HomePag extends StatelessWidget { shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(30.0), ), - padding: - const EdgeInsets.symmetric(horizontal: 20, vertical: 15), - textStyle: const TextStyle( - fontSize: 18, - fontWeight: FontWeight.bold, - ), + padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 15), + textStyle: const TextStyle(fontSize: 18, fontWeight: FontWeight.bold), ), onPressed: () { - Navigator.push(context, - MaterialPageRoute(builder: (context) => HomePage())); + Navigator.push(context, MaterialPageRoute(builder: (context) => HomePage())); }, child: Text("Home Page"), ), @@ -54,16 +48,11 @@ class HomePag extends StatelessWidget { shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(30.0), ), - padding: - const EdgeInsets.symmetric(horizontal: 20, vertical: 15), - textStyle: const TextStyle( - fontSize: 18, - fontWeight: FontWeight.bold, - ), + padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 15), + textStyle: const TextStyle(fontSize: 18, fontWeight: FontWeight.bold), ), onPressed: () { - Navigator.push(context, - MaterialPageRoute(builder: (context) => DomainPage())); + Navigator.push(context, MaterialPageRoute(builder: (context) => DomainPage())); }, child: Text("Domain Page"), ), @@ -76,16 +65,11 @@ class HomePag extends StatelessWidget { shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(30.0), ), - padding: - const EdgeInsets.symmetric(horizontal: 20, vertical: 15), - textStyle: const TextStyle( - fontSize: 18, - fontWeight: FontWeight.bold, - ), + padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 15), + textStyle: const TextStyle(fontSize: 18, fontWeight: FontWeight.bold), ), onPressed: () { - Navigator.push(context, - MaterialPageRoute(builder: (context) => BottomNav())); + Navigator.push(context, MaterialPageRoute(builder: (context) => BottomNav())); }, child: Text("Bottom Nav"), ), @@ -98,60 +82,11 @@ class HomePag extends StatelessWidget { shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(30.0), ), - padding: - const EdgeInsets.symmetric(horizontal: 20, vertical: 15), - textStyle: const TextStyle( - fontSize: 18, - fontWeight: FontWeight.bold, - ), - ), - onPressed: () { - Navigator.push(context, - MaterialPageRoute(builder: (context) => SubmissionPage())); - }, - child: Text("Submission Page"), - ), - ElevatedButton( - style: ElevatedButton.styleFrom( - backgroundColor: const Color.fromARGB(255, 39, 94, 176), - foregroundColor: Colors.white, - shadowColor: Colors.blueAccent, // Shadow color - elevation: 5, // Elevation of the button - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(30.0), // Rounded corners - ), - padding: EdgeInsets.symmetric( - horizontal: 20, vertical: 15), // Padding inside the button - textStyle: TextStyle( - fontSize: 18, - fontWeight: FontWeight.bold, - ), - ), - onPressed: () { - Navigator.push(context, - MaterialPageRoute(builder: (context) => SubmissionPage())); - }, - child: Text("Submission Page"), - ), - ElevatedButton( - style: ElevatedButton.styleFrom( - backgroundColor: const Color.fromARGB(255, 39, 94, 176), - foregroundColor: Colors.white, - shadowColor: Colors.blueAccent, // Shadow color - elevation: 5, // Elevation of the button - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(30.0), // Rounded corners - ), - padding: EdgeInsets.symmetric( - horizontal: 20, vertical: 15), // Padding inside the button - textStyle: TextStyle( - fontSize: 18, - fontWeight: FontWeight.bold, - ), + padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 15), + textStyle: const TextStyle(fontSize: 18, fontWeight: FontWeight.bold), ), onPressed: () { - Navigator.push(context, - MaterialPageRoute(builder: (context) => SubmissionPage())); + Navigator.push(context, MaterialPageRoute(builder: (context) => SubmissionPage())); }, child: Text("Submission Page"), ), @@ -164,16 +99,11 @@ class HomePag extends StatelessWidget { shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(30.0), ), - padding: - const EdgeInsets.symmetric(horizontal: 20, vertical: 15), - textStyle: const TextStyle( - fontSize: 18, - fontWeight: FontWeight.bold, - ), + padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 15), + textStyle: const TextStyle(fontSize: 18, fontWeight: FontWeight.bold), ), onPressed: () { - Navigator.push(context, - MaterialPageRoute(builder: (context) => ConfirmPage())); + Navigator.push(context, MaterialPageRoute(builder: (context) => ConfirmPage())); }, child: const Text("Confirm"), ), @@ -186,26 +116,11 @@ class HomePag extends StatelessWidget { shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(30.0), ), - padding: - const EdgeInsets.symmetric(horizontal: 20, vertical: 15), - textStyle: const TextStyle( - - padding: EdgeInsets.symmetric( - horizontal: 20, vertical: 15), // Padding inside the button - - textStyle: TextStyle( - fontSize: 18, - fontWeight: FontWeight.bold, - ), + padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 15), + textStyle: const TextStyle(fontSize: 18, fontWeight: FontWeight.bold), ), onPressed: () { - Navigator.push( - context, - MaterialPageRoute( - builder: (context) => PreviousProjects())); - - Navigator.push(context, - MaterialPageRoute(builder: (context) => SpecificProject())); + Navigator.push(context, MaterialPageRoute(builder: (context) => PreviousProjects())); }, child: Text("Previous Projects"), ), @@ -219,14 +134,10 @@ class HomePag extends StatelessWidget { borderRadius: BorderRadius.circular(30.0), ), padding: EdgeInsets.symmetric(horizontal: 20, vertical: 15), - textStyle: const TextStyle( - fontSize: 18, - fontWeight: FontWeight.bold, - ), + textStyle: const TextStyle(fontSize: 18, fontWeight: FontWeight.bold), ), onPressed: () { - Navigator.push( - context, MaterialPageRoute(builder: (context) => Splash())); + Navigator.push(context, MaterialPageRoute(builder: (context) => Splash())); }, child: const Text("SplashScreen"), ), @@ -239,18 +150,11 @@ class HomePag extends StatelessWidget { shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(30.0), ), - padding: - const EdgeInsets.symmetric(horizontal: 20, vertical: 15), - textStyle: const TextStyle( - fontSize: 18, - fontWeight: FontWeight.bold, - ), + padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 15), + textStyle: const TextStyle(fontSize: 18, fontWeight: FontWeight.bold), ), onPressed: () { - Navigator.push( - context, - MaterialPageRoute( - builder: (context) => ProgressTrackerPage())); + Navigator.push(context, MaterialPageRoute(builder: (context) => ProgressTrackerPage())); }, child: const Text("Tracker Page"), ), @@ -263,18 +167,11 @@ class HomePag extends StatelessWidget { shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(30.0), ), - padding: - const EdgeInsets.symmetric(horizontal: 20, vertical: 15), - textStyle: const TextStyle( - fontSize: 18, - fontWeight: FontWeight.bold, - ), + padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 15), + textStyle: const TextStyle(fontSize: 18, fontWeight: FontWeight.bold), ), onPressed: () { - Navigator.push( - context, - MaterialPageRoute( - builder: (context) => MgmtPreviousProjects())); + Navigator.push(context, MaterialPageRoute(builder: (context) => MgmtPreviousProjects())); }, child: const Text("Management Project View Page"), ), @@ -288,16 +185,12 @@ class HomePag extends StatelessWidget { borderRadius: BorderRadius.circular(30.0), ), padding: EdgeInsets.symmetric(horizontal: 20, vertical: 15), - textStyle: TextStyle( - fontSize: 18, - fontWeight: FontWeight.bold, - ), + textStyle: const TextStyle(fontSize: 18, fontWeight: FontWeight.bold), ), onPressed: () { - Navigator.push(context, - MaterialPageRoute(builder: (context) => Studentview())); + Navigator.push(context, MaterialPageRoute(builder: (context) => Studentview())); }, - child: Text("Student View"), + child: const Text("Student View"), ), ], ), diff --git a/frontend/macos/Flutter/GeneratedPluginRegistrant.swift b/frontend/macos/Flutter/GeneratedPluginRegistrant.swift index d993eb7..aa53084 100644 --- a/frontend/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/frontend/macos/Flutter/GeneratedPluginRegistrant.swift @@ -5,12 +5,14 @@ import FlutterMacOS import Foundation +import file_picker import file_selector_macos import path_provider_foundation import shared_preferences_foundation import url_launcher_macos func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { + FilePickerPlugin.register(with: registry.registrar(forPlugin: "FilePickerPlugin")) FileSelectorPlugin.register(with: registry.registrar(forPlugin: "FileSelectorPlugin")) PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin")) diff --git a/frontend/pubspec.lock b/frontend/pubspec.lock index ca991fa..48501d9 100644 --- a/frontend/pubspec.lock +++ b/frontend/pubspec.lock @@ -37,26 +37,10 @@ packages: dependency: transitive description: name: collection - sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a + sha256: a1ace0a119f20aabc852d165077c036cd864315bd99b7eaa10a60100341941bf url: "https://pub.dev" source: hosted - version: "1.18.0" - cross_file: - dependency: transitive - description: - name: cross_file - sha256: "7caf6a750a0c04effbb52a676dce9a4a592e10ad35c34d6d2d0e4811160d5670" - url: "https://pub.dev" - source: hosted - version: "0.3.4+2" - cross_file: - dependency: transitive - description: - name: cross_file - sha256: "7caf6a750a0c04effbb52a676dce9a4a592e10ad35c34d6d2d0e4811160d5670" - url: "https://pub.dev" - source: hosted - version: "0.3.4+2" + version: "1.19.0" cross_file: dependency: transitive description: @@ -69,10 +53,10 @@ packages: dependency: transitive description: name: crypto - sha256: ec30d999af904f33454ba22ed9a86162b35e52b44ac4807d1d93c288041d7d27 + sha256: "1e445881f28f22d6140f181e07737b22f1e099a5e1ff94b0af2f9e4a463f4855" url: "https://pub.dev" source: hosted - version: "3.0.5" + version: "3.0.6" cupertino_icons: dependency: "direct main" description: @@ -101,26 +85,34 @@ packages: dependency: transitive description: name: file - sha256: "5fc22d7c25582e38ad9a8515372cd9a93834027aacf1801cf01164dac0ffa08c" + sha256: a3b4f84adafef897088c160faf7dfffb7696046cb13ae90b508c2cbc95d3b8d4 + url: "https://pub.dev" + source: hosted + version: "7.0.1" + file_picker: + dependency: "direct main" + description: + name: file_picker + sha256: c3756004a4e6035d9ac1acfb419d2a3ddaa1c0bf12ea9ab5a302bff80489349c url: "https://pub.dev" source: hosted - version: "7.0.0" + version: "8.3.0" file_selector_linux: dependency: transitive description: name: file_selector_linux - sha256: "045d372bf19b02aeb69cacf8b4009555fb5f6f0b7ad8016e5f46dd1387ddd492" + sha256: "54cbbd957e1156d29548c7d9b9ec0c0ebb6de0a90452198683a7d23aed617a33" url: "https://pub.dev" source: hosted - version: "0.9.2+1" + version: "0.9.3+2" file_selector_macos: dependency: transitive description: name: file_selector_macos - sha256: f42eacb83b318e183b1ae24eead1373ab1334084404c8c16e0354f9a3e55d385 + sha256: "271ab9986df0c135d45c3cdb6bd0faa5db6f4976d3e4b437cf7d0f258d941bfc" url: "https://pub.dev" source: hosted - version: "0.9.4" + version: "0.9.4+2" file_selector_platform_interface: dependency: transitive description: @@ -133,26 +125,10 @@ packages: dependency: transitive description: name: file_selector_windows - sha256: "2ad726953f6e8affbc4df8dc78b77c3b4a060967a291e528ef72ae846c60fb69" - url: "https://pub.dev" - source: hosted - version: "0.9.3+2" - file_picker: - dependency: "direct main" - description: - name: file_picker - sha256: "167bb619cdddaa10ef2907609feb8a79c16dfa479d3afaf960f8e223f754bf12" - url: "https://pub.dev" - source: hosted - version: "8.1.2" - file_picker: - dependency: "direct main" - description: - name: file_picker - sha256: "167bb619cdddaa10ef2907609feb8a79c16dfa479d3afaf960f8e223f754bf12" + sha256: "8f5d2f6590d51ecd9179ba39c64f722edc15226cc93dcc8698466ad36a4a85a4" url: "https://pub.dev" source: hosted - version: "8.1.2" + version: "0.9.3+3" flutter: dependency: "direct main" description: flutter @@ -170,26 +146,10 @@ packages: dependency: transitive description: name: flutter_plugin_android_lifecycle - sha256: "9ee02950848f61c4129af3d6ec84a1cfc0e47931abc746b03e7a3bc3e8ff6eda" + sha256: "615a505aef59b151b46bbeef55b36ce2b6ed299d160c51d84281946f0aa0ce0e" url: "https://pub.dev" source: hosted - version: "2.0.22" - flutter_plugin_android_lifecycle: - dependency: transitive - description: - name: flutter_plugin_android_lifecycle - sha256: "9ee02950848f61c4129af3d6ec84a1cfc0e47931abc746b03e7a3bc3e8ff6eda" - url: "https://pub.dev" - source: hosted - version: "2.0.22" - flutter_plugin_android_lifecycle: - dependency: transitive - description: - name: flutter_plugin_android_lifecycle - sha256: "9ee02950848f61c4129af3d6ec84a1cfc0e47931abc746b03e7a3bc3e8ff6eda" - url: "https://pub.dev" - source: hosted - version: "2.0.22" + version: "2.0.24" flutter_test: dependency: "direct dev" description: flutter @@ -212,18 +172,18 @@ packages: dependency: transitive description: name: http - sha256: b9c29a161230ee03d3ccf545097fccd9b87a5264228c5d348202e0f0c28f9010 + sha256: fe7ab022b76f3034adc518fb6ea04a82387620e19977665ea18d30a1cf43442f url: "https://pub.dev" source: hosted - version: "1.2.2" + version: "1.3.0" http_parser: dependency: transitive description: name: http_parser - sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b" + sha256: "178d74305e7866013777bab2c3d8726205dc5a4dd935297175b19a23a2e66571" url: "https://pub.dev" source: hosted - version: "4.0.2" + version: "4.1.2" image_picker: dependency: "direct main" description: @@ -236,26 +196,26 @@ packages: dependency: transitive description: name: image_picker_android - sha256: "8c5abf0dcc24fe6e8e0b4a5c0b51a5cf30cefdf6407a3213dae61edc75a70f56" + sha256: b62d34a506e12bb965e824b6db4fbf709ee4589cf5d3e99b45ab2287b008ee0c url: "https://pub.dev" source: hosted - version: "0.8.12+12" + version: "0.8.12+20" image_picker_for_web: dependency: transitive description: name: image_picker_for_web - sha256: "65d94623e15372c5c51bebbcb820848d7bcb323836e12dfdba60b5d3a8b39e50" + sha256: "717eb042ab08c40767684327be06a5d8dbb341fe791d514e4b92c7bbe1b7bb83" url: "https://pub.dev" source: hosted - version: "3.0.5" + version: "3.0.6" image_picker_ios: dependency: transitive description: name: image_picker_ios - sha256: "6703696ad49f5c3c8356d576d7ace84d1faf459afb07accbb0fae780753ff447" + sha256: "05da758e67bc7839e886b3959848aa6b44ff123ab4b28f67891008afe8ef9100" url: "https://pub.dev" source: hosted - version: "0.8.12" + version: "0.8.12+2" image_picker_linux: dependency: transitive description: @@ -268,18 +228,18 @@ packages: dependency: transitive description: name: image_picker_macos - sha256: "3f5ad1e8112a9a6111c46d0b57a7be2286a9a07fc6e1976fdf5be2bd31d4ff62" + sha256: "1b90ebbd9dcf98fb6c1d01427e49a55bd96b5d67b8c67cf955d60a5de74207c1" url: "https://pub.dev" source: hosted - version: "0.2.1+1" + version: "0.2.1+2" image_picker_platform_interface: dependency: transitive description: name: image_picker_platform_interface - sha256: "9ec26d410ff46f483c5519c29c02ef0e02e13a543f882b152d4bfd2f06802f80" + sha256: "886d57f0be73c4b140004e78b9f28a8914a09e50c2d816bdd0520051a71236a0" url: "https://pub.dev" source: hosted - version: "2.10.0" + version: "2.10.1" image_picker_windows: dependency: transitive description: @@ -292,36 +252,18 @@ packages: dependency: transitive description: name: leak_tracker - sha256: "7f0df31977cb2c0b88585095d168e689669a2cc9b97c309665e3386f3e9d341a" + sha256: "7bb2830ebd849694d1ec25bf1f44582d6ac531a57a365a803a6034ff751d2d06" url: "https://pub.dev" source: hosted - version: "10.0.4" - - - sha256: "3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05" - sha256: "3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05" - sha256: "3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05" - url: "https://pub.dev" - source: hosted - version: "10.0.5" - - + version: "10.0.7" leak_tracker_flutter_testing: dependency: transitive description: name: leak_tracker_flutter_testing - - sha256: "932549fb305594d82d7183ecd9fa93463e9914e1b67cacc34bc40906594a1806" - url: "https://pub.dev" - source: hosted - version: "3.0.5" - - - main - sha256: "06e98f569d004c1315b991ded39924b21af84cf14cc94791b8aea337d25b57f8" + sha256: "9491a714cca3667b60b5c420da8217e6de0d1ba7a5ec322fab01758f6998f379" url: "https://pub.dev" source: hosted - version: "3.0.5" + version: "3.0.8" leak_tracker_testing: dependency: transitive description: @@ -350,30 +292,26 @@ packages: dependency: transitive description: name: material_color_utilities - sha256: "0e0a020085b65b6083975e499759762399b4475f766c21668c4ecca34ea74e5a" + sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec url: "https://pub.dev" source: hosted - version: "0.8.0" + version: "0.11.1" meta: dependency: transitive description: name: meta - sha256: "7687075e408b093f36e6bbf6c91878cc0d4cd10f409506f7bc996f68220b9136" + sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7 url: "https://pub.dev" source: hosted - version: "1.12.0" + version: "1.15.0" mime: dependency: transitive description: name: mime - sha256: "801fd0b26f14a4a58ccb09d5892c3fbdeff209594300a542492cf13fba9d247a" + sha256: "41a20518f0cb1256669420fdba0cd90d21561e560ac240f26ef8322e45bb7ed6" url: "https://pub.dev" source: hosted - version: "1.15.0" - version: "1.15.0" - - - version: "1.0.6" + version: "2.0.0" path: dependency: transitive description: @@ -386,26 +324,26 @@ packages: dependency: transitive description: name: path_provider - sha256: fec0d61223fba3154d87759e3cc27fe2c8dc498f6386c6d6fc80d1afdd1bf378 + sha256: "50c5dd5b6e1aaf6fb3a78b33f6aa3afca52bf903a8a5298f53101fdaee55bbcd" url: "https://pub.dev" source: hosted - version: "2.1.4" + version: "2.1.5" path_provider_android: dependency: transitive description: name: path_provider_android - sha256: "6f01f8e37ec30b07bc424b4deabac37cacb1bc7e2e515ad74486039918a37eb7" + sha256: "4adf4fd5423ec60a29506c76581bc05854c55e3a0b72d35bb28d661c9686edf2" url: "https://pub.dev" source: hosted - version: "2.2.10" + version: "2.2.15" path_provider_foundation: dependency: transitive description: name: path_provider_foundation - sha256: f234384a3fdd67f989b4d54a5d73ca2a6c422fa55ae694381ae0f4375cd1ea16 + sha256: "4843174df4d288f5e29185bd6e72a6fbdf5a4a4602717eed565497429f179942" url: "https://pub.dev" source: hosted - version: "2.4.0" + version: "2.4.1" path_provider_linux: dependency: transitive description: @@ -442,10 +380,10 @@ packages: dependency: transitive description: name: permission_handler_android - sha256: "76e4ab092c1b240d31177bb64d2b0bea43f43d0e23541ec866151b9f7b2490fa" + sha256: "71bbecfee799e65aff7c744761a57e817e73b738fedf62ab7afd5593da21f9f1" url: "https://pub.dev" source: hosted - version: "12.0.12" + version: "12.0.13" permission_handler_apple: dependency: transitive description: @@ -458,18 +396,18 @@ packages: dependency: transitive description: name: permission_handler_html - sha256: af26edbbb1f2674af65a8f4b56e1a6f526156bc273d0e65dd8075fab51c78851 + sha256: "38f000e83355abb3392140f6bc3030660cfaef189e1f87824facb76300b4ff24" url: "https://pub.dev" source: hosted - version: "0.1.3+2" + version: "0.1.3+5" permission_handler_platform_interface: dependency: transitive description: name: permission_handler_platform_interface - sha256: fe0ffe274d665be8e34f9c59705441a7d248edebbe5d9e3ec2665f88b79358ea + sha256: e9c8eadee926c4532d0305dff94b85bf961f16759c3af791486613152af4b4f9 url: "https://pub.dev" source: hosted - version: "4.2.2" + version: "4.2.3" permission_handler_windows: dependency: transitive description: @@ -482,10 +420,10 @@ packages: dependency: transitive description: name: platform - sha256: "9b71283fc13df574056616011fb138fd3b793ea47cc509c189a6c3fa5f8a1a65" + sha256: "5d6b1b0036a5f331ebc77c850ebc8506cbc1e9416c27e59b439f917a902a4984" url: "https://pub.dev" source: hosted - version: "3.1.5" + version: "3.1.6" plugin_platform_interface: dependency: transitive description: @@ -506,26 +444,26 @@ packages: dependency: "direct main" description: name: shared_preferences - sha256: "746e5369a43170c25816cc472ee016d3a66bc13fcf430c0bc41ad7b4b2922051" + sha256: c59819dacc6669a1165d54d2735a9543f136f9b3cec94ca65cea6ab8dffc422e url: "https://pub.dev" source: hosted - version: "2.3.2" + version: "2.4.0" shared_preferences_android: dependency: transitive description: name: shared_preferences_android - sha256: "480ba4345773f56acda9abf5f50bd966f581dac5d514e5fc4a18c62976bbba7e" + sha256: "650584dcc0a39856f369782874e562efd002a9c94aec032412c9eb81419cce1f" url: "https://pub.dev" source: hosted - version: "2.3.2" + version: "2.4.4" shared_preferences_foundation: dependency: transitive description: name: shared_preferences_foundation - sha256: c4b35f6cb8f63c147312c054ce7c2254c8066745125264f0c88739c417fc9d9f + sha256: "6a52cfcdaeac77cad8c97b539ff688ccfc458c007b4db12be584fbe5c0e49e03" url: "https://pub.dev" source: hosted - version: "2.5.2" + version: "2.5.4" shared_preferences_linux: dependency: transitive description: @@ -562,7 +500,7 @@ packages: dependency: transitive description: flutter source: sdk - version: "0.0.99" + version: "0.0.0" source_span: dependency: transitive description: @@ -575,10 +513,10 @@ packages: dependency: transitive description: name: stack_trace - sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b" + sha256: "9f47fd3630d76be3ab26f0ee06d213679aa425996925ff3feffdec504931c377" url: "https://pub.dev" source: hosted - version: "1.11.1" + version: "1.12.0" stream_channel: dependency: transitive description: @@ -591,10 +529,10 @@ packages: dependency: transitive description: name: string_scanner - sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" + sha256: "688af5ed3402a4bde5b3a6c15fd768dbf2621a614950b17f04626c431ab3c4c3" url: "https://pub.dev" source: hosted - version: "1.2.0" + version: "1.3.0" term_glyph: dependency: transitive description: @@ -607,58 +545,58 @@ packages: dependency: transitive description: name: test_api - sha256: "9955ae474176f7ac8ee4e989dadfb411a58c30415bcfb648fa04b2b8a03afa7f" + sha256: "664d3a9a64782fcdeb83ce9c6b39e78fd2971d4e37827b9b06c3aa1edc5e760c" url: "https://pub.dev" source: hosted - version: "0.7.0" + version: "0.7.3" typed_data: dependency: transitive description: name: typed_data - sha256: facc8d6582f16042dd49f2463ff1bd6e2c9ef9f3d5da3d9b087e244a7b564b3c + sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006 url: "https://pub.dev" source: hosted - version: "1.3.2" + version: "1.4.0" url_launcher: dependency: "direct main" description: name: url_launcher - sha256: "21b704ce5fa560ea9f3b525b43601c678728ba46725bab9b01187b4831377ed3" + sha256: "9d06212b1362abc2f0f0d78e6f09f726608c74e3b9462e8368bb03314aa8d603" url: "https://pub.dev" source: hosted - version: "6.3.0" + version: "6.3.1" url_launcher_android: dependency: transitive description: name: url_launcher_android - sha256: f0c73347dfcfa5b3db8bc06e1502668265d39c08f310c29bff4e28eea9699f79 + sha256: "6fc2f56536ee873eeb867ad176ae15f304ccccc357848b351f6f0d8d4a40d193" url: "https://pub.dev" source: hosted - version: "6.3.9" + version: "6.3.14" url_launcher_ios: dependency: transitive description: name: url_launcher_ios - sha256: e43b677296fadce447e987a2f519dcf5f6d1e527dc35d01ffab4fff5b8a7063e + sha256: "16a513b6c12bb419304e72ea0ae2ab4fed569920d1c7cb850263fe3acc824626" url: "https://pub.dev" source: hosted - version: "6.3.1" + version: "6.3.2" url_launcher_linux: dependency: transitive description: name: url_launcher_linux - sha256: e2b9622b4007f97f504cd64c0128309dfb978ae66adbe944125ed9e1750f06af + sha256: "4e9ba368772369e3e08f231d2301b4ef72b9ff87c31192ef471b380ef29a4935" url: "https://pub.dev" source: hosted - version: "3.2.0" + version: "3.2.1" url_launcher_macos: dependency: transitive description: name: url_launcher_macos - sha256: "9a1a42d5d2d95400c795b2914c36fdcb525870c752569438e4ebb09a2b5d90de" + sha256: "17ba2000b847f334f16626a574c702b196723af2a289e7a93ffcb79acff855c2" url: "https://pub.dev" source: hosted - version: "3.2.0" + version: "3.2.2" url_launcher_platform_interface: dependency: transitive description: @@ -671,18 +609,18 @@ packages: dependency: transitive description: name: url_launcher_web - sha256: "772638d3b34c779ede05ba3d38af34657a05ac55b06279ea6edd409e323dca8e" + sha256: "3ba963161bd0fe395917ba881d320b9c4f6dd3c4a233da62ab18a5025c85f1e9" url: "https://pub.dev" source: hosted - version: "2.3.3" + version: "2.4.0" url_launcher_windows: dependency: transitive description: name: url_launcher_windows - sha256: "49c10f879746271804767cb45551ec5592cdab00ee105c06dddde1a98f73b185" + sha256: "3284b6d2ac454cf34f114e1d3319866fdd1e19cdc329999057e44ffe936cfa77" url: "https://pub.dev" source: hosted - version: "3.1.2" + version: "3.1.4" vector_math: dependency: transitive description: @@ -695,42 +633,34 @@ packages: dependency: transitive description: name: vm_service - sha256: "3923c89304b715fb1eb6423f017651664a03bf5f4b29983627c4da791f74a4ec" - url: "https://pub.dev" - source: hosted - version: "14.2.1" - - - sha256: f652077d0bdf60abe4c1f6377448e8655008eef28f128bc023f7b5e8dfeb48fc + sha256: f6be3ed8bd01289b34d679c2b62226f63c0e69f9fd2e50a6b3c1c729a961041b url: "https://pub.dev" source: hosted - version: "14.2.5" + version: "14.3.0" web: dependency: transitive description: name: web - sha256: d43c1d6b787bf0afad444700ae7f4db8827f701bc61c255ac8d328c6f4d52062 + sha256: cd3543bd5798f6ad290ea73d210f423502e71900302dde696f8bff84bf89a1cb url: "https://pub.dev" source: hosted - version: "1.0.0" + version: "1.1.0" win32: dependency: transitive description: name: win32 - sha256: "68d1e89a91ed61ad9c370f9f8b6effed9ae5e0ede22a270bdfa6daf79fc2290a" + sha256: daf97c9d80197ed7b619040e86c8ab9a9dad285e7671ee7390f9180cc828a51e url: "https://pub.dev" source: hosted - version: "0.5.1" + version: "5.10.1" xdg_directories: dependency: transitive description: name: xdg_directories - sha256: faea9dee56b520b55a566385b84f2e8de55e7496104adada9962e0bd11bcff1d + sha256: "7a3f37b05d989967cdddcbb571f1ea834867ae2faa29725fd085180e0883aa15" url: "https://pub.dev" source: hosted - version: "1.0.4" + version: "1.1.0" sdks: - dart: ">=3.4.0 <4.0.0" - flutter: ">=3.22.0" - dart: ">=3.4.0 <4.0.0" - flutter: ">=3.22.0" + dart: ">=3.6.0 <4.0.0" + flutter: ">=3.27.0" diff --git a/frontend/pubspec.yaml b/frontend/pubspec.yaml index 404d869..e778647 100644 --- a/frontend/pubspec.yaml +++ b/frontend/pubspec.yaml @@ -40,7 +40,8 @@ dependencies: url_launcher: ^6.3.0 image_picker: ^1.1.2 shared_preferences: ^2.0.13 - permission_handler: ^11.3.1 file_picker: ^8.1.2 + permission_handler: ^11.3.1 + file_picker: ^8.1.2 dev_dependencies: flutter_test: From 5d3e45eb0984c5284937f12f52f0f1d20f94937e Mon Sep 17 00:00:00 2001 From: bharathan06 Date: Mon, 3 Feb 2025 23:06:18 +0530 Subject: [PATCH 04/63] added mvvm boilerplate folders --- frontend/lib/api/api.dart | 0 frontend/lib/logic/logic.dart | 0 frontend/lib/models/models.dart | 0 .../mgmg_prev_projects.dart | 0 .../projects_card.dart | 2 +- .../common_pages}/bottomNav.dart | 2 +- .../{ => common_pages}/confirm_page.dart | 0 .../lib/pages/{ => common_pages}/domain.dart | 2 +- .../pages/{ => common_pages}/home_page.dart | 0 .../pages/{ => common_pages}/login_page.dart | 0 .../{ => common_pages}/previous_projects.dart | 0 .../{ => common_pages}/register_page.dart | 0 .../{ => common_pages}/specific_project.dart | 2 +- .../{ => common_pages}/splashscreen.dart | 0 .../pages/{ => common_pages}/teamcard.dart | 2 +- .../common_pages}/topNav.dart | 0 frontend/lib/pages/home.dart | 22 +++++++++---------- frontend/lib/pages/std_details.dart | 2 +- .../{ => user_pages}/imageuploadpage.dart | 0 .../pages/{ => user_pages}/studentview.dart | 2 +- .../{ => user_pages}/submission_page.dart | 0 .../lib/pages/{ => user_pages}/tracker.dart | 0 frontend/lib/routing/routes.dart | 0 frontend/lib/theme/colors.dart | 0 frontend/lib/utils/utils.dart | 0 25 files changed, 18 insertions(+), 18 deletions(-) create mode 100644 frontend/lib/api/api.dart create mode 100644 frontend/lib/logic/logic.dart create mode 100644 frontend/lib/models/models.dart rename frontend/lib/pages/{mgmt_previous_projects => admin_pages}/mgmg_prev_projects.dart (100%) rename frontend/lib/pages/{mgmt_previous_projects => admin_pages}/projects_card.dart (99%) rename frontend/lib/{components => pages/common_pages}/bottomNav.dart (96%) rename frontend/lib/pages/{ => common_pages}/confirm_page.dart (100%) rename frontend/lib/pages/{ => common_pages}/domain.dart (99%) rename frontend/lib/pages/{ => common_pages}/home_page.dart (100%) rename frontend/lib/pages/{ => common_pages}/login_page.dart (100%) rename frontend/lib/pages/{ => common_pages}/previous_projects.dart (100%) rename frontend/lib/pages/{ => common_pages}/register_page.dart (100%) rename frontend/lib/pages/{ => common_pages}/specific_project.dart (99%) rename frontend/lib/pages/{ => common_pages}/splashscreen.dart (100%) rename frontend/lib/pages/{ => common_pages}/teamcard.dart (98%) rename frontend/lib/{components => pages/common_pages}/topNav.dart (100%) rename frontend/lib/pages/{ => user_pages}/imageuploadpage.dart (100%) rename frontend/lib/pages/{ => user_pages}/studentview.dart (98%) rename frontend/lib/pages/{ => user_pages}/submission_page.dart (100%) rename frontend/lib/pages/{ => user_pages}/tracker.dart (100%) create mode 100644 frontend/lib/routing/routes.dart create mode 100644 frontend/lib/theme/colors.dart create mode 100644 frontend/lib/utils/utils.dart diff --git a/frontend/lib/api/api.dart b/frontend/lib/api/api.dart new file mode 100644 index 0000000..e69de29 diff --git a/frontend/lib/logic/logic.dart b/frontend/lib/logic/logic.dart new file mode 100644 index 0000000..e69de29 diff --git a/frontend/lib/models/models.dart b/frontend/lib/models/models.dart new file mode 100644 index 0000000..e69de29 diff --git a/frontend/lib/pages/mgmt_previous_projects/mgmg_prev_projects.dart b/frontend/lib/pages/admin_pages/mgmg_prev_projects.dart similarity index 100% rename from frontend/lib/pages/mgmt_previous_projects/mgmg_prev_projects.dart rename to frontend/lib/pages/admin_pages/mgmg_prev_projects.dart diff --git a/frontend/lib/pages/mgmt_previous_projects/projects_card.dart b/frontend/lib/pages/admin_pages/projects_card.dart similarity index 99% rename from frontend/lib/pages/mgmt_previous_projects/projects_card.dart rename to frontend/lib/pages/admin_pages/projects_card.dart index 7aa9244..77484d4 100644 --- a/frontend/lib/pages/mgmt_previous_projects/projects_card.dart +++ b/frontend/lib/pages/admin_pages/projects_card.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; -import '../specific_project.dart'; +import '../common_pages/specific_project.dart'; class Data { diff --git a/frontend/lib/components/bottomNav.dart b/frontend/lib/pages/common_pages/bottomNav.dart similarity index 96% rename from frontend/lib/components/bottomNav.dart rename to frontend/lib/pages/common_pages/bottomNav.dart index 6631550..2acb502 100644 --- a/frontend/lib/components/bottomNav.dart +++ b/frontend/lib/pages/common_pages/bottomNav.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; //Testing change -import 'package:dev_track_app/pages/domain.dart'; +import 'package:dev_track_app/pages/common_pages/domain.dart'; import 'package:dev_track_app/pages/home.dart'; class BottomNav extends StatefulWidget { diff --git a/frontend/lib/pages/confirm_page.dart b/frontend/lib/pages/common_pages/confirm_page.dart similarity index 100% rename from frontend/lib/pages/confirm_page.dart rename to frontend/lib/pages/common_pages/confirm_page.dart diff --git a/frontend/lib/pages/domain.dart b/frontend/lib/pages/common_pages/domain.dart similarity index 99% rename from frontend/lib/pages/domain.dart rename to frontend/lib/pages/common_pages/domain.dart index a6068ab..5dfa937 100644 --- a/frontend/lib/pages/domain.dart +++ b/frontend/lib/pages/common_pages/domain.dart @@ -1,4 +1,4 @@ -import 'package:dev_track_app/components/topNav.dart'; +import 'package:dev_track_app/pages/common_pages/topNav.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter/painting.dart'; diff --git a/frontend/lib/pages/home_page.dart b/frontend/lib/pages/common_pages/home_page.dart similarity index 100% rename from frontend/lib/pages/home_page.dart rename to frontend/lib/pages/common_pages/home_page.dart diff --git a/frontend/lib/pages/login_page.dart b/frontend/lib/pages/common_pages/login_page.dart similarity index 100% rename from frontend/lib/pages/login_page.dart rename to frontend/lib/pages/common_pages/login_page.dart diff --git a/frontend/lib/pages/previous_projects.dart b/frontend/lib/pages/common_pages/previous_projects.dart similarity index 100% rename from frontend/lib/pages/previous_projects.dart rename to frontend/lib/pages/common_pages/previous_projects.dart diff --git a/frontend/lib/pages/register_page.dart b/frontend/lib/pages/common_pages/register_page.dart similarity index 100% rename from frontend/lib/pages/register_page.dart rename to frontend/lib/pages/common_pages/register_page.dart diff --git a/frontend/lib/pages/specific_project.dart b/frontend/lib/pages/common_pages/specific_project.dart similarity index 99% rename from frontend/lib/pages/specific_project.dart rename to frontend/lib/pages/common_pages/specific_project.dart index ed91409..9d678f2 100644 --- a/frontend/lib/pages/specific_project.dart +++ b/frontend/lib/pages/common_pages/specific_project.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; import 'package:readmore/readmore.dart'; -import 'std_details.dart'; +import '../std_details.dart'; import 'teamcard.dart'; diff --git a/frontend/lib/pages/splashscreen.dart b/frontend/lib/pages/common_pages/splashscreen.dart similarity index 100% rename from frontend/lib/pages/splashscreen.dart rename to frontend/lib/pages/common_pages/splashscreen.dart diff --git a/frontend/lib/pages/teamcard.dart b/frontend/lib/pages/common_pages/teamcard.dart similarity index 98% rename from frontend/lib/pages/teamcard.dart rename to frontend/lib/pages/common_pages/teamcard.dart index 5ec6d8b..8c213f5 100644 --- a/frontend/lib/pages/teamcard.dart +++ b/frontend/lib/pages/common_pages/teamcard.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:url_launcher/url_launcher.dart'; -import 'std_class.dart'; +import '../std_class.dart'; class TeamCard extends StatefulWidget { final STD std; diff --git a/frontend/lib/components/topNav.dart b/frontend/lib/pages/common_pages/topNav.dart similarity index 100% rename from frontend/lib/components/topNav.dart rename to frontend/lib/pages/common_pages/topNav.dart diff --git a/frontend/lib/pages/home.dart b/frontend/lib/pages/home.dart index 77ecdea..f7ea972 100644 --- a/frontend/lib/pages/home.dart +++ b/frontend/lib/pages/home.dart @@ -1,15 +1,15 @@ -import 'package:dev_track_app/components/bottomNav.dart'; -import 'package:dev_track_app/pages/mgmt_previous_projects/mgmg_prev_projects.dart'; -import 'package:dev_track_app/pages/previous_projects.dart'; -import 'package:dev_track_app/pages/splashscreen.dart'; -import 'package:dev_track_app/pages/confirm_page.dart'; -import 'package:dev_track_app/pages/domain.dart'; -import 'package:dev_track_app/pages/specific_project.dart'; -import 'package:dev_track_app/pages/home_page.dart'; +import 'package:dev_track_app/pages/common_pages/bottomNav.dart'; +import 'package:dev_track_app/pages/admin_pages//mgmg_prev_projects.dart'; +import 'package:dev_track_app/pages/common_pages/previous_projects.dart'; +import 'package:dev_track_app/pages/common_pages/splashscreen.dart'; +import 'package:dev_track_app/pages/common_pages/confirm_page.dart'; +import 'package:dev_track_app/pages/common_pages/domain.dart'; +import 'package:dev_track_app/pages/common_pages/specific_project.dart'; +import 'package:dev_track_app/pages/common_pages/home_page.dart'; import 'package:flutter/material.dart'; -import 'package:dev_track_app/pages/tracker.dart'; -import 'package:dev_track_app/pages/studentview.dart'; -import 'package:dev_track_app/pages/submission_page.dart'; +import 'package:dev_track_app/pages/user_pages/tracker.dart'; +import 'package:dev_track_app/pages/user_pages/studentview.dart'; +import 'package:dev_track_app/pages/user_pages/submission_page.dart'; class HomePag extends StatelessWidget { const HomePag({super.key}); diff --git a/frontend/lib/pages/std_details.dart b/frontend/lib/pages/std_details.dart index ee01093..b00a9d7 100644 --- a/frontend/lib/pages/std_details.dart +++ b/frontend/lib/pages/std_details.dart @@ -6,7 +6,7 @@ class STD_details{ STD("070","Vaishali","assets/images/elmoo.jpg","https://www.youtube.com/watch?v=dQw4w9WgXcQ","Lead"), STD("071","Areny","assets/images/elmoo.jpg","https://www.youtube.com/watch?v=dQw4w9WgXcQ","Front-End"), STD("072","Atul","assets/images/elmoo.jpg","https://www.youtube.com/watch?v=dQw4w9WgXcQ","Back-End"), - STD("073","Vai","assets/images/elmoo.jpg","https://www.youtube.com/watch?v=dQw4w9WgXcQ","UI/UX"), + STD("073","Vais","assets/images/elmoo.jpg","https://www.youtube.com/watch?v=dQw4w9WgXcQ","UI/UX"), ]; } \ No newline at end of file diff --git a/frontend/lib/pages/imageuploadpage.dart b/frontend/lib/pages/user_pages/imageuploadpage.dart similarity index 100% rename from frontend/lib/pages/imageuploadpage.dart rename to frontend/lib/pages/user_pages/imageuploadpage.dart diff --git a/frontend/lib/pages/studentview.dart b/frontend/lib/pages/user_pages/studentview.dart similarity index 98% rename from frontend/lib/pages/studentview.dart rename to frontend/lib/pages/user_pages/studentview.dart index f4bb2a2..8c62650 100644 --- a/frontend/lib/pages/studentview.dart +++ b/frontend/lib/pages/user_pages/studentview.dart @@ -3,7 +3,7 @@ import 'package:flutter/material.dart'; import 'package:google_fonts/google_fonts.dart'; import 'package:image_picker/image_picker.dart'; import 'package:shared_preferences/shared_preferences.dart'; // For local storage -import 'package:dev_track_app/pages/imageuploadpage.dart'; // Ensure this is the correct path +import 'package:dev_track_app/pages/user_pages/imageuploadpage.dart'; // Ensure this is the correct path class Studentview extends StatefulWidget { const Studentview({super.key}); diff --git a/frontend/lib/pages/submission_page.dart b/frontend/lib/pages/user_pages/submission_page.dart similarity index 100% rename from frontend/lib/pages/submission_page.dart rename to frontend/lib/pages/user_pages/submission_page.dart diff --git a/frontend/lib/pages/tracker.dart b/frontend/lib/pages/user_pages/tracker.dart similarity index 100% rename from frontend/lib/pages/tracker.dart rename to frontend/lib/pages/user_pages/tracker.dart diff --git a/frontend/lib/routing/routes.dart b/frontend/lib/routing/routes.dart new file mode 100644 index 0000000..e69de29 diff --git a/frontend/lib/theme/colors.dart b/frontend/lib/theme/colors.dart new file mode 100644 index 0000000..e69de29 diff --git a/frontend/lib/utils/utils.dart b/frontend/lib/utils/utils.dart new file mode 100644 index 0000000..e69de29 From 5e2b0e3bb60be4b9525dbd77adb63336ddf40d3c Mon Sep 17 00:00:00 2001 From: ghamani <138302691+Ghamani121@users.noreply.github.com> Date: Mon, 10 Feb 2025 18:36:58 +0530 Subject: [PATCH 05/63] created branch --- .../lib/pages/admin_pages/projects_card.dart | 3 ++- frontend/pubspec.lock | 16 ++++++++-------- frontend/pubspec.yaml | 2 +- 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/frontend/lib/pages/admin_pages/projects_card.dart b/frontend/lib/pages/admin_pages/projects_card.dart index 77484d4..6b72dbe 100644 --- a/frontend/lib/pages/admin_pages/projects_card.dart +++ b/frontend/lib/pages/admin_pages/projects_card.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; -import '../common_pages/specific_project.dart'; +import 'package:dev_track_app/pages/common_pages/specific_project.dart'; + class Data { diff --git a/frontend/pubspec.lock b/frontend/pubspec.lock index 48501d9..bb82cab 100644 --- a/frontend/pubspec.lock +++ b/frontend/pubspec.lock @@ -93,10 +93,10 @@ packages: dependency: "direct main" description: name: file_picker - sha256: c3756004a4e6035d9ac1acfb419d2a3ddaa1c0bf12ea9ab5a302bff80489349c + sha256: cacfdc5abe93e64d418caa9256eef663499ad791bb688d9fd12c85a311968fba url: "https://pub.dev" source: hosted - version: "8.3.0" + version: "8.3.2" file_selector_linux: dependency: transitive description: @@ -138,10 +138,10 @@ packages: dependency: "direct dev" description: name: flutter_lints - sha256: "3f41d009ba7172d5ff9be5f6e6e6abb4300e263aab8866d2a0842ed2a70f8f0c" + sha256: "5398f14efa795ffb7a33e9b6a08798b26a180edac4ad7db3f231e40f82ce11e1" url: "https://pub.dev" source: hosted - version: "4.0.0" + version: "5.0.0" flutter_plugin_android_lifecycle: dependency: transitive description: @@ -276,10 +276,10 @@ packages: dependency: transitive description: name: lints - sha256: "976c774dd944a42e83e2467f4cc670daef7eed6295b10b36ae8c85bcbf828235" + sha256: c35bb79562d980e9a453fc715854e1ed39e24e7d0297a880ef54e17f9874a9d7 url: "https://pub.dev" source: hosted - version: "4.0.0" + version: "5.1.1" matcher: dependency: transitive description: @@ -444,10 +444,10 @@ packages: dependency: "direct main" description: name: shared_preferences - sha256: c59819dacc6669a1165d54d2735a9543f136f9b3cec94ca65cea6ab8dffc422e + sha256: "688ee90fbfb6989c980254a56cb26ebe9bb30a3a2dff439a78894211f73de67a" url: "https://pub.dev" source: hosted - version: "2.4.0" + version: "2.5.1" shared_preferences_android: dependency: transitive description: diff --git a/frontend/pubspec.yaml b/frontend/pubspec.yaml index e778647..a4bcf70 100644 --- a/frontend/pubspec.yaml +++ b/frontend/pubspec.yaml @@ -52,7 +52,7 @@ dev_dependencies: # activated in the `analysis_options.yaml` file located at the root of your # package. See that file for information about deactivating specific lint # rules and activating additional ones. - flutter_lints: ^4.0.0 + flutter_lints: ^5.0.0 # For information on the generic Dart part of this file, see the # following page: https://dart.dev/tools/pub/pubspec From eee847d4cf6e5c7a1547afd3232ec30aac218415 Mon Sep 17 00:00:00 2001 From: ghamani <138302691+Ghamani121@users.noreply.github.com> Date: Tue, 11 Feb 2025 10:36:19 +0530 Subject: [PATCH 06/63] updated import command --- frontend/lib/{ => api}/models/models.dart | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename frontend/lib/{ => api}/models/models.dart (100%) diff --git a/frontend/lib/models/models.dart b/frontend/lib/api/models/models.dart similarity index 100% rename from frontend/lib/models/models.dart rename to frontend/lib/api/models/models.dart From 40ff83244b9782311189e776b0a3ef409db225a3 Mon Sep 17 00:00:00 2001 From: ghamani <138302691+Ghamani121@users.noreply.github.com> Date: Wed, 12 Feb 2025 00:20:42 +0530 Subject: [PATCH 07/63] Cleaning Previous project page The page can be divided into two parts i.e, routing and pages --- .../pages/common_pages/previous_projects.dart | 42 ++++--------------- .../routing/previous_projects_routing.dart | 15 +++++++ 2 files changed, 24 insertions(+), 33 deletions(-) create mode 100644 frontend/lib/routing/previous_projects_routing.dart diff --git a/frontend/lib/pages/common_pages/previous_projects.dart b/frontend/lib/pages/common_pages/previous_projects.dart index 021cd31..f560e6f 100644 --- a/frontend/lib/pages/common_pages/previous_projects.dart +++ b/frontend/lib/pages/common_pages/previous_projects.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'specific_project.dart'; +import '../../routing/previous_projects_routing.dart'; class PreviousProjects extends StatefulWidget { const PreviousProjects({super.key}); @@ -21,7 +22,7 @@ class _PreviousProjectsState extends State { Expanded( child: IconButton( onPressed: () { - Navigator.pop(context); + PreviousProjectsRouting.pop(context); }, icon: Icon( Icons.arrow_back_ios, @@ -72,7 +73,7 @@ class _PreviousProjectsState extends State { ), title: const Text('1'), onTap: () { - Navigator.pop(context); + PreviousProjectsRouting.pop(context); }, ), ListTile( @@ -81,7 +82,7 @@ class _PreviousProjectsState extends State { ), title: const Text('2'), onTap: () { - Navigator.pop(context); + PreviousProjectsRouting.pop(context); }, ), ], @@ -185,12 +186,7 @@ class _PreviousProjectsState extends State { height: double.infinity, child: ElevatedButton( onPressed: () { - Navigator.push( - context, - MaterialPageRoute( - builder: (context) => - SpecificProject()) - ); + PreviousProjectsRouting.pushToSpecificProject(context); }, child: Text( 'Learn More', @@ -263,12 +259,7 @@ class _PreviousProjectsState extends State { height: double.infinity, child: ElevatedButton( onPressed: () { - Navigator.push( - context, - MaterialPageRoute( - builder: (context) => - SpecificProject()) - ); + PreviousProjectsRouting.pushToSpecificProject(context); }, child: Text( 'Learn More', @@ -341,12 +332,7 @@ class _PreviousProjectsState extends State { height: double.infinity, child: ElevatedButton( onPressed: () { - Navigator.push( - context, - MaterialPageRoute( - builder: (context) => - SpecificProject()) - ); + PreviousProjectsRouting.pushToSpecificProject(context); }, child: Text( 'Learn More', @@ -419,12 +405,7 @@ class _PreviousProjectsState extends State { height: double.infinity, child: ElevatedButton( onPressed: () { - Navigator.push( - context, - MaterialPageRoute( - builder: (context) => - SpecificProject()) - ); + PreviousProjectsRouting.pushToSpecificProject(context); }, child: Text( 'Learn More', @@ -497,12 +478,7 @@ class _PreviousProjectsState extends State { height: double.infinity, child: ElevatedButton( onPressed: () { - Navigator.push( - context, - MaterialPageRoute( - builder: (context) => - SpecificProject()) - ); + PreviousProjectsRouting.pushToSpecificProject(context); }, child: Text( 'Learn More', diff --git a/frontend/lib/routing/previous_projects_routing.dart b/frontend/lib/routing/previous_projects_routing.dart new file mode 100644 index 0000000..d82cea8 --- /dev/null +++ b/frontend/lib/routing/previous_projects_routing.dart @@ -0,0 +1,15 @@ +import 'package:flutter/material.dart'; +import '../pages/common_pages/specific_project.dart'; + +class PreviousProjectsRouting { + static void pop(BuildContext context) { + Navigator.pop(context); + } + + static void pushToSpecificProject(BuildContext context) { + Navigator.push( + context, + MaterialPageRoute(builder: (context) => SpecificProject()), + ); + } +} From 63064eab6536625c4f31d79b2e2b5f84d9a63fac Mon Sep 17 00:00:00 2001 From: ghamani <138302691+Ghamani121@users.noreply.github.com> Date: Wed, 12 Feb 2025 10:39:56 +0530 Subject: [PATCH 08/63] resolved issue --- frontend/lib/{api => }/models/models.dart | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename frontend/lib/{api => }/models/models.dart (100%) diff --git a/frontend/lib/api/models/models.dart b/frontend/lib/models/models.dart similarity index 100% rename from frontend/lib/api/models/models.dart rename to frontend/lib/models/models.dart From 02f5ce7b395d17310fa3d9f27527ab60d28b8ac5 Mon Sep 17 00:00:00 2001 From: Kartikjarali010 Date: Wed, 12 Feb 2025 17:46:46 +0530 Subject: [PATCH 09/63] created 2 components and updated home_page --- .../lib/pages/common_pages/home_page.dart | 63 +++++-------------- frontend/lib/utils/bottom_nav_bar.dart | 0 frontend/lib/utils/custom_button.dart | 0 3 files changed, 14 insertions(+), 49 deletions(-) create mode 100644 frontend/lib/utils/bottom_nav_bar.dart create mode 100644 frontend/lib/utils/custom_button.dart diff --git a/frontend/lib/pages/common_pages/home_page.dart b/frontend/lib/pages/common_pages/home_page.dart index e36f50e..4f4d8db 100644 --- a/frontend/lib/pages/common_pages/home_page.dart +++ b/frontend/lib/pages/common_pages/home_page.dart @@ -1,6 +1,9 @@ +import 'package:dev_track_app/components/custom_button.dart'; import 'package:flutter/material.dart'; -import 'login_page.dart'; -import 'register_page.dart'; +import 'package:dev_track_app/components/bottom_nav_bar.dart'; +import 'package:dev_track_app/pages/common_pages/login_page.dart'; +import 'package:dev_track_app/pages/common_pages/register_page.dart'; + class HomePage extends StatelessWidget { const HomePage({super.key}); @@ -44,47 +47,27 @@ class HomePage extends StatelessWidget { Row( mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [ - ElevatedButton( + CustomButton( + text: 'Login', onPressed: () { Navigator.push( context, MaterialPageRoute( - builder: (context) => const LoginPage()), + builder: (context) => const LoginPage(), + ), ); }, - style: ElevatedButton.styleFrom( - backgroundColor: - const Color.fromARGB(255, 53, 156, 19), - fixedSize: const Size(120, 50), - ), - child: const Text( - 'Login', - style: TextStyle( - color: Colors.white, - fontWeight: FontWeight.bold, - ), - ), ), - ElevatedButton( + CustomButton( + text: 'Register', onPressed: () { Navigator.push( context, MaterialPageRoute( - builder: (context) => const RegisterPage()), + builder: (context) => const RegisterPage(), + ), ); }, - style: ElevatedButton.styleFrom( - backgroundColor: - const Color.fromARGB(255, 53, 156, 19), - fixedSize: const Size(120, 50), - ), - child: const Text( - 'Register', - style: TextStyle( - color: Colors.white, - fontWeight: FontWeight.bold, - ), - ), ), ], ), @@ -94,25 +77,7 @@ class HomePage extends StatelessWidget { ], ), ), - bottomNavigationBar: BottomNavigationBar( - backgroundColor: Colors.grey[850], - selectedItemColor: Colors.white, - unselectedItemColor: Colors.grey, - items: const [ - BottomNavigationBarItem( - icon: Icon(Icons.home), - label: 'Home', - ), - BottomNavigationBarItem( - icon: Icon(Icons.person), - label: 'Profile', - ), - BottomNavigationBarItem( - icon: Icon(Icons.settings), - label: 'Settings', - ), - ], - ), + bottomNavigationBar: const BottomNavBar(), ); } } diff --git a/frontend/lib/utils/bottom_nav_bar.dart b/frontend/lib/utils/bottom_nav_bar.dart new file mode 100644 index 0000000..e69de29 diff --git a/frontend/lib/utils/custom_button.dart b/frontend/lib/utils/custom_button.dart new file mode 100644 index 0000000..e69de29 From 7d230ecc81d892eaeeac48677794dea84b27c8a7 Mon Sep 17 00:00:00 2001 From: Kartikjarali010 Date: Wed, 12 Feb 2025 17:48:50 +0530 Subject: [PATCH 10/63] created 2 components and updated home_page --- frontend/lib/components/bottom_nav_bar.dart | 28 +++++++++++++++++++++ frontend/lib/components/custom_button.dart | 26 +++++++++++++++++++ frontend/lib/utils/bottom_nav_bar.dart | 28 +++++++++++++++++++++ frontend/lib/utils/custom_button.dart | 26 +++++++++++++++++++ 4 files changed, 108 insertions(+) create mode 100644 frontend/lib/components/bottom_nav_bar.dart create mode 100644 frontend/lib/components/custom_button.dart diff --git a/frontend/lib/components/bottom_nav_bar.dart b/frontend/lib/components/bottom_nav_bar.dart new file mode 100644 index 0000000..8e0baae --- /dev/null +++ b/frontend/lib/components/bottom_nav_bar.dart @@ -0,0 +1,28 @@ +import 'package:flutter/material.dart'; + +class BottomNavBar extends StatelessWidget { + const BottomNavBar({super.key}); + + @override + Widget build(BuildContext context) { + return BottomNavigationBar( + backgroundColor: Colors.grey[850], + selectedItemColor: Colors.white, + unselectedItemColor: Colors.grey, + items: const [ + BottomNavigationBarItem( + icon: Icon(Icons.home), + label: 'Home', + ), + BottomNavigationBarItem( + icon: Icon(Icons.person), + label: 'Profile', + ), + BottomNavigationBarItem( + icon: Icon(Icons.settings), + label: 'Settings', + ), + ], + ); + } +} diff --git a/frontend/lib/components/custom_button.dart b/frontend/lib/components/custom_button.dart new file mode 100644 index 0000000..5e466af --- /dev/null +++ b/frontend/lib/components/custom_button.dart @@ -0,0 +1,26 @@ +import 'package:flutter/material.dart'; + +class CustomButton extends StatelessWidget { + final String text; + final VoidCallback onPressed; + + const CustomButton({super.key, required this.text, required this.onPressed}); + + @override + Widget build(BuildContext context) { + return ElevatedButton( + onPressed: onPressed, + style: ElevatedButton.styleFrom( + backgroundColor: const Color.fromARGB(255, 53, 156, 19), + fixedSize: const Size(120, 50), + ), + child: Text( + text, + style: const TextStyle( + color: Colors.white, + fontWeight: FontWeight.bold, + ), + ), + ); + } +} diff --git a/frontend/lib/utils/bottom_nav_bar.dart b/frontend/lib/utils/bottom_nav_bar.dart index e69de29..8e0baae 100644 --- a/frontend/lib/utils/bottom_nav_bar.dart +++ b/frontend/lib/utils/bottom_nav_bar.dart @@ -0,0 +1,28 @@ +import 'package:flutter/material.dart'; + +class BottomNavBar extends StatelessWidget { + const BottomNavBar({super.key}); + + @override + Widget build(BuildContext context) { + return BottomNavigationBar( + backgroundColor: Colors.grey[850], + selectedItemColor: Colors.white, + unselectedItemColor: Colors.grey, + items: const [ + BottomNavigationBarItem( + icon: Icon(Icons.home), + label: 'Home', + ), + BottomNavigationBarItem( + icon: Icon(Icons.person), + label: 'Profile', + ), + BottomNavigationBarItem( + icon: Icon(Icons.settings), + label: 'Settings', + ), + ], + ); + } +} diff --git a/frontend/lib/utils/custom_button.dart b/frontend/lib/utils/custom_button.dart index e69de29..5e466af 100644 --- a/frontend/lib/utils/custom_button.dart +++ b/frontend/lib/utils/custom_button.dart @@ -0,0 +1,26 @@ +import 'package:flutter/material.dart'; + +class CustomButton extends StatelessWidget { + final String text; + final VoidCallback onPressed; + + const CustomButton({super.key, required this.text, required this.onPressed}); + + @override + Widget build(BuildContext context) { + return ElevatedButton( + onPressed: onPressed, + style: ElevatedButton.styleFrom( + backgroundColor: const Color.fromARGB(255, 53, 156, 19), + fixedSize: const Size(120, 50), + ), + child: Text( + text, + style: const TextStyle( + color: Colors.white, + fontWeight: FontWeight.bold, + ), + ), + ); + } +} From 87962edb7db7513c0d9ede4c44940317be09f4db Mon Sep 17 00:00:00 2001 From: Kartikjarali010 Date: Wed, 12 Feb 2025 17:58:59 +0530 Subject: [PATCH 11/63] created 2 components and updated home_page --- frontend/lib/components/bottom_nav_bar.dart | 28 ------------------- frontend/lib/components/custom_button.dart | 26 ----------------- .../lib/pages/common_pages/home_page.dart | 6 ++-- 3 files changed, 4 insertions(+), 56 deletions(-) delete mode 100644 frontend/lib/components/bottom_nav_bar.dart delete mode 100644 frontend/lib/components/custom_button.dart diff --git a/frontend/lib/components/bottom_nav_bar.dart b/frontend/lib/components/bottom_nav_bar.dart deleted file mode 100644 index 8e0baae..0000000 --- a/frontend/lib/components/bottom_nav_bar.dart +++ /dev/null @@ -1,28 +0,0 @@ -import 'package:flutter/material.dart'; - -class BottomNavBar extends StatelessWidget { - const BottomNavBar({super.key}); - - @override - Widget build(BuildContext context) { - return BottomNavigationBar( - backgroundColor: Colors.grey[850], - selectedItemColor: Colors.white, - unselectedItemColor: Colors.grey, - items: const [ - BottomNavigationBarItem( - icon: Icon(Icons.home), - label: 'Home', - ), - BottomNavigationBarItem( - icon: Icon(Icons.person), - label: 'Profile', - ), - BottomNavigationBarItem( - icon: Icon(Icons.settings), - label: 'Settings', - ), - ], - ); - } -} diff --git a/frontend/lib/components/custom_button.dart b/frontend/lib/components/custom_button.dart deleted file mode 100644 index 5e466af..0000000 --- a/frontend/lib/components/custom_button.dart +++ /dev/null @@ -1,26 +0,0 @@ -import 'package:flutter/material.dart'; - -class CustomButton extends StatelessWidget { - final String text; - final VoidCallback onPressed; - - const CustomButton({super.key, required this.text, required this.onPressed}); - - @override - Widget build(BuildContext context) { - return ElevatedButton( - onPressed: onPressed, - style: ElevatedButton.styleFrom( - backgroundColor: const Color.fromARGB(255, 53, 156, 19), - fixedSize: const Size(120, 50), - ), - child: Text( - text, - style: const TextStyle( - color: Colors.white, - fontWeight: FontWeight.bold, - ), - ), - ); - } -} diff --git a/frontend/lib/pages/common_pages/home_page.dart b/frontend/lib/pages/common_pages/home_page.dart index 4f4d8db..37348c4 100644 --- a/frontend/lib/pages/common_pages/home_page.dart +++ b/frontend/lib/pages/common_pages/home_page.dart @@ -1,6 +1,8 @@ -import 'package:dev_track_app/components/custom_button.dart'; + +import 'package:dev_track_app/utils/bottom_nav_bar.dart'; +import 'package:dev_track_app/utils/custom_button.dart'; import 'package:flutter/material.dart'; -import 'package:dev_track_app/components/bottom_nav_bar.dart'; + import 'package:dev_track_app/pages/common_pages/login_page.dart'; import 'package:dev_track_app/pages/common_pages/register_page.dart'; From 67c48fb49601ba648e1474a60fb5e5caf5b1760e Mon Sep 17 00:00:00 2001 From: Piyush Chakarborthy <102757301+Chakravartinsamrat@users.noreply.github.com> Date: Wed, 12 Feb 2025 22:49:14 +0530 Subject: [PATCH 12/63] Submission_page submission page has been broken down to Widget/drop_down models/submission_model pages/Projects/submission page rest I've done some reaaranging, Cause it's all messy --- frontend/lib/models/submission_model.dart | 6 + .../lib/pages/admin_pages/projects_card.dart | 62 ++- .../lib/pages/common_pages/bottomNav.dart | 2 +- .../pages/common_pages/previous_projects.dart | 508 ----------------- .../domain.dart | 0 frontend/lib/pages/home.dart | 98 ++-- .../project_display/previous_projects.dart | 513 ++++++++++++++++++ .../project_display}/specific_project.dart | 24 +- .../submission_page}/submission_page.dart | 0 .../widgets/drop_down_button.dart | 39 ++ frontend/lib/pages/std_class.dart | 9 +- .../lib/pages/user_pages/studentview.dart | 2 +- .../routing/previous_projects_routing.dart | 2 +- .../user_pages => utils}/imageuploadpage.dart | 0 frontend/pubspec.lock | 90 +-- frontend/pubspec.yaml | 2 +- 16 files changed, 717 insertions(+), 640 deletions(-) create mode 100644 frontend/lib/models/submission_model.dart delete mode 100644 frontend/lib/pages/common_pages/previous_projects.dart rename frontend/lib/pages/{common_pages => domain_pages}/domain.dart (100%) create mode 100644 frontend/lib/pages/project_pages/project_display/previous_projects.dart rename frontend/lib/pages/{common_pages => project_pages/project_display}/specific_project.dart (96%) rename frontend/lib/pages/{user_pages => project_pages/submission_page}/submission_page.dart (100%) create mode 100644 frontend/lib/pages/project_pages/submission_page/widgets/drop_down_button.dart rename frontend/lib/{pages/user_pages => utils}/imageuploadpage.dart (100%) diff --git a/frontend/lib/models/submission_model.dart b/frontend/lib/models/submission_model.dart new file mode 100644 index 0000000..fae9474 --- /dev/null +++ b/frontend/lib/models/submission_model.dart @@ -0,0 +1,6 @@ +const List submissionList = [ + 'AppDev-51', + 'AppDev-52', + 'WebDev-41', + 'WebDev-42' +]; diff --git a/frontend/lib/pages/admin_pages/projects_card.dart b/frontend/lib/pages/admin_pages/projects_card.dart index 6b72dbe..31c1465 100644 --- a/frontend/lib/pages/admin_pages/projects_card.dart +++ b/frontend/lib/pages/admin_pages/projects_card.dart @@ -1,26 +1,21 @@ import 'package:flutter/material.dart'; -import 'package:dev_track_app/pages/common_pages/specific_project.dart'; - - +import 'package:dev_track_app/pages/project_pages/project_display/specific_project.dart'; class Data { String domain_name; String content; - Data( - {required this.domain_name, - - required this.content}); + Data({required this.domain_name, required this.content}); } Widget ProjectsCard(List projectlist, int index, BuildContext contextt, Function onUpdate, Function onDelete) { TextEditingController _domainController = - TextEditingController(text: projectlist[index].domain_name); + TextEditingController(text: projectlist[index].domain_name); TextEditingController _contentController = - TextEditingController(text: projectlist[index].content); + TextEditingController(text: projectlist[index].content); return Padding( padding: const EdgeInsets.fromLTRB(0, 15, 0, 15), @@ -60,9 +55,12 @@ Widget ProjectsCard(List projectlist, int index, BuildContext contextt, ), Text( projectlist[index].domain_name, - style: TextStyle(fontSize: 15,color: Colors.white), + style: TextStyle(fontSize: 15, color: Colors.white), + ), + Text( + projectlist[index].content, + style: TextStyle(color: Colors.white), ), - Text(projectlist[index].content,style: TextStyle(color: Colors.white),), ], ), ], @@ -73,12 +71,12 @@ Widget ProjectsCard(List projectlist, int index, BuildContext contextt, child: Container( height: 50, width: 50, - child: Container( width: 30, child: PopupMenuButton( offset: Offset(0, 40), - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10)), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(10)), itemBuilder: (context) => [ PopupMenuItem( child: Row( @@ -109,16 +107,19 @@ Widget ProjectsCard(List projectlist, int index, BuildContext contextt, TextField( controller: _domainController, cursorColor: Colors.black45, - style: TextStyle(color: Colors.black), + style: TextStyle( + color: Colors.black), decoration: InputDecoration( labelText: 'Edit Caption', labelStyle: TextStyle( color: Colors.black45), - enabledBorder: UnderlineInputBorder( + enabledBorder: + UnderlineInputBorder( borderSide: BorderSide( color: Colors.black38), ), - focusedBorder: UnderlineInputBorder( + focusedBorder: + UnderlineInputBorder( borderSide: BorderSide( color: Colors.black45), ), @@ -127,16 +128,19 @@ Widget ProjectsCard(List projectlist, int index, BuildContext contextt, TextField( controller: _contentController, cursorColor: Colors.black45, - style: TextStyle(color: Colors.black), + style: TextStyle( + color: Colors.black), decoration: InputDecoration( labelText: 'Edit Content', labelStyle: TextStyle( color: Colors.black45), - enabledBorder: UnderlineInputBorder( + enabledBorder: + UnderlineInputBorder( borderSide: BorderSide( color: Colors.black38), ), - focusedBorder: UnderlineInputBorder( + focusedBorder: + UnderlineInputBorder( borderSide: BorderSide( color: Colors.black45), ), @@ -154,11 +158,12 @@ Widget ProjectsCard(List projectlist, int index, BuildContext contextt, }, child: Text( 'Update', - style: - TextStyle(color: Colors.white), + style: TextStyle( + color: Colors.white), ), style: ElevatedButton.styleFrom( - backgroundColor: Color(0xFF93B1A6), + backgroundColor: + Color(0xFF93B1A6), ), ), ], @@ -189,11 +194,7 @@ Widget ProjectsCard(List projectlist, int index, BuildContext contextt, ], iconColor: Color(0xFF93B1A6), ), - - ), - - ), ), ], @@ -209,15 +210,18 @@ Widget ProjectsCard(List projectlist, int index, BuildContext contextt, height: double.infinity, child: ElevatedButton( onPressed: () { - Navigator.push(contextt, - MaterialPageRoute(builder: (context) => SpecificProject())); + Navigator.push( + contextt, + MaterialPageRoute( + builder: (context) => SpecificProject())); }, child: Text( 'Learn More', style: TextStyle(fontSize: 15, color: Colors.grey[800]), ), style: ElevatedButton.styleFrom( - shape: RoundedRectangleBorder(borderRadius: BorderRadius.zero), + shape: + RoundedRectangleBorder(borderRadius: BorderRadius.zero), backgroundColor: Colors.grey[400], ), ), diff --git a/frontend/lib/pages/common_pages/bottomNav.dart b/frontend/lib/pages/common_pages/bottomNav.dart index 2acb502..d6c9f4c 100644 --- a/frontend/lib/pages/common_pages/bottomNav.dart +++ b/frontend/lib/pages/common_pages/bottomNav.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; //Testing change -import 'package:dev_track_app/pages/common_pages/domain.dart'; +import 'package:dev_track_app/pages/domain_pages/domain.dart'; import 'package:dev_track_app/pages/home.dart'; class BottomNav extends StatefulWidget { diff --git a/frontend/lib/pages/common_pages/previous_projects.dart b/frontend/lib/pages/common_pages/previous_projects.dart deleted file mode 100644 index f560e6f..0000000 --- a/frontend/lib/pages/common_pages/previous_projects.dart +++ /dev/null @@ -1,508 +0,0 @@ -import 'package:flutter/material.dart'; -import 'specific_project.dart'; -import '../../routing/previous_projects_routing.dart'; - -class PreviousProjects extends StatefulWidget { - const PreviousProjects({super.key}); - - @override - State createState() => _PreviousProjectsState(); -} - -class _PreviousProjectsState extends State { - @override - Widget build(BuildContext context) { - return SafeArea( - child: Scaffold( - appBar: AppBar( - leading: Container( - child: Row( - mainAxisSize: MainAxisSize.min, - children: [ - Expanded( - child: IconButton( - onPressed: () { - PreviousProjectsRouting.pop(context); - }, - icon: Icon( - Icons.arrow_back_ios, - size: 30, - ), - ), - ), - Expanded( - child: Builder( - builder: (context) => IconButton( - icon: Icon( - Icons.menu, - size: 40, - ), - onPressed: () { - Scaffold.of(context).openDrawer(); - }, - ), - ), - ), - ], - ), - ), - backgroundColor: Colors.white, - actions: [ - IconButton( - onPressed: () {}, - icon: Icon( - Icons.notifications_none, - size: 40, - ), - ) - ], - ), - drawer: Drawer( - child: ListView( - padding: EdgeInsets.zero, - children: [ - const DrawerHeader( - decoration: BoxDecoration( - color: Colors.grey, - ), - child: Text('Drawer Header'), - ), - ListTile( - leading: Icon( - Icons.home, - ), - title: const Text('1'), - onTap: () { - PreviousProjectsRouting.pop(context); - }, - ), - ListTile( - leading: Icon( - Icons.train, - ), - title: const Text('2'), - onTap: () { - PreviousProjectsRouting.pop(context); - }, - ), - ], - ), - ), - body: SingleChildScrollView( - child: Container( - width: double.infinity, - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Padding( - padding: const EdgeInsets.fromLTRB(25, 15, 15, 0), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Text( - 'Welcome back,', - style: TextStyle(fontSize: 18, color: Colors.grey), - ), - Text( - 'Nameeee', - style: TextStyle(fontSize: 25), - ), - ], - ), - ), - Padding( - padding: const EdgeInsets.all(18.0), - child: TextField( - decoration: InputDecoration( - filled: true, - fillColor: Colors.grey[300], - labelText: 'Search all projects ....', - // suffixIcon: Icon(Icons.search), - border: OutlineInputBorder( - borderRadius: BorderRadius.circular(25.0), - ), - ), - ), - ), - Container( - width: double.infinity, - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - SizedBox( - height: 10, - ), - Column( - children: [ - Container( - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(20), - color: Colors.grey[300], - ), - height: 90, - width: 350, - child: Padding( - padding: const EdgeInsets.only( - left: 10, - ), - child: Row( - children: [ - Container( - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(20), - color: Colors.grey[800], - ), - height: 70, - width: 70, - ), - SizedBox( - width: 19, - ), - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - SizedBox( - height: 15, - ), - Text( - 'DOMAIN', - style: TextStyle(fontSize: 15), - ), - Text('Project Name'), - ], - ) - ], - ), - ), - ), - Container( - height: 30, - width: 320, - child: Align( - alignment: Alignment.topRight, - child: SizedBox( - height: double.infinity, - child: ElevatedButton( - onPressed: () { - PreviousProjectsRouting.pushToSpecificProject(context); - }, - child: Text( - 'Learn More', - style: TextStyle( - fontSize: 15, color: Colors.grey[800]), - ), - style: ElevatedButton.styleFrom( - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.zero), - backgroundColor: Colors.grey[400], - ), - ), - ), - ), - ) - ], - ), - SizedBox( - height: 20, - ), - Column( - children: [ - Container( - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(20), - color: Colors.grey[300], - ), - height: 90, - width: 350, - child: Padding( - padding: const EdgeInsets.only( - left: 10, - ), - child: Row( - children: [ - Container( - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(20), - color: Colors.grey[800], - ), - height: 70, - width: 70, - ), - SizedBox( - width: 19, - ), - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - SizedBox( - height: 15, - ), - Text( - 'DOMAIN', - style: TextStyle(fontSize: 15), - ), - Text('Project Name'), - ], - ) - ], - ), - ), - ), - Container( - height: 30, - width: 320, - child: Align( - alignment: Alignment.topRight, - child: SizedBox( - height: double.infinity, - child: ElevatedButton( - onPressed: () { - PreviousProjectsRouting.pushToSpecificProject(context); - }, - child: Text( - 'Learn More', - style: TextStyle( - fontSize: 15, color: Colors.grey[800]), - ), - style: ElevatedButton.styleFrom( - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.zero), - backgroundColor: Colors.grey[400], - ), - ), - ), - ), - ) - ], - ), - SizedBox( - height: 20, - ), - Column( - children: [ - Container( - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(20), - color: Colors.grey[300], - ), - height: 90, - width: 350, - child: Padding( - padding: const EdgeInsets.only( - left: 10, - ), - child: Row( - children: [ - Container( - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(20), - color: Colors.grey[800], - ), - height: 70, - width: 70, - ), - SizedBox( - width: 19, - ), - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - SizedBox( - height: 15, - ), - Text( - 'DOMAIN', - style: TextStyle(fontSize: 15), - ), - Text('Project Name'), - ], - ) - ], - ), - ), - ), - Container( - height: 30, - width: 320, - child: Align( - alignment: Alignment.topRight, - child: SizedBox( - height: double.infinity, - child: ElevatedButton( - onPressed: () { - PreviousProjectsRouting.pushToSpecificProject(context); - }, - child: Text( - 'Learn More', - style: TextStyle( - fontSize: 15, color: Colors.grey[800]), - ), - style: ElevatedButton.styleFrom( - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.zero), - backgroundColor: Colors.grey[400], - ), - ), - ), - ), - ) - ], - ), - SizedBox( - height: 20, - ), - Column( - children: [ - Container( - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(20), - color: Colors.grey[300], - ), - height: 90, - width: 350, - child: Padding( - padding: const EdgeInsets.only( - left: 10, - ), - child: Row( - children: [ - Container( - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(20), - color: Colors.grey[800], - ), - height: 70, - width: 70, - ), - SizedBox( - width: 19, - ), - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - SizedBox( - height: 15, - ), - Text( - 'DOMAIN', - style: TextStyle(fontSize: 15), - ), - Text('Project Name'), - ], - ) - ], - ), - ), - ), - Container( - height: 30, - width: 320, - child: Align( - alignment: Alignment.topRight, - child: SizedBox( - height: double.infinity, - child: ElevatedButton( - onPressed: () { - PreviousProjectsRouting.pushToSpecificProject(context); - }, - child: Text( - 'Learn More', - style: TextStyle( - fontSize: 15, color: Colors.grey[800]), - ), - style: ElevatedButton.styleFrom( - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.zero), - backgroundColor: Colors.grey[400], - ), - ), - ), - ), - ) - ], - ), - SizedBox( - height: 20, - ), - Column( - children: [ - Container( - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(20), - color: Colors.grey[300], - ), - height: 90, - width: 350, - child: Padding( - padding: const EdgeInsets.only( - left: 10, - ), - child: Row( - children: [ - Container( - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(20), - color: Colors.grey[800], - ), - height: 70, - width: 70, - ), - SizedBox( - width: 19, - ), - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - SizedBox( - height: 15, - ), - Text( - 'DOMAIN', - style: TextStyle(fontSize: 15), - ), - Text('Project Name'), - ], - ) - ], - ), - ), - ), - Container( - height: 30, - width: 320, - child: Align( - alignment: Alignment.topRight, - child: SizedBox( - height: double.infinity, - child: ElevatedButton( - onPressed: () { - PreviousProjectsRouting.pushToSpecificProject(context); - }, - child: Text( - 'Learn More', - style: TextStyle( - fontSize: 15, color: Colors.grey[800]), - ), - style: ElevatedButton.styleFrom( - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.zero), - backgroundColor: Colors.grey[400], - ), - ), - ), - ), - ) - ], - ), - ], - ), - ) - ], - ), - ), - ), - )); - } -} diff --git a/frontend/lib/pages/common_pages/domain.dart b/frontend/lib/pages/domain_pages/domain.dart similarity index 100% rename from frontend/lib/pages/common_pages/domain.dart rename to frontend/lib/pages/domain_pages/domain.dart diff --git a/frontend/lib/pages/home.dart b/frontend/lib/pages/home.dart index f7ea972..d9c9aa2 100644 --- a/frontend/lib/pages/home.dart +++ b/frontend/lib/pages/home.dart @@ -1,15 +1,15 @@ import 'package:dev_track_app/pages/common_pages/bottomNav.dart'; import 'package:dev_track_app/pages/admin_pages//mgmg_prev_projects.dart'; -import 'package:dev_track_app/pages/common_pages/previous_projects.dart'; +import 'package:dev_track_app/pages/project_pages/project_display/previous_projects.dart'; import 'package:dev_track_app/pages/common_pages/splashscreen.dart'; import 'package:dev_track_app/pages/common_pages/confirm_page.dart'; -import 'package:dev_track_app/pages/common_pages/domain.dart'; -import 'package:dev_track_app/pages/common_pages/specific_project.dart'; +import 'package:dev_track_app/pages/domain_pages/domain.dart'; +import 'package:dev_track_app/pages/project_pages/project_display/specific_project.dart'; import 'package:dev_track_app/pages/common_pages/home_page.dart'; import 'package:flutter/material.dart'; import 'package:dev_track_app/pages/user_pages/tracker.dart'; import 'package:dev_track_app/pages/user_pages/studentview.dart'; -import 'package:dev_track_app/pages/user_pages/submission_page.dart'; +import 'package:dev_track_app/pages/project_pages/submission_page/submission_page.dart'; class HomePag extends StatelessWidget { const HomePag({super.key}); @@ -31,11 +31,14 @@ class HomePag extends StatelessWidget { shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(30.0), ), - padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 15), - textStyle: const TextStyle(fontSize: 18, fontWeight: FontWeight.bold), + padding: + const EdgeInsets.symmetric(horizontal: 20, vertical: 15), + textStyle: + const TextStyle(fontSize: 18, fontWeight: FontWeight.bold), ), onPressed: () { - Navigator.push(context, MaterialPageRoute(builder: (context) => HomePage())); + Navigator.push(context, + MaterialPageRoute(builder: (context) => HomePage())); }, child: Text("Home Page"), ), @@ -48,11 +51,14 @@ class HomePag extends StatelessWidget { shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(30.0), ), - padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 15), - textStyle: const TextStyle(fontSize: 18, fontWeight: FontWeight.bold), + padding: + const EdgeInsets.symmetric(horizontal: 20, vertical: 15), + textStyle: + const TextStyle(fontSize: 18, fontWeight: FontWeight.bold), ), onPressed: () { - Navigator.push(context, MaterialPageRoute(builder: (context) => DomainPage())); + Navigator.push(context, + MaterialPageRoute(builder: (context) => DomainPage())); }, child: Text("Domain Page"), ), @@ -65,11 +71,14 @@ class HomePag extends StatelessWidget { shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(30.0), ), - padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 15), - textStyle: const TextStyle(fontSize: 18, fontWeight: FontWeight.bold), + padding: + const EdgeInsets.symmetric(horizontal: 20, vertical: 15), + textStyle: + const TextStyle(fontSize: 18, fontWeight: FontWeight.bold), ), onPressed: () { - Navigator.push(context, MaterialPageRoute(builder: (context) => BottomNav())); + Navigator.push(context, + MaterialPageRoute(builder: (context) => BottomNav())); }, child: Text("Bottom Nav"), ), @@ -82,11 +91,14 @@ class HomePag extends StatelessWidget { shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(30.0), ), - padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 15), - textStyle: const TextStyle(fontSize: 18, fontWeight: FontWeight.bold), + padding: + const EdgeInsets.symmetric(horizontal: 20, vertical: 15), + textStyle: + const TextStyle(fontSize: 18, fontWeight: FontWeight.bold), ), onPressed: () { - Navigator.push(context, MaterialPageRoute(builder: (context) => SubmissionPage())); + Navigator.push(context, + MaterialPageRoute(builder: (context) => SubmissionPage())); }, child: Text("Submission Page"), ), @@ -99,11 +111,14 @@ class HomePag extends StatelessWidget { shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(30.0), ), - padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 15), - textStyle: const TextStyle(fontSize: 18, fontWeight: FontWeight.bold), + padding: + const EdgeInsets.symmetric(horizontal: 20, vertical: 15), + textStyle: + const TextStyle(fontSize: 18, fontWeight: FontWeight.bold), ), onPressed: () { - Navigator.push(context, MaterialPageRoute(builder: (context) => ConfirmPage())); + Navigator.push(context, + MaterialPageRoute(builder: (context) => ConfirmPage())); }, child: const Text("Confirm"), ), @@ -116,11 +131,16 @@ class HomePag extends StatelessWidget { shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(30.0), ), - padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 15), - textStyle: const TextStyle(fontSize: 18, fontWeight: FontWeight.bold), + padding: + const EdgeInsets.symmetric(horizontal: 20, vertical: 15), + textStyle: + const TextStyle(fontSize: 18, fontWeight: FontWeight.bold), ), onPressed: () { - Navigator.push(context, MaterialPageRoute(builder: (context) => PreviousProjects())); + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => PreviousProjects())); }, child: Text("Previous Projects"), ), @@ -134,10 +154,12 @@ class HomePag extends StatelessWidget { borderRadius: BorderRadius.circular(30.0), ), padding: EdgeInsets.symmetric(horizontal: 20, vertical: 15), - textStyle: const TextStyle(fontSize: 18, fontWeight: FontWeight.bold), + textStyle: + const TextStyle(fontSize: 18, fontWeight: FontWeight.bold), ), onPressed: () { - Navigator.push(context, MaterialPageRoute(builder: (context) => Splash())); + Navigator.push( + context, MaterialPageRoute(builder: (context) => Splash())); }, child: const Text("SplashScreen"), ), @@ -150,11 +172,16 @@ class HomePag extends StatelessWidget { shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(30.0), ), - padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 15), - textStyle: const TextStyle(fontSize: 18, fontWeight: FontWeight.bold), + padding: + const EdgeInsets.symmetric(horizontal: 20, vertical: 15), + textStyle: + const TextStyle(fontSize: 18, fontWeight: FontWeight.bold), ), onPressed: () { - Navigator.push(context, MaterialPageRoute(builder: (context) => ProgressTrackerPage())); + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => ProgressTrackerPage())); }, child: const Text("Tracker Page"), ), @@ -167,11 +194,16 @@ class HomePag extends StatelessWidget { shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(30.0), ), - padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 15), - textStyle: const TextStyle(fontSize: 18, fontWeight: FontWeight.bold), + padding: + const EdgeInsets.symmetric(horizontal: 20, vertical: 15), + textStyle: + const TextStyle(fontSize: 18, fontWeight: FontWeight.bold), ), onPressed: () { - Navigator.push(context, MaterialPageRoute(builder: (context) => MgmtPreviousProjects())); + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => MgmtPreviousProjects())); }, child: const Text("Management Project View Page"), ), @@ -185,10 +217,12 @@ class HomePag extends StatelessWidget { borderRadius: BorderRadius.circular(30.0), ), padding: EdgeInsets.symmetric(horizontal: 20, vertical: 15), - textStyle: const TextStyle(fontSize: 18, fontWeight: FontWeight.bold), + textStyle: + const TextStyle(fontSize: 18, fontWeight: FontWeight.bold), ), onPressed: () { - Navigator.push(context, MaterialPageRoute(builder: (context) => Studentview())); + Navigator.push(context, + MaterialPageRoute(builder: (context) => Studentview())); }, child: const Text("Student View"), ), diff --git a/frontend/lib/pages/project_pages/project_display/previous_projects.dart b/frontend/lib/pages/project_pages/project_display/previous_projects.dart new file mode 100644 index 0000000..d655b72 --- /dev/null +++ b/frontend/lib/pages/project_pages/project_display/previous_projects.dart @@ -0,0 +1,513 @@ +import 'package:flutter/material.dart'; +import 'specific_project.dart'; +import '../../../routing/previous_projects_routing.dart'; + +class PreviousProjects extends StatefulWidget { + const PreviousProjects({super.key}); + + @override + State createState() => _PreviousProjectsState(); +} + +class _PreviousProjectsState extends State { + @override + Widget build(BuildContext context) { + return SafeArea( + child: Scaffold( + appBar: AppBar( + leading: Container( + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + Expanded( + child: IconButton( + onPressed: () { + PreviousProjectsRouting.pop(context); + }, + icon: Icon( + Icons.arrow_back_ios, + size: 30, + ), + ), + ), + Expanded( + child: Builder( + builder: (context) => IconButton( + icon: Icon( + Icons.menu, + size: 40, + ), + onPressed: () { + Scaffold.of(context).openDrawer(); + }, + ), + ), + ), + ], + ), + ), + backgroundColor: Colors.white, + actions: [ + IconButton( + onPressed: () {}, + icon: Icon( + Icons.notifications_none, + size: 40, + ), + ) + ], + ), + drawer: Drawer( + child: ListView( + padding: EdgeInsets.zero, + children: [ + const DrawerHeader( + decoration: BoxDecoration( + color: Colors.grey, + ), + child: Text('Drawer Header'), + ), + ListTile( + leading: Icon( + Icons.home, + ), + title: const Text('1'), + onTap: () { + PreviousProjectsRouting.pop(context); + }, + ), + ListTile( + leading: Icon( + Icons.train, + ), + title: const Text('2'), + onTap: () { + PreviousProjectsRouting.pop(context); + }, + ), + ], + ), + ), + body: SingleChildScrollView( + child: Container( + width: double.infinity, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: const EdgeInsets.fromLTRB(25, 15, 15, 0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Text( + 'Welcome back,', + style: TextStyle(fontSize: 18, color: Colors.grey), + ), + Text( + 'Nameeee', + style: TextStyle(fontSize: 25), + ), + ], + ), + ), + Padding( + padding: const EdgeInsets.all(18.0), + child: TextField( + decoration: InputDecoration( + filled: true, + fillColor: Colors.grey[300], + labelText: 'Search all projects ....', + // suffixIcon: Icon(Icons.search), + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(25.0), + ), + ), + ), + ), + Container( + width: double.infinity, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + SizedBox( + height: 10, + ), + Column( + children: [ + Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(20), + color: Colors.grey[300], + ), + height: 90, + width: 350, + child: Padding( + padding: const EdgeInsets.only( + left: 10, + ), + child: Row( + children: [ + Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(20), + color: Colors.grey[800], + ), + height: 70, + width: 70, + ), + SizedBox( + width: 19, + ), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox( + height: 15, + ), + Text( + 'DOMAIN', + style: TextStyle(fontSize: 15), + ), + Text('Project Name'), + ], + ) + ], + ), + ), + ), + Container( + height: 30, + width: 320, + child: Align( + alignment: Alignment.topRight, + child: SizedBox( + height: double.infinity, + child: ElevatedButton( + onPressed: () { + PreviousProjectsRouting.pushToSpecificProject( + context); + }, + child: Text( + 'Learn More', + style: TextStyle( + fontSize: 15, color: Colors.grey[800]), + ), + style: ElevatedButton.styleFrom( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.zero), + backgroundColor: Colors.grey[400], + ), + ), + ), + ), + ) + ], + ), + SizedBox( + height: 20, + ), + Column( + children: [ + Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(20), + color: Colors.grey[300], + ), + height: 90, + width: 350, + child: Padding( + padding: const EdgeInsets.only( + left: 10, + ), + child: Row( + children: [ + Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(20), + color: Colors.grey[800], + ), + height: 70, + width: 70, + ), + SizedBox( + width: 19, + ), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox( + height: 15, + ), + Text( + 'DOMAIN', + style: TextStyle(fontSize: 15), + ), + Text('Project Name'), + ], + ) + ], + ), + ), + ), + Container( + height: 30, + width: 320, + child: Align( + alignment: Alignment.topRight, + child: SizedBox( + height: double.infinity, + child: ElevatedButton( + onPressed: () { + PreviousProjectsRouting.pushToSpecificProject( + context); + }, + child: Text( + 'Learn More', + style: TextStyle( + fontSize: 15, color: Colors.grey[800]), + ), + style: ElevatedButton.styleFrom( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.zero), + backgroundColor: Colors.grey[400], + ), + ), + ), + ), + ) + ], + ), + SizedBox( + height: 20, + ), + Column( + children: [ + Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(20), + color: Colors.grey[300], + ), + height: 90, + width: 350, + child: Padding( + padding: const EdgeInsets.only( + left: 10, + ), + child: Row( + children: [ + Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(20), + color: Colors.grey[800], + ), + height: 70, + width: 70, + ), + SizedBox( + width: 19, + ), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox( + height: 15, + ), + Text( + 'DOMAIN', + style: TextStyle(fontSize: 15), + ), + Text('Project Name'), + ], + ) + ], + ), + ), + ), + Container( + height: 30, + width: 320, + child: Align( + alignment: Alignment.topRight, + child: SizedBox( + height: double.infinity, + child: ElevatedButton( + onPressed: () { + PreviousProjectsRouting.pushToSpecificProject( + context); + }, + child: Text( + 'Learn More', + style: TextStyle( + fontSize: 15, color: Colors.grey[800]), + ), + style: ElevatedButton.styleFrom( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.zero), + backgroundColor: Colors.grey[400], + ), + ), + ), + ), + ) + ], + ), + SizedBox( + height: 20, + ), + Column( + children: [ + Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(20), + color: Colors.grey[300], + ), + height: 90, + width: 350, + child: Padding( + padding: const EdgeInsets.only( + left: 10, + ), + child: Row( + children: [ + Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(20), + color: Colors.grey[800], + ), + height: 70, + width: 70, + ), + SizedBox( + width: 19, + ), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox( + height: 15, + ), + Text( + 'DOMAIN', + style: TextStyle(fontSize: 15), + ), + Text('Project Name'), + ], + ) + ], + ), + ), + ), + Container( + height: 30, + width: 320, + child: Align( + alignment: Alignment.topRight, + child: SizedBox( + height: double.infinity, + child: ElevatedButton( + onPressed: () { + PreviousProjectsRouting.pushToSpecificProject( + context); + }, + child: Text( + 'Learn More', + style: TextStyle( + fontSize: 15, color: Colors.grey[800]), + ), + style: ElevatedButton.styleFrom( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.zero), + backgroundColor: Colors.grey[400], + ), + ), + ), + ), + ) + ], + ), + SizedBox( + height: 20, + ), + Column( + children: [ + Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(20), + color: Colors.grey[300], + ), + height: 90, + width: 350, + child: Padding( + padding: const EdgeInsets.only( + left: 10, + ), + child: Row( + children: [ + Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(20), + color: Colors.grey[800], + ), + height: 70, + width: 70, + ), + SizedBox( + width: 19, + ), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox( + height: 15, + ), + Text( + 'DOMAIN', + style: TextStyle(fontSize: 15), + ), + Text('Project Name'), + ], + ) + ], + ), + ), + ), + Container( + height: 30, + width: 320, + child: Align( + alignment: Alignment.topRight, + child: SizedBox( + height: double.infinity, + child: ElevatedButton( + onPressed: () { + PreviousProjectsRouting.pushToSpecificProject( + context); + }, + child: Text( + 'Learn More', + style: TextStyle( + fontSize: 15, color: Colors.grey[800]), + ), + style: ElevatedButton.styleFrom( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.zero), + backgroundColor: Colors.grey[400], + ), + ), + ), + ), + ) + ], + ), + ], + ), + ) + ], + ), + ), + ), + )); + } +} diff --git a/frontend/lib/pages/common_pages/specific_project.dart b/frontend/lib/pages/project_pages/project_display/specific_project.dart similarity index 96% rename from frontend/lib/pages/common_pages/specific_project.dart rename to frontend/lib/pages/project_pages/project_display/specific_project.dart index 9d678f2..a5ad2cf 100644 --- a/frontend/lib/pages/common_pages/specific_project.dart +++ b/frontend/lib/pages/project_pages/project_display/specific_project.dart @@ -1,9 +1,8 @@ import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; import 'package:readmore/readmore.dart'; -import '../std_details.dart'; -import 'teamcard.dart'; - +import '../../std_details.dart'; +import '../../common_pages/teamcard.dart'; class SpecificProject extends StatefulWidget { const SpecificProject({super.key}); @@ -65,7 +64,6 @@ class _SpecificProjectState extends State { padding: EdgeInsets.zero, children: [ const DrawerHeader( - decoration: BoxDecoration( color: Colors.grey, ), @@ -111,8 +109,7 @@ class _SpecificProjectState extends State { width: double.infinity, decoration: BoxDecoration( border: Border.all(color: Colors.black26), - borderRadius: BorderRadius.all(Radius.circular(20)) - ), + borderRadius: BorderRadius.all(Radius.circular(20))), child: Column( mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [ @@ -145,7 +142,6 @@ class _SpecificProjectState extends State { 'About:', style: TextStyle(fontSize: 20), ), - Wrap( children: [ ReadMoreText( @@ -168,7 +164,6 @@ class _SpecificProjectState extends State { ), ], ) - ], ), ), @@ -180,26 +175,24 @@ class _SpecificProjectState extends State { ), Row( children: [ - SizedBox(width: 10,), + SizedBox( + width: 10, + ), Text( 'Team Members:', style: TextStyle(fontSize: 20), ) ], ), - - Container( height: 190, - child: ListView.builder( scrollDirection: Axis.horizontal, itemCount: STD_details.stdlist.length, itemBuilder: (context, index) { return Container( width: 150, - margin: EdgeInsets.symmetric( - horizontal: 2), + margin: EdgeInsets.symmetric(horizontal: 2), child: TeamCard(std: STD_details.stdlist[index]), ); }, @@ -216,7 +209,8 @@ class _SpecificProjectState extends State { width: 250, color: Colors.grey[300], ), - )], + ) + ], ) ], ), diff --git a/frontend/lib/pages/user_pages/submission_page.dart b/frontend/lib/pages/project_pages/submission_page/submission_page.dart similarity index 100% rename from frontend/lib/pages/user_pages/submission_page.dart rename to frontend/lib/pages/project_pages/submission_page/submission_page.dart diff --git a/frontend/lib/pages/project_pages/submission_page/widgets/drop_down_button.dart b/frontend/lib/pages/project_pages/submission_page/widgets/drop_down_button.dart new file mode 100644 index 0000000..8b36e63 --- /dev/null +++ b/frontend/lib/pages/project_pages/submission_page/widgets/drop_down_button.dart @@ -0,0 +1,39 @@ +import 'package:flutter/material.dart'; +import 'package:dev_track_app/models/submission_model.dart'; + +class DropdownButtonApp extends StatefulWidget { + const DropdownButtonApp({super.key}); + + @override + State createState() => _DropdownButtonAppState(); +} + +class _DropdownButtonAppState extends State { + String dropdownValue = submissionList.first; + + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.symmetric(vertical: 16.0), + child: DropdownButton( + value: dropdownValue, + isExpanded: true, + icon: const Icon(Icons.arrow_downward, color: Colors.white), + elevation: 16, + style: const TextStyle(color: Colors.white), + dropdownColor: Colors.grey[800], + onChanged: (String? newValue) { + setState(() { + dropdownValue = newValue!; + }); + }, + items: submissionList.map>((String value) { + return DropdownMenuItem( + value: value, + child: Text(value), + ); + }).toList(), + ), + ); + } +} diff --git a/frontend/lib/pages/std_class.dart b/frontend/lib/pages/std_class.dart index 4505c18..44b4ae3 100644 --- a/frontend/lib/pages/std_class.dart +++ b/frontend/lib/pages/std_class.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; -class STD{ +class STD { final String _id; final String _name; @@ -11,9 +11,6 @@ class STD{ final String _position; - - - STD(this._id, this._name, this._profilepic, this._linkedin, this._position); String get id => _id; @@ -25,6 +22,4 @@ class STD{ String get linkedin => _linkedin; String get profilepic => _profilepic; - - -} \ No newline at end of file +} diff --git a/frontend/lib/pages/user_pages/studentview.dart b/frontend/lib/pages/user_pages/studentview.dart index 8c62650..805f7f1 100644 --- a/frontend/lib/pages/user_pages/studentview.dart +++ b/frontend/lib/pages/user_pages/studentview.dart @@ -3,7 +3,7 @@ import 'package:flutter/material.dart'; import 'package:google_fonts/google_fonts.dart'; import 'package:image_picker/image_picker.dart'; import 'package:shared_preferences/shared_preferences.dart'; // For local storage -import 'package:dev_track_app/pages/user_pages/imageuploadpage.dart'; // Ensure this is the correct path +import 'package:dev_track_app/utils/imageuploadpage.dart'; // Ensure this is the correct path class Studentview extends StatefulWidget { const Studentview({super.key}); diff --git a/frontend/lib/routing/previous_projects_routing.dart b/frontend/lib/routing/previous_projects_routing.dart index d82cea8..c0a120b 100644 --- a/frontend/lib/routing/previous_projects_routing.dart +++ b/frontend/lib/routing/previous_projects_routing.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import '../pages/common_pages/specific_project.dart'; +import '../pages/project_pages/project_display/specific_project.dart'; class PreviousProjectsRouting { static void pop(BuildContext context) { diff --git a/frontend/lib/pages/user_pages/imageuploadpage.dart b/frontend/lib/utils/imageuploadpage.dart similarity index 100% rename from frontend/lib/pages/user_pages/imageuploadpage.dart rename to frontend/lib/utils/imageuploadpage.dart diff --git a/frontend/pubspec.lock b/frontend/pubspec.lock index bb82cab..72a8c4b 100644 --- a/frontend/pubspec.lock +++ b/frontend/pubspec.lock @@ -37,10 +37,10 @@ packages: dependency: transitive description: name: collection - sha256: a1ace0a119f20aabc852d165077c036cd864315bd99b7eaa10a60100341941bf + sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a url: "https://pub.dev" source: hosted - version: "1.19.0" + version: "1.18.0" cross_file: dependency: transitive description: @@ -138,18 +138,18 @@ packages: dependency: "direct dev" description: name: flutter_lints - sha256: "5398f14efa795ffb7a33e9b6a08798b26a180edac4ad7db3f231e40f82ce11e1" + sha256: "3f41d009ba7172d5ff9be5f6e6e6abb4300e263aab8866d2a0842ed2a70f8f0c" url: "https://pub.dev" source: hosted - version: "5.0.0" + version: "4.0.0" flutter_plugin_android_lifecycle: dependency: transitive description: name: flutter_plugin_android_lifecycle - sha256: "615a505aef59b151b46bbeef55b36ce2b6ed299d160c51d84281946f0aa0ce0e" + sha256: "9ee02950848f61c4129af3d6ec84a1cfc0e47931abc746b03e7a3bc3e8ff6eda" url: "https://pub.dev" source: hosted - version: "2.0.24" + version: "2.0.22" flutter_test: dependency: "direct dev" description: flutter @@ -180,10 +180,10 @@ packages: dependency: transitive description: name: http_parser - sha256: "178d74305e7866013777bab2c3d8726205dc5a4dd935297175b19a23a2e66571" + sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b" url: "https://pub.dev" source: hosted - version: "4.1.2" + version: "4.0.2" image_picker: dependency: "direct main" description: @@ -196,10 +196,10 @@ packages: dependency: transitive description: name: image_picker_android - sha256: b62d34a506e12bb965e824b6db4fbf709ee4589cf5d3e99b45ab2287b008ee0c + sha256: "8c5abf0dcc24fe6e8e0b4a5c0b51a5cf30cefdf6407a3213dae61edc75a70f56" url: "https://pub.dev" source: hosted - version: "0.8.12+20" + version: "0.8.12+12" image_picker_for_web: dependency: transitive description: @@ -252,18 +252,18 @@ packages: dependency: transitive description: name: leak_tracker - sha256: "7bb2830ebd849694d1ec25bf1f44582d6ac531a57a365a803a6034ff751d2d06" + sha256: "7f0df31977cb2c0b88585095d168e689669a2cc9b97c309665e3386f3e9d341a" url: "https://pub.dev" source: hosted - version: "10.0.7" + version: "10.0.4" leak_tracker_flutter_testing: dependency: transitive description: name: leak_tracker_flutter_testing - sha256: "9491a714cca3667b60b5c420da8217e6de0d1ba7a5ec322fab01758f6998f379" + sha256: "06e98f569d004c1315b991ded39924b21af84cf14cc94791b8aea337d25b57f8" url: "https://pub.dev" source: hosted - version: "3.0.8" + version: "3.0.3" leak_tracker_testing: dependency: transitive description: @@ -276,10 +276,10 @@ packages: dependency: transitive description: name: lints - sha256: c35bb79562d980e9a453fc715854e1ed39e24e7d0297a880ef54e17f9874a9d7 + sha256: "976c774dd944a42e83e2467f4cc670daef7eed6295b10b36ae8c85bcbf828235" url: "https://pub.dev" source: hosted - version: "5.1.1" + version: "4.0.0" matcher: dependency: transitive description: @@ -292,18 +292,18 @@ packages: dependency: transitive description: name: material_color_utilities - sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec + sha256: "0e0a020085b65b6083975e499759762399b4475f766c21668c4ecca34ea74e5a" url: "https://pub.dev" source: hosted - version: "0.11.1" + version: "0.8.0" meta: dependency: transitive description: name: meta - sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7 + sha256: "7687075e408b093f36e6bbf6c91878cc0d4cd10f409506f7bc996f68220b9136" url: "https://pub.dev" source: hosted - version: "1.15.0" + version: "1.12.0" mime: dependency: transitive description: @@ -332,10 +332,10 @@ packages: dependency: transitive description: name: path_provider_android - sha256: "4adf4fd5423ec60a29506c76581bc05854c55e3a0b72d35bb28d661c9686edf2" + sha256: "6f01f8e37ec30b07bc424b4deabac37cacb1bc7e2e515ad74486039918a37eb7" url: "https://pub.dev" source: hosted - version: "2.2.15" + version: "2.2.10" path_provider_foundation: dependency: transitive description: @@ -444,18 +444,18 @@ packages: dependency: "direct main" description: name: shared_preferences - sha256: "688ee90fbfb6989c980254a56cb26ebe9bb30a3a2dff439a78894211f73de67a" + sha256: "95f9997ca1fb9799d494d0cb2a780fd7be075818d59f00c43832ed112b158a82" url: "https://pub.dev" source: hosted - version: "2.5.1" + version: "2.3.3" shared_preferences_android: dependency: transitive description: name: shared_preferences_android - sha256: "650584dcc0a39856f369782874e562efd002a9c94aec032412c9eb81419cce1f" + sha256: "480ba4345773f56acda9abf5f50bd966f581dac5d514e5fc4a18c62976bbba7e" url: "https://pub.dev" source: hosted - version: "2.4.4" + version: "2.3.2" shared_preferences_foundation: dependency: transitive description: @@ -500,7 +500,7 @@ packages: dependency: transitive description: flutter source: sdk - version: "0.0.0" + version: "0.0.99" source_span: dependency: transitive description: @@ -513,10 +513,10 @@ packages: dependency: transitive description: name: stack_trace - sha256: "9f47fd3630d76be3ab26f0ee06d213679aa425996925ff3feffdec504931c377" + sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b" url: "https://pub.dev" source: hosted - version: "1.12.0" + version: "1.11.1" stream_channel: dependency: transitive description: @@ -529,10 +529,10 @@ packages: dependency: transitive description: name: string_scanner - sha256: "688af5ed3402a4bde5b3a6c15fd768dbf2621a614950b17f04626c431ab3c4c3" + sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" url: "https://pub.dev" source: hosted - version: "1.3.0" + version: "1.2.0" term_glyph: dependency: transitive description: @@ -545,18 +545,18 @@ packages: dependency: transitive description: name: test_api - sha256: "664d3a9a64782fcdeb83ce9c6b39e78fd2971d4e37827b9b06c3aa1edc5e760c" + sha256: "9955ae474176f7ac8ee4e989dadfb411a58c30415bcfb648fa04b2b8a03afa7f" url: "https://pub.dev" source: hosted - version: "0.7.3" + version: "0.7.0" typed_data: dependency: transitive description: name: typed_data - sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006 + sha256: facc8d6582f16042dd49f2463ff1bd6e2c9ef9f3d5da3d9b087e244a7b564b3c url: "https://pub.dev" source: hosted - version: "1.4.0" + version: "1.3.2" url_launcher: dependency: "direct main" description: @@ -569,10 +569,10 @@ packages: dependency: transitive description: name: url_launcher_android - sha256: "6fc2f56536ee873eeb867ad176ae15f304ccccc357848b351f6f0d8d4a40d193" + sha256: f0c73347dfcfa5b3db8bc06e1502668265d39c08f310c29bff4e28eea9699f79 url: "https://pub.dev" source: hosted - version: "6.3.14" + version: "6.3.9" url_launcher_ios: dependency: transitive description: @@ -609,10 +609,10 @@ packages: dependency: transitive description: name: url_launcher_web - sha256: "3ba963161bd0fe395917ba881d320b9c4f6dd3c4a233da62ab18a5025c85f1e9" + sha256: "772638d3b34c779ede05ba3d38af34657a05ac55b06279ea6edd409e323dca8e" url: "https://pub.dev" source: hosted - version: "2.4.0" + version: "2.3.3" url_launcher_windows: dependency: transitive description: @@ -633,10 +633,10 @@ packages: dependency: transitive description: name: vm_service - sha256: f6be3ed8bd01289b34d679c2b62226f63c0e69f9fd2e50a6b3c1c729a961041b + sha256: "3923c89304b715fb1eb6423f017651664a03bf5f4b29983627c4da791f74a4ec" url: "https://pub.dev" source: hosted - version: "14.3.0" + version: "14.2.1" web: dependency: transitive description: @@ -649,10 +649,10 @@ packages: dependency: transitive description: name: win32 - sha256: daf97c9d80197ed7b619040e86c8ab9a9dad285e7671ee7390f9180cc828a51e + sha256: "68d1e89a91ed61ad9c370f9f8b6effed9ae5e0ede22a270bdfa6daf79fc2290a" url: "https://pub.dev" source: hosted - version: "5.10.1" + version: "5.5.4" xdg_directories: dependency: transitive description: @@ -662,5 +662,5 @@ packages: source: hosted version: "1.1.0" sdks: - dart: ">=3.6.0 <4.0.0" - flutter: ">=3.27.0" + dart: ">=3.4.0 <4.0.0" + flutter: ">=3.22.0" diff --git a/frontend/pubspec.yaml b/frontend/pubspec.yaml index a4bcf70..d6a431b 100644 --- a/frontend/pubspec.yaml +++ b/frontend/pubspec.yaml @@ -52,7 +52,7 @@ dev_dependencies: # activated in the `analysis_options.yaml` file located at the root of your # package. See that file for information about deactivating specific lint # rules and activating additional ones. - flutter_lints: ^5.0.0 + flutter_lints: 4.0.0 # For information on the generic Dart part of this file, see the # following page: https://dart.dev/tools/pub/pubspec From 92ceadc2fdb84ae86babb4bf78111c7338b90852 Mon Sep 17 00:00:00 2001 From: yvaishalirao Date: Thu, 13 Feb 2025 18:53:10 +0530 Subject: [PATCH 13/63] cleaned domain --- .idea/libraries/Dart_Packages.xml | 320 +++++++++++++++++--- frontend/lib/pages/common_pages/domain.dart | 297 +++++++++--------- frontend/pubspec.lock | 46 +-- 3 files changed, 456 insertions(+), 207 deletions(-) diff --git a/.idea/libraries/Dart_Packages.xml b/.idea/libraries/Dart_Packages.xml index 935f4ca..41666ed 100644 --- a/.idea/libraries/Dart_Packages.xml +++ b/.idea/libraries/Dart_Packages.xml @@ -37,10 +37,17 @@ + + + + + + - @@ -61,7 +68,49 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -75,7 +124,14 @@ - + + + + + + @@ -103,7 +159,7 @@ - @@ -114,6 +170,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -138,7 +250,7 @@ - @@ -163,6 +275,13 @@ + + + + + + @@ -173,21 +292,21 @@ - - - @@ -212,10 +331,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - @@ -233,6 +394,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -285,42 +495,42 @@ - - - - - - @@ -341,7 +551,7 @@ - @@ -362,14 +572,21 @@ - + + + + + + - @@ -381,50 +598,81 @@ - + + - - + + + + + + + + + - + + + + + + + + + - + + - - - + + + - + + + + + + + + + + + + + + - - - - - - + + + + + + - + - - + + + diff --git a/frontend/lib/pages/common_pages/domain.dart b/frontend/lib/pages/common_pages/domain.dart index 5dfa937..177aedd 100644 --- a/frontend/lib/pages/common_pages/domain.dart +++ b/frontend/lib/pages/common_pages/domain.dart @@ -1,9 +1,5 @@ import 'package:dev_track_app/pages/common_pages/topNav.dart'; -import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:flutter/painting.dart'; -import 'package:flutter/rendering.dart'; -import 'package:flutter/widgets.dart'; import 'package:google_fonts/google_fonts.dart'; class DomainPage extends StatelessWidget { @@ -13,163 +9,168 @@ class DomainPage extends StatelessWidget { Widget build(BuildContext context) { return SafeArea( child: Scaffold( - backgroundColor: Color(0xFF040D12), + backgroundColor: const Color(0xFF040D12), body: Column( children: [ - TopNav(), - Container( - padding: EdgeInsets.all(10), - margin: EdgeInsets.only(left: 14, right: 14), - decoration: BoxDecoration( - color: Color(0xFF183D3D), - borderRadius: BorderRadius.circular(23), + const TopNav(), + cycleCard(), + const SizedBox(height: 40), + Expanded(child: domianGrid()), + ], + ), + ), + ); + } + + Widget cycleCard() { + return Container( + padding: const EdgeInsets.all(10), + margin: const EdgeInsets.symmetric(horizontal: 14), + decoration: BoxDecoration( + color: const Color(0xFF183D3D), + borderRadius: BorderRadius.circular(23), + ), + child: Column( + children: [ + Row( + children: [ + Container( + height: 70, + width: 70, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(35), + color: const Color(0xFF5C8374), + ), + child: const Icon( + Icons.pedal_bike, + color: Colors.white, + size: 38, + ), ), - child: Column( + const SizedBox(width: 4), + Column( + crossAxisAlignment: CrossAxisAlignment.start, children: [ - Row( - children: [ - Container( - height: 70, - width: 70, - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(35), - color: Color(0xFF5C8374)), - child: Align( - alignment: Alignment.center, - child: Icon( - Icons.pedal_bike, - color: Colors.white, - size: 38, - ), - ), - ), - SizedBox( - width: 4, + Text( + "My Cycle", + style: GoogleFonts.inter( + textStyle: const TextStyle( + color: Colors.white, + fontSize: 19, + fontWeight: FontWeight.w500, ), - Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Text( - "My Cycle", - style: GoogleFonts.inter( - textStyle: TextStyle( - color: Colors.white, - fontSize: 19, - fontWeight: FontWeight.w500), - ), - ), - Text( - "Web Dev 68", - style: GoogleFonts.inter( - textStyle: TextStyle( - color: Color(0xFFC6C6C6), - fontSize: 14, - fontWeight: FontWeight.w500), - ), - ) - ], - ) - ], - ), - SizedBox( - height: 20, + ), ), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Row( - children: [ - Text( - 'Week', - style: GoogleFonts.inter( - textStyle: TextStyle( - fontSize: 21, - color: Color(0xFF999999), - ), - ), - ), - SizedBox( - width: 2, - ), - Text( - '4', - style: GoogleFonts.inter( - textStyle: TextStyle( - fontSize: 21, - color: Colors.white, - ), - ), - ), - ], + Text( + "Web Dev 68", + style: GoogleFonts.inter( + textStyle: const TextStyle( + color: Color(0xFFC6C6C6), + fontSize: 14, + fontWeight: FontWeight.w500, ), - ElevatedButton( - style: ButtonStyle( - padding: MaterialStatePropertyAll(EdgeInsets.only( - top: 20, bottom: 20, left: 45, right: 45)), - backgroundColor: - MaterialStatePropertyAll(Color(0xFF93B1A6)), - foregroundColor: - MaterialStatePropertyAll(Colors.white), - textStyle: MaterialStatePropertyAll(TextStyle( - fontSize: 19, fontWeight: FontWeight.bold))), - child: Text("Review"), - onPressed: null, - ) - ], - ), + ), + ) ], ), - ), - SizedBox( - height: 40, - ), - Expanded( - child: GridView.count( - crossAxisCount: 2, - padding: EdgeInsets.only(left: 14, right: 14), - mainAxisSpacing: 7, - crossAxisSpacing: 7, - children: - List.generate( - 6, - (index) => Container( - decoration: BoxDecoration( - color: Color(0xFF183D3D), - borderRadius: BorderRadius.circular(24)), - child: Align( - alignment: Alignment.center, - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Image.asset( - 'assets/images/game.png', - fit: BoxFit.cover, - height: 58, - width: 111, - ), - SizedBox( - height: 28, - ), - Text( - "Game Dev", - style: GoogleFonts.hiMelody( - textStyle: TextStyle( - fontSize: 29, - color: Colors.white, - )), - ) - ], - ), + ], + ), + const SizedBox(height: 20), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Row( + children: [ + Text( + 'Week', + style: GoogleFonts.inter( + textStyle: const TextStyle( + fontSize: 21, + color: Color(0xFF999999), ), ), - ) - + ), + const SizedBox(width: 2), + Text( + '4', + style: GoogleFonts.inter( + textStyle: const TextStyle( + fontSize: 21, + color: Colors.white, + ), + ), + ), + ], ), - ) - ], - ), + ElevatedButton( + style: ElevatedButton.styleFrom( + padding: + const EdgeInsets.symmetric(vertical: 20, horizontal: 45), + backgroundColor: const Color(0xFF93B1A6), + foregroundColor: Colors.white, + textStyle: const TextStyle( + fontSize: 19, + fontWeight: FontWeight.bold, + ), + ), + onPressed: () {}, + child: const Text("Review"), + ), + ], + ), + ], ), ); } + + Widget domianGrid() { + return GridView.builder( + padding: const EdgeInsets.symmetric(horizontal: 14), + gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 2, + mainAxisSpacing: 7, + crossAxisSpacing: 7, + ), + itemCount: domainData.length, + itemBuilder: (context, index) { + return Container( + decoration: BoxDecoration( + color: const Color(0xFF183D3D), + borderRadius: BorderRadius.circular(24), + ), + child: Column( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Image.asset( + domainData[index]["imagePath"]!, + fit: BoxFit.cover, + height: 58, + width: 111, + ), + const SizedBox(height: 28), + Text( + domainData[index]["title"]!, + style: GoogleFonts.hiMelody( + textStyle: const TextStyle( + fontSize: 29, + color: Colors.white, + ), + ), + ), + ], + ), + ); + }, + ); + } } + +final List> domainData = [ + {"title": "GameDev81", "imagePath": "assets/images/game.png"}, + {"title": "GameDev82", "imagePath": "assets/images/game.png"}, + {"title": "AppDev81", "imagePath": "assets/images/game.png"}, + {"title": "AppDev82", "imagePath": "assets/images/game.png"}, + {"title": "WebDev81", "imagePath": "assets/images/game.png"}, + {"title": "WebDev82", "imagePath": "assets/images/game.png"}, +]; diff --git a/frontend/pubspec.lock b/frontend/pubspec.lock index bb82cab..4112d6e 100644 --- a/frontend/pubspec.lock +++ b/frontend/pubspec.lock @@ -37,10 +37,10 @@ packages: dependency: transitive description: name: collection - sha256: a1ace0a119f20aabc852d165077c036cd864315bd99b7eaa10a60100341941bf + sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a url: "https://pub.dev" source: hosted - version: "1.19.0" + version: "1.18.0" cross_file: dependency: transitive description: @@ -180,10 +180,10 @@ packages: dependency: transitive description: name: http_parser - sha256: "178d74305e7866013777bab2c3d8726205dc5a4dd935297175b19a23a2e66571" + sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b" url: "https://pub.dev" source: hosted - version: "4.1.2" + version: "4.0.2" image_picker: dependency: "direct main" description: @@ -252,18 +252,18 @@ packages: dependency: transitive description: name: leak_tracker - sha256: "7bb2830ebd849694d1ec25bf1f44582d6ac531a57a365a803a6034ff751d2d06" + sha256: "3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05" url: "https://pub.dev" source: hosted - version: "10.0.7" + version: "10.0.5" leak_tracker_flutter_testing: dependency: transitive description: name: leak_tracker_flutter_testing - sha256: "9491a714cca3667b60b5c420da8217e6de0d1ba7a5ec322fab01758f6998f379" + sha256: "932549fb305594d82d7183ecd9fa93463e9914e1b67cacc34bc40906594a1806" url: "https://pub.dev" source: hosted - version: "3.0.8" + version: "3.0.5" leak_tracker_testing: dependency: transitive description: @@ -276,10 +276,10 @@ packages: dependency: transitive description: name: lints - sha256: c35bb79562d980e9a453fc715854e1ed39e24e7d0297a880ef54e17f9874a9d7 + sha256: "3315600f3fb3b135be672bf4a178c55f274bebe368325ae18462c89ac1e3b413" url: "https://pub.dev" source: hosted - version: "5.1.1" + version: "5.0.0" matcher: dependency: transitive description: @@ -500,7 +500,7 @@ packages: dependency: transitive description: flutter source: sdk - version: "0.0.0" + version: "0.0.99" source_span: dependency: transitive description: @@ -513,10 +513,10 @@ packages: dependency: transitive description: name: stack_trace - sha256: "9f47fd3630d76be3ab26f0ee06d213679aa425996925ff3feffdec504931c377" + sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b" url: "https://pub.dev" source: hosted - version: "1.12.0" + version: "1.11.1" stream_channel: dependency: transitive description: @@ -529,10 +529,10 @@ packages: dependency: transitive description: name: string_scanner - sha256: "688af5ed3402a4bde5b3a6c15fd768dbf2621a614950b17f04626c431ab3c4c3" + sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" url: "https://pub.dev" source: hosted - version: "1.3.0" + version: "1.2.0" term_glyph: dependency: transitive description: @@ -545,10 +545,10 @@ packages: dependency: transitive description: name: test_api - sha256: "664d3a9a64782fcdeb83ce9c6b39e78fd2971d4e37827b9b06c3aa1edc5e760c" + sha256: "5b8a98dafc4d5c4c9c72d8b31ab2b23fc13422348d2997120294d3bac86b4ddb" url: "https://pub.dev" source: hosted - version: "0.7.3" + version: "0.7.2" typed_data: dependency: transitive description: @@ -609,10 +609,10 @@ packages: dependency: transitive description: name: url_launcher_web - sha256: "3ba963161bd0fe395917ba881d320b9c4f6dd3c4a233da62ab18a5025c85f1e9" + sha256: "772638d3b34c779ede05ba3d38af34657a05ac55b06279ea6edd409e323dca8e" url: "https://pub.dev" source: hosted - version: "2.4.0" + version: "2.3.3" url_launcher_windows: dependency: transitive description: @@ -633,10 +633,10 @@ packages: dependency: transitive description: name: vm_service - sha256: f6be3ed8bd01289b34d679c2b62226f63c0e69f9fd2e50a6b3c1c729a961041b + sha256: f652077d0bdf60abe4c1f6377448e8655008eef28f128bc023f7b5e8dfeb48fc url: "https://pub.dev" source: hosted - version: "14.3.0" + version: "14.2.4" web: dependency: transitive description: @@ -662,5 +662,5 @@ packages: source: hosted version: "1.1.0" sdks: - dart: ">=3.6.0 <4.0.0" - flutter: ">=3.27.0" + dart: ">=3.5.0 <4.0.0" + flutter: ">=3.24.0" From ee182b3a33205ccf7d8f562638a264ddd7570f58 Mon Sep 17 00:00:00 2001 From: ghamani <138302691+Ghamani121@users.noreply.github.com> Date: Thu, 13 Feb 2025 20:09:32 +0530 Subject: [PATCH 14/63] Updated Tracker page --- frontend/lib/logic/tracker_logic.dart | 31 +++++++++++++++++++++ frontend/lib/pages/user_pages/tracker.dart | 32 ++++++++++------------ 2 files changed, 45 insertions(+), 18 deletions(-) create mode 100644 frontend/lib/logic/tracker_logic.dart diff --git a/frontend/lib/logic/tracker_logic.dart b/frontend/lib/logic/tracker_logic.dart new file mode 100644 index 0000000..26ec9ca --- /dev/null +++ b/frontend/lib/logic/tracker_logic.dart @@ -0,0 +1,31 @@ +import 'package:flutter/material.dart'; + +class ProgressTrackerLogic { + /// Number of members to track + final int numberOfMembers; + + /// Which panels are expanded + late List isExpandedList; + + /// Text controllers for each member + late List progressControllers; + + ProgressTrackerLogic({this.numberOfMembers = 4}) { + isExpandedList = List.generate(numberOfMembers, (_) => false); + progressControllers = + List.generate(numberOfMembers, (_) => TextEditingController()); + } + + /// Toggle expansion for a specific member index + void toggleExpanded(int index) { + isExpandedList[index] = !isExpandedList[index]; + } + + /// Dispose of controllers to avoid memory leaks + void dispose() { + for (var controller in progressControllers) { + controller.dispose(); + } + } +} + diff --git a/frontend/lib/pages/user_pages/tracker.dart b/frontend/lib/pages/user_pages/tracker.dart index 9fc243d..37d6e57 100644 --- a/frontend/lib/pages/user_pages/tracker.dart +++ b/frontend/lib/pages/user_pages/tracker.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import '../../logic/tracker_logic.dart'; void main() { runApp(const MaterialApp( @@ -16,34 +17,29 @@ class ProgressTrackerPage extends StatefulWidget { class ProgressTrackerPageState extends State with SingleTickerProviderStateMixin { - List isExpandedList = []; // Initialize an empty list for expanded state - List progressControllers = - []; // Initialize an empty list for controllers + late ProgressTrackerLogic _logic; late AnimationController _controller; late Animation _animation; @override void initState() { super.initState(); + + // Instantiate the logic class, which sets up expanded lists & controllers + _logic = ProgressTrackerLogic(numberOfMembers: 4); + + //set up animation _controller = AnimationController( duration: const Duration(seconds: 8), vsync: this, )..repeat(reverse: true); _animation = CurvedAnimation(parent: _controller, curve: Curves.easeInOut); - - // Initialize lists based on the number of items - int numberOfMembers = 4; - isExpandedList = List.generate(numberOfMembers, (_) => false); - progressControllers = - List.generate(numberOfMembers, (_) => TextEditingController()); } @override void dispose() { _controller.dispose(); - for (var controller in progressControllers) { - controller.dispose(); - } + _logic.dispose(); super.dispose(); } @@ -129,7 +125,7 @@ class ProgressTrackerPageState extends State const SizedBox(height: 20), Expanded( child: ListView.builder( - itemCount: isExpandedList.length, // Use the length of the list + itemCount: _logic.isExpandedList.length, // Use the length of the list itemBuilder: (context, index) { return Card( elevation: 4, @@ -139,7 +135,7 @@ class ProgressTrackerPageState extends State expandedHeaderPadding: const EdgeInsets.all(0), expansionCallback: (int itemIndex, bool isExpanded) { setState(() { - isExpandedList[index] = !isExpandedList[index]; + _logic.isExpandedList[index] = !_logic.isExpandedList[index]; }); }, children: [ @@ -187,7 +183,7 @@ class ProgressTrackerPageState extends State ), const SizedBox(height: 16), TextField( - controller: progressControllers[index], + controller: _logic.progressControllers[index], decoration: const InputDecoration( labelText: 'Add progress here...', border: OutlineInputBorder(), @@ -213,7 +209,7 @@ class ProgressTrackerPageState extends State ], ), ), - isExpanded: isExpandedList[index], + isExpanded: _logic.isExpandedList[index], ), ], ), @@ -229,7 +225,7 @@ class ProgressTrackerPageState extends State void _showEditDialog(BuildContext context, int index) { TextEditingController editController = - TextEditingController(text: progressControllers[index].text); + TextEditingController(text: _logic.progressControllers[index].text); showDialog( context: context, @@ -254,7 +250,7 @@ class ProgressTrackerPageState extends State ElevatedButton( onPressed: () { setState(() { - progressControllers[index].text = editController.text; + _logic.progressControllers[index].text = editController.text; }); Navigator.of(context).pop(); ScaffoldMessenger.of(context).showSnackBar( From ff0bb66b58248fe7b248bef67b0da1dc4e3465f1 Mon Sep 17 00:00:00 2001 From: Piyush Chakarborthy <102757301+Chakravartinsamrat@users.noreply.github.com> Date: Thu, 13 Feb 2025 21:31:47 +0530 Subject: [PATCH 15/63] More Cleaning- Jhaddu Pocha --- frontend/lib/To-Be-Discarded/bottomNav.dart | 70 +++++++++++++++++++ frontend/lib/{pages => models}/std_class.dart | 0 .../lib/{pages => models}/std_details.dart | 0 .../lib/pages/common_pages/bottomNav.dart | 70 ------------------- frontend/lib/pages/domain_pages/domain.dart | 17 ++--- .../topNav.dart | 0 frontend/lib/pages/home.dart | 4 +- .../project_display/specific_project.dart | 2 +- .../project_display}/teamcard.dart | 13 ++-- .../common_pages => theme}/splashscreen.dart | 0 10 files changed, 88 insertions(+), 88 deletions(-) create mode 100644 frontend/lib/To-Be-Discarded/bottomNav.dart rename frontend/lib/{pages => models}/std_class.dart (100%) rename frontend/lib/{pages => models}/std_details.dart (100%) delete mode 100644 frontend/lib/pages/common_pages/bottomNav.dart rename frontend/lib/pages/{common_pages => domain_pages}/topNav.dart (100%) rename frontend/lib/pages/{common_pages => project_pages/project_display}/teamcard.dart (82%) rename frontend/lib/{pages/common_pages => theme}/splashscreen.dart (100%) diff --git a/frontend/lib/To-Be-Discarded/bottomNav.dart b/frontend/lib/To-Be-Discarded/bottomNav.dart new file mode 100644 index 0000000..a31884f --- /dev/null +++ b/frontend/lib/To-Be-Discarded/bottomNav.dart @@ -0,0 +1,70 @@ +// import 'package:flutter/material.dart'; +// //Testing change +// import 'package:dev_track_app/pages/domain_pages/domain.dart'; +// import 'package:dev_track_app/pages/home.dart'; + +// class BottomNav extends StatefulWidget { +// const BottomNav({super.key}); + +// @override +// State createState() => _BottomNavState(); +// } + +// class _BottomNavState extends State { +// int _currentIndex = 0; +// final List pages = [ +// const HomePag(), +// // const ScrumPage(), +// const DomainPage(), +// // const ProgressPage(), +// // const ProfilePage(), +// ]; +// @override +// Widget build(BuildContext context) { +// return MaterialApp( +// home: Scaffold( +// body: pages[_currentIndex], +// bottomNavigationBar: BottomNavigationBar( +// currentIndex: _currentIndex, +// type: BottomNavigationBarType.fixed, +// backgroundColor: Colors.black, +// selectedItemColor: +// Colors.green, // Set the selected icon color to green +// unselectedItemColor: Color.fromARGB(255, 2, 155, 73), +// iconSize: 35, // Set the unselected icon color to green +// items: const [ +// BottomNavigationBarItem( +// icon: Icon(Icons.home), +// label: 'Feed', +// ), +// BottomNavigationBarItem( +// icon: Icon(Icons.supervisor_account), +// label: 'Scrum', +// ), +// BottomNavigationBarItem( +// icon: Icon(Icons.apps), +// label: 'Domain', +// ), +// BottomNavigationBarItem( +// icon: Icon(Icons.access_time), +// label: 'Progress', +// ), +// BottomNavigationBarItem( +// icon: Icon(Icons.person_rounded), +// label: 'Profile', +// ), +// ], +// onTap: (index) { +// setState(() { +// _currentIndex = index; +// }); +// }, +// ), +// ), +// ); +// } +// } + +// void main() { +// runApp(const BottomNav()); +// } diff --git a/frontend/lib/pages/std_class.dart b/frontend/lib/models/std_class.dart similarity index 100% rename from frontend/lib/pages/std_class.dart rename to frontend/lib/models/std_class.dart diff --git a/frontend/lib/pages/std_details.dart b/frontend/lib/models/std_details.dart similarity index 100% rename from frontend/lib/pages/std_details.dart rename to frontend/lib/models/std_details.dart diff --git a/frontend/lib/pages/common_pages/bottomNav.dart b/frontend/lib/pages/common_pages/bottomNav.dart deleted file mode 100644 index d6c9f4c..0000000 --- a/frontend/lib/pages/common_pages/bottomNav.dart +++ /dev/null @@ -1,70 +0,0 @@ -import 'package:flutter/material.dart'; -//Testing change -import 'package:dev_track_app/pages/domain_pages/domain.dart'; -import 'package:dev_track_app/pages/home.dart'; - -class BottomNav extends StatefulWidget { - const BottomNav({super.key}); - - @override - State createState() => _BottomNavState(); -} - -class _BottomNavState extends State { - int _currentIndex = 0; - final List pages = [ - const HomePag(), - // const ScrumPage(), - const DomainPage(), - // const ProgressPage(), - // const ProfilePage(), - ]; - @override - Widget build(BuildContext context) { - return MaterialApp( - home: Scaffold( - body: pages[_currentIndex], - bottomNavigationBar: BottomNavigationBar( - currentIndex: _currentIndex, - type: BottomNavigationBarType.fixed, - backgroundColor: Colors.black, - selectedItemColor: - Colors.green, // Set the selected icon color to green - unselectedItemColor: Color.fromARGB(255, 2, 155, 73), - iconSize: 35, // Set the unselected icon color to green - items: const [ - BottomNavigationBarItem( - icon: Icon(Icons.home), - label: 'Feed', - ), - BottomNavigationBarItem( - icon: Icon(Icons.supervisor_account), - label: 'Scrum', - ), - BottomNavigationBarItem( - icon: Icon(Icons.apps), - label: 'Domain', - ), - BottomNavigationBarItem( - icon: Icon(Icons.access_time), - label: 'Progress', - ), - BottomNavigationBarItem( - icon: Icon(Icons.person_rounded), - label: 'Profile', - ), - ], - onTap: (index) { - setState(() { - _currentIndex = index; - }); - }, - ), - ), - ); - } -} - -void main() { - runApp(const BottomNav()); -} diff --git a/frontend/lib/pages/domain_pages/domain.dart b/frontend/lib/pages/domain_pages/domain.dart index 5dfa937..4e15a8f 100644 --- a/frontend/lib/pages/domain_pages/domain.dart +++ b/frontend/lib/pages/domain_pages/domain.dart @@ -1,4 +1,4 @@ -import 'package:dev_track_app/pages/common_pages/topNav.dart'; +import 'package:dev_track_app/pages/domain_pages/topNav.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter/painting.dart'; @@ -126,12 +126,11 @@ class DomainPage extends StatelessWidget { ), Expanded( child: GridView.count( - crossAxisCount: 2, - padding: EdgeInsets.only(left: 14, right: 14), - mainAxisSpacing: 7, - crossAxisSpacing: 7, - children: - List.generate( + crossAxisCount: 2, + padding: EdgeInsets.only(left: 14, right: 14), + mainAxisSpacing: 7, + crossAxisSpacing: 7, + children: List.generate( 6, (index) => Container( decoration: BoxDecoration( @@ -163,9 +162,7 @@ class DomainPage extends StatelessWidget { ), ), ), - ) - - ), + )), ) ], ), diff --git a/frontend/lib/pages/common_pages/topNav.dart b/frontend/lib/pages/domain_pages/topNav.dart similarity index 100% rename from frontend/lib/pages/common_pages/topNav.dart rename to frontend/lib/pages/domain_pages/topNav.dart diff --git a/frontend/lib/pages/home.dart b/frontend/lib/pages/home.dart index d9c9aa2..8d1ac8c 100644 --- a/frontend/lib/pages/home.dart +++ b/frontend/lib/pages/home.dart @@ -1,4 +1,4 @@ -import 'package:dev_track_app/pages/common_pages/bottomNav.dart'; +import 'package:dev_track_app/utils/bottom_nav_bar.dart'; import 'package:dev_track_app/pages/admin_pages//mgmg_prev_projects.dart'; import 'package:dev_track_app/pages/project_pages/project_display/previous_projects.dart'; import 'package:dev_track_app/pages/common_pages/splashscreen.dart'; @@ -78,7 +78,7 @@ class HomePag extends StatelessWidget { ), onPressed: () { Navigator.push(context, - MaterialPageRoute(builder: (context) => BottomNav())); + MaterialPageRoute(builder: (context) => BottomNavBar())); }, child: Text("Bottom Nav"), ), diff --git a/frontend/lib/pages/project_pages/project_display/specific_project.dart b/frontend/lib/pages/project_pages/project_display/specific_project.dart index a5ad2cf..3f19ac3 100644 --- a/frontend/lib/pages/project_pages/project_display/specific_project.dart +++ b/frontend/lib/pages/project_pages/project_display/specific_project.dart @@ -2,7 +2,7 @@ import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; import 'package:readmore/readmore.dart'; import '../../std_details.dart'; -import '../../common_pages/teamcard.dart'; +import 'teamcard.dart'; class SpecificProject extends StatefulWidget { const SpecificProject({super.key}); diff --git a/frontend/lib/pages/common_pages/teamcard.dart b/frontend/lib/pages/project_pages/project_display/teamcard.dart similarity index 82% rename from frontend/lib/pages/common_pages/teamcard.dart rename to frontend/lib/pages/project_pages/project_display/teamcard.dart index 8c213f5..f41a0b2 100644 --- a/frontend/lib/pages/common_pages/teamcard.dart +++ b/frontend/lib/pages/project_pages/project_display/teamcard.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:url_launcher/url_launcher.dart'; -import '../std_class.dart'; +import '../../std_class.dart'; class TeamCard extends StatefulWidget { final STD std; @@ -17,7 +17,7 @@ class _TeamCardState extends State { scrollDirection: Axis.horizontal, child: Container( child: SizedBox( - width:150, + width: 150, child: Card( clipBehavior: Clip.antiAlias, elevation: 0, @@ -32,14 +32,17 @@ class _TeamCardState extends State { height: 150, decoration: BoxDecoration( border: Border.all(color: Colors.black26), - borderRadius: BorderRadius.circular(10), // Adjust the radius as needed + borderRadius: BorderRadius.circular( + 10), // Adjust the radius as needed ), child: ClipRRect( - borderRadius: BorderRadius.circular(10), // Ensure the image fits within the rounded corners + borderRadius: BorderRadius.circular( + 10), // Ensure the image fits within the rounded corners child: Image.asset( widget.std.profilepic, width: double.infinity, - fit: BoxFit.fill, // Use cover for better aspect ratio handling + fit: BoxFit + .fill, // Use cover for better aspect ratio handling ), ), ), diff --git a/frontend/lib/pages/common_pages/splashscreen.dart b/frontend/lib/theme/splashscreen.dart similarity index 100% rename from frontend/lib/pages/common_pages/splashscreen.dart rename to frontend/lib/theme/splashscreen.dart From 479b2a963f15d0ab98d41fb25099f1ffdc9c94fc Mon Sep 17 00:00:00 2001 From: Piyush Chakarborthy <102757301+Chakravartinsamrat@users.noreply.github.com> Date: Thu, 13 Feb 2025 21:33:30 +0530 Subject: [PATCH 16/63] Prject pages in User Pages --- .../project_pages/project_display/previous_projects.dart | 0 .../project_pages/project_display/specific_project.dart | 0 .../{ => user_pages}/project_pages/project_display/teamcard.dart | 0 .../project_pages/submission_page/submission_page.dart | 0 .../project_pages/submission_page/widgets/drop_down_button.dart | 0 5 files changed, 0 insertions(+), 0 deletions(-) rename frontend/lib/pages/{ => user_pages}/project_pages/project_display/previous_projects.dart (100%) rename frontend/lib/pages/{ => user_pages}/project_pages/project_display/specific_project.dart (100%) rename frontend/lib/pages/{ => user_pages}/project_pages/project_display/teamcard.dart (100%) rename frontend/lib/pages/{ => user_pages}/project_pages/submission_page/submission_page.dart (100%) rename frontend/lib/pages/{ => user_pages}/project_pages/submission_page/widgets/drop_down_button.dart (100%) diff --git a/frontend/lib/pages/project_pages/project_display/previous_projects.dart b/frontend/lib/pages/user_pages/project_pages/project_display/previous_projects.dart similarity index 100% rename from frontend/lib/pages/project_pages/project_display/previous_projects.dart rename to frontend/lib/pages/user_pages/project_pages/project_display/previous_projects.dart diff --git a/frontend/lib/pages/project_pages/project_display/specific_project.dart b/frontend/lib/pages/user_pages/project_pages/project_display/specific_project.dart similarity index 100% rename from frontend/lib/pages/project_pages/project_display/specific_project.dart rename to frontend/lib/pages/user_pages/project_pages/project_display/specific_project.dart diff --git a/frontend/lib/pages/project_pages/project_display/teamcard.dart b/frontend/lib/pages/user_pages/project_pages/project_display/teamcard.dart similarity index 100% rename from frontend/lib/pages/project_pages/project_display/teamcard.dart rename to frontend/lib/pages/user_pages/project_pages/project_display/teamcard.dart diff --git a/frontend/lib/pages/project_pages/submission_page/submission_page.dart b/frontend/lib/pages/user_pages/project_pages/submission_page/submission_page.dart similarity index 100% rename from frontend/lib/pages/project_pages/submission_page/submission_page.dart rename to frontend/lib/pages/user_pages/project_pages/submission_page/submission_page.dart diff --git a/frontend/lib/pages/project_pages/submission_page/widgets/drop_down_button.dart b/frontend/lib/pages/user_pages/project_pages/submission_page/widgets/drop_down_button.dart similarity index 100% rename from frontend/lib/pages/project_pages/submission_page/widgets/drop_down_button.dart rename to frontend/lib/pages/user_pages/project_pages/submission_page/widgets/drop_down_button.dart From a594838be70dfa54055adb93fcc2d9a39056c0b3 Mon Sep 17 00:00:00 2001 From: Piyush Chakarborthy <102757301+Chakravartinsamrat@users.noreply.github.com> Date: Thu, 13 Feb 2025 21:49:10 +0530 Subject: [PATCH 17/63] Doone --- frontend/lib/models/std_details.dart | 19 +++++++++++-------- .../lib/pages/admin_pages/projects_card.dart | 2 +- .../domain_pages/domain.dart | 2 +- .../domain_pages/topNav.dart | 0 frontend/lib/pages/home.dart | 10 +++++----- .../project_display/previous_projects.dart | 2 +- .../project_display/specific_project.dart | 2 +- .../project_display/teamcard.dart | 2 +- .../routing/previous_projects_routing.dart | 2 +- 9 files changed, 22 insertions(+), 19 deletions(-) rename frontend/lib/pages/{ => common_pages}/domain_pages/domain.dart (98%) rename frontend/lib/pages/{ => common_pages}/domain_pages/topNav.dart (100%) diff --git a/frontend/lib/models/std_details.dart b/frontend/lib/models/std_details.dart index b00a9d7..4546c35 100644 --- a/frontend/lib/models/std_details.dart +++ b/frontend/lib/models/std_details.dart @@ -1,12 +1,15 @@ import 'package:flutter/material.dart'; import 'std_class.dart'; -class STD_details{ - static List stdlist=[ - STD("070","Vaishali","assets/images/elmoo.jpg","https://www.youtube.com/watch?v=dQw4w9WgXcQ","Lead"), - STD("071","Areny","assets/images/elmoo.jpg","https://www.youtube.com/watch?v=dQw4w9WgXcQ","Front-End"), - STD("072","Atul","assets/images/elmoo.jpg","https://www.youtube.com/watch?v=dQw4w9WgXcQ","Back-End"), - STD("073","Vais","assets/images/elmoo.jpg","https://www.youtube.com/watch?v=dQw4w9WgXcQ","UI/UX"), - +class STD_details { + static List stdlist = [ + STD("070", "Vaishali", "assets/images/elmoo.jpg", + "https://www.youtube.com/watch?v=dQw4w9WgXcQ", "Lead"), + STD("071", "Areny", "assets/images/elmoo.jpg", + "https://www.youtube.com/watch?v=dQw4w9WgXcQ", "Front-End"), + STD("072", "Atul", "assets/images/elmoo.jpg", + "https://www.youtube.com/watch?v=dQw4w9WgXcQ", "Back-End"), + STD("073", "Vais", "assets/images/elmoo.jpg", + "https://www.youtube.com/watch?v=dQw4w9WgXcQ", "UI/UX"), ]; -} \ No newline at end of file +} diff --git a/frontend/lib/pages/admin_pages/projects_card.dart b/frontend/lib/pages/admin_pages/projects_card.dart index 31c1465..36fe367 100644 --- a/frontend/lib/pages/admin_pages/projects_card.dart +++ b/frontend/lib/pages/admin_pages/projects_card.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; -import 'package:dev_track_app/pages/project_pages/project_display/specific_project.dart'; +import 'package:dev_track_app/pages/user_pages/project_pages/project_display/specific_project.dart'; class Data { String domain_name; diff --git a/frontend/lib/pages/domain_pages/domain.dart b/frontend/lib/pages/common_pages/domain_pages/domain.dart similarity index 98% rename from frontend/lib/pages/domain_pages/domain.dart rename to frontend/lib/pages/common_pages/domain_pages/domain.dart index 4e15a8f..01d43e5 100644 --- a/frontend/lib/pages/domain_pages/domain.dart +++ b/frontend/lib/pages/common_pages/domain_pages/domain.dart @@ -1,4 +1,4 @@ -import 'package:dev_track_app/pages/domain_pages/topNav.dart'; +import 'package:dev_track_app/pages/common_pages/domain_pages/topNav.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter/painting.dart'; diff --git a/frontend/lib/pages/domain_pages/topNav.dart b/frontend/lib/pages/common_pages/domain_pages/topNav.dart similarity index 100% rename from frontend/lib/pages/domain_pages/topNav.dart rename to frontend/lib/pages/common_pages/domain_pages/topNav.dart diff --git a/frontend/lib/pages/home.dart b/frontend/lib/pages/home.dart index 8d1ac8c..d82c511 100644 --- a/frontend/lib/pages/home.dart +++ b/frontend/lib/pages/home.dart @@ -1,15 +1,15 @@ import 'package:dev_track_app/utils/bottom_nav_bar.dart'; import 'package:dev_track_app/pages/admin_pages//mgmg_prev_projects.dart'; -import 'package:dev_track_app/pages/project_pages/project_display/previous_projects.dart'; -import 'package:dev_track_app/pages/common_pages/splashscreen.dart'; +import 'package:dev_track_app/pages/user_pages/project_pages/project_display/previous_projects.dart'; +import 'package:dev_track_app/theme/splashscreen.dart'; import 'package:dev_track_app/pages/common_pages/confirm_page.dart'; -import 'package:dev_track_app/pages/domain_pages/domain.dart'; -import 'package:dev_track_app/pages/project_pages/project_display/specific_project.dart'; +import 'package:dev_track_app/pages/common_pages/domain_pages/domain.dart'; +import 'package:dev_track_app/pages/user_pages/project_pages/project_display/specific_project.dart'; import 'package:dev_track_app/pages/common_pages/home_page.dart'; import 'package:flutter/material.dart'; import 'package:dev_track_app/pages/user_pages/tracker.dart'; import 'package:dev_track_app/pages/user_pages/studentview.dart'; -import 'package:dev_track_app/pages/project_pages/submission_page/submission_page.dart'; +import 'package:dev_track_app/pages/user_pages/project_pages/submission_page/submission_page.dart'; class HomePag extends StatelessWidget { const HomePag({super.key}); diff --git a/frontend/lib/pages/user_pages/project_pages/project_display/previous_projects.dart b/frontend/lib/pages/user_pages/project_pages/project_display/previous_projects.dart index d655b72..b6e2afb 100644 --- a/frontend/lib/pages/user_pages/project_pages/project_display/previous_projects.dart +++ b/frontend/lib/pages/user_pages/project_pages/project_display/previous_projects.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'specific_project.dart'; -import '../../../routing/previous_projects_routing.dart'; +import '../../../../routing/previous_projects_routing.dart'; class PreviousProjects extends StatefulWidget { const PreviousProjects({super.key}); diff --git a/frontend/lib/pages/user_pages/project_pages/project_display/specific_project.dart b/frontend/lib/pages/user_pages/project_pages/project_display/specific_project.dart index 3f19ac3..6c9711f 100644 --- a/frontend/lib/pages/user_pages/project_pages/project_display/specific_project.dart +++ b/frontend/lib/pages/user_pages/project_pages/project_display/specific_project.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; import 'package:readmore/readmore.dart'; -import '../../std_details.dart'; +import '../../../../models/std_details.dart'; import 'teamcard.dart'; class SpecificProject extends StatefulWidget { diff --git a/frontend/lib/pages/user_pages/project_pages/project_display/teamcard.dart b/frontend/lib/pages/user_pages/project_pages/project_display/teamcard.dart index f41a0b2..bfc0eb8 100644 --- a/frontend/lib/pages/user_pages/project_pages/project_display/teamcard.dart +++ b/frontend/lib/pages/user_pages/project_pages/project_display/teamcard.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:url_launcher/url_launcher.dart'; -import '../../std_class.dart'; +import '../../../../models/std_class.dart'; class TeamCard extends StatefulWidget { final STD std; diff --git a/frontend/lib/routing/previous_projects_routing.dart b/frontend/lib/routing/previous_projects_routing.dart index c0a120b..9d82dae 100644 --- a/frontend/lib/routing/previous_projects_routing.dart +++ b/frontend/lib/routing/previous_projects_routing.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import '../pages/project_pages/project_display/specific_project.dart'; +import '../pages/user_pages/project_pages/project_display/specific_project.dart'; class PreviousProjectsRouting { static void pop(BuildContext context) { From 10fee4c6f9c4ff1f40d7755974c0d07c89b0b595 Mon Sep 17 00:00:00 2001 From: bharathan06 Date: Fri, 14 Feb 2025 14:21:19 +0530 Subject: [PATCH 18/63] make some model modifications for the login feature --- .../__pycache__/__init__.cpython-313.pyc | Bin 0 -> 177 bytes .../__pycache__/apps.cpython-313.pyc | Bin 0 -> 555 bytes .../__pycache__/models.cpython-313.pyc | Bin 0 -> 1741 bytes .../announcements/migrations/0001_initial.py | 2 +- .../__pycache__/0001_initial.cpython-313.pyc | Bin 0 -> 1739 bytes .../__pycache__/0002_initial.cpython-313.pyc | Bin 0 -> 1191 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 0 -> 188 bytes backend/myproject/db.sqlite3 | Bin 286720 -> 282624 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 0 -> 171 bytes .../members/__pycache__/api.cpython-313.pyc | Bin 0 -> 4523 bytes .../members/__pycache__/apps.cpython-313.pyc | Bin 0 -> 535 bytes .../__pycache__/managers.cpython-313.pyc | Bin 0 -> 1358 bytes .../__pycache__/models.cpython-313.pyc | Bin 0 -> 4559 bytes .../__pycache__/schemas.cpython-313.pyc | Bin 0 -> 1101 bytes backend/myproject/members/managers.py | 15 ++++ .../members/migrations/0001_initial.py | 34 +++++---- .../migrations/0002_alter_customuser_srn.py | 18 ----- ...ed_project_and_more.py => 0002_initial.py} | 6 +- .../0003_remove_customuser_alt_email.py | 17 ----- ...lemodel_alter_customuser_email_and_more.py | 40 ----------- .../__pycache__/0001_initial.cpython-313.pyc | Bin 0 -> 4681 bytes .../__pycache__/0002_initial.cpython-313.pyc | Bin 0 -> 2019 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 0 -> 182 bytes backend/myproject/members/models.py | 13 ++++ .../__pycache__/__init__.cpython-313.pyc | Bin 0 -> 173 bytes .../__pycache__/settings.cpython-313.pyc | Bin 0 -> 3439 bytes .../__pycache__/urls.cpython-313.pyc | Bin 0 -> 629 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 0 -> 172 bytes .../projects/__pycache__/api.cpython-313.pyc | Bin 0 -> 4359 bytes .../projects/__pycache__/apps.cpython-313.pyc | Bin 0 -> 539 bytes .../__pycache__/models.cpython-313.pyc | Bin 0 -> 4442 bytes .../__pycache__/schemas.cpython-313.pyc | Bin 0 -> 1479 bytes .../__pycache__/services.cpython-313.pyc | Bin 0 -> 3007 bytes .../projects/migrations/0001_initial.py | 4 +- ...alter_projectmodel_description_and_more.py | 23 ------- ...alter_projectmodel_description_and_more.py | 23 ------- .../__pycache__/0001_initial.cpython-313.pyc | Bin 0 -> 5354 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 0 -> 183 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 0 -> 177 bytes .../__pycache__/apps.cpython-313.pyc | Bin 0 -> 555 bytes .../__pycache__/models.cpython-313.pyc | Bin 0 -> 1432 bytes .../registrations/migrations/0001_initial.py | 2 +- .../__pycache__/0001_initial.cpython-313.pyc | Bin 0 -> 2427 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 0 -> 188 bytes backend/myproject/requirements.txt | 65 ++++-------------- 45 files changed, 71 insertions(+), 191 deletions(-) create mode 100644 backend/myproject/announcements/__pycache__/__init__.cpython-313.pyc create mode 100644 backend/myproject/announcements/__pycache__/apps.cpython-313.pyc create mode 100644 backend/myproject/announcements/__pycache__/models.cpython-313.pyc create mode 100644 backend/myproject/announcements/migrations/__pycache__/0001_initial.cpython-313.pyc create mode 100644 backend/myproject/announcements/migrations/__pycache__/0002_initial.cpython-313.pyc create mode 100644 backend/myproject/announcements/migrations/__pycache__/__init__.cpython-313.pyc create mode 100644 backend/myproject/members/__pycache__/__init__.cpython-313.pyc create mode 100644 backend/myproject/members/__pycache__/api.cpython-313.pyc create mode 100644 backend/myproject/members/__pycache__/apps.cpython-313.pyc create mode 100644 backend/myproject/members/__pycache__/managers.cpython-313.pyc create mode 100644 backend/myproject/members/__pycache__/models.cpython-313.pyc create mode 100644 backend/myproject/members/__pycache__/schemas.cpython-313.pyc create mode 100644 backend/myproject/members/managers.py delete mode 100644 backend/myproject/members/migrations/0002_alter_customuser_srn.py rename backend/myproject/members/migrations/{0005_filemodel_related_project_and_more.py => 0002_initial.py} (91%) delete mode 100644 backend/myproject/members/migrations/0003_remove_customuser_alt_email.py delete mode 100644 backend/myproject/members/migrations/0004_filemodel_alter_customuser_email_and_more.py create mode 100644 backend/myproject/members/migrations/__pycache__/0001_initial.cpython-313.pyc create mode 100644 backend/myproject/members/migrations/__pycache__/0002_initial.cpython-313.pyc create mode 100644 backend/myproject/members/migrations/__pycache__/__init__.cpython-313.pyc create mode 100644 backend/myproject/myproject/__pycache__/__init__.cpython-313.pyc create mode 100644 backend/myproject/myproject/__pycache__/settings.cpython-313.pyc create mode 100644 backend/myproject/myproject/__pycache__/urls.cpython-313.pyc create mode 100644 backend/myproject/projects/__pycache__/__init__.cpython-313.pyc create mode 100644 backend/myproject/projects/__pycache__/api.cpython-313.pyc create mode 100644 backend/myproject/projects/__pycache__/apps.cpython-313.pyc create mode 100644 backend/myproject/projects/__pycache__/models.cpython-313.pyc create mode 100644 backend/myproject/projects/__pycache__/schemas.cpython-313.pyc create mode 100644 backend/myproject/projects/__pycache__/services.cpython-313.pyc delete mode 100644 backend/myproject/projects/migrations/0002_alter_projectmodel_description_and_more.py delete mode 100644 backend/myproject/projects/migrations/0003_alter_projectmodel_description_and_more.py create mode 100644 backend/myproject/projects/migrations/__pycache__/0001_initial.cpython-313.pyc create mode 100644 backend/myproject/projects/migrations/__pycache__/__init__.cpython-313.pyc create mode 100644 backend/myproject/registrations/__pycache__/__init__.cpython-313.pyc create mode 100644 backend/myproject/registrations/__pycache__/apps.cpython-313.pyc create mode 100644 backend/myproject/registrations/__pycache__/models.cpython-313.pyc create mode 100644 backend/myproject/registrations/migrations/__pycache__/0001_initial.cpython-313.pyc create mode 100644 backend/myproject/registrations/migrations/__pycache__/__init__.cpython-313.pyc diff --git a/backend/myproject/announcements/__pycache__/__init__.cpython-313.pyc b/backend/myproject/announcements/__pycache__/__init__.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9a677e7d70edae3ddded41aeaae378628587cfc0 GIT binary patch literal 177 zcmey&%ge<81mbI((n0iN5CH>>P{wB#AY&>+I)f&o-%5reCLr%KNa|LAvsFxJacWU< zOj1T-QDTfsYH@Z+egTj!(+w#~OwQJIEGURc0y0wbQetu|3ySiyQj<$!67%x%OY@Rb yb5rw5ieuvAGxIV_;^XxSDsOSvvgsIiMKC_{hx2$XLV-WB~xmK`zVy literal 0 HcmV?d00001 diff --git a/backend/myproject/announcements/__pycache__/apps.cpython-313.pyc b/backend/myproject/announcements/__pycache__/apps.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..65bb02bd5cc3569164c8c19d16cfe28b394eae28 GIT binary patch literal 555 zcmY*WO-md>5bd6sT{oH~#xD{zkmMlD!MzC*g0LzcOz_h2*3k6M^iF1-?U_{f1k5o3 z|AF8S$R$^QiAQP3$&)u>%{|r53P~NRUh(P`^)cyoX9?Qz<@f9-#v7kJT5Ad>8wkz` zBaD6^hZN{*@`Ai2ELbHhLAFXxOMB3n7SwZs@f~{Fwc^PZakePlXV2=gcG2Q zK)@)3EP#lG&|(p^vsT=8i+!!jS|@6(v^7n$+X!{vUZo?cv$B^CdgC%xh3W0)S--aB zL9U9_b>+XpU*ssBaUCJF94jH*tPm)w3y+@)@uiluY za$6Xytlt^~XNUKk`R$ z=;o%^@nZ1LY2<#krtmo;*LmMuVFwm5^?xx-=2LDpz8%oDi}(-0@Syq&_nMcm literal 0 HcmV?d00001 diff --git a/backend/myproject/announcements/__pycache__/models.cpython-313.pyc b/backend/myproject/announcements/__pycache__/models.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f7144c2bfda46a75445232351a1fe7bedc809f95 GIT binary patch literal 1741 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 literal 0 HcmV?d00001 diff --git a/backend/myproject/announcements/migrations/__pycache__/0002_initial.cpython-313.pyc b/backend/myproject/announcements/migrations/__pycache__/0002_initial.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d7de9e762b4aa8d166abea9437aea7133e4c22b2 GIT binary patch literal 1191 zcmZuw%}>-o6rZ-c-F8_73JQJ(fdrO>f+id=hPdI&fJ(AmZcQfL?d)3Eot9}=!;Qqm zvlspcxahy);-O>`qtO$$HLEuheQjCLz@(jd@6CH}-u!-VI=#JF1moME_cc#M=zFAe zNBT_Y6hSyZ1~P;V!~|Hy4RKv!(r9FpHd5rp7&20~kdZdi#cSO}7wf!~ z$ShM6^73hGo|wzgac&86*18e zm}H17Wk_&x?%#k!9z$lP*ninRFC?~Ek*N?lblD@i5!|PzIC9mV*;~AG*QrKQV{Cb<=@SNVs!K6oO#;Hjz|Bj*Lxer1R)g?VJg2J;soO`u*dSMM zyn`{%Vho%U=_%eaR*Lxf=JLujo;&w&h|iURZLdbPu&70OcGYFXsnHFx$7OrlqBWO` zc9|>jeV~zeW~pE-6_!_c*7ZoYxvpdE2Y^HcTS35_ax)-4#!Q2h9rzK)OOMPgK*u-B zFD+)7%f#OaTo2Y)GbLtKc4i8mXO=;L;?2gM$J}jF3C#Z(FfZEK1TG$SxzN2mmVr~^ zDI(9`h3PH&dQID3Ys*NTK2fw#nLJh|50!B0No(rKC#BF%OGEPhvvv-tgQ0T!Sh;;N zJbf}Se4>qn+W4_HepvnB966!B*wPn6eXXUhh5BYo-~3oI!&1EkpVs)1NvYYkBx~}U zbvE9uA+PY833$3)){}>)cM)WF!HxHv?N?k{O^8y@BVtZtK9XxiFeb?-qEO{=(j<#) q3e@P$`C~A(B|#86G7|28Mx$TQ)K9rjkl$s){)txq#4iL&oZ~MVIx6=7 literal 0 HcmV?d00001 diff --git a/backend/myproject/announcements/migrations/__pycache__/__init__.cpython-313.pyc b/backend/myproject/announcements/migrations/__pycache__/__init__.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3abf1ca7df8ee638363572b5d111ce127b91494f GIT binary patch literal 188 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 delta 6289 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 diff --git a/backend/myproject/members/__pycache__/__init__.cpython-313.pyc b/backend/myproject/members/__pycache__/__init__.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cc45b8db2a7c681e5832dff541d5432c2e404f47 GIT binary patch literal 171 zcmey&%ge<81mbI((n0iN5CH>>P{wB#AY&>+I)f&o-%5reCLr%KNa~iCvsFxJacWU< zOj1T-QDTfsYH@Z+egTj!(+w#~OwQJIEGURc0y0wbQetu|3ySiyQj<$!a#M4YK)T}N pGxIV_;^XxSDsOSvy?-SzQcbd}L;1WGrF^vH*Y;EHeNA literal 0 HcmV?d00001 diff --git a/backend/myproject/members/__pycache__/api.cpython-313.pyc b/backend/myproject/members/__pycache__/api.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d1cd17f49543f60e640c7c4bf9be75880133a452 GIT binary patch literal 4523 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 literal 0 HcmV?d00001 diff --git a/backend/myproject/members/__pycache__/apps.cpython-313.pyc b/backend/myproject/members/__pycache__/apps.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f544a4520f52d25d43d3a6b7038f34bc6c8be7fb GIT binary patch literal 535 zcmXw0J#Q015Z%2yJI2OJ0to^HQbG~winv3HP=pi`xgf&Ll5VBdo^O3za$n5uA(=8r z)HLBg(B_wwea);#5Gn+e4G4n?6&FswVayaZ0w6p8W)1!B3a#WjgoT@CgYq`oJ z1^O46glo1ZL?Lq}gzXD~@;Y<)p%9;InYGNi5VI7t$b$_6@(Ear(rN7DUUDu=AKf-?m!+q6%R*sJM literal 0 HcmV?d00001 diff --git a/backend/myproject/members/__pycache__/managers.cpython-313.pyc b/backend/myproject/members/__pycache__/managers.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2d0840dfcfd0c2013b70e6eed00f95918d771b59 GIT binary patch literal 1358 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 B1YrOG literal 0 HcmV?d00001 diff --git a/backend/myproject/members/__pycache__/schemas.cpython-313.pyc b/backend/myproject/members/__pycache__/schemas.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dfcd7e8b99973f576ddeb48d08c383e7f7a25497 GIT binary patch literal 1101 zcmZuw%WD%s7@vJ+vuRUXtyD!Rf{ztiPdz9iXuUM01zq*x!a7N&>9+fb-)xj#6{_H+ zm;Mpr&A+A$^yH~GF%hqR-)t&GJ0!pP=6k<(I6dt%JTJe!?|n5G`%aJ3&tDzLvdCUY0r;vv=2B=ae7KcnrwUNvI2s$? z!S^AH7#JY~Gc>@u!6G|yLh}|%G-VML+Tiw_z*SRW(#zNKadZzw%E3I6RC#?a<+}p9 zU)W|)Q(heBJQH!O{5Z~v?jR+4DvsX_csiEM#PL=FvP_d)Wm4o4 zx$|)>>D7sOSwhktlmgi>jlqZbXKHQrenh3qsJ+dBM^A*@EsH+hZi45I z5+d(L*^rwMJlT!#E*-@kUp>@=p-QR%uQ}IMQZRFA! z-bR>gryi$?6Kh8EO% zcHpSwpZzvH#~(3-$~%cSgSv9^B;Vmc8?RiQyQ~WF`g>iT<5q!-GN=*g>1*%* zl;l0AR`?;@L_PZGWPtF)G7RIGT|H*k^lxG0na13~y%ED}}>dX literal 0 HcmV?d00001 diff --git a/backend/myproject/members/managers.py b/backend/myproject/members/managers.py new file mode 100644 index 0000000..2c8ca01 --- /dev/null +++ b/backend/myproject/members/managers.py @@ -0,0 +1,15 @@ +from django.contrib.auth.models import BaseUserManager + +class CustomUserManager(BaseUserManager): + def create_user(self, email, password=None, **extra_fields): + if not email: + raise ValueError('The Email field must be set') + email = self.normalize_email(email) + user = self.model(email=email, **extra_fields) + user.set_password(password) + user.save(using=self._db) + return user + + def create_superuser(self, email, password=None, **extra_fields): + extra_fields.setdefault('role', 'admin') + return self.create_user(email, password, **extra_fields) diff --git a/backend/myproject/members/migrations/0001_initial.py b/backend/myproject/members/migrations/0001_initial.py index 215912b..f76338b 100644 --- a/backend/myproject/members/migrations/0001_initial.py +++ b/backend/myproject/members/migrations/0001_initial.py @@ -1,6 +1,5 @@ -# Generated by Django 5.0.7 on 2024-08-10 13:33 +# Generated by Django 5.1.6 on 2025-02-14 08:49 -import django.contrib.auth.models import django.contrib.auth.validators import django.utils.timezone from django.db import migrations, models @@ -11,10 +10,22 @@ class Migration(migrations.Migration): initial = True dependencies = [ - ('auth', '0013_alter_user_email'), + ('auth', '0012_alter_user_first_name_max_length'), ] operations = [ + migrations.CreateModel( + name='FileModel', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=200, unique=True)), + ('type', models.CharField(choices=[('PD', 'pdf'), ('IM', 'image'), ('LI', 'link')], max_length=2)), + ('file', models.FileField(blank=True, null=True, upload_to='files/')), + ('image', models.ImageField(blank=True, null=True, upload_to='images/')), + ('url', models.URLField(blank=True, max_length=500, null=True)), + ('uploaded_at', models.DateTimeField(auto_now_add=True, db_index=True)), + ], + ), migrations.CreateModel( name='CustomUser', fields=[ @@ -25,17 +36,19 @@ class Migration(migrations.Migration): ('username', models.CharField(error_messages={'unique': 'A user with that username already exists.'}, help_text='Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.', max_length=150, unique=True, validators=[django.contrib.auth.validators.UnicodeUsernameValidator()], verbose_name='username')), ('first_name', models.CharField(blank=True, max_length=150, verbose_name='first name')), ('last_name', models.CharField(blank=True, max_length=150, verbose_name='last name')), - ('email', models.EmailField(blank=True, max_length=254, unique=True, verbose_name='email address')), ('is_staff', models.BooleanField(default=False, help_text='Designates whether the user can log into this admin site.', verbose_name='staff status')), - ('is_active', models.BooleanField(default=True, help_text='Designates whether this user should be treated as active. Unselect this instead of deleting accounts.', verbose_name='active')), ('date_joined', models.DateTimeField(default=django.utils.timezone.now, verbose_name='date joined')), - ('alt_email', models.EmailField(max_length=254, unique=True)), + ('email', models.EmailField(max_length=254, unique=True)), ('phone', models.CharField(max_length=10)), - ('srn', models.CharField(max_length=8, unique=True)), + ('srn', models.CharField(max_length=8)), ('branch', models.CharField(max_length=50)), ('semester', models.CharField(default='1', max_length=2)), - ('github', models.URLField(default='')), - ('linkedin', models.URLField(default='')), + ('github', models.URLField(blank=True, default='')), + ('linkedin', models.URLField(blank=True, default='')), + ('is_active', models.BooleanField(default=True)), + ('otp_token', models.CharField(blank=True, max_length=6, null=True)), + ('otp_expiration', models.DateTimeField(blank=True, null=True)), + ('role', models.CharField(choices=[('admin', 'Admin'), ('student', 'Student')], default='student', max_length=10)), ('groups', models.ManyToManyField(blank=True, help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', related_name='user_set', related_query_name='user', to='auth.group', verbose_name='groups')), ('user_permissions', models.ManyToManyField(blank=True, help_text='Specific permissions for this user.', related_name='user_set', related_query_name='user', to='auth.permission', verbose_name='user permissions')), ], @@ -44,8 +57,5 @@ class Migration(migrations.Migration): 'verbose_name_plural': 'users', 'abstract': False, }, - managers=[ - ('objects', django.contrib.auth.models.UserManager()), - ], ), ] diff --git a/backend/myproject/members/migrations/0002_alter_customuser_srn.py b/backend/myproject/members/migrations/0002_alter_customuser_srn.py deleted file mode 100644 index 3306fd2..0000000 --- a/backend/myproject/members/migrations/0002_alter_customuser_srn.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 5.0.7 on 2024-08-12 05:54 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('members', '0001_initial'), - ] - - operations = [ - migrations.AlterField( - model_name='customuser', - name='srn', - field=models.CharField(max_length=8), - ), - ] diff --git a/backend/myproject/members/migrations/0005_filemodel_related_project_and_more.py b/backend/myproject/members/migrations/0002_initial.py similarity index 91% rename from backend/myproject/members/migrations/0005_filemodel_related_project_and_more.py rename to backend/myproject/members/migrations/0002_initial.py index 132d855..d10beb2 100644 --- a/backend/myproject/members/migrations/0005_filemodel_related_project_and_more.py +++ b/backend/myproject/members/migrations/0002_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 5.0.7 on 2024-09-03 16:35 +# Generated by Django 5.1.6 on 2025-02-14 08:49 import django.db.models.deletion from django.conf import settings @@ -7,8 +7,10 @@ class Migration(migrations.Migration): + initial = True + dependencies = [ - ('members', '0004_filemodel_alter_customuser_email_and_more'), + ('members', '0001_initial'), ('projects', '0001_initial'), ] diff --git a/backend/myproject/members/migrations/0003_remove_customuser_alt_email.py b/backend/myproject/members/migrations/0003_remove_customuser_alt_email.py deleted file mode 100644 index 7b9e239..0000000 --- a/backend/myproject/members/migrations/0003_remove_customuser_alt_email.py +++ /dev/null @@ -1,17 +0,0 @@ -# Generated by Django 5.0.7 on 2024-08-12 06:09 - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('members', '0002_alter_customuser_srn'), - ] - - operations = [ - migrations.RemoveField( - model_name='customuser', - name='alt_email', - ), - ] diff --git a/backend/myproject/members/migrations/0004_filemodel_alter_customuser_email_and_more.py b/backend/myproject/members/migrations/0004_filemodel_alter_customuser_email_and_more.py deleted file mode 100644 index 78636b4..0000000 --- a/backend/myproject/members/migrations/0004_filemodel_alter_customuser_email_and_more.py +++ /dev/null @@ -1,40 +0,0 @@ -# Generated by Django 5.0.7 on 2024-09-03 16:35 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('members', '0003_remove_customuser_alt_email'), - ] - - operations = [ - migrations.CreateModel( - name='FileModel', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=200, unique=True)), - ('type', models.CharField(choices=[('PD', 'pdf'), ('IM', 'image'), ('LI', 'link')], max_length=2)), - ('file', models.FileField(blank=True, null=True, upload_to='files/')), - ('image', models.ImageField(blank=True, null=True, upload_to='images/')), - ('url', models.URLField(blank=True, max_length=500, null=True)), - ('uploaded_at', models.DateTimeField(auto_now_add=True, db_index=True)), - ], - ), - migrations.AlterField( - model_name='customuser', - name='email', - field=models.EmailField(max_length=254, unique=True), - ), - migrations.AlterField( - model_name='customuser', - name='github', - field=models.URLField(blank=True, default=''), - ), - migrations.AlterField( - model_name='customuser', - name='linkedin', - field=models.URLField(blank=True, default=''), - ), - ] diff --git a/backend/myproject/members/migrations/__pycache__/0001_initial.cpython-313.pyc b/backend/myproject/members/migrations/__pycache__/0001_initial.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..297c3ef2985f547e3a4b00296c803e0a29980a8d GIT binary patch literal 4681 zcma)9OKjUl8m34|mK4X95-0K7OzfmlQcHH?B(>8t@gsJeR~wD(CSA2GC5|N46e$m> zB-UcF1q$rBmn@84n&a+iee|BzM;|F+0U5K0EwCrw9HhnG7W>aoeiX5S8Zc-6nUCN9 z&;J_g?eXIg0sdY|f6M>UE(rf&!rot?F?stKCa(k}Am0Ol`1mODQG6iX_Y?p9013!K zr*KX{Qn!HoX@9D9kK|yyCV6ub%=_Yj9VR@Ei!@Ty^F(!Y%d}~*XldB6vj;B;!eB#q z`xxwbC8W6pL_|I!A(8lzl=P86I+$uZ{E{~Zd;BPn4y8^UxhEnK1yKtMjr+$$6b4+! zk+=xpj*W|eX>Eo{3h4L~A8JGG92W)L=_9$A&KNo|E&_?0M*?DbsE^t zaIQ{3^)^9?sEb*ZY(d@QVpC7`{AN$}g07=I)rWdfKli}Ed+m|YS#I??K=mJKbr21r zA#|RjE;QBm0lGNiLveHoiRozS+`CMvp(EBV9I+OEckNnZDd|HO(B<(UMC`++mWW`( zFiLQHlkY{1G*F}OIr|lKwQ=?_Kph!ZIPax*ZBBi7#9HFrHFOPK=W)6L{3Gw~L*;z5 zpY`KS&ohB;j{CqbA2&t#8i-p>5uY>=x0@pFKwV98Yo`FytQMxx49DF44VYQL9G!O} zn&T(B*VGyj&F@#;eLx)<9YBca0k`L2Q>I7gaZ*H|q6zdF&zmQJymDkLM3h1ZEucm8 z1TFDQ{QN!GryTnXec@q~r{T@tL8nV6B=qIDloUxf`ik`AmH5{*{AjQH?u0<~0yJd5 zT6PNb{K&}Y6-6~1Oq8+>kDN|yM={kRR*LFN#lU7BVBuNaz>iqhrlPLRQgMDJ?x(Fl zVJTUHRR?SISc&LGm8>euc$J2MOIHoOf@$k>Ofr^@IVtrs>YXhxf?o;;DuQKGUnyhi zcUDU{F2Sz&*$kCRT8>TUAJG7?=P?r=&Qrgko69?*N7IrmSb7%QphH5T@;<91TaJghys-`#==>l-2g_GJzDwT<$|Lg;^Br*UyoQuee@R;`w))dtN z_1>vX>xH6f8VzX~MK?A4GA@!BLxW;$Xf};Zmu<%?E`lRysHEEV3yWww-vR`X%uo_# z@Q9&;zYQy|n-xBn`Fzg`c^}xS+lpN-VZy>x`D_N;dfo)b+p<$o9eC)r%(mo$YRjr& z$N(+sw#{x_`GxKjtg<8HmnB2b>W;B0gGE4~n|XK@7Za7}KDlf=s#CVXbuAjssb#~V z;Q}^Fii2M|p4B0yiA9pI8=?}Q^i(r7o;iE_UjY~FdGy+d zoGqwC%|iCsvPI+^et}6seuy2m@}aEhdEJ52n3{YinMhtv4ks1aGL6;5&YwYVJV@Ix zAr?`J*tQ`#Y%K_ zM)#Q5>1YsKS}12IOGBRMObHFKdcvA+(l8tmBBDRXK+gBVmIJZ3ma(}LWY{()Lni6o z_uL+j%=Y}mGFXiU_+;NbQ?7`$^ftRq&rWLMM$@MWIQ zJqPmC&S1kb^N{gYLf%g~NcB8+-bs1*+BBgp0anIpwjf(M79X87SQC`zuwr9}`Wbm8 z!Wv?N>x>6I*RX7&tpppa!Fm1b#GVAb3VIz&5Gq1`@nViLBIQuwRR&QBXZ4(({Z%>U zAlLT`Hc@Hknh##9aGt|&&;VnGlJxYPJls;1l2InAK|^ZBc33e1ighBwK7eS8RpKAr ze}%8`UK&!o)~?WqqQF;p*}#fITNP!ctQzbrAhj#rB>)+LO$!!UbW?YrnbTGcmoW4? zGpj?XvG06(Y?^m}el-w3ch{7jpM-m1mbF0|o`wQ%OxYdcO(XNHm3#BhV(OtcJ3a$$ zUeJq;jn*j(a!ED4&7k&;YUVB4lC?~S=o!N9F*3?Db}pKF7Vf6SMo(JWt9kI6qZ>92 zIY3&0nxPW3Z5p}DYRRK*f25kL3l@8N3lR(A(D*Y3K>dj#Yy3`S1dSVtIJ7R7z)H0&YteS4+hD24|gg5f?M;t%Ki0 z=@Gby;UeLVPLx&&t2F*#=d}L`&i<3|Q`?De=XQfacw$!)JA&Un+>Hp~ll4%4E!4jq z>-{Nq>ig&QGnZ;-E^YX?hTJa{*Cf?5wi|V}V`tV**Sq4iuJ}6I?5K9ly3x5qi?u5m z*D6)JR@^8#w7l-$7~A@&+O^muuaZ*M~M1ww_hHKX;=~w_~T*f( z3~b=ioF~nBQp%H3p0w;q%YMiZM=JV(#gRK2z2Vp5g8ggA(%y*XCxzUM~g8zH__>%O#}sdkUM(Fq>j zdgsMj=f(BOYUgz~dSg4*wRXMUbGg=Yd7V^yCfw-FLoQv$Ni}MpsbH=o~ZWCxY4_f(~j2qM>mG5{kPrdonJdZ-O{T4$c-*+$IiaKULU+s z8@#chL8c9QnYN$U?$x{Q+?Vc^uiU~4xZ;n#N#>XCDejkP@C!G4wAM4a!NM``GuY1W z#k(xhUr1lG0ZS`vxZ}Ua!q_{{fU*1j?bzV!rTY1swevS2pHnYjbxwT3UeAe~Wd(8! zq$g6ArP>9J2{A0~4xj00+r1*3{b2ip#CGr5H!c2CZEvm(Kn3&+p9p?;pICck9&e%j zUW-dKI$VO^3Wq*mFl#xd8X(@;68nuU+*sB!yf5=s?DY`Vtvod)_I~JNukC+A91!7q rSFqU+>Rrj_^SuoUz6<{ndjBn4{5g2d7yLd_j}BF%L%#?haE|{28Ftuz literal 0 HcmV?d00001 diff --git a/backend/myproject/members/migrations/__pycache__/0002_initial.cpython-313.pyc b/backend/myproject/members/migrations/__pycache__/0002_initial.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4120297c054c0e181a69d56099fc09e697cb5d75 GIT binary patch literal 2019 zcmcgt&ube;6rTO5)moP1Rh_yqxQ?SjMH|H_^xzT-!d|CHNef!5U|2HjYDenEt6gPg z6>v_0K+h$RdymPf{S(?#&(1|=ptR6aZVGDYH8ZPS#U$pe}<@6F6N-@N_aXu760tfdwp~1+c)Z*boS^}0V5zCfj$=5}!*y^J589T*NZLMvbg`ADqoM?%*-oEtqT)Vs=wzeR4 z`R$mMv$P%A%I`?;;G|zLr=@dnDqJw9WxLqkSdhQsj`Ba*D_t~aT8;<*7DxCj$k*xug00sYXAeJ5ZO+7L(gP&X!+S0&B&`~W2-KuZ_} zPK-R5u6VebEv=`6WL-_BiW@lL5tYMH5YT)SLRLX2MpTTWn#8J$R}>7L0b)yduk?Hr zc+|)aAR~9+6T<56;oAI+H^CX5LbiHD5T?tS$N7?)f_dd*UZ|MY4V|y%2jUeTS{e<5 z$nn^P++$jtI|;yZ_9hrqg9%FrsSY7Kbrc{rEZww*Ep}KYf4ebY<(*SQ{Hx zUl>=PRewJC<=fv5e?1(VofES&Ht(L8cgJS$#OzG~2!vhn6#$hz@l{UF>l6LII3JxK zXFtKYwHW8a^Wr=ZOp(!Qif!>xyReI}}$eM~N!8ThAst9ElH u|1a@2bJ_O=WQ%nZNf3mo3WO`agUvs{$A7CEg8G9#E>};=)qenU5{%c8k;+~G literal 0 HcmV?d00001 diff --git a/backend/myproject/members/migrations/__pycache__/__init__.cpython-313.pyc b/backend/myproject/members/migrations/__pycache__/__init__.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..79ba7a0b12e9136e26e1e7cfd89e78e52fe93b25 GIT binary patch literal 182 zcmey&%ge<81S0>|rGx0lAOZ#$p^VQgK*m&tbOudEzm*I{OhDdekkqYEXRDad;?$zz zn52xvqQn@N)Z*-t`~o0drW;a}n4GQaSWpm?1Z1S8eywm6LB^S1zd>@@6EE0t{^2anK9N50(PkOuPYhxRgIMHQX9)|lcir>MOS~zj;+7*V8;w*$Gp&@dGdPl>tKbN0B=uHlw6XdB_#${`$kBTT!(y7H zzD>p2wO9HuXu64OZGsnHzj>&bU+j@Pi*Krru(JPnuDbl7rhNaEqE@X()!*%^>SA4K zEvv8Zr|;h0Z_VvUU@T;5O|0UErM&lpec%KD*0zPs_fGmd?o{Q#r2aMZ)$(Ilj;vsX zU_w2bN&{^Z6IoN!VLHKQvjRf0R9Y8`azV@slDHwz$+D0y3ux^kf1+HHcuA1|Ya7w2 zl>(n#FNjEz`Me~QWmilr6={estd`26w6;MbNL($7#Z`G-cu8X~gtC}_dA1zmx1=?B zP2h8&EWO+m5RGjipv9b=7llG@u*?>CaU&hGuk?WAYKCqRt;#8FK==9urn8B4%Q|Rb z)4qCP)5N9;IdyrX2^&fsG^Q_VSdfJ^C-+Ri8#k+%0K~ec?p}~G?nlz^9y3y8axC!yWlHfYzAiNeQqIB54zrU+N=!RxuuBoYN1MkEA zaoY~J=x{gAnf9F_*TceDh-e`8uXO)3L+0RxG!320y3;_^Uc4;ormJQhaLCD9Acn*r zUBs!6>~Jus#~Wyon~MmUL#w^sQ);iFTyek66QzkuE%(NT^y25GkZY5MX=nO&EZl50pc-;j zFo1RStXgq7w=hcmZIdS5to^}~Az5k=7TjXmXWzSM=CTy0;%d8Y-~S9rg5N+@v+OVW zvcs>)eNvFGL;icO>){3Aa~wYr%GqApM*}NR9E4(y`f_3!(ICIMDZ5mlv?)Q6K=$+i zvVF6zaZ0NNNW0fa11jE8+70XcF{;%8g65kByoZN&7?^!J?V%$=aaAk|)K}y;1hU|y z+1iEB-P~y@rnzqrRfZa`sjfS23rZtzITZzpDbku+LvfP*MNh&Y_S4U`w4v!*v)wFU zy>9Ie^ndfY`n^ZF*^hBx;QP-tP;56b(Q211__4m&HmP?@%Gv?w#PDP?_DtU_AlWpa zvzXk9R);5L*|upJO$R;dht8xab|B-< zne;6hkY#AkvP?Y&6wVg(!G=~PUbq+BU1=ok2o=AL-)etnAXT1DuTcUBXh$IjOQAj*Q z!y95QR}i-OvOuHdQc04x%7tvHn5Q90*w`#UdqXs_jaEfRz943KCr4>0$4k5u5Oh1Y zS#9zNZI{Y9`2}APVY39O9V_s~)h&Kikh7(n00yC#%CAb0ib3dRviRVeA{}uk=@py_ zI;og-ywhY($n#qT=$>0rso(G>vtUtnPbtIUb3#!P`2wQj13nxHdMl*5!$sx1ES0yA zG{hZsBXt|;1_V@~J_md1+cPvBfDm#b53RZ+(NK?uSpLF%1OORY$Udn!w`o?Yy9!Y% zIc&a$A5k#BU6cq^utmPrs`N`)<^25)QD?ukxYhv;eg`?#Zs4b+2*#aXC}tbR6EDlM zr=BqD`#8z4;lDFer%@)F_+#)7Pv1r6jv{lvMsB@}+&_xke;0Xh6nW4Ip2V4WneBv6 zMwn2n<3CO$JF$O`Fzn6K5oUJbmp4Z<5B>)8^P|~JcV@1ey4@X{>Ry@YPF(9=yX}k< zv!@f0n5Pr^Fh82~bmAZ8BXJMdn`RQJPV^+mj0J+tYSCnJ literal 0 HcmV?d00001 diff --git a/backend/myproject/myproject/__pycache__/urls.cpython-313.pyc b/backend/myproject/myproject/__pycache__/urls.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c7cf084cd1b3b1471c02f35b69af18c6d41a6a11 GIT binary patch literal 629 zcmYk4O=}ZT6o&7e@63>9VX2`~2n81rlCBCWMT}OkGiqVdii?3VnYm4;&3tg?MyNYo zb*T&S54g~+|D?DmTnH{)xogND@Z3pbybN=m^S<|mMJ6J|*P0Ocu+y zf!SAt&!kWK)FUnh+LEkzimQU^YM@oQ>glclM#Y+Ex)xX!>t4;Z!ETX2-6VY@F#NSe zgJs-S=DbA%dy@o~-&}eNLUnz?%h)#`C>=~;WoWf)f27f-LJ#9K$=Zt0ijbcOGs&XS zIA-XmVUb|4O2&DT4NGLBUz0W9fiQW3S6&vy5E zM~D6kVb9Uu-#-uzn)pndK~{bzGu%(a^QRAk!xDQ2gOd=#V3(C=JTEZ5?HoWDoppLe z5eyJm76<8h0r@G5_>P{wB#AY&>+I)f&o-%5reCLr%KNa~iivsFxJacWU< zOj1T-QDTfsYH@Z+egTj!(+w#~OwQJIEGURc0y0wbQetu|3ySiyQj<$!pmcFee0*kJ nW=VX!UP0w84x8Nkl+v73yCPPg*&w@%L5z>gjEsy$%s>_Zxt1)m literal 0 HcmV?d00001 diff --git a/backend/myproject/projects/__pycache__/api.cpython-313.pyc b/backend/myproject/projects/__pycache__/api.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bdc1ccff5145677938efa6af3218e7d106556675 GIT binary patch literal 4359 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 Vv0q3orZxz45Ir%qjsm{%KLHE+=CuF- literal 0 HcmV?d00001 diff --git a/backend/myproject/projects/__pycache__/apps.cpython-313.pyc b/backend/myproject/projects/__pycache__/apps.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..60ce4073121e0166878299cf357b3feb630f0e73 GIT binary patch literal 539 zcmXw0O-md>5bd6sT{oH~8b2^0fh32(9Ne2AL4q(I-1b@G8Q?=@jQr<;CN2VNY6jR%*6)IRGLMK8~WNj#|N%F{ZTzCkb{oB(A6 zJVwE19t6yX1`D7WH^QcEe}Vi|4NTSMAwb3D+vrqgao&mgolzdCRCjihxLcZhKT&C9 zTSX<&zsPYoXInyKa-@W?^Fm;KnL7Mji1SjWHS6eij$}%-VVq4@~ z-@p~yRUx#ICK(863?%*1C@loEaImS{%O3PT@o!pz=KT{1lJ6;fX7U2##l}~VgR>31 z3hyIOS;R-R2~ADbRs`|7&-72f5~@^88Pvt&C~99h3+V9SYPCz5SARwT=@q{s%BHkxAF?UGzmw8Ll2UHKu#~!(YYx-H1f&U98Ky#VXi?Bx)~6QUi;n*rAjPm8AV6X0AC!hoQ<-w{-gCZ?FjJtzG4vYY=BiCKEVQaZxY$1Htd=|95K&nyFA89c%=z$`;x zDIZ}OWR_vDRF1F=G0O;8Mvt(R^RZ-n2M;1CQmItVnMFJ4qQR-E?UYORY?IKyOrdCg zftoBoFfR9zxDVIg37SAeRUj@^ByP>q>AV3Am+DqM6D}fwg>ujtpM!;0l_o^uSA8Uq z_a_51G+izk1&cj?2go4o-(m>k$ z+Tk}sIn&OPLd7YRE!v~&wqrPjtZq0CDP*dSX@e7dy`JtJ0wAQb!aa6`COT-8Mn81^;hd}&E*bc=S zp;PtHsdanfQY|#TJiQ%1(TES!;{(sLwfMy+bL7O{vO@q$a2Ln!?^q}u1WzTlsRq%2Q9pu$`S7pd)BNWDrPpk5w%esW($J ztVbjOH{qTyyI3w{O`FqQq_R8@kpbwNS9fH<$Ofmo~ATCDHB@%NXd6Go% z0?{Nf6mbyLcW2?&o!bkysORpanx?Xvo=o3U_0*mDn<@(nl0aL;nDn6N#Z~@$srgo5 zpmte&%X`|a=aBtq!xO=J&cy;AgtCdJiV~)K$ykH z;W}}0?bD~9KKE=)*Af%U^V{J>Bm8bX{O)>j)2@Z5mS?tO#~ZQXdTbb0#KxCr+4Vp@ zHn2XiDZNx)C_krbu@v0Lm8a|B)6c%yc<__;qg4yvd@{pd3E$>W*kTUAvHKLn+vi;% ze%Gw4`7c8XzyTrb=^VnEAL^(lg@CsWma{!XhMXN{IU6#iQQ|D`2iu*CAQ+u#zyS>; zZ6lXXx~WXeBEuf@D<>xswZ%}S6GPibNF!eu)>68RlJSXnzybA@%u)stF2N^Lzj`yR zFWj4-Cs)vWC(3++3KaeDZ{GlMFt4`gpd4!`Lv>|n{nuN{2f(IiZzFo99zC=E{^r$J zsb4ixMlEH$S}fM0r6;#Jc6_j9W-wTp4J66)dktb->uYY2xNy6%T@(D0|^-t z%d-ejdI3r)>7xpRlAq>cp|Udq+a{PI(_|Q@Jej-!Duz9a$dACD`dUSe9X9nK9mof$ z2t0)R$I?JYfNtQ!P~Zma>mV?u0g(6V%6scFkEWV(3xgcWVP8Ge_w37!k)OtX9IJ&U zA(j!Wp?Y*^W2hGWWDg#6cnF^T*t+;%C9&&4cZCPLoe9tX01NuVo_=w<7XO?TmPTTM;tu|pin=2&G4E0S-A`~ z-{Lq03bt-!oxZ9Xe@$D}@Wyykmc*+o p57vsS#ijt$X51~FUFluxTkS*r*{19fN1jQ4mA{w&DZrF%@!u|^UatTE literal 0 HcmV?d00001 diff --git a/backend/myproject/projects/__pycache__/schemas.cpython-313.pyc b/backend/myproject/projects/__pycache__/schemas.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b9a95c802cc4f5be7453b023866089b67ce9607d GIT binary patch literal 1479 zcmbVM&1(};5P$o<$!?moY0@fML{W*-p6o@WP}_r~wF;}A7M4wRO}9;U<9nMzt_Jkl zOQHWlul_4S2@i?~PrV6=cW2%v+Da*6AoFH^^D=LK^N~@ZkSFkY_vK^DlnMEc#`L32 zl+ht5N5mnHv_Fg(GPkkoQ{UYT*?yXI;XGJ=L;dFd@_M)HHb4pE!0q(AS+U&7$y_GN%T~I5nuCBs zAUlR{d?rI{W>6o_RZi6ktxo;_RahNLJT0st3R~KaSbC|fHoU;)D4-TTg&FMBOj<;v zgkl!O90;yNaZ2aWETgEP!24N}3#i?g3XIB70G*sYcmbR~)w7Fu=V~@j!1FI-A_hhk z1Eayf=rx1SBCp9*PUb}5SYyBTHvw@f%qk>#|fmu8s*D7&-6`uX!&r(Z?wq%R6WO6N2mbS83>aUjFxP@TZDWp_QwWS(B3brfmP@+xk zva?G!GIA(VpvciZ7)6i*3DBZIa|&{DPeo82awHQ6BnC2CplAW#n96{ITXKNgV7*i>yj336k*i=xX1JOk@S6(HPQV=a3d(;Qcp{ zq-T@BmN>Tc@ARqi6BeLybil+Fqfv8p$F+&EgP(A|U4E6=w{hA1p>5)tD$>Cl1RE|6 ztXg>&?-}&eD^&mmd9LxEKh$E#fL!pQSL7T%hw`X`t_wL-;b5$CB5oKVE2ij;ubL`PV|(BL9-yLWxQ2R~uq382dz+DgLxmmeQpsNi450F|jh!{y zz4-<}oG^fR>me-h$Qf^Cj&TukYTMlDXE zzEAu8uQ^`E`CzLxKc?`!o9(5Og@pMf>hhzK+U14h!eJ)g&RlL~F1ItqR;Kvj%kBA_ zt@)eHOtG1{bwBzvjz%Ur!`a`y`I|R8+3|LErj?!PS z2l_#rW4grb2XbP0S~xf>FHZ^wV;s{bBOw2T*3=k{>pH`euG56B@7ZPp@4c8^r?S_jT2q=Q@2>ysnGm#7ht1}ME z(qE&lcs`;wC$2q1(309%Y@58NBz%J}g(bn`OK4B< zWn@j|eQN77u~Q~hpA=%6PhIzheGXD~4M*9=*b2FgutKNCJlZ1XK__EOFp?xMF)_}> zB@jTJ6HLDbg2oAU>b3>Yz6@Q5UC8=Zv#sZGsDod7VOVmGnrTMge-b=6JP%#vJeB==eBeH!y!O-Yuk_ItGXyl#|UO7o+ ztF|iVy=)an*IqU`g*`3K#op68r_6}MP+gVER^`NvEpL)*Ue64M3PL8SvR5U|boab| z?|a{S{kli5&z*Bq@cG>Or);pEqW(cTho2g=@p>K_pHmFQSng5C0(bfzebj##q6!_xJ>(-9jZD^S+bg zF^e(QNh24`Y&a=FJOY0_^Oq|=qZyj9GY-Z%XzQaH7sy?yDCY(_&mavlUXTe?lsU)L z4qE!?PAgM4NS}(vcV;yHQ_+}~n0k;1R>Bf92LbQ-GsrZ6Ot`w9&YG%TT{yE>r*nMK z;P34WGnW8wOC`JzC7QXc$EooQGFL#Ra=e?EKqt+(nPy#A5acTI4Aw#<=1dqQS}P$+ zo}a&da(w<`g|W5@V>eHZF%hOkM|Jfyn+*L9thO>g8MH!nyQ=2FPtTkO*8qLx7+yE? zAPN#4C;e}sj%D|czuCGw2(<)`p$UNhP_--7TGl7IhoI3PXP%V z94fKvdG-MDUZFIJW7cY&*r%e9^1%uKLZB!!zTAJo8$9Yc@5i(dEs%9$DRx? zrIAn|N6>u=j)zeTBFDlgjo^e#Vf(7U=Q0xZ&mr*=5%=5zfz~J2#4L1x}Ko?MSbQLYkL!_}Fdo#Bwqmxee;_;uDt3 zWUxJ>6a2KHVE80;7z6tG8#KAZJPX|O;0rB_*j>o1vWPE;NPg-!L)Nh>;Mzc_Ok5bB9|lS3cWfOrXxv))Zp_X3^>fifoz1~2I&b`C~zs5nc)kNZhSsn zLgZ}=*NrYNOtOnie4d@29gk08?;8n$m#}9{Up~4wh`jP)?`oWC9Yg zV{DWe8y$~h7tv_Us+;EWr3H~(O@&N+ft^{Ln!;|ez#qOHUSL_W3WPK;FC!sUlzE9| z(TCu}Yxq(4!Pp1MMW_Q(G6g!Q{e zEjLEDnU@V}V?yywz?5fpE!1%)P7&%aJdhB$5gjgRo%R`sf9Yr zq0XINHT0q48`<;gL%rot?`|lj_-^g_o3@s;=I(NH_il5q;_KV<2ewwVV0Ss#y&EJ0 z2Oc{y>;l6L#|($68b0!AUTqvue1jD{(ucmR`=V|;1Ad1MzeCS1ei`~Av@O4ERU;FM zZ*tGyxOGcwx>0Vrp~MoeYL&iUD4DF8p~~KcV(d zX#I0)|D4wUk=p-}@=#KnWW`rBr+1Y@T>xSATj3i)ODw60B`v|K306yF)kIdw{qB2; z3XjqU6y?87ADnj+HqHSXfn#hmS7pO=3PKqnq1^LFp54-}_Li^q?p`&5aCXoKt{MWs z2>|Mk0SHtDP$3*wwh~&PryS_nUej*PsPGNUD!w^0{GH`s=k~(OrEizNS=QopsztYL#=u@yps$$jCucsXBd1+IFamAO| z^XpjK%YpVC`wQ1|mo_k|4oqqT_tk;>+Q70pu&k^U)xf6Wdt$DpwsK?J_R`nOUoC5~ zxEhOVu^BZsqs5lg*pl)~QEe)G=|WVJ}F9ErW`QzMg# z@6Iu>+v7X(tIfZb{!-FrS#_4xX4ll&HEp(_&K7{WP0KXlta(N!YnC=wNOw8hy_0xx z=lLCNXi6QL(uNk*p+#-zp*r+XNfp(w;ihi5ryS|oS$eVjd|4ZwR)?px;U#r=NgG~K zhgX#Jx|aU63g5_Y6yIM}(Htqr9`kux%&!`olk3e4eIL^|AfvXDGHxh;K&Co}jE(WvD*Siq`VaQ|7K{Bex8`eAeXakbNKe=DAD`orV*mgE literal 0 HcmV?d00001 diff --git a/backend/myproject/projects/migrations/__pycache__/__init__.cpython-313.pyc b/backend/myproject/projects/migrations/__pycache__/__init__.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f2000c180573f8c18d05ac73d8ccd3e54318d913 GIT binary patch literal 183 zcmey&%ge<81akk@rGx0lAOZ#$p^VQgK*m&tbOudEzm*I{OhDdekkqX(XRDad;?$zz zn52xvqQn@N)Z*-t`~o0drW;a}n4GQaSWpm?1Z1S>P{wB#AY&>+I)f&o-%5reCLr%KNa|LAvsFxJacWU< zOj1T-QDTfsYH@Z+egTj!(+w#~OwQJIEGURc0y0wbQetu|3ySiyQj<$!ic-@vi%W_U yOEUBGieuvAGxIV_;^XxSDsOSvvgsIiMKC_{hx2$XLV-WB~xpqAuJ3 literal 0 HcmV?d00001 diff --git a/backend/myproject/registrations/__pycache__/apps.cpython-313.pyc b/backend/myproject/registrations/__pycache__/apps.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..878034973bcf45821e363df84f23d6aa5c6a0890 GIT binary patch literal 555 zcmY*W&ubGw6rS1L#I!M3Z56Ew>Y=cQ=2nnWgqYGpD?K>sX<(RSC)-UnyW2Ojh4g5l z|3RRCfETa*OL{B=o_gx75WV{*n}WW>d*9=G-{bw5wOY#r?c3$|_y@)tm)u)z0cINr zri2kj56C_R`i49w?+EkO3G+GK@~b-V;vlTux+J7_sZ$i)JR2l&zoIKo7s>1uf+^ty zC?nu83O@57U_R7X0QI;Q*6r$N6(`z&G)bQ6s@ZLTy3^OuP-b!7j(Y8J9;sBfKPGXf zH2Gel(#W>pU*S)37(TEKAu>5uLfB;?P*kQ4KNRA)l<9(bB*Y*AZPFxDS&sCRNDX9} z8X>Vaa;|ycitSS&w86ppLK*`}uQW;v0S%mP=2oulU_9CU z0jm~9J=yovy_lmi5>+2S}b8`LS{Z;Vny19O~3oG~h zVd&fD;yO+Y?m3m*%~lmYMr0d1)fGO#DyHr)dJWy3PbvLH-u|w8^yNkPhhUhi{sJ(6 Bm*D^a literal 0 HcmV?d00001 diff --git a/backend/myproject/registrations/__pycache__/models.cpython-313.pyc b/backend/myproject/registrations/__pycache__/models.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f89f7d3dcfb197a68325eceb2fd66cd728818cb2 GIT binary patch literal 1432 zcmaJ>&2Jk;6rc63KX=_EmV>R5R8hguC2BaeQc&e8wcUf=M9_6Ov>T1ayA!j?ewf)c zD7OeC{sW|P0&yxg;6i(%e}Ziejz+3L>Zv!Rz@0a{HUYKCXm|EE@6CH}-uu1T(_*oJ zV0`@Z7yVTkp%-E?AL$u5eE{HVWFSN8pti)MHGxx|R9j|pjOC8fPP247!!qqG%dVj+ zx{3_tGBVPpbboQ~@a%g7Vu``>{fwS{DWER#j2GC{4FMGz!!QcG-HIKPRQWFVF@Bqp26{W$OW*5rE?nHkVr z`oC1HjMQd|<<7OrUtm=@*Ge_SIbIh{*_4@ffnE9nyCUdTUd;gb$Qap8i7kMB?REMa zGa*|#H*yIy@4RXYo-;;nQ(sTamf`q=8f)pS)ANUy9q!HzX zeTRh+9x%GEr?|$bOCoAxpLmq1u$!wPwF2LccXYv4Bf}`be(*Uawyn#_CdD7RE>HJd z;vfEicJw!R4#z$)<^_zQvxY7OtYQ4=khsD-tQIhiqq~kz{QzSo`jQv!28=p=zeA6h zA_UpSmeJU1wzx8cj$|1jOIxA=nYbi;@hk<(sBcle^q(`&M8ziL)pb02*P*V>7s**^ zunj7%-3bDh5gdY*Pj3ENe_9`F?c>%-Wp!G)HmO{D{N}S;qlaYr&>6#1IT$JBlj@aeRi9M#$Lr6w zM|;+E?{ExH)g39zvEBNlvi_tzuGGcmQgvFYO-i-jO79+bPRf_3<=UiN`_6%2x1Zh~ zeY88;Bja-K%Wd}d{Lnjkf#>Z5;`f6MyO&UY$)jEm3bc_Vnb5v4tHZxiL3Yf3LP$FP z=Oon-#ZE%h0P)7!R6ke7eFBm)E*v8PvqK-|Bqd19NNU7Q?VB@y_OT!vRF*KtE#&l!YC9_Lh zEJck}spqItq#S*0Pf1S6(K)3@mK@d^scNL2awBqk@7rB)ESa1lWd+Q z0S^PuGyCIm)5$RZ7)190+I$W(usmdVhPN#<#0D$7%r4o9J#6so%Z?={aW1)tE6j{B z6AbSNF}ySH%nWw)k1a8~MUcL-E$Vt>5NlBzsDyp7m-mN-!L$_LEu7<-@H z5472%uD!e6s`W*V4<^`)HZsD8$Y}YK=o#u>?M~er4gy$*LF8&gzKx5jLcNzRUAl}! zNmNClLIdAh{A8_G5sT)et{P)XS+TT8+3yyj4(b)^s*H*R3o0(r{u&Xh0%@Ra+@Nj+ z6MzwSG4MS;j6}%hjdO6$K zm~8XhfEe7egupedV#=yA^=*knQBjTHEljXf#MJYSvpakQRg$ZMC|MwOVoVqH5?nEY zF?}TggXLFnQI<-_;rfrU=s?$3q++4EJ9GqZkQTUuItvv++NKVvUa6RtENn*|(gXoG z%+$EHL|iE;f52fGpd2!NK!|z}0+@OQ!`_R~ow`sl#DO}6kQrD-l&~ZNqpwpv;xIfP zR(2rSLIE^OxQ3+?(-%MRk3EX$q4TZK`6pY?#HXSjU)17@di&ZNWp_aNp6$A!d^Te$^Pn7fG^z(@TEUqo8_#Y&y{X62 zS}d){*0k7~9^24j8_ir%&nX&wf@;%OZ~NWDgKwQ)x2J6%9CH1#L_Y5pDaz5H)n~J% z!mK%R%51mU$YrBr`aADolDDi0a35)y!(w*1Rd=J$EbxS(%6(}~-`C_TAdUYKig7u& k?KYe3(8bt3{fi0z%}oF63fNo^Ji2dE^G*K80AXVM58Av&*#H0l literal 0 HcmV?d00001 diff --git a/backend/myproject/registrations/migrations/__pycache__/__init__.cpython-313.pyc b/backend/myproject/registrations/migrations/__pycache__/__init__.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9c72f47218b4a5439d29db20ec817f23333d8a58 GIT binary patch literal 188 zcmey&%ge<81mbI((n0iN5CH>>P{wB#AY&>+I)f&o-%5reCLr%KNa|L!vsFxJacWU< zOj1T-QDTfsYH@Z+egTj!(+w#~OwQJIEGURc0y0wbQetu|3ySiyQj<$!ic-@vi%W_U zOEUBGieqv!(_zf`_{_Y_lK6PNg34PQHo5sJr8%i~MXW%(KyE1pF+MUgGBOr116cq~ Chckcx literal 0 HcmV?d00001 diff --git a/backend/myproject/requirements.txt b/backend/myproject/requirements.txt index 2444e13..25770bf 100644 --- a/backend/myproject/requirements.txt +++ b/backend/myproject/requirements.txt @@ -1,58 +1,19 @@ annotated-types==0.7.0 asgiref==3.8.1 -asttokens==2.4.1 -cffi==1.16.0 -colorama==0.4.6 -comm==0.2.2 +cffi==1.17.1 contextlib2==21.6.0 -cryptography==43.0.0 -debugpy==1.8.1 -decorator==5.1.1 -dj-database-url==2.2.0 -Django==5.0.7 -django-cors-headers==4.4.0 -django-enumfields==2.1.1 -django-heroku==0.3.1 -django-ninja==1.2.2 -django-ninja-extra==0.21.2 -django-ninja-jwt==5.3.2 -django-phonenumber-field==8.0.0 -djangorestframework==3.15.2 -djangorestframework-simplejwt==5.3.1 -executing==2.0.1 -gunicorn==22.0.0 +cryptography==44.0.1 +Django==5.1.6 +django-cors-headers==4.7.0 +django-ninja==1.3.0 +django-ninja-extra==0.22.3 +django-ninja-jwt==5.3.5 injector==0.22.0 -ipykernel==6.29.4 -ipython==8.24.0 -jedi==0.19.1 -jupyter_client==8.6.1 -jupyter_core==5.7.2 -matplotlib-inline==0.1.7 -nest-asyncio==1.6.0 -packaging==24.0 -parso==0.8.4 -phonenumberslite==8.13.42 -platformdirs==4.2.2 -prompt-toolkit==3.0.43 -psutil==5.9.8 -pure-eval==0.2.2 +pillow==11.1.0 pycparser==2.22 -pydantic==2.8.2 -pydantic_core==2.20.1 -Pygments==2.18.0 -PyJWT==2.9.0 -python-dateutil==2.9.0.post0 -pywin32==306 -pyzmq==26.0.3 -setuptools==69.5.1 -six==1.16.0 -sqlparse==0.5.1 -stack-data==0.6.3 -tornado==6.4 -traitlets==5.14.3 +pydantic==2.10.6 +pydantic_core==2.27.2 +PyJWT==2.10.1 +sqlparse==0.5.3 typing_extensions==4.12.2 -tzdata==2024.1 -wcwidth==0.2.13 -wheel==0.43.0 -whitenoise==6.7.0 - +tzdata==2025.1 From 5bf63dfc25b405c2408c5dfc7ebea639ca2ce98b Mon Sep 17 00:00:00 2001 From: bharathan06 Date: Fri, 14 Feb 2025 14:22:03 +0530 Subject: [PATCH 19/63] redundant requirements deleted --- requirements.txt | Bin 1790 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 requirements.txt diff --git a/requirements.txt b/requirements.txt deleted file mode 100644 index bcd856cbbc3466a5acf29c8ccfedfcc9b4342cc9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1790 zcmZ{l(QevM5Jc~DrG5$#CX^-*ed`DG46j&d$!g z`SUwZjXtL|q+Cy#inP%G*VO8JpT6j`Ob_X^o@M%&J_yyPD(zFJ`m5C+ReREt-RgrF zPU$E_Gjgm{U*9l0Rck$+*xvL+7Z4j`0r93!RCs@7l|roBbe4uzDye6xP5r6!Hr%M_ z4D-o)hsGiuG-Y9kTx`r#>X)<7wc)*A%=}e&e5%ApN7&pI9DyyWi?Mevw(sK1RV~Hp zPBI^lJ9+;e=uZ4csfej@)?K~FHuAr*t}*}IpShY=Do(<(iL?CNT9<`3x7W8?>R`Y< z=5bwRdRJ{H{9t`5!_WbY>#0;lg*)Ahh`>0{-Zn%EI#b}zZp5)l&-!<5`*hSW>I^lj znNJ5X6zUbOWcIe}I7kOMAh}(7k)GNnYxGNS(eZz1@=+R+osx1-8L1q^OiBmi+-jq^ z4nKZQYIu(v@M|yhLhts{)JV;KObi)Chda{>vD2n=J4xgUw)xB;NR8(W-`SBn_V1nc zrVJlq?ktg?^*9l;Fw?6zJ0$@}=ee8`)arLmUu&~)hB&Q9;oVbMQM496bGOpzS@8|y zB>R23Rj-zlR&%b#NgeS#A~<)PzcT%lMrWbJT+>yGIb~#WcVod7-xw*FBgn$EU1yr| z`%UOdGjc8l>39FhiJt|Zi(L8niQA&Qn-o?ig|}5VwjUe5reEU!F*5t^A4bQxZ3atj zxa$fw#^!ew3VO}@ZVconn) i07T@0R6BwjlRGS`mM<-?G0I Date: Sat, 15 Feb 2025 11:47:53 +0530 Subject: [PATCH 20/63] Themes Updated People can chat gpt the themes and colors to get and Idea how these works, But generating a sample page with thier implementation --- frontend/lib/theme/colors.dart | 21 +++++++++ frontend/lib/theme/theme.dart | 80 ++++++++++++++++++++++++++++++++++ 2 files changed, 101 insertions(+) create mode 100644 frontend/lib/theme/theme.dart diff --git a/frontend/lib/theme/colors.dart b/frontend/lib/theme/colors.dart index e69de29..8980fc4 100644 --- a/frontend/lib/theme/colors.dart +++ b/frontend/lib/theme/colors.dart @@ -0,0 +1,21 @@ +import 'package:flutter/material.dart'; + +class AppColors { + // Light Theme Colors + static const Color primaryLight = Color(0xFF6200EA); + static const Color secondaryLight = Color(0xFF03DAC6); + static const Color backgroundLight = Color(0xFFF5F5F5); + static const Color textPrimaryLight = Color(0xFF212121); + static const Color textSecondaryLight = Color(0xFF757575); + static const Color accentLight = Color(0xFFFFC107); + static const Color neutralLight = Color(0xFF666666); + + // Dark Theme Colors (Based on MUI Theme) + static const Color primaryDark = Color(0xFF1F2A40); + static const Color secondaryDark = Color(0xFF4cceac); + static const Color backgroundDark = Color(0xFF141b2d); + static const Color textPrimaryDark = Color(0xFFE0E0E0); + static const Color textSecondaryDark = Color(0xFFA3A3A3); + static const Color accentDark = Color(0xFF6870fa); + static const Color neutralDark = Color(0xFF3d3d3d); +} diff --git a/frontend/lib/theme/theme.dart b/frontend/lib/theme/theme.dart new file mode 100644 index 0000000..bf3d8dc --- /dev/null +++ b/frontend/lib/theme/theme.dart @@ -0,0 +1,80 @@ +import 'package:flutter/material.dart'; +import 'colors.dart'; + +class AppTheme { + // Light Theme + static final ThemeData lightTheme = ThemeData( + brightness: Brightness.light, + primaryColor: AppColors.primaryLight, + scaffoldBackgroundColor: AppColors.backgroundLight, + colorScheme: ColorScheme.light( + primary: AppColors.primaryLight, + secondary: AppColors.secondaryLight, + background: AppColors.backgroundLight, + onBackground: AppColors.textPrimaryLight, + surface: AppColors.backgroundLight, + onSurface: AppColors.textPrimaryLight, + ), + textTheme: const TextTheme( + displayLarge: TextStyle( + fontSize: 40, + fontWeight: FontWeight.bold, + color: AppColors.textPrimaryLight), + displayMedium: TextStyle( + fontSize: 32, + fontWeight: FontWeight.bold, + color: AppColors.textPrimaryLight), + displaySmall: TextStyle( + fontSize: 24, + fontWeight: FontWeight.bold, + color: AppColors.textPrimaryLight), + headlineLarge: TextStyle( + fontSize: 20, + fontWeight: FontWeight.bold, + color: AppColors.textPrimaryLight), + titleLarge: TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold, + color: AppColors.textPrimaryLight), + bodyLarge: TextStyle(fontSize: 14, color: AppColors.textSecondaryLight), + ), + ); + + // Dark Theme + static final ThemeData darkTheme = ThemeData( + brightness: Brightness.dark, + primaryColor: AppColors.primaryDark, + scaffoldBackgroundColor: AppColors.backgroundDark, + colorScheme: ColorScheme.dark( + primary: AppColors.primaryDark, + secondary: AppColors.secondaryDark, + background: AppColors.backgroundDark, + onBackground: AppColors.textPrimaryDark, + surface: AppColors.backgroundDark, + onSurface: AppColors.textPrimaryDark, + ), + textTheme: const TextTheme( + displayLarge: TextStyle( + fontSize: 40, + fontWeight: FontWeight.bold, + color: AppColors.textPrimaryDark), + displayMedium: TextStyle( + fontSize: 32, + fontWeight: FontWeight.bold, + color: AppColors.textPrimaryDark), + displaySmall: TextStyle( + fontSize: 24, + fontWeight: FontWeight.bold, + color: AppColors.textPrimaryDark), + headlineLarge: TextStyle( + fontSize: 20, + fontWeight: FontWeight.bold, + color: AppColors.textPrimaryDark), + titleLarge: TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold, + color: AppColors.textPrimaryDark), + bodyLarge: TextStyle(fontSize: 14, color: AppColors.textSecondaryDark), + ), + ); +} From 69ac5e91131ec47efe0578ede113ea228e6a2ff2 Mon Sep 17 00:00:00 2001 From: Piyush Chakarborthy <102757301+Chakravartinsamrat@users.noreply.github.com> Date: Sat, 15 Feb 2025 12:18:06 +0530 Subject: [PATCH 21/63] Sample Page Added --- .../common_pages/Theme-Demo-Page/sample.dart | 94 +++++++++++++++++++ frontend/lib/pages/home.dart | 7 +- frontend/pubspec.lock | 26 ++--- 3 files changed, 111 insertions(+), 16 deletions(-) create mode 100644 frontend/lib/pages/common_pages/Theme-Demo-Page/sample.dart diff --git a/frontend/lib/pages/common_pages/Theme-Demo-Page/sample.dart b/frontend/lib/pages/common_pages/Theme-Demo-Page/sample.dart new file mode 100644 index 0000000..1f85d9b --- /dev/null +++ b/frontend/lib/pages/common_pages/Theme-Demo-Page/sample.dart @@ -0,0 +1,94 @@ +import 'package:flutter/material.dart'; +import 'package:dev_track_app/theme/theme.dart'; // Import your theme file + +class ThemedPage extends StatelessWidget { + const ThemedPage({super.key}); + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + final colorScheme = theme.colorScheme; + final textTheme = theme.textTheme; + + return Scaffold( + appBar: AppBar( + title: Text('Themed Page', style: textTheme.headlineLarge), + backgroundColor: colorScheme.primary, + ), + body: Padding( + padding: const EdgeInsets.all(20.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // Text Styles + Text('Display Large', style: textTheme.displayLarge), + Text('Display Medium', style: textTheme.displayMedium), + Text('Display Small', style: textTheme.displaySmall), + Text('Headline Large', style: textTheme.headlineLarge), + Text('Title Large', style: textTheme.titleLarge), + Text('Body Large (Secondary Text)', style: textTheme.bodyLarge), + const SizedBox(height: 20), + + // Themed Buttons + ElevatedButton( + onPressed: () {}, + style: ElevatedButton.styleFrom( + backgroundColor: colorScheme.primary, + ), + child: Text('Primary Button', style: textTheme.titleLarge), + ), + const SizedBox(height: 10), + ElevatedButton( + onPressed: () {}, + style: ElevatedButton.styleFrom( + backgroundColor: colorScheme.secondary, + ), + child: Text('Secondary Button', style: textTheme.titleLarge), + ), + const SizedBox(height: 10), + OutlinedButton( + onPressed: () {}, + style: OutlinedButton.styleFrom( + foregroundColor: colorScheme.onBackground, + ), + child: Text('Outlined Button', style: textTheme.titleLarge), + ), + const SizedBox(height: 20), + + // Colored Containers + Container( + height: 50, + width: double.infinity, + color: colorScheme.surface, + child: Center( + child: Text('Surface Color', style: textTheme.bodyLarge), + ), + ), + const SizedBox(height: 10), + Container( + height: 50, + width: double.infinity, + color: colorScheme.background, + child: Center( + child: Text('Background Color', style: textTheme.bodyLarge), + ), + ), + const SizedBox(height: 20), + + // Accent Color + Container( + height: 50, + width: double.infinity, + color: Theme.of(context).brightness == Brightness.light + ? const Color(0xFFFFC107) // Light mode accent color + : const Color(0xFF6870fa), // Dark mode accent color + child: Center( + child: Text('Accent Color', style: textTheme.bodyLarge), + ), + ), + ], + ), + ), + ); + } +} diff --git a/frontend/lib/pages/home.dart b/frontend/lib/pages/home.dart index d82c511..7fce26b 100644 --- a/frontend/lib/pages/home.dart +++ b/frontend/lib/pages/home.dart @@ -1,4 +1,5 @@ -import 'package:dev_track_app/utils/bottom_nav_bar.dart'; +// import 'package:dev_track_app/utils/bottom_nav_bar.dart'; +import 'package:dev_track_app/pages/common_pages/Theme-Demo-Page/sample.dart'; import 'package:dev_track_app/pages/admin_pages//mgmg_prev_projects.dart'; import 'package:dev_track_app/pages/user_pages/project_pages/project_display/previous_projects.dart'; import 'package:dev_track_app/theme/splashscreen.dart'; @@ -78,9 +79,9 @@ class HomePag extends StatelessWidget { ), onPressed: () { Navigator.push(context, - MaterialPageRoute(builder: (context) => BottomNavBar())); + MaterialPageRoute(builder: (context) => ThemedPage())); }, - child: Text("Bottom Nav"), + child: Text("Theme Page Implementation"), ), ElevatedButton( style: ElevatedButton.styleFrom( diff --git a/frontend/pubspec.lock b/frontend/pubspec.lock index 1059a7f..72a8c4b 100644 --- a/frontend/pubspec.lock +++ b/frontend/pubspec.lock @@ -37,7 +37,7 @@ packages: dependency: transitive description: name: collection - sha256: a1ace0a119f20aabc852d165077c036cd864315bd99b7eaa10a60100341941bf + sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a url: "https://pub.dev" source: hosted version: "1.18.0" @@ -252,18 +252,18 @@ packages: dependency: transitive description: name: leak_tracker - sha256: "7bb2830ebd849694d1ec25bf1f44582d6ac531a57a365a803a6034ff751d2d06" + sha256: "7f0df31977cb2c0b88585095d168e689669a2cc9b97c309665e3386f3e9d341a" url: "https://pub.dev" source: hosted - version: "10.0.7" + version: "10.0.4" leak_tracker_flutter_testing: dependency: transitive description: name: leak_tracker_flutter_testing - sha256: "9491a714cca3667b60b5c420da8217e6de0d1ba7a5ec322fab01758f6998f379" + sha256: "06e98f569d004c1315b991ded39924b21af84cf14cc94791b8aea337d25b57f8" url: "https://pub.dev" source: hosted - version: "3.0.8" + version: "3.0.3" leak_tracker_testing: dependency: transitive description: @@ -276,10 +276,10 @@ packages: dependency: transitive description: name: lints - sha256: c35bb79562d980e9a453fc715854e1ed39e24e7d0297a880ef54e17f9874a9d7 + sha256: "976c774dd944a42e83e2467f4cc670daef7eed6295b10b36ae8c85bcbf828235" url: "https://pub.dev" source: hosted - version: "5.1.1" + version: "4.0.0" matcher: dependency: transitive description: @@ -545,10 +545,10 @@ packages: dependency: transitive description: name: test_api - sha256: "664d3a9a64782fcdeb83ce9c6b39e78fd2971d4e37827b9b06c3aa1edc5e760c" + sha256: "9955ae474176f7ac8ee4e989dadfb411a58c30415bcfb648fa04b2b8a03afa7f" url: "https://pub.dev" source: hosted - version: "0.7.3" + version: "0.7.0" typed_data: dependency: transitive description: @@ -633,10 +633,10 @@ packages: dependency: transitive description: name: vm_service - sha256: f6be3ed8bd01289b34d679c2b62226f63c0e69f9fd2e50a6b3c1c729a961041b + sha256: "3923c89304b715fb1eb6423f017651664a03bf5f4b29983627c4da791f74a4ec" url: "https://pub.dev" source: hosted - version: "14.3.0" + version: "14.2.1" web: dependency: transitive description: @@ -662,5 +662,5 @@ packages: source: hosted version: "1.1.0" sdks: - dart: ">=3.6.0 <4.0.0" - flutter: ">=3.27.0" + dart: ">=3.4.0 <4.0.0" + flutter: ">=3.22.0" From 2395b7d0d87840ba0537673878254648e226736c Mon Sep 17 00:00:00 2001 From: yvaishalirao Date: Sat, 15 Feb 2025 22:37:40 +0530 Subject: [PATCH 22/63] hald done domain page - horizontal cards left --- frontend/lib/pages/common_pages/domain.dart | 70 +++++++++++++++++++-- 1 file changed, 66 insertions(+), 4 deletions(-) diff --git a/frontend/lib/pages/common_pages/domain.dart b/frontend/lib/pages/common_pages/domain.dart index 177aedd..f21ec50 100644 --- a/frontend/lib/pages/common_pages/domain.dart +++ b/frontend/lib/pages/common_pages/domain.dart @@ -1,18 +1,24 @@ -import 'package:dev_track_app/pages/common_pages/topNav.dart'; import 'package:flutter/material.dart'; import 'package:google_fonts/google_fonts.dart'; -class DomainPage extends StatelessWidget { +class DomainPage extends StatefulWidget { const DomainPage({super.key}); + @override + State createState() => _DomainPageState(); +} + +class _DomainPageState extends State { @override Widget build(BuildContext context) { return SafeArea( child: Scaffold( - backgroundColor: const Color(0xFF040D12), + appBar: appBarCommon(), + backgroundColor: Colors.white, body: Column( children: [ - const TopNav(), + searchBar(), + welcomeBack(), cycleCard(), const SizedBox(height: 40), Expanded(child: domianGrid()), @@ -164,6 +170,62 @@ class DomainPage extends StatelessWidget { }, ); } + + PreferredSizeWidget appBarCommon() { + return AppBar( + elevation: 0.00, + backgroundColor: Colors.white, + actions: [ + IconButton( + icon: const Icon(Icons.notifications), + tooltip: 'Setting Icon', + onPressed: () {}, + ), //IconButton + ], + ); + } + + Widget searchBar() { + return Container( + padding: EdgeInsets.all(16), + child: TextField( + decoration: InputDecoration( + labelText: 'search all projects', + border: OutlineInputBorder( + borderRadius: BorderRadius.all(Radius.circular(20.0)), + ), + prefixIcon: Icon(Icons.search), + ), + ), + ); + } + + Widget welcomeBack() { + return Container( + padding: const EdgeInsets.all(10), + margin: const EdgeInsets.symmetric(horizontal: 14), + child: Column( + children: [ + Row( + children: [ + Text( + 'Welcome Back,', + style: TextStyle(fontSize: 30), + ), + ], + ), + Row( + children: [ + Text( + 'STUDENT', + style: TextStyle(fontSize: 40), + ), + ], + ) + ], + ), + ); + } } final List> domainData = [ From 2a1ba856e9638364e696823927f212c450624917 Mon Sep 17 00:00:00 2001 From: bharathan06 Date: Sun, 16 Feb 2025 00:03:48 +0530 Subject: [PATCH 23/63] login feature implemented with session based id, management command for ingesting new users has also been added, old bugs fixed --- .../__pycache__/admin.cpython-313.pyc | Bin 0 -> 221 bytes backend/myproject/db.sqlite3 | Bin 282624 -> 303104 bytes .../members/__pycache__/admin.cpython-313.pyc | Bin 0 -> 732 bytes .../members/__pycache__/api.cpython-313.pyc | Bin 4523 -> 5575 bytes backend/myproject/members/admin.py | 8 +- backend/myproject/members/api.py | 89 +++++++++--------- .../myproject/members/management/__init__.py | 0 .../__pycache__/__init__.cpython-313.pyc | Bin 0 -> 182 bytes .../members/management/commands/__init__.py | 0 .../__pycache__/__init__.cpython-313.pyc | Bin 0 -> 191 bytes .../__pycache__/import_users.cpython-313.pyc | Bin 0 -> 5049 bytes .../management/commands/import_users.py | 81 ++++++++++++++++ .../__pycache__/settings.cpython-313.pyc | Bin 3439 -> 3606 bytes .../__pycache__/urls.cpython-313.pyc | Bin 629 -> 717 bytes .../__pycache__/wsgi.cpython-313.pyc | Bin 0 -> 665 bytes backend/myproject/myproject/settings.py | 51 ++++++---- backend/myproject/myproject/urls.py | 2 +- .../__pycache__/admin.cpython-313.pyc | Bin 0 -> 216 bytes .../__pycache__/admin.cpython-313.pyc | Bin 0 -> 221 bytes frontend/pubspec.lock | 38 ++++---- 20 files changed, 187 insertions(+), 82 deletions(-) create mode 100644 backend/myproject/announcements/__pycache__/admin.cpython-313.pyc create mode 100644 backend/myproject/members/__pycache__/admin.cpython-313.pyc create mode 100644 backend/myproject/members/management/__init__.py create mode 100644 backend/myproject/members/management/__pycache__/__init__.cpython-313.pyc create mode 100644 backend/myproject/members/management/commands/__init__.py create mode 100644 backend/myproject/members/management/commands/__pycache__/__init__.cpython-313.pyc create mode 100644 backend/myproject/members/management/commands/__pycache__/import_users.cpython-313.pyc create mode 100644 backend/myproject/members/management/commands/import_users.py create mode 100644 backend/myproject/myproject/__pycache__/wsgi.cpython-313.pyc create mode 100644 backend/myproject/projects/__pycache__/admin.cpython-313.pyc create mode 100644 backend/myproject/registrations/__pycache__/admin.cpython-313.pyc diff --git a/backend/myproject/announcements/__pycache__/admin.cpython-313.pyc b/backend/myproject/announcements/__pycache__/admin.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1b690e43baf5358d9f828dcc714c2b8884932b33 GIT binary patch literal 221 zcmey&%ge<81mbI((w%_xV-N=hn4pZ$0zk%8hG2$ZMsEf$#v(=qhIA%P=9eI8O~zZS zi7C06d48HqxA;=B67$mY^^)`RN{TX*ikN{4Rx*4Bsk`OtY!wq)oLW>Ila!HIlo;cZ zTAW>yUjU@bbVG^~le2Xl3kqVAfQ;0nrZWO@F^KVjnURt49)m&=8;}D49|k*Y literal 0 HcmV?d00001 diff --git a/backend/myproject/db.sqlite3 b/backend/myproject/db.sqlite3 index 51b08f268080b332623ce33ed76f8c1d9bc2fed9..c830e0054396bc4b607e3440ba8413a8e06a22c5 100644 GIT binary patch delta 4135 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 AMF0Q* delta 475 zcmZoTAk?rxaDud;76Su=D-gqg*F+s-Ni7DwvTjzO5HtTrkc1ikZ~kxmAKA+{R+R8d zD=DNTmHmGt3utauR5;JI`M(r1E8iss7XHah{JZ%l^S|U@ zvso~qnV(ghiP@NOaw4xVBmd+z`l{w4K%L?oDOrhm>G|==`FSO&c_r~Bl?B4g%-W2J zr6n2h1*t{3nZ?DK`FS>Z#auw;{CwpMo4E|4_$CJkh;A;o>t$rN;j);_?oheeQD6t> zW(%(~tjzp;Ws}(hBTG?43@JPFe)$#OlJ*X%w}RZFkLW;$zb}+Xr`X+dV!4B{>ce2Br$MrmPSEjKsccP>XhEyl0B)!UTxn>6YY&-R3*uG>yn6fe`}KS85Ao)5+thh2 zIu_X^-wE@~Tnf!QYL^O@i9*Ma7Rm{gB~g2aCS3P>?qTjems_hdAI=-~2=5Rz&#BD+ x@Y`mL{eb>I7uekk=6>9Gw{hluWw-xY7Q25YzpZY4S>39DNM(by{>OxC+5b)3yw(5! literal 0 HcmV?d00001 diff --git a/backend/myproject/members/__pycache__/api.cpython-313.pyc b/backend/myproject/members/__pycache__/api.cpython-313.pyc index d1cd17f49543f60e640c7c4bf9be75880133a452..ac4c364d4b440735c2b06b9c52b4a9e8bd5ebaff 100644 GIT binary patch literal 5575 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 literal 4523 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 diff --git a/backend/myproject/members/admin.py b/backend/myproject/members/admin.py index 8c38f3f..a75af42 100644 --- a/backend/myproject/members/admin.py +++ b/backend/myproject/members/admin.py @@ -1,3 +1,9 @@ from django.contrib import admin -# Register your models here. + +from .models import CustomUser + +@admin.register(CustomUser) +class CustomUserAdmin(admin.ModelAdmin): + list_display = ("email", "first_name", "last_name", "srn", "is_active", "is_staff") + search_fields = ("email", "srn") \ No newline at end of file diff --git a/backend/myproject/members/api.py b/backend/myproject/members/api.py index 5d3f0c3..9339eaa 100644 --- a/backend/myproject/members/api.py +++ b/backend/myproject/members/api.py @@ -1,86 +1,91 @@ -from django.contrib.auth import authenticate, logout +import os +from django.contrib.auth import authenticate, logout, login from .models import CustomUser as User +from django.core.management import call_command from . import schemas from django.http import JsonResponse from django.shortcuts import get_object_or_404 -from ninja_jwt.controller import NinjaJWTDefaultController -from ninja_jwt.authentication import JWTAuth -from ninja_jwt.tokens import RefreshToken from ninja_extra import NinjaExtraAPI, ControllerBase, api_controller, route +from django.middleware.csrf import get_token +from ninja import UploadedFile +from django.core.files.base import ContentFile +from django.core.files.storage import default_storage + from projects.api import ProjectsAPI -@api_controller("/user", tags="User Authentication", auth=JWTAuth()) +@api_controller("/user", tags="User Authentication") class UserAuthAPI(ControllerBase): - #API call for user to login by giving username and password. JWT based session will be created after this. + #API call for user to login by giving username and password. @route.post("/login", url_name="User login", auth=None) def login_view(self, request, payload: schemas.SignInSchema): user = authenticate(request, username=payload.email, password=payload.password) if user is not None: - refresh= RefreshToken.for_user(user) + login(request, user) return { - 'refresh': str(refresh), - 'access': str(refresh.access_token) + "message": "Login successful", + "role": user.role, + "csrf_token": get_token(request) # Provide CSRF token for frontend } return JsonResponse({"detail": "Invalid credentials"}, status=401) - #API call made by a user to logout., auth=JWTAuth() - @route.post("/logout", auth=None) + #API call made by a user to logout. + @route.post("/logout") def logout_view(self, request): logout(request) - return {"message": "Logged out"} + return {"message": "Logged out successfully"} #API call made by user to view their profile. - @route.get("/user", auth=JWTAuth()) - def user(self, request): - return { - "username": request.user.username, - "email": request.user.email, - "github": request.user.github, - "fname" : request.user.fname, - } - - - #API post request for a new user to create a new account. - @route.post("/register", auth=None) - def register(self, request, payload: schemas.RegisterSchema): - try: - user = User.objects.create_user( - username=payload.email, - email=payload.email, - password=payload.password, - first_name= payload.first_name, - last_name= payload.last_name, - ) - refresh = RefreshToken.for_user(user) + @route.get("/user") + def user_profile(self, request): + if request.user.is_authenticated: return { - "refresh": str(refresh), - "access": str(refresh.access_token), + "username": request.user.username, + "email": request.user.email, + "github": request.user.github, + "fname" : request.user.fname, } - except Exception as e: - return JsonResponse({"error": str(e)}, status=400) + return JsonResponse({"detail": "Not logged in"}, status=401) - - @route.put("/edit", auth=JWTAuth() ,response=schemas.RegisterSchema) + @route.put("/edit",response=schemas.RegisterSchema) def edit_profile(self, request, payload : schemas.RegisterSchema): - user= get_object_or_404(User, srn=request.user.srn) + if not request.user.is_authenticated: + return JsonResponse({"detail": "Authentication required"}, status=401) + + user = get_object_or_404(User, srn=request.user.srn) for attr, value in payload.dict().items(): setattr(user, attr, value) user.save() return user + @route.post("/import-users/", url_name="Import Users") + def import_users(self, request, file: UploadedFile): + """API endpoint to import users using the management command""" + file_path = default_storage.save(f"temp/{file.name}", ContentFile(file.read())) + + try: + # Call the management command + call_command("import_users", default_storage.path(file_path)) + except Exception as e: + return {"error": str(e)} + finally: + # Ensure file deletion after processing + if os.path.exists(default_storage.path(file_path)): + os.remove(default_storage.path(file_path)) + + return {"message": "User import initiated successfully!"} + api = NinjaExtraAPI(csrf=False) -api.register_controllers(NinjaJWTDefaultController) api.register_controllers(UserAuthAPI) api.register_controllers(ProjectsAPI) diff --git a/backend/myproject/members/management/__init__.py b/backend/myproject/members/management/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/backend/myproject/members/management/__pycache__/__init__.cpython-313.pyc b/backend/myproject/members/management/__pycache__/__init__.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e2570b8c395fa0b9538ed6428cd28612ddd1a19b GIT binary patch literal 182 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 diff --git a/backend/myproject/myproject/__pycache__/urls.cpython-313.pyc b/backend/myproject/myproject/__pycache__/urls.cpython-313.pyc index c7cf084cd1b3b1471c02f35b69af18c6d41a6a11..fef1663ab52ff38ee81595e0527826239020b777 100644 GIT binary patch delta 273 zcmey$a+a0%GcPX}0}yalZAcH8$ScWsXQH}KJ!6mAsCS9Ot5nnooCg)@hM%&50j1r9elhYUrCf{LfQ4<47G6He2Cy@BS%*e=imqFn^ bgX&!dX&~b+gVskb23F3=GnfonM1U#)PNp2- diff --git a/backend/myproject/myproject/__pycache__/wsgi.cpython-313.pyc b/backend/myproject/myproject/__pycache__/wsgi.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0ec85ce999e89e6cefbac27b3259eb1400d6f648 GIT binary patch literal 665 zcmYjP!EVz)5Z$#yQ#mw3743Odafw9iaLA=XNEHboEu>PN!o`xau_umOd)M0CrlhxW z;R`tN1zh=(B9IV1fe;67p!@*qCTTN=oi{sr^WLm>wy|L$9j`vUjXq$6eig+sN((R> zYVaPpNFW!x#sL;sXY;_=H-$-%hmY2ml-qn%xy4K5mfSl{V_s>Vxr3UEmRO67+S$ThIl7O>O9FY+hB%Nl0pFp64N!-EhYITyZCaEaB4>m~zf#6g$?RV$og==l3H}esSlo*vPkA z`+L34q3^c){cf-0`Y#V#$1mC!n>YL05|oNrBx~io?EBh;@8<@W`MtRnJJ1{0#b9A- zsk{tq5)009OA|vF(X&M5l@-m8XjXX2pFiF8jwJ}`4aZbauLbf{@l5AQy)S5RTHnhu zZ>RyV(7W-of(lVPo963}=kNYRRP|u}n~-ei5^&36$R(HNsA6!<%T}}EA`gO$9 literal 0 HcmV?d00001 diff --git a/backend/myproject/myproject/settings.py b/backend/myproject/myproject/settings.py index eb8fb47..fbc742a 100644 --- a/backend/myproject/myproject/settings.py +++ b/backend/myproject/myproject/settings.py @@ -31,27 +31,11 @@ ALLOWED_HOSTS = [] -from datetime import timedelta -#Django-ninja jwt settings -NINJA_JWT = { - 'ACCESS_TOKEN_LIFETIME': timedelta(minutes=5), - 'REFRESH_TOKEN_LIFETIME': timedelta(days=1), - 'ROTATE_REFRESH_TOKENS': True, - 'BLACKLIST_AFTER_ROTATION': True, - 'ALGORITHM': 'HS256', - 'SIGNING_KEY': SECRET_KEY, - 'VERIFYING_KEY': None, - 'AUTH_HEADER_TYPES': ('Bearer',), - 'USER_ID_FIELD': 'id', - 'USER_ID_CLAIM': 'user_id', -} - - # Application definition INSTALLED_APPS = [ - # 'django.contrib.admin', + 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', @@ -60,13 +44,23 @@ 'members', 'ninja', 'corsheaders', - 'ninja_jwt', 'ninja_extra', 'projects', 'announcements', 'registrations', + ] +AUTHENTICATION_BACKENDS = [ + "django.contrib.auth.backends.ModelBackend", +] + +REST_FRAMEWORK = { + 'DEFAULT_AUTHENTICATION_CLASSES': [ + 'rest_framework.authentication.SessionAuthentication', + ] +} + MIDDLEWARE = [ 'whitenoise.middleware.WhiteNoiseMiddleware', "corsheaders.middleware.CorsMiddleware", @@ -163,9 +157,28 @@ CORS_ALLOW_CREDENTIALS = True CORS_ALLOWED_ORIGINS = ["http://localhost:8000"] CSRF_TRUSTED_ORIGINS = ['http://localhost:8000'] +CSRF_USE_SESSIONS = True AUTH_USER_MODEL = 'members.CustomUser' MEDIA_ROOT = os.path.join(BASE_DIR, 'media') -MEDIA_URL = '/media/' \ No newline at end of file +MEDIA_URL = '/media/' + + +# database-backed sessions +SESSION_ENGINE = "django.contrib.sessions.backends.db" + +# Name of the session cookie +SESSION_COOKIE_NAME = "sessionid" + +# Ensure the session expires when the browser is closed +SESSION_EXPIRE_AT_BROWSER_CLOSE = False + +# Set session age (e.g., 2 weeks) +SESSION_COOKIE_AGE = 1209600 # 2 weeks in seconds + +# Secure session settings for production +SESSION_COOKIE_SECURE = False # Set to True in production if using HTTPS +SESSION_COOKIE_HTTPONLY = True +SESSION_COOKIE_SAMESITE = "Lax" # Change to 'None' if working with cross-site requests diff --git a/backend/myproject/myproject/urls.py b/backend/myproject/myproject/urls.py index 91f8e51..7a08a29 100644 --- a/backend/myproject/myproject/urls.py +++ b/backend/myproject/myproject/urls.py @@ -6,6 +6,6 @@ urlpatterns = [ - # path('admin/', admin.site.urls), + path('admin/', admin.site.urls), path("api/", api.urls), ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) diff --git a/backend/myproject/projects/__pycache__/admin.cpython-313.pyc b/backend/myproject/projects/__pycache__/admin.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..02e8454c0b6b9d0112bfe945f4a0ec587d686f9a GIT binary patch literal 216 zcmey&%ge<81mbI((w%_xV-N=hn4pZ$0zk%8hG2$ZMsEf$#v(=qhIA%P=9eI8O~zZS zi7C06d48HqxA;=B67$mY^^)`RN{TX*ikN{4Rx*4Bsk`OjY!wq)oLW>Ila!HIlo;cZ zTAW>yUjU@bbVG^~le2Xl3kqVAfQ;0 cPO4oI2hdIla!HIlo;cZ zTAW>yUjU@bbVG^~le2Xl3kqVAfQ;0nrZWO@F^KVjnURt49)m&=8;}D4B4;~% literal 0 HcmV?d00001 diff --git a/frontend/pubspec.lock b/frontend/pubspec.lock index 72a8c4b..12d4bf6 100644 --- a/frontend/pubspec.lock +++ b/frontend/pubspec.lock @@ -37,10 +37,10 @@ packages: dependency: transitive description: name: collection - sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a + sha256: a1ace0a119f20aabc852d165077c036cd864315bd99b7eaa10a60100341941bf url: "https://pub.dev" source: hosted - version: "1.18.0" + version: "1.19.0" cross_file: dependency: transitive description: @@ -252,18 +252,18 @@ packages: dependency: transitive description: name: leak_tracker - sha256: "7f0df31977cb2c0b88585095d168e689669a2cc9b97c309665e3386f3e9d341a" + sha256: "7bb2830ebd849694d1ec25bf1f44582d6ac531a57a365a803a6034ff751d2d06" url: "https://pub.dev" source: hosted - version: "10.0.4" + version: "10.0.7" leak_tracker_flutter_testing: dependency: transitive description: name: leak_tracker_flutter_testing - sha256: "06e98f569d004c1315b991ded39924b21af84cf14cc94791b8aea337d25b57f8" + sha256: "9491a714cca3667b60b5c420da8217e6de0d1ba7a5ec322fab01758f6998f379" url: "https://pub.dev" source: hosted - version: "3.0.3" + version: "3.0.8" leak_tracker_testing: dependency: transitive description: @@ -292,18 +292,18 @@ packages: dependency: transitive description: name: material_color_utilities - sha256: "0e0a020085b65b6083975e499759762399b4475f766c21668c4ecca34ea74e5a" + sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec url: "https://pub.dev" source: hosted - version: "0.8.0" + version: "0.11.1" meta: dependency: transitive description: name: meta - sha256: "7687075e408b093f36e6bbf6c91878cc0d4cd10f409506f7bc996f68220b9136" + sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7 url: "https://pub.dev" source: hosted - version: "1.12.0" + version: "1.15.0" mime: dependency: transitive description: @@ -500,7 +500,7 @@ packages: dependency: transitive description: flutter source: sdk - version: "0.0.99" + version: "0.0.0" source_span: dependency: transitive description: @@ -513,10 +513,10 @@ packages: dependency: transitive description: name: stack_trace - sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b" + sha256: "9f47fd3630d76be3ab26f0ee06d213679aa425996925ff3feffdec504931c377" url: "https://pub.dev" source: hosted - version: "1.11.1" + version: "1.12.0" stream_channel: dependency: transitive description: @@ -529,10 +529,10 @@ packages: dependency: transitive description: name: string_scanner - sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" + sha256: "688af5ed3402a4bde5b3a6c15fd768dbf2621a614950b17f04626c431ab3c4c3" url: "https://pub.dev" source: hosted - version: "1.2.0" + version: "1.3.0" term_glyph: dependency: transitive description: @@ -545,10 +545,10 @@ packages: dependency: transitive description: name: test_api - sha256: "9955ae474176f7ac8ee4e989dadfb411a58c30415bcfb648fa04b2b8a03afa7f" + sha256: "664d3a9a64782fcdeb83ce9c6b39e78fd2971d4e37827b9b06c3aa1edc5e760c" url: "https://pub.dev" source: hosted - version: "0.7.0" + version: "0.7.3" typed_data: dependency: transitive description: @@ -633,10 +633,10 @@ packages: dependency: transitive description: name: vm_service - sha256: "3923c89304b715fb1eb6423f017651664a03bf5f4b29983627c4da791f74a4ec" + sha256: f6be3ed8bd01289b34d679c2b62226f63c0e69f9fd2e50a6b3c1c729a961041b url: "https://pub.dev" source: hosted - version: "14.2.1" + version: "14.3.0" web: dependency: transitive description: From b6c46727c29e21ab7eaedf87bd29d9a963b503b1 Mon Sep 17 00:00:00 2001 From: Kartikjarali010 Date: Sun, 16 Feb 2025 02:06:18 +0530 Subject: [PATCH 24/63] designed a new login page --- .../lib/pages/common_pages/login_page.dart | 193 +++++++++++------- 1 file changed, 115 insertions(+), 78 deletions(-) diff --git a/frontend/lib/pages/common_pages/login_page.dart b/frontend/lib/pages/common_pages/login_page.dart index 7d3d825..dc87a31 100644 --- a/frontend/lib/pages/common_pages/login_page.dart +++ b/frontend/lib/pages/common_pages/login_page.dart @@ -1,107 +1,144 @@ +import 'package:dev_track_app/pages/common_pages/register_page.dart'; +import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; + class LoginPage extends StatelessWidget { const LoginPage({Key? key}) : super(key: key); @override Widget build(BuildContext context) { return Scaffold( - backgroundColor: Colors.black, - body: Padding( - padding: const EdgeInsets.symmetric(horizontal: 32.0), + backgroundColor: Colors.white, + body: SingleChildScrollView( child: Center( - child: Container( - padding: const EdgeInsets.all(20.0), - decoration: BoxDecoration( - color: Colors.grey[850], - borderRadius: BorderRadius.circular(10.0), - boxShadow: [ - BoxShadow( - color: Colors.black.withOpacity(0.5), - spreadRadius: 2, - blurRadius: 5, - offset: const Offset(0, 3), - ), - ], - ), - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - const Text( - 'Login with your details', - style: TextStyle( - color: Colors.white, - fontSize: 24, - fontWeight: FontWeight.bold, + child: Column( + children: [ + Stack( + alignment: Alignment.center, + children: [ + Container( + height: 150, + decoration: BoxDecoration( + color: Color(0xFF5e00b0), + shape: BoxShape.rectangle, + borderRadius: BorderRadius.vertical( + top: Radius.circular(10), + ), + ), + ), + Positioned( + top: 48, + child: CircleAvatar( + radius: 50, + backgroundColor: Colors.white, + child: CircleAvatar( + radius: 45, + backgroundImage: NetworkImage( + 'https://storage.googleapis.com/a1aa/image/FMzESL12uGqBDRIcbgyzHWSJA_eagcTLOcV2KYexVXY.jpg', + ), + ), + ), ), + ], + ), + SizedBox(height: 60), + Text( + 'Welcome Back', + style: TextStyle( + fontSize: 32, + fontWeight: FontWeight.bold, + ), + ), + SizedBox(height: 10), + Text( + 'Sign in to your account', + style: TextStyle( + fontSize: 16, + color: Colors.black54, ), - const SizedBox(height: 20), - TextField( + ), + SizedBox(height: 20), + Padding( + padding: const EdgeInsets.fromLTRB(25, 10, 25, 25), + child: TextField( decoration: InputDecoration( - filled: true, - fillColor: Colors.grey[700], - hintText: 'Username', - hintStyle: const TextStyle(color: Colors.white54), - border: OutlineInputBorder( - borderRadius: BorderRadius.circular(10.0), - borderSide: BorderSide.none, - ), + prefixIcon: Icon(Icons.person), + labelText: 'Username', + // border: OutlineInputBorder(), ), ), - const SizedBox(height: 10), - TextField( + ), + SizedBox(height: 0), + Padding( + padding: const EdgeInsets.fromLTRB(25, 0, 25, 25), // Adjust padding + child: TextField( + obscureText: true, decoration: InputDecoration( - filled: true, - fillColor: Colors.grey[700], - hintText: 'Registered Email', - hintStyle: const TextStyle(color: Colors.white54), - border: OutlineInputBorder( - borderRadius: BorderRadius.circular(10.0), - borderSide: BorderSide.none, - ), + prefixIcon: Icon(Icons.lock), + labelText: 'Password', + // border: OutlineInputBorder(), + suffix: GestureDetector( + onTap: () { + // logic.... + }, + child: Text( + 'Forgot ?', + style: TextStyle(color: Colors.black54), + ), + ), ), ), - const SizedBox(height: 20), - ElevatedButton( + ), + SizedBox(height: 0), + Padding( + padding: const EdgeInsets.fromLTRB(25, 10, 25, 10), + child: ElevatedButton( onPressed: () { - // Handle login action + // Add your login logic here }, style: ElevatedButton.styleFrom( - backgroundColor: const Color.fromARGB(255, 53, 156, 19), - fixedSize: const Size(double.infinity, 50), - ), - child: const Text( - 'Login', - style: TextStyle( - color: Colors.white, - fontWeight: FontWeight.bold, + backgroundColor: Color(0xFF5e00b0), + padding: EdgeInsets.symmetric(vertical: 15), + textStyle: TextStyle(fontSize: 18), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(5), ), ), + child: Center( + child: Text('login', + style: TextStyle(color: Colors.white)), + ), + ), + ), + SizedBox(height: 20), + Text.rich( + TextSpan( + text: "Don't have an account? ", + children: [ + TextSpan( + text: 'Create', + style: TextStyle( + color: Color(0xFF5e00b0), + decoration: TextDecoration.underline, + ), + recognizer: TapGestureRecognizer() + ..onTap = () { + // write on tap logiv here..... + // Example given below.... + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => const RegisterPage()),); + } + ), + ], ), - ], - ), + ), + ], ), ), ), - bottomNavigationBar: BottomNavigationBar( - backgroundColor: Colors.grey[850], - selectedItemColor: Colors.white, - unselectedItemColor: Colors.grey, - items: const [ - BottomNavigationBarItem( - icon: Icon(Icons.home), - label: 'Home', - ), - BottomNavigationBarItem( - icon: Icon(Icons.person), - label: 'Profile', - ), - BottomNavigationBarItem( - icon: Icon(Icons.settings), - label: 'Settings', - ), - ], - ), ); } } From e348e389d2fc70db1412c75a6ae3d6a9540a89b1 Mon Sep 17 00:00:00 2001 From: ghamani <138302691+Ghamani121@users.noreply.github.com> Date: Sun, 16 Feb 2025 13:05:23 +0530 Subject: [PATCH 25/63] previous project page updated Have finished 95 percent of the ui for the page --- .idea/Dev-Track-App.iml | 54 ++ .idea/libraries/Dart_Packages.xml | 336 +++++----- .../pages/common_pages/previous_projects.dart | 633 +++++------------- frontend/pubspec.lock | 76 +-- 4 files changed, 416 insertions(+), 683 deletions(-) diff --git a/.idea/Dev-Track-App.iml b/.idea/Dev-Track-App.iml index 7e902b9..f72ad73 100644 --- a/.idea/Dev-Track-App.iml +++ b/.idea/Dev-Track-App.iml @@ -30,6 +30,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.idea/libraries/Dart_Packages.xml b/.idea/libraries/Dart_Packages.xml index 41666ed..bcb3a86 100644 --- a/.idea/libraries/Dart_Packages.xml +++ b/.idea/libraries/Dart_Packages.xml @@ -5,678 +5,678 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/frontend/lib/pages/common_pages/previous_projects.dart b/frontend/lib/pages/common_pages/previous_projects.dart index f560e6f..7f738bd 100644 --- a/frontend/lib/pages/common_pages/previous_projects.dart +++ b/frontend/lib/pages/common_pages/previous_projects.dart @@ -1,6 +1,8 @@ import 'package:flutter/material.dart'; +import 'package:dev_track_app/pages/common_pages/topNav.dart'; import 'specific_project.dart'; import '../../routing/previous_projects_routing.dart'; +import 'package:google_fonts/google_fonts.dart'; class PreviousProjects extends StatefulWidget { const PreviousProjects({super.key}); @@ -11,498 +13,175 @@ class PreviousProjects extends StatefulWidget { class _PreviousProjectsState extends State { @override + + //nav bar Widget build(BuildContext context) { return SafeArea( - child: Scaffold( - appBar: AppBar( - leading: Container( - child: Row( - mainAxisSize: MainAxisSize.min, - children: [ - Expanded( - child: IconButton( - onPressed: () { - PreviousProjectsRouting.pop(context); - }, - icon: Icon( - Icons.arrow_back_ios, - size: 30, - ), - ), - ), - Expanded( - child: Builder( - builder: (context) => IconButton( - icon: Icon( - Icons.menu, - size: 40, - ), - onPressed: () { - Scaffold.of(context).openDrawer(); - }, - ), - ), - ), - ], - ), + child: Scaffold( + backgroundColor: const Color(0xFFF7F4F3), + body: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const TopNav(), + _buildSearchBar(), + _buildTitle(), + const SizedBox(height: 20), + Expanded(child: _buildProjectList()), + ], + ), + ), + ); + } + + Widget _buildSearchBar() { + return Padding( + padding: const EdgeInsets.all(18.0), + child: SizedBox( + height: 50, + child: TextField( + decoration: InputDecoration( + filled: true, + fillColor: Colors.white, + labelText: 'search all projects', + prefixIcon: Icon(Icons.search, color: Colors.black54), + enabledBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(14.0), + borderSide: BorderSide(color: const Color(0xFF5B2333)), ), - backgroundColor: Colors.white, - actions: [ - IconButton( - onPressed: () {}, - icon: Icon( - Icons.notifications_none, - size: 40, - ), - ) - ], ), - drawer: Drawer( - child: ListView( - padding: EdgeInsets.zero, + ), + ), + ); + } + + Widget _buildTitle() { + return Padding( + padding: const EdgeInsets.fromLTRB(25, 15, 15, 0), + child: Text( + 'Explore our projects', + style: GoogleFonts.poppins( + fontSize: 30, + fontWeight: FontWeight.w600, + fontStyle: FontStyle.italic, + color: const Color(0xFF6901AE), + ), + ), + ); + } + + final List> projects = [ + { + "title": "UI/UX 42", + "subtitle": "Budgeting application", + "description": "Lorem ipsum dolor sit amet, consectetur adipiscing elit.", + "image": "assets/images/game.png" + }, + { + "title": "Dev Track", + "subtitle": "Project management tool", + "description": "A tool to track developer progress in real-time.", + "image": "assets/images/devtrack.png" + }, + { + "title": "E-commerce App", + "subtitle": "Shopping made easy", + "description": "An intuitive mobile shopping experience.", + "image": "assets/images/ecommerce.png" + }, + ]; + +//logic to geneterate project cards + Widget _buildProjectList() { + return ListView.builder( + padding: EdgeInsets.symmetric(horizontal: 15), + itemCount: projects.length, + itemBuilder: (context, index) { + return _buildProjectCard(projects[index]); + }, + ); + } + +//ui for cards + Widget _buildProjectCard(Map project) { + return Container( + padding: EdgeInsets.all(24), + margin: EdgeInsets.symmetric(vertical: 16, horizontal: 15), + decoration: BoxDecoration( + color: const Color(0xFF6901AE), + borderRadius: BorderRadius.circular(4), + ), + child: Row( + children: [ + Flexible( + flex: 1, // Image takes available space proportionally + child: Container( + padding: EdgeInsets.all(16), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8), + ), + child: ClipRRect( + borderRadius: BorderRadius.circular(8), + child: Image.network( + 'assets/images/game.png', // Replace with actual image URL or use AssetImage + fit: BoxFit + .cover, // Ensures the image fills the available space + ), + ), + )), + SizedBox(width: 15), + Expanded( + flex: 3, // Text takes more space + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, children: [ - const DrawerHeader( - decoration: BoxDecoration( - color: Colors.grey, + Text( + "UI/UX 42", + style: GoogleFonts.poppins( + color: Colors.white, + fontSize: 18, + fontWeight: FontWeight.bold, ), - child: Text('Drawer Header'), ), - ListTile( - leading: Icon( - Icons.home, + SizedBox(height: 4), + Text( + "Budgeting application", + style: GoogleFonts.poppins( + color: Colors.white, + fontSize: 13, + fontWeight: FontWeight.w500, ), - title: const Text('1'), - onTap: () { - PreviousProjectsRouting.pop(context); - }, ), - ListTile( - leading: Icon( - Icons.train, + SizedBox(height: 4), + Text( + "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor", + style: GoogleFonts.poppins( + color: Colors.white, + fontSize: 10, ), - title: const Text('2'), - onTap: () { - PreviousProjectsRouting.pop(context); - }, ), - ], - ), - ), - body: SingleChildScrollView( - child: Container( - width: double.infinity, - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Padding( - padding: const EdgeInsets.fromLTRB(25, 15, 15, 0), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Text( - 'Welcome back,', - style: TextStyle(fontSize: 18, color: Colors.grey), - ), - Text( - 'Nameeee', - style: TextStyle(fontSize: 25), - ), - ], + SizedBox(height: 8), + ElevatedButton( + style: ElevatedButton.styleFrom( + backgroundColor: Colors.white, + foregroundColor: Colors.black, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), ), - ), - Padding( - padding: const EdgeInsets.all(18.0), - child: TextField( - decoration: InputDecoration( - filled: true, - fillColor: Colors.grey[300], - labelText: 'Search all projects ....', - // suffixIcon: Icon(Icons.search), - border: OutlineInputBorder( - borderRadius: BorderRadius.circular(25.0), - ), - ), + padding: EdgeInsets.only( + left: 20, right: 20, top: 10, bottom: 10), + textStyle: GoogleFonts.poppins( + fontSize: 10, + fontWeight: FontWeight.bold, ), ), - Container( - width: double.infinity, - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - SizedBox( - height: 10, - ), - Column( - children: [ - Container( - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(20), - color: Colors.grey[300], - ), - height: 90, - width: 350, - child: Padding( - padding: const EdgeInsets.only( - left: 10, - ), - child: Row( - children: [ - Container( - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(20), - color: Colors.grey[800], - ), - height: 70, - width: 70, - ), - SizedBox( - width: 19, - ), - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - SizedBox( - height: 15, - ), - Text( - 'DOMAIN', - style: TextStyle(fontSize: 15), - ), - Text('Project Name'), - ], - ) - ], - ), - ), - ), - Container( - height: 30, - width: 320, - child: Align( - alignment: Alignment.topRight, - child: SizedBox( - height: double.infinity, - child: ElevatedButton( - onPressed: () { - PreviousProjectsRouting.pushToSpecificProject(context); - }, - child: Text( - 'Learn More', - style: TextStyle( - fontSize: 15, color: Colors.grey[800]), - ), - style: ElevatedButton.styleFrom( - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.zero), - backgroundColor: Colors.grey[400], - ), - ), - ), - ), - ) - ], - ), - SizedBox( - height: 20, - ), - Column( - children: [ - Container( - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(20), - color: Colors.grey[300], - ), - height: 90, - width: 350, - child: Padding( - padding: const EdgeInsets.only( - left: 10, - ), - child: Row( - children: [ - Container( - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(20), - color: Colors.grey[800], - ), - height: 70, - width: 70, - ), - SizedBox( - width: 19, - ), - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - SizedBox( - height: 15, - ), - Text( - 'DOMAIN', - style: TextStyle(fontSize: 15), - ), - Text('Project Name'), - ], - ) - ], - ), - ), - ), - Container( - height: 30, - width: 320, - child: Align( - alignment: Alignment.topRight, - child: SizedBox( - height: double.infinity, - child: ElevatedButton( - onPressed: () { - PreviousProjectsRouting.pushToSpecificProject(context); - }, - child: Text( - 'Learn More', - style: TextStyle( - fontSize: 15, color: Colors.grey[800]), - ), - style: ElevatedButton.styleFrom( - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.zero), - backgroundColor: Colors.grey[400], - ), - ), - ), - ), - ) - ], - ), - SizedBox( - height: 20, - ), - Column( - children: [ - Container( - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(20), - color: Colors.grey[300], - ), - height: 90, - width: 350, - child: Padding( - padding: const EdgeInsets.only( - left: 10, - ), - child: Row( - children: [ - Container( - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(20), - color: Colors.grey[800], - ), - height: 70, - width: 70, - ), - SizedBox( - width: 19, - ), - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - SizedBox( - height: 15, - ), - Text( - 'DOMAIN', - style: TextStyle(fontSize: 15), - ), - Text('Project Name'), - ], - ) - ], - ), - ), - ), - Container( - height: 30, - width: 320, - child: Align( - alignment: Alignment.topRight, - child: SizedBox( - height: double.infinity, - child: ElevatedButton( - onPressed: () { - PreviousProjectsRouting.pushToSpecificProject(context); - }, - child: Text( - 'Learn More', - style: TextStyle( - fontSize: 15, color: Colors.grey[800]), - ), - style: ElevatedButton.styleFrom( - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.zero), - backgroundColor: Colors.grey[400], - ), - ), - ), - ), - ) - ], - ), - SizedBox( - height: 20, - ), - Column( - children: [ - Container( - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(20), - color: Colors.grey[300], - ), - height: 90, - width: 350, - child: Padding( - padding: const EdgeInsets.only( - left: 10, - ), - child: Row( - children: [ - Container( - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(20), - color: Colors.grey[800], - ), - height: 70, - width: 70, - ), - SizedBox( - width: 19, - ), - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - SizedBox( - height: 15, - ), - Text( - 'DOMAIN', - style: TextStyle(fontSize: 15), - ), - Text('Project Name'), - ], - ) - ], - ), - ), - ), - Container( - height: 30, - width: 320, - child: Align( - alignment: Alignment.topRight, - child: SizedBox( - height: double.infinity, - child: ElevatedButton( - onPressed: () { - PreviousProjectsRouting.pushToSpecificProject(context); - }, - child: Text( - 'Learn More', - style: TextStyle( - fontSize: 15, color: Colors.grey[800]), - ), - style: ElevatedButton.styleFrom( - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.zero), - backgroundColor: Colors.grey[400], - ), - ), - ), - ), - ) - ], - ), - SizedBox( - height: 20, - ), - Column( - children: [ - Container( - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(20), - color: Colors.grey[300], - ), - height: 90, - width: 350, - child: Padding( - padding: const EdgeInsets.only( - left: 10, - ), - child: Row( - children: [ - Container( - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(20), - color: Colors.grey[800], - ), - height: 70, - width: 70, - ), - SizedBox( - width: 19, - ), - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - SizedBox( - height: 15, - ), - Text( - 'DOMAIN', - style: TextStyle(fontSize: 15), - ), - Text('Project Name'), - ], - ) - ], - ), - ), - ), - Container( - height: 30, - width: 320, - child: Align( - alignment: Alignment.topRight, - child: SizedBox( - height: double.infinity, - child: ElevatedButton( - onPressed: () { - PreviousProjectsRouting.pushToSpecificProject(context); - }, - child: Text( - 'Learn More', - style: TextStyle( - fontSize: 15, color: Colors.grey[800]), - ), - style: ElevatedButton.styleFrom( - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.zero), - backgroundColor: Colors.grey[400], - ), - ), - ), - ), - ) - ], - ), - ], - ), - ) - ], - ), + onPressed: () {}, + child: Text("Explore"), + ), + ], ), ), - )); + ], + ), + ); } } diff --git a/frontend/pubspec.lock b/frontend/pubspec.lock index 4112d6e..cf69dd7 100644 --- a/frontend/pubspec.lock +++ b/frontend/pubspec.lock @@ -5,42 +5,42 @@ packages: dependency: transitive description: name: async - sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c" + sha256: d2872f9c19731c2e5f10444b14686eb7cc85c76274bd6c16e1816bff9a3bab63 url: "https://pub.dev" source: hosted - version: "2.11.0" + version: "2.12.0" boolean_selector: dependency: transitive description: name: boolean_selector - sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" + sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea" url: "https://pub.dev" source: hosted - version: "2.1.1" + version: "2.1.2" characters: dependency: transitive description: name: characters - sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605" + sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803 url: "https://pub.dev" source: hosted - version: "1.3.0" + version: "1.4.0" clock: dependency: transitive description: name: clock - sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf + sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b url: "https://pub.dev" source: hosted - version: "1.1.1" + version: "1.1.2" collection: dependency: transitive description: name: collection - sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a + sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76" url: "https://pub.dev" source: hosted - version: "1.18.0" + version: "1.19.1" cross_file: dependency: transitive description: @@ -69,10 +69,10 @@ packages: dependency: transitive description: name: fake_async - sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" + sha256: "6a95e56b2449df2273fd8c45a662d6947ce1ebb7aafe80e550a3f68297f3cacc" url: "https://pub.dev" source: hosted - version: "1.3.1" + version: "1.3.2" ffi: dependency: transitive description: @@ -252,18 +252,18 @@ packages: dependency: transitive description: name: leak_tracker - sha256: "3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05" + sha256: c35baad643ba394b40aac41080300150a4f08fd0fd6a10378f8f7c6bc161acec url: "https://pub.dev" source: hosted - version: "10.0.5" + version: "10.0.8" leak_tracker_flutter_testing: dependency: transitive description: name: leak_tracker_flutter_testing - sha256: "932549fb305594d82d7183ecd9fa93463e9914e1b67cacc34bc40906594a1806" + sha256: f8b613e7e6a13ec79cfdc0e97638fddb3ab848452eff057653abd3edba760573 url: "https://pub.dev" source: hosted - version: "3.0.5" + version: "3.0.9" leak_tracker_testing: dependency: transitive description: @@ -284,10 +284,10 @@ packages: dependency: transitive description: name: matcher - sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb + sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2 url: "https://pub.dev" source: hosted - version: "0.12.16+1" + version: "0.12.17" material_color_utilities: dependency: transitive description: @@ -300,10 +300,10 @@ packages: dependency: transitive description: name: meta - sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7 + sha256: e3641ec5d63ebf0d9b41bd43201a66e3fc79a65db5f61fc181f04cd27aab950c url: "https://pub.dev" source: hosted - version: "1.15.0" + version: "1.16.0" mime: dependency: transitive description: @@ -316,10 +316,10 @@ packages: dependency: transitive description: name: path - sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af" + sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5" url: "https://pub.dev" source: hosted - version: "1.9.0" + version: "1.9.1" path_provider: dependency: transitive description: @@ -500,55 +500,55 @@ packages: dependency: transitive description: flutter source: sdk - version: "0.0.99" + version: "0.0.0" source_span: dependency: transitive description: name: source_span - sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c" + sha256: "254ee5351d6cb365c859e20ee823c3bb479bf4a293c22d17a9f1bf144ce86f7c" url: "https://pub.dev" source: hosted - version: "1.10.0" + version: "1.10.1" stack_trace: dependency: transitive description: name: stack_trace - sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b" + sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1" url: "https://pub.dev" source: hosted - version: "1.11.1" + version: "1.12.1" stream_channel: dependency: transitive description: name: stream_channel - sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7 + sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d" url: "https://pub.dev" source: hosted - version: "2.1.2" + version: "2.1.4" string_scanner: dependency: transitive description: name: string_scanner - sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" + sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43" url: "https://pub.dev" source: hosted - version: "1.2.0" + version: "1.4.1" term_glyph: dependency: transitive description: name: term_glyph - sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 + sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e" url: "https://pub.dev" source: hosted - version: "1.2.1" + version: "1.2.2" test_api: dependency: transitive description: name: test_api - sha256: "5b8a98dafc4d5c4c9c72d8b31ab2b23fc13422348d2997120294d3bac86b4ddb" + sha256: fb31f383e2ee25fbbfe06b40fe21e1e458d14080e3c67e7ba0acfde4df4e0bbd url: "https://pub.dev" source: hosted - version: "0.7.2" + version: "0.7.4" typed_data: dependency: transitive description: @@ -633,10 +633,10 @@ packages: dependency: transitive description: name: vm_service - sha256: f652077d0bdf60abe4c1f6377448e8655008eef28f128bc023f7b5e8dfeb48fc + sha256: "0968250880a6c5fe7edc067ed0a13d4bae1577fe2771dcf3010d52c4a9d3ca14" url: "https://pub.dev" source: hosted - version: "14.2.4" + version: "14.3.1" web: dependency: transitive description: @@ -662,5 +662,5 @@ packages: source: hosted version: "1.1.0" sdks: - dart: ">=3.5.0 <4.0.0" + dart: ">=3.7.0-0 <4.0.0" flutter: ">=3.24.0" From dff3b99fbcce7495cf4c5fb398d31c03f431885e Mon Sep 17 00:00:00 2001 From: ghamani <138302691+Ghamani121@users.noreply.github.com> Date: Sun, 16 Feb 2025 13:05:23 +0530 Subject: [PATCH 26/63] previous project page updated Have finished 95 percent of the ui for the page --- .idea/Dev-Track-App.iml | 54 +++++ .idea/libraries/Dart_Packages.xml | 336 +++++++++++++++--------------- frontend/pubspec.lock | 72 +++---- 3 files changed, 258 insertions(+), 204 deletions(-) diff --git a/.idea/Dev-Track-App.iml b/.idea/Dev-Track-App.iml index 7e902b9..f72ad73 100644 --- a/.idea/Dev-Track-App.iml +++ b/.idea/Dev-Track-App.iml @@ -30,6 +30,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.idea/libraries/Dart_Packages.xml b/.idea/libraries/Dart_Packages.xml index 41666ed..bcb3a86 100644 --- a/.idea/libraries/Dart_Packages.xml +++ b/.idea/libraries/Dart_Packages.xml @@ -5,678 +5,678 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/frontend/pubspec.lock b/frontend/pubspec.lock index 12d4bf6..0504981 100644 --- a/frontend/pubspec.lock +++ b/frontend/pubspec.lock @@ -5,34 +5,34 @@ packages: dependency: transitive description: name: async - sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c" + sha256: d2872f9c19731c2e5f10444b14686eb7cc85c76274bd6c16e1816bff9a3bab63 url: "https://pub.dev" source: hosted - version: "2.11.0" + version: "2.12.0" boolean_selector: dependency: transitive description: name: boolean_selector - sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" + sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea" url: "https://pub.dev" source: hosted - version: "2.1.1" + version: "2.1.2" characters: dependency: transitive description: name: characters - sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605" + sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803 url: "https://pub.dev" source: hosted - version: "1.3.0" + version: "1.4.0" clock: dependency: transitive description: name: clock - sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf + sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b url: "https://pub.dev" source: hosted - version: "1.1.1" + version: "1.1.2" collection: dependency: transitive description: @@ -69,10 +69,10 @@ packages: dependency: transitive description: name: fake_async - sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" + sha256: "6a95e56b2449df2273fd8c45a662d6947ce1ebb7aafe80e550a3f68297f3cacc" url: "https://pub.dev" source: hosted - version: "1.3.1" + version: "1.3.2" ffi: dependency: transitive description: @@ -252,18 +252,18 @@ packages: dependency: transitive description: name: leak_tracker - sha256: "7bb2830ebd849694d1ec25bf1f44582d6ac531a57a365a803a6034ff751d2d06" + sha256: "3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05" url: "https://pub.dev" source: hosted - version: "10.0.7" + version: "10.0.5" leak_tracker_flutter_testing: dependency: transitive description: name: leak_tracker_flutter_testing - sha256: "9491a714cca3667b60b5c420da8217e6de0d1ba7a5ec322fab01758f6998f379" + sha256: "932549fb305594d82d7183ecd9fa93463e9914e1b67cacc34bc40906594a1806" url: "https://pub.dev" source: hosted - version: "3.0.8" + version: "3.0.5" leak_tracker_testing: dependency: transitive description: @@ -284,10 +284,10 @@ packages: dependency: transitive description: name: matcher - sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb + sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2 url: "https://pub.dev" source: hosted - version: "0.12.16+1" + version: "0.12.17" material_color_utilities: dependency: transitive description: @@ -300,10 +300,10 @@ packages: dependency: transitive description: name: meta - sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7 + sha256: e3641ec5d63ebf0d9b41bd43201a66e3fc79a65db5f61fc181f04cd27aab950c url: "https://pub.dev" source: hosted - version: "1.15.0" + version: "1.16.0" mime: dependency: transitive description: @@ -316,10 +316,10 @@ packages: dependency: transitive description: name: path - sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af" + sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5" url: "https://pub.dev" source: hosted - version: "1.9.0" + version: "1.9.1" path_provider: dependency: transitive description: @@ -505,50 +505,50 @@ packages: dependency: transitive description: name: source_span - sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c" + sha256: "254ee5351d6cb365c859e20ee823c3bb479bf4a293c22d17a9f1bf144ce86f7c" url: "https://pub.dev" source: hosted - version: "1.10.0" + version: "1.10.1" stack_trace: dependency: transitive description: name: stack_trace - sha256: "9f47fd3630d76be3ab26f0ee06d213679aa425996925ff3feffdec504931c377" + sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b" url: "https://pub.dev" source: hosted - version: "1.12.0" + version: "1.11.1" stream_channel: dependency: transitive description: name: stream_channel - sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7 + sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d" url: "https://pub.dev" source: hosted - version: "2.1.2" + version: "2.1.4" string_scanner: dependency: transitive description: name: string_scanner - sha256: "688af5ed3402a4bde5b3a6c15fd768dbf2621a614950b17f04626c431ab3c4c3" + sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" url: "https://pub.dev" source: hosted - version: "1.3.0" + version: "1.4.1" term_glyph: dependency: transitive description: name: term_glyph - sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 + sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e" url: "https://pub.dev" source: hosted - version: "1.2.1" + version: "1.2.2" test_api: dependency: transitive description: name: test_api - sha256: "664d3a9a64782fcdeb83ce9c6b39e78fd2971d4e37827b9b06c3aa1edc5e760c" + sha256: fb31f383e2ee25fbbfe06b40fe21e1e458d14080e3c67e7ba0acfde4df4e0bbd url: "https://pub.dev" source: hosted - version: "0.7.3" + version: "0.7.2" typed_data: dependency: transitive description: @@ -633,10 +633,10 @@ packages: dependency: transitive description: name: vm_service - sha256: f6be3ed8bd01289b34d679c2b62226f63c0e69f9fd2e50a6b3c1c729a961041b + sha256: "0968250880a6c5fe7edc067ed0a13d4bae1577fe2771dcf3010d52c4a9d3ca14" url: "https://pub.dev" source: hosted - version: "14.3.0" + version: "14.3.1" web: dependency: transitive description: @@ -662,5 +662,5 @@ packages: source: hosted version: "1.1.0" sdks: - dart: ">=3.4.0 <4.0.0" - flutter: ">=3.22.0" + dart: ">=3.7.0-0 <4.0.0" + flutter: ">=3.24.0" From b6d9dd4495df9916360253c5d0eb942d927b82a6 Mon Sep 17 00:00:00 2001 From: Kartikjarali010 Date: Sun, 16 Feb 2025 15:19:28 +0530 Subject: [PATCH 27/63] updated new button -browse as a guest --- .../lib/pages/common_pages/login_page.dart | 27 ++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/frontend/lib/pages/common_pages/login_page.dart b/frontend/lib/pages/common_pages/login_page.dart index dc87a31..ef8ce96 100644 --- a/frontend/lib/pages/common_pages/login_page.dart +++ b/frontend/lib/pages/common_pages/login_page.dart @@ -111,7 +111,7 @@ class LoginPage extends StatelessWidget { ), ), ), - SizedBox(height: 20), + SizedBox(height: 15), Text.rich( TextSpan( text: "Don't have an account? ", @@ -135,6 +135,31 @@ class LoginPage extends StatelessWidget { ], ), ), + SizedBox(height: 20), + const Text('OR', + style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold) + ), + Padding( + padding: const EdgeInsets.fromLTRB(25, 15, 25, 10), + child: ElevatedButton( + onPressed: () { + // Add your login logic here + }, + style: ElevatedButton.styleFrom( + backgroundColor: Colors.white, + side: BorderSide(color: Color(0xFF5e00b0)), + padding: EdgeInsets.symmetric(vertical: 15), + textStyle: TextStyle(fontSize: 18,color: Colors.grey), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(5), + ), + ), + child: Center( + child: Text('Browse as a Guest', + style: TextStyle(color: Colors.black)), + ), + ), + ), ], ), ), From 820ecf6163ad1ffc2aa7baf192042e04685c007a Mon Sep 17 00:00:00 2001 From: ghamani <138302691+Ghamani121@users.noreply.github.com> Date: Sun, 16 Feb 2025 15:21:17 +0530 Subject: [PATCH 28/63] ui for previous page is completed The ui is completed Need to add static data --- .../project_display/previous_projects.dart | 688 ++++++------------ 1 file changed, 205 insertions(+), 483 deletions(-) diff --git a/frontend/lib/pages/user_pages/project_pages/project_display/previous_projects.dart b/frontend/lib/pages/user_pages/project_pages/project_display/previous_projects.dart index b6e2afb..58e8ff6 100644 --- a/frontend/lib/pages/user_pages/project_pages/project_display/previous_projects.dart +++ b/frontend/lib/pages/user_pages/project_pages/project_display/previous_projects.dart @@ -1,6 +1,8 @@ import 'package:flutter/material.dart'; +import 'package:dev_track_app/pages/common_pages/domain_pages/topNav.dart'; import 'specific_project.dart'; -import '../../../../routing/previous_projects_routing.dart'; +import 'package:dev_track_app/routing/previous_projects_routing.dart'; +import 'package:google_fonts/google_fonts.dart'; class PreviousProjects extends StatefulWidget { const PreviousProjects({super.key}); @@ -11,503 +13,223 @@ class PreviousProjects extends StatefulWidget { class _PreviousProjectsState extends State { @override - Widget build(BuildContext context) { + + //all our components gets built here + Widget build(BuildContext context) { return SafeArea( - child: Scaffold( - appBar: AppBar( - leading: Container( - child: Row( - mainAxisSize: MainAxisSize.min, - children: [ - Expanded( - child: IconButton( - onPressed: () { - PreviousProjectsRouting.pop(context); - }, - icon: Icon( - Icons.arrow_back_ios, - size: 30, - ), - ), - ), - Expanded( - child: Builder( - builder: (context) => IconButton( - icon: Icon( - Icons.menu, - size: 40, - ), - onPressed: () { - Scaffold.of(context).openDrawer(); - }, + child: Scaffold( + backgroundColor: const Color(0xFFF7F4F3), + body: Stack( + children: [ + Column( + children: [ + const TopNav(), // Fixed at top + _buildSearchBar(), // Fixed below navbar + Expanded( + child: CustomScrollView( + slivers: [ + SliverToBoxAdapter( + child: _buildTitle(), // Title scrolls with projects + ), + SliverList( + delegate: SliverChildBuilderDelegate( + (context, index) => _buildProjectCard(projects[index]), + childCount: projects.length, + ), + ), + ], ), ), - ), - ], - ), - ), - backgroundColor: Colors.white, - actions: [ - IconButton( - onPressed: () {}, - icon: Icon( - Icons.notifications_none, - size: 40, + ], ), - ) - ], + ], + ), ), - drawer: Drawer( - child: ListView( - padding: EdgeInsets.zero, - children: [ - const DrawerHeader( - decoration: BoxDecoration( - color: Colors.grey, - ), - child: Text('Drawer Header'), - ), - ListTile( - leading: Icon( - Icons.home, - ), - title: const Text('1'), - onTap: () { - PreviousProjectsRouting.pop(context); - }, - ), - ListTile( - leading: Icon( - Icons.train, - ), - title: const Text('2'), - onTap: () { - PreviousProjectsRouting.pop(context); - }, + ); + } + + //builds our search bar + Widget _buildSearchBar() { + return Padding( + padding: const EdgeInsets.all(18.0), + child: SizedBox( + height: 50, + child: TextField( + decoration: InputDecoration( + filled: true, + fillColor: Colors.white, + labelText: 'search all projects', + prefixIcon: Icon(Icons.search, color: Colors.black54), + enabledBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(14.0), + borderSide: BorderSide(color: const Color(0xFF5B2333)), ), - ], + ), ), ), - body: SingleChildScrollView( - child: Container( - width: double.infinity, - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Padding( - padding: const EdgeInsets.fromLTRB(25, 15, 15, 0), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Text( - 'Welcome back,', - style: TextStyle(fontSize: 18, color: Colors.grey), - ), - Text( - 'Nameeee', - style: TextStyle(fontSize: 25), - ), - ], + ); + } + + Widget _buildTitle() { + return Padding( + padding: const EdgeInsets.fromLTRB(25, 15, 15, 0), + child: Text( + 'Explore our projects', + style: GoogleFonts.poppins( + fontSize: 30, + fontWeight: FontWeight.w600, + fontStyle: FontStyle.italic, + color: const Color(0xFF6901AE), + ), + ), + ); + } + + final List> projects = [ + { + "title": "UI/UX 42", + "subtitle": "Budgeting application", + "description": "Lorem ipsum dolor sit amet, consectetur adipiscing elit.", + "image": "assets/images/game.png" + }, + { + "title": "Dev Track", + "subtitle": "Project management tool", + "description": "A tool to track developer progress in real-time.", + "image": "assets/images/devtrack.png" + }, + { + "title": "E-commerce App", + "subtitle": "Shopping made easy", + "description": "An intuitive mobile shopping experience.", + "image": "assets/images/ecommerce.png" + }, + { + "title": "E-commerce App", + "subtitle": "Shopping made easy", + "description": "An intuitive mobile shopping experience.", + "image": "assets/images/ecommerce.png" + }, + { + "title": "E-commerce App", + "subtitle": "Shopping made easy", + "description": "An intuitive mobile shopping experience.", + "image": "assets/images/ecommerce.png" + }, + { + "title": "E-commerce App", + "subtitle": "Shopping made easy", + "description": "An intuitive mobile shopping experience.", + "image": "assets/images/ecommerce.png" + }, + { + "title": "E-commerce App", + "subtitle": "Shopping made easy", + "description": "An intuitive mobile shopping experience.", + "image": "assets/images/ecommerce.png" + }, + { + "title": "E-commerce App", + "subtitle": "Shopping made easy", + "description": "An intuitive mobile shopping experience.", + "image": "assets/images/ecommerce.png" + }, + ]; + +//logic to geneterate project cards + // Widget _buildProjectList() { + // return ListView.builder( + // padding: EdgeInsets.symmetric(horizontal: 15), + // itemCount: projects.length, + // itemBuilder: (context, index) { + // return _buildProjectCard(projects[index]); + // }, + // ); + // } + +//ui for cards + Widget _buildProjectCard(Map project) { + return Container( + padding: EdgeInsets.all(24), + margin: EdgeInsets.symmetric(vertical: 16, horizontal: 15), + decoration: BoxDecoration( + color: const Color(0xFF6901AE), + borderRadius: BorderRadius.circular(4), + ), + child: Row( + children: [ + Flexible( + flex: 1, // Image takes available space proportionally + child: Container( + padding: EdgeInsets.all(16), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8), ), - ), - Padding( - padding: const EdgeInsets.all(18.0), - child: TextField( - decoration: InputDecoration( - filled: true, - fillColor: Colors.grey[300], - labelText: 'Search all projects ....', - // suffixIcon: Icon(Icons.search), - border: OutlineInputBorder( - borderRadius: BorderRadius.circular(25.0), - ), + child: ClipRRect( + borderRadius: BorderRadius.circular(8), + child: Image.network( + 'assets/images/game.png', // Replace with actual image URL or use AssetImage + fit: BoxFit + .cover, // Ensures the image fills the available space ), ), - ), - Container( - width: double.infinity, - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - SizedBox( - height: 10, - ), - Column( - children: [ - Container( - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(20), - color: Colors.grey[300], - ), - height: 90, - width: 350, - child: Padding( - padding: const EdgeInsets.only( - left: 10, - ), - child: Row( - children: [ - Container( - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(20), - color: Colors.grey[800], - ), - height: 70, - width: 70, - ), - SizedBox( - width: 19, - ), - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - SizedBox( - height: 15, - ), - Text( - 'DOMAIN', - style: TextStyle(fontSize: 15), - ), - Text('Project Name'), - ], - ) - ], - ), - ), - ), - Container( - height: 30, - width: 320, - child: Align( - alignment: Alignment.topRight, - child: SizedBox( - height: double.infinity, - child: ElevatedButton( - onPressed: () { - PreviousProjectsRouting.pushToSpecificProject( - context); - }, - child: Text( - 'Learn More', - style: TextStyle( - fontSize: 15, color: Colors.grey[800]), - ), - style: ElevatedButton.styleFrom( - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.zero), - backgroundColor: Colors.grey[400], - ), - ), - ), - ), - ) - ], - ), - SizedBox( - height: 20, - ), - Column( - children: [ - Container( - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(20), - color: Colors.grey[300], - ), - height: 90, - width: 350, - child: Padding( - padding: const EdgeInsets.only( - left: 10, - ), - child: Row( - children: [ - Container( - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(20), - color: Colors.grey[800], - ), - height: 70, - width: 70, - ), - SizedBox( - width: 19, - ), - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - SizedBox( - height: 15, - ), - Text( - 'DOMAIN', - style: TextStyle(fontSize: 15), - ), - Text('Project Name'), - ], - ) - ], - ), - ), - ), - Container( - height: 30, - width: 320, - child: Align( - alignment: Alignment.topRight, - child: SizedBox( - height: double.infinity, - child: ElevatedButton( - onPressed: () { - PreviousProjectsRouting.pushToSpecificProject( - context); - }, - child: Text( - 'Learn More', - style: TextStyle( - fontSize: 15, color: Colors.grey[800]), - ), - style: ElevatedButton.styleFrom( - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.zero), - backgroundColor: Colors.grey[400], - ), - ), - ), - ), - ) - ], - ), - SizedBox( - height: 20, - ), - Column( - children: [ - Container( - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(20), - color: Colors.grey[300], - ), - height: 90, - width: 350, - child: Padding( - padding: const EdgeInsets.only( - left: 10, - ), - child: Row( - children: [ - Container( - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(20), - color: Colors.grey[800], - ), - height: 70, - width: 70, - ), - SizedBox( - width: 19, - ), - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - SizedBox( - height: 15, - ), - Text( - 'DOMAIN', - style: TextStyle(fontSize: 15), - ), - Text('Project Name'), - ], - ) - ], - ), - ), - ), - Container( - height: 30, - width: 320, - child: Align( - alignment: Alignment.topRight, - child: SizedBox( - height: double.infinity, - child: ElevatedButton( - onPressed: () { - PreviousProjectsRouting.pushToSpecificProject( - context); - }, - child: Text( - 'Learn More', - style: TextStyle( - fontSize: 15, color: Colors.grey[800]), - ), - style: ElevatedButton.styleFrom( - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.zero), - backgroundColor: Colors.grey[400], - ), - ), - ), - ), - ) - ], - ), - SizedBox( - height: 20, - ), - Column( - children: [ - Container( - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(20), - color: Colors.grey[300], - ), - height: 90, - width: 350, - child: Padding( - padding: const EdgeInsets.only( - left: 10, - ), - child: Row( - children: [ - Container( - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(20), - color: Colors.grey[800], - ), - height: 70, - width: 70, - ), - SizedBox( - width: 19, - ), - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - SizedBox( - height: 15, - ), - Text( - 'DOMAIN', - style: TextStyle(fontSize: 15), - ), - Text('Project Name'), - ], - ) - ], - ), - ), - ), - Container( - height: 30, - width: 320, - child: Align( - alignment: Alignment.topRight, - child: SizedBox( - height: double.infinity, - child: ElevatedButton( - onPressed: () { - PreviousProjectsRouting.pushToSpecificProject( - context); - }, - child: Text( - 'Learn More', - style: TextStyle( - fontSize: 15, color: Colors.grey[800]), - ), - style: ElevatedButton.styleFrom( - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.zero), - backgroundColor: Colors.grey[400], - ), - ), - ), - ), - ) - ], - ), - SizedBox( - height: 20, + )), + SizedBox(width: 15), + Expanded( + flex: 3, // Text takes more space + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + "UI/UX 42", + style: GoogleFonts.poppins( + color: Colors.white, + fontSize: 18, + fontWeight: FontWeight.bold, + ), + ), + SizedBox(height: 4), + Text( + "Budgeting application", + style: GoogleFonts.poppins( + color: Colors.white, + fontSize: 13, + fontWeight: FontWeight.w500, + ), + ), + SizedBox(height: 4), + Text( + "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor", + style: GoogleFonts.poppins( + color: Colors.white, + fontSize: 10, + ), + ), + SizedBox(height: 8), + ElevatedButton( + style: ElevatedButton.styleFrom( + backgroundColor: Colors.white, + foregroundColor: Colors.black, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), ), - Column( - children: [ - Container( - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(20), - color: Colors.grey[300], - ), - height: 90, - width: 350, - child: Padding( - padding: const EdgeInsets.only( - left: 10, - ), - child: Row( - children: [ - Container( - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(20), - color: Colors.grey[800], - ), - height: 70, - width: 70, - ), - SizedBox( - width: 19, - ), - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - SizedBox( - height: 15, - ), - Text( - 'DOMAIN', - style: TextStyle(fontSize: 15), - ), - Text('Project Name'), - ], - ) - ], - ), - ), - ), - Container( - height: 30, - width: 320, - child: Align( - alignment: Alignment.topRight, - child: SizedBox( - height: double.infinity, - child: ElevatedButton( - onPressed: () { - PreviousProjectsRouting.pushToSpecificProject( - context); - }, - child: Text( - 'Learn More', - style: TextStyle( - fontSize: 15, color: Colors.grey[800]), - ), - style: ElevatedButton.styleFrom( - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.zero), - backgroundColor: Colors.grey[400], - ), - ), - ), - ), - ) - ], + padding: EdgeInsets.only( + left: 20, right: 20, top: 10, bottom: 10), + textStyle: GoogleFonts.poppins( + fontSize: 10, + fontWeight: FontWeight.bold, ), - ], + ), + onPressed: () { + PreviousProjectsRouting.pushToSpecificProject(context); + }, + child: Text("Explore"), ), - ) - ], + ], + ), ), - ), + ], ), - )); + ); } } From 3a2c5ceac2c04f0e5a654a2a767bf608d5acac63 Mon Sep 17 00:00:00 2001 From: Kartikjarali010 Date: Sun, 16 Feb 2025 15:42:56 +0530 Subject: [PATCH 29/63] updated button on login page --- .../lib/pages/common_pages/login_page.dart | 26 +++++++++++-------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/frontend/lib/pages/common_pages/login_page.dart b/frontend/lib/pages/common_pages/login_page.dart index ef8ce96..a8920ed 100644 --- a/frontend/lib/pages/common_pages/login_page.dart +++ b/frontend/lib/pages/common_pages/login_page.dart @@ -51,16 +51,20 @@ class LoginPage extends StatelessWidget { ), ), SizedBox(height: 10), - Text( - 'Sign in to your account', - style: TextStyle( - fontSize: 16, - color: Colors.black54, + Padding( + padding: const EdgeInsets.fromLTRB(0, 0, 0, 0), + child: Text( + 'Sign in to your account', + textAlign: TextAlign.left, + style: TextStyle( + fontSize: 16, + color: Colors.black54, + ), ), ), - SizedBox(height: 20), + SizedBox(height: 0), Padding( - padding: const EdgeInsets.fromLTRB(25, 10, 25, 25), + padding: const EdgeInsets.fromLTRB(25, 10, 25, 10), child: TextField( decoration: InputDecoration( prefixIcon: Icon(Icons.person), @@ -99,10 +103,10 @@ class LoginPage extends StatelessWidget { }, style: ElevatedButton.styleFrom( backgroundColor: Color(0xFF5e00b0), - padding: EdgeInsets.symmetric(vertical: 15), + padding: EdgeInsets.symmetric(vertical: 10), textStyle: TextStyle(fontSize: 18), shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(5), + borderRadius: BorderRadius.circular(10), ), ), child: Center( @@ -148,10 +152,10 @@ class LoginPage extends StatelessWidget { style: ElevatedButton.styleFrom( backgroundColor: Colors.white, side: BorderSide(color: Color(0xFF5e00b0)), - padding: EdgeInsets.symmetric(vertical: 15), + padding: EdgeInsets.symmetric(vertical: 10), textStyle: TextStyle(fontSize: 18,color: Colors.grey), shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(5), + borderRadius: BorderRadius.circular(10), ), ), child: Center( From 6668b49de190c7b6136709401000a31c1486c05e Mon Sep 17 00:00:00 2001 From: bharathan06 Date: Sun, 16 Feb 2025 16:17:20 +0530 Subject: [PATCH 30/63] setup django debugger, added a new makefile with easy access commands, changed manage.py to enable it --- backend/myproject/manage.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/backend/myproject/manage.py b/backend/myproject/manage.py index 222f06d..7ecc615 100644 --- a/backend/myproject/manage.py +++ b/backend/myproject/manage.py @@ -2,11 +2,20 @@ """Django's command-line utility for administrative tasks.""" import os import sys +import debugpy + # os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings') def main(): """Run administrative tasks.""" os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings') + + if "runserver" in sys.argv: + import debugpy + debugpy.listen(("0.0.0.0", 5678)) + print("Waiting for debugger attach...") + debugpy.wait_for_client() + try: from django.core.management import execute_from_command_line except ImportError as exc: From 809b044cab87e8f4f11433dccfb601ab60156db6 Mon Sep 17 00:00:00 2001 From: bharathan06 Date: Sun, 16 Feb 2025 16:21:00 +0530 Subject: [PATCH 31/63] same --- .vscode/launch.json | 3 ++- makefile | 37 +++++++++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 1 deletion(-) create mode 100644 makefile diff --git a/.vscode/launch.json b/.vscode/launch.json index d30496b..95464f9 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -16,7 +16,8 @@ ], "django": true, "autoStartBrowser": false, - "program": "${workspaceFolder}\\manage.py" + "justMyCode": false, + "program": "${workspaceFolder}/backend/myproject/manage.py" } ] } \ No newline at end of file diff --git a/makefile b/makefile new file mode 100644 index 0000000..e7d3581 --- /dev/null +++ b/makefile @@ -0,0 +1,37 @@ +# Variables +MODE ?= local + +# Echo color +GREEN = \033[0;32m +BLUE = \033[0;34m +YELLOW = \033[0;33m +NC = \033[0m + +run: + APP_MODE=$(MODE) python manage.py runserver + +# fmt: +# black . + +debug: + APP_MODE=$(MODE) python -m debugpy --listen 5678 --wait-for-client manage.py runserver + +mm: + APP_MODE=$(MODE) python manage.py makemigrations + +migrate: + APP_MODE=$(MODE) python manage.py migrate + +su: + APP_MODE=$(MODE) python manage.py createsuperuser + + +# collectstatic: +# APP_MODE=$(MODE) python manage.py collectstatic + +clear_db: + find . -path "*/migrations/*.py" -not -name "__init__.py" -delete + find . -path "*/migrations/*.pyc" -delete + +freeze: + pip freeze > requirements.txt From a717edb78849bf06007cfde16c9af3026e195da2 Mon Sep 17 00:00:00 2001 From: yvaishalirao Date: Sun, 16 Feb 2025 18:21:58 +0530 Subject: [PATCH 32/63] added horizontal scroll to domain cards --- frontend/lib/pages/common_pages/domain.dart | 233 +++++++------------- 1 file changed, 77 insertions(+), 156 deletions(-) diff --git a/frontend/lib/pages/common_pages/domain.dart b/frontend/lib/pages/common_pages/domain.dart index f21ec50..3341309 100644 --- a/frontend/lib/pages/common_pages/domain.dart +++ b/frontend/lib/pages/common_pages/domain.dart @@ -1,5 +1,4 @@ import 'package:flutter/material.dart'; -import 'package:google_fonts/google_fonts.dart'; class DomainPage extends StatefulWidget { const DomainPage({super.key}); @@ -9,6 +8,14 @@ class DomainPage extends StatefulWidget { } class _DomainPageState extends State { + final List> projects = List.generate( + 6, + (index) => { + "name": "Project name", + "team": "Team A", + "description": "Lorem ipsum dolor sit amet.", + }, + ); @override Widget build(BuildContext context) { return SafeArea( @@ -19,155 +26,19 @@ class _DomainPageState extends State { children: [ searchBar(), welcomeBack(), - cycleCard(), - const SizedBox(height: 40), - Expanded(child: domianGrid()), - ], - ), - ), - ); - } - - Widget cycleCard() { - return Container( - padding: const EdgeInsets.all(10), - margin: const EdgeInsets.symmetric(horizontal: 14), - decoration: BoxDecoration( - color: const Color(0xFF183D3D), - borderRadius: BorderRadius.circular(23), - ), - child: Column( - children: [ - Row( - children: [ - Container( - height: 70, - width: 70, - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(35), - color: const Color(0xFF5C8374), + const SizedBox(height: 20), + Expanded( + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 16), + child: ListView.builder( + itemCount: 3, + itemBuilder: (context, index) => domainArea(), ), - child: const Icon( - Icons.pedal_bike, - color: Colors.white, - size: 38, - ), - ), - const SizedBox(width: 4), - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - "My Cycle", - style: GoogleFonts.inter( - textStyle: const TextStyle( - color: Colors.white, - fontSize: 19, - fontWeight: FontWeight.w500, - ), - ), - ), - Text( - "Web Dev 68", - style: GoogleFonts.inter( - textStyle: const TextStyle( - color: Color(0xFFC6C6C6), - fontSize: 14, - fontWeight: FontWeight.w500, - ), - ), - ) - ], - ), - ], - ), - const SizedBox(height: 20), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Row( - children: [ - Text( - 'Week', - style: GoogleFonts.inter( - textStyle: const TextStyle( - fontSize: 21, - color: Color(0xFF999999), - ), - ), - ), - const SizedBox(width: 2), - Text( - '4', - style: GoogleFonts.inter( - textStyle: const TextStyle( - fontSize: 21, - color: Colors.white, - ), - ), - ), - ], ), - ElevatedButton( - style: ElevatedButton.styleFrom( - padding: - const EdgeInsets.symmetric(vertical: 20, horizontal: 45), - backgroundColor: const Color(0xFF93B1A6), - foregroundColor: Colors.white, - textStyle: const TextStyle( - fontSize: 19, - fontWeight: FontWeight.bold, - ), - ), - onPressed: () {}, - child: const Text("Review"), - ), - ], - ), - ], - ), - ); - } - - Widget domianGrid() { - return GridView.builder( - padding: const EdgeInsets.symmetric(horizontal: 14), - gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount( - crossAxisCount: 2, - mainAxisSpacing: 7, - crossAxisSpacing: 7, + ), + ], + ), ), - itemCount: domainData.length, - itemBuilder: (context, index) { - return Container( - decoration: BoxDecoration( - color: const Color(0xFF183D3D), - borderRadius: BorderRadius.circular(24), - ), - child: Column( - mainAxisSize: MainAxisSize.min, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Image.asset( - domainData[index]["imagePath"]!, - fit: BoxFit.cover, - height: 58, - width: 111, - ), - const SizedBox(height: 28), - Text( - domainData[index]["title"]!, - style: GoogleFonts.hiMelody( - textStyle: const TextStyle( - fontSize: 29, - color: Colors.white, - ), - ), - ), - ], - ), - ); - }, ); } @@ -226,13 +97,63 @@ class _DomainPageState extends State { ), ); } -} -final List> domainData = [ - {"title": "GameDev81", "imagePath": "assets/images/game.png"}, - {"title": "GameDev82", "imagePath": "assets/images/game.png"}, - {"title": "AppDev81", "imagePath": "assets/images/game.png"}, - {"title": "AppDev82", "imagePath": "assets/images/game.png"}, - {"title": "WebDev81", "imagePath": "assets/images/game.png"}, - {"title": "WebDev82", "imagePath": "assets/images/game.png"}, -]; + Widget domainArea() { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text("AI/ML", + style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold)), + SizedBox(height: 8), + SizedBox( + height: 130, + //width: 80, + child: SingleChildScrollView( + scrollDirection: Axis.horizontal, + child: Row( + children: projects.map((project) { + return Padding( + padding: const EdgeInsets.only(right: 10), + child: SizedBox(width: 170, child: domainCards(project)), + ); + }).toList(), + ), + ), + ), + SizedBox(height: 10), + Text( + "Explore more projects", + style: TextStyle( + color: Colors.purple, + decoration: TextDecoration.underline, + decorationThickness: 2), + ), + SizedBox(height: 20), + ], + ); + } + + Widget domainCards(Map project) { + return Card( + shadowColor: Colors.black87, + elevation: 5, + color: Color.fromRGBO(122, 36, 180, 1), + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10)), + child: Padding( + padding: const EdgeInsets.all(10.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(project["name"]!, + style: TextStyle( + color: Colors.white, fontWeight: FontWeight.bold)), + Text(project["team"]!, style: TextStyle(color: Colors.white70)), + SizedBox(height: 5), + Text(project["description"]!, + style: TextStyle(color: Colors.white70, fontSize: 12)), + ], + ), + ), + ); + } +} From b3d56fd783bb65ea2a3f0e682c7dbe7a991a9414 Mon Sep 17 00:00:00 2001 From: yvaishalirao Date: Sun, 16 Feb 2025 21:46:32 +0530 Subject: [PATCH 33/63] pull and domain page readjust --- frontend/lib/models/domain_model.dart | 0 frontend/lib/pages/common_pages/domain.dart | 159 -------------------- 2 files changed, 159 deletions(-) create mode 100644 frontend/lib/models/domain_model.dart delete mode 100644 frontend/lib/pages/common_pages/domain.dart diff --git a/frontend/lib/models/domain_model.dart b/frontend/lib/models/domain_model.dart new file mode 100644 index 0000000..e69de29 diff --git a/frontend/lib/pages/common_pages/domain.dart b/frontend/lib/pages/common_pages/domain.dart deleted file mode 100644 index 3341309..0000000 --- a/frontend/lib/pages/common_pages/domain.dart +++ /dev/null @@ -1,159 +0,0 @@ -import 'package:flutter/material.dart'; - -class DomainPage extends StatefulWidget { - const DomainPage({super.key}); - - @override - State createState() => _DomainPageState(); -} - -class _DomainPageState extends State { - final List> projects = List.generate( - 6, - (index) => { - "name": "Project name", - "team": "Team A", - "description": "Lorem ipsum dolor sit amet.", - }, - ); - @override - Widget build(BuildContext context) { - return SafeArea( - child: Scaffold( - appBar: appBarCommon(), - backgroundColor: Colors.white, - body: Column( - children: [ - searchBar(), - welcomeBack(), - const SizedBox(height: 20), - Expanded( - child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 16), - child: ListView.builder( - itemCount: 3, - itemBuilder: (context, index) => domainArea(), - ), - ), - ), - ], - ), - ), - ); - } - - PreferredSizeWidget appBarCommon() { - return AppBar( - elevation: 0.00, - backgroundColor: Colors.white, - actions: [ - IconButton( - icon: const Icon(Icons.notifications), - tooltip: 'Setting Icon', - onPressed: () {}, - ), //IconButton - ], - ); - } - - Widget searchBar() { - return Container( - padding: EdgeInsets.all(16), - child: TextField( - decoration: InputDecoration( - labelText: 'search all projects', - border: OutlineInputBorder( - borderRadius: BorderRadius.all(Radius.circular(20.0)), - ), - prefixIcon: Icon(Icons.search), - ), - ), - ); - } - - Widget welcomeBack() { - return Container( - padding: const EdgeInsets.all(10), - margin: const EdgeInsets.symmetric(horizontal: 14), - child: Column( - children: [ - Row( - children: [ - Text( - 'Welcome Back,', - style: TextStyle(fontSize: 30), - ), - ], - ), - Row( - children: [ - Text( - 'STUDENT', - style: TextStyle(fontSize: 40), - ), - ], - ) - ], - ), - ); - } - - Widget domainArea() { - return Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text("AI/ML", - style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold)), - SizedBox(height: 8), - SizedBox( - height: 130, - //width: 80, - child: SingleChildScrollView( - scrollDirection: Axis.horizontal, - child: Row( - children: projects.map((project) { - return Padding( - padding: const EdgeInsets.only(right: 10), - child: SizedBox(width: 170, child: domainCards(project)), - ); - }).toList(), - ), - ), - ), - SizedBox(height: 10), - Text( - "Explore more projects", - style: TextStyle( - color: Colors.purple, - decoration: TextDecoration.underline, - decorationThickness: 2), - ), - SizedBox(height: 20), - ], - ); - } - - Widget domainCards(Map project) { - return Card( - shadowColor: Colors.black87, - elevation: 5, - color: Color.fromRGBO(122, 36, 180, 1), - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10)), - child: Padding( - padding: const EdgeInsets.all(10.0), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text(project["name"]!, - style: TextStyle( - color: Colors.white, fontWeight: FontWeight.bold)), - Text(project["team"]!, style: TextStyle(color: Colors.white70)), - SizedBox(height: 5), - Text(project["description"]!, - style: TextStyle(color: Colors.white70, fontSize: 12)), - ], - ), - ), - ); - } -} From 75199d060851f0ed40ea2cbc3b594b006f4f9481 Mon Sep 17 00:00:00 2001 From: yvaishalirao Date: Sun, 16 Feb 2025 21:46:54 +0530 Subject: [PATCH 34/63] pull and domain page readjust --- .idea/libraries/Dart_Packages.xml | 40 +-- frontend/lib/models/domain_model.dart | 8 + .../common_pages/domain_pages/domain.dart | 290 +++++++++--------- frontend/pubspec.lock | 30 +- 4 files changed, 183 insertions(+), 185 deletions(-) diff --git a/.idea/libraries/Dart_Packages.xml b/.idea/libraries/Dart_Packages.xml index 41666ed..ac0e4b8 100644 --- a/.idea/libraries/Dart_Packages.xml +++ b/.idea/libraries/Dart_Packages.xml @@ -124,14 +124,14 @@ - - @@ -180,7 +180,7 @@ - @@ -250,7 +250,7 @@ - @@ -299,7 +299,7 @@ - @@ -397,14 +397,14 @@ - - @@ -495,7 +495,7 @@ - @@ -509,7 +509,7 @@ - @@ -579,7 +579,7 @@ - @@ -609,13 +609,13 @@ - - + + - + @@ -625,14 +625,14 @@ - + - + @@ -646,8 +646,8 @@ - - + + @@ -659,9 +659,9 @@ - + - + @@ -671,7 +671,7 @@ - + diff --git a/frontend/lib/models/domain_model.dart b/frontend/lib/models/domain_model.dart index e69de29..37de0f3 100644 --- a/frontend/lib/models/domain_model.dart +++ b/frontend/lib/models/domain_model.dart @@ -0,0 +1,8 @@ +// final List> projects = List.generate( +// 6, +// (index) => { +// "name": "Project name", +// "team": "Team A", +// "description": "Lorem ipsum dolor sit amet.", +// }, +// ); diff --git a/frontend/lib/pages/common_pages/domain_pages/domain.dart b/frontend/lib/pages/common_pages/domain_pages/domain.dart index 9decfc3..3341309 100644 --- a/frontend/lib/pages/common_pages/domain_pages/domain.dart +++ b/frontend/lib/pages/common_pages/domain_pages/domain.dart @@ -1,166 +1,156 @@ -import 'package:dev_track_app/pages/common_pages/domain_pages/topNav.dart'; -import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:google_fonts/google_fonts.dart'; -class DomainPage extends StatelessWidget { +class DomainPage extends StatefulWidget { const DomainPage({super.key}); + @override + State createState() => _DomainPageState(); +} + +class _DomainPageState extends State { + final List> projects = List.generate( + 6, + (index) => { + "name": "Project name", + "team": "Team A", + "description": "Lorem ipsum dolor sit amet.", + }, + ); @override Widget build(BuildContext context) { return SafeArea( child: Scaffold( - backgroundColor: const Color(0xFF040D12), + appBar: appBarCommon(), + backgroundColor: Colors.white, body: Column( children: [ - TopNav(), - Container( - padding: EdgeInsets.all(10), - margin: EdgeInsets.only(left: 14, right: 14), - decoration: BoxDecoration( - color: Color(0xFF183D3D), - borderRadius: BorderRadius.circular(23), - ), - child: Column( - children: [ - Row( - children: [ - Container( - height: 70, - width: 70, - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(35), - color: Color(0xFF5C8374)), - child: Align( - alignment: Alignment.center, - child: Icon( - Icons.pedal_bike, - color: Colors.white, - size: 38, - ), - ), - ), - SizedBox( - width: 4, - ), - Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Text( - "My Cycle", - style: GoogleFonts.inter( - textStyle: TextStyle( - color: Colors.white, - fontSize: 19, - fontWeight: FontWeight.w500), - ), - ), - Text( - "Web Dev 68", - style: GoogleFonts.inter( - textStyle: TextStyle( - color: Color(0xFFC6C6C6), - fontSize: 14, - fontWeight: FontWeight.w500), - ), - ) - ], - ) - ], - ), - SizedBox( - height: 20, - ), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Row( - children: [ - Text( - 'Week', - style: GoogleFonts.inter( - textStyle: TextStyle( - fontSize: 21, - color: Color(0xFF999999), - ), - ), - ), - SizedBox( - width: 2, - ), - Text( - '4', - style: GoogleFonts.inter( - textStyle: TextStyle( - fontSize: 21, - color: Colors.white, - ), - ), - ), - ], - ), - ElevatedButton( - style: ButtonStyle( - padding: MaterialStatePropertyAll(EdgeInsets.only( - top: 20, bottom: 20, left: 45, right: 45)), - backgroundColor: - MaterialStatePropertyAll(Color(0xFF93B1A6)), - foregroundColor: - MaterialStatePropertyAll(Colors.white), - textStyle: MaterialStatePropertyAll(TextStyle( - fontSize: 19, fontWeight: FontWeight.bold))), - child: Text("Review"), - onPressed: null, - ) - ], - ), - ], + searchBar(), + welcomeBack(), + const SizedBox(height: 20), + Expanded( + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 16), + child: ListView.builder( + itemCount: 3, + itemBuilder: (context, index) => domainArea(), + ), ), ), - SizedBox( - height: 40, + ], + ), + ), + ); + } + + PreferredSizeWidget appBarCommon() { + return AppBar( + elevation: 0.00, + backgroundColor: Colors.white, + actions: [ + IconButton( + icon: const Icon(Icons.notifications), + tooltip: 'Setting Icon', + onPressed: () {}, + ), //IconButton + ], + ); + } + + Widget searchBar() { + return Container( + padding: EdgeInsets.all(16), + child: TextField( + decoration: InputDecoration( + labelText: 'search all projects', + border: OutlineInputBorder( + borderRadius: BorderRadius.all(Radius.circular(20.0)), + ), + prefixIcon: Icon(Icons.search), + ), + ), + ); + } + + Widget welcomeBack() { + return Container( + padding: const EdgeInsets.all(10), + margin: const EdgeInsets.symmetric(horizontal: 14), + child: Column( + children: [ + Row( + children: [ + Text( + 'Welcome Back,', + style: TextStyle(fontSize: 30), + ), + ], + ), + Row( + children: [ + Text( + 'STUDENT', + style: TextStyle(fontSize: 40), + ), + ], + ) + ], + ), + ); + } + + Widget domainArea() { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text("AI/ML", + style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold)), + SizedBox(height: 8), + SizedBox( + height: 130, + //width: 80, + child: SingleChildScrollView( + scrollDirection: Axis.horizontal, + child: Row( + children: projects.map((project) { + return Padding( + padding: const EdgeInsets.only(right: 10), + child: SizedBox(width: 170, child: domainCards(project)), + ); + }).toList(), ), - Expanded( - child: GridView.count( - crossAxisCount: 2, - padding: EdgeInsets.only(left: 14, right: 14), - mainAxisSpacing: 7, - crossAxisSpacing: 7, - children: List.generate( - 6, - (index) => Container( - decoration: BoxDecoration( - color: Color(0xFF183D3D), - borderRadius: BorderRadius.circular(24)), - child: Align( - alignment: Alignment.center, - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Image.asset( - 'assets/images/game.png', - fit: BoxFit.cover, - height: 58, - width: 111, - ), - SizedBox( - height: 28, - ), - Text( - "Game Dev", - style: GoogleFonts.hiMelody( - textStyle: TextStyle( - fontSize: 29, - color: Colors.white, - )), - ) - ], - ), - ), - ), - )), - ) + ), + ), + SizedBox(height: 10), + Text( + "Explore more projects", + style: TextStyle( + color: Colors.purple, + decoration: TextDecoration.underline, + decorationThickness: 2), + ), + SizedBox(height: 20), + ], + ); + } + + Widget domainCards(Map project) { + return Card( + shadowColor: Colors.black87, + elevation: 5, + color: Color.fromRGBO(122, 36, 180, 1), + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10)), + child: Padding( + padding: const EdgeInsets.all(10.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(project["name"]!, + style: TextStyle( + color: Colors.white, fontWeight: FontWeight.bold)), + Text(project["team"]!, style: TextStyle(color: Colors.white70)), + SizedBox(height: 5), + Text(project["description"]!, + style: TextStyle(color: Colors.white70, fontSize: 12)), ], ), ), diff --git a/frontend/pubspec.lock b/frontend/pubspec.lock index 12d4bf6..9d9b4c8 100644 --- a/frontend/pubspec.lock +++ b/frontend/pubspec.lock @@ -37,10 +37,10 @@ packages: dependency: transitive description: name: collection - sha256: a1ace0a119f20aabc852d165077c036cd864315bd99b7eaa10a60100341941bf + sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a url: "https://pub.dev" source: hosted - version: "1.19.0" + version: "1.18.0" cross_file: dependency: transitive description: @@ -252,18 +252,18 @@ packages: dependency: transitive description: name: leak_tracker - sha256: "7bb2830ebd849694d1ec25bf1f44582d6ac531a57a365a803a6034ff751d2d06" + sha256: "3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05" url: "https://pub.dev" source: hosted - version: "10.0.7" + version: "10.0.5" leak_tracker_flutter_testing: dependency: transitive description: name: leak_tracker_flutter_testing - sha256: "9491a714cca3667b60b5c420da8217e6de0d1ba7a5ec322fab01758f6998f379" + sha256: "932549fb305594d82d7183ecd9fa93463e9914e1b67cacc34bc40906594a1806" url: "https://pub.dev" source: hosted - version: "3.0.8" + version: "3.0.5" leak_tracker_testing: dependency: transitive description: @@ -500,7 +500,7 @@ packages: dependency: transitive description: flutter source: sdk - version: "0.0.0" + version: "0.0.99" source_span: dependency: transitive description: @@ -513,10 +513,10 @@ packages: dependency: transitive description: name: stack_trace - sha256: "9f47fd3630d76be3ab26f0ee06d213679aa425996925ff3feffdec504931c377" + sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b" url: "https://pub.dev" source: hosted - version: "1.12.0" + version: "1.11.1" stream_channel: dependency: transitive description: @@ -529,10 +529,10 @@ packages: dependency: transitive description: name: string_scanner - sha256: "688af5ed3402a4bde5b3a6c15fd768dbf2621a614950b17f04626c431ab3c4c3" + sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" url: "https://pub.dev" source: hosted - version: "1.3.0" + version: "1.2.0" term_glyph: dependency: transitive description: @@ -545,10 +545,10 @@ packages: dependency: transitive description: name: test_api - sha256: "664d3a9a64782fcdeb83ce9c6b39e78fd2971d4e37827b9b06c3aa1edc5e760c" + sha256: "5b8a98dafc4d5c4c9c72d8b31ab2b23fc13422348d2997120294d3bac86b4ddb" url: "https://pub.dev" source: hosted - version: "0.7.3" + version: "0.7.2" typed_data: dependency: transitive description: @@ -633,10 +633,10 @@ packages: dependency: transitive description: name: vm_service - sha256: f6be3ed8bd01289b34d679c2b62226f63c0e69f9fd2e50a6b3c1c729a961041b + sha256: f652077d0bdf60abe4c1f6377448e8655008eef28f128bc023f7b5e8dfeb48fc url: "https://pub.dev" source: hosted - version: "14.3.0" + version: "14.2.4" web: dependency: transitive description: From 1ca0285e6bfb793f2d93957fe87db5060d297048 Mon Sep 17 00:00:00 2001 From: Piyush Chakarborthy <102757301+Chakravartinsamrat@users.noreply.github.com> Date: Mon, 17 Feb 2025 01:19:34 +0530 Subject: [PATCH 35/63] =?UTF-8?q?Api=20Ready=20Page=20:)=20=F0=9F=92=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Insane W --- .../android/app/src/main/AndroidManifest.xml | 8 + frontend/android/gradle.properties | 2 + frontend/ios/Runner/Info.plist | 4 + .../models/new_specific_projectModels.dart | 95 ++++++++ frontend/lib/pages/home.dart | 23 +- .../project_display/new_specific_project.dart | 219 ++++++++++++++++++ frontend/lib/theme/colors.dart | 4 +- frontend/lib/utils/topnavbar.dart | 43 ++++ frontend/pubspec.lock | 38 +-- frontend/pubspec.yaml | 2 +- 10 files changed, 415 insertions(+), 23 deletions(-) create mode 100644 frontend/lib/models/new_specific_projectModels.dart create mode 100644 frontend/lib/pages/user_pages/project_pages/project_display/new_specific_project.dart create mode 100644 frontend/lib/utils/topnavbar.dart diff --git a/frontend/android/app/src/main/AndroidManifest.xml b/frontend/android/app/src/main/AndroidManifest.xml index 6f2f4c8..949d141 100644 --- a/frontend/android/app/src/main/AndroidManifest.xml +++ b/frontend/android/app/src/main/AndroidManifest.xml @@ -44,4 +44,12 @@ + + + + + + + + diff --git a/frontend/android/gradle.properties b/frontend/android/gradle.properties index 598d13f..06c53e1 100644 --- a/frontend/android/gradle.properties +++ b/frontend/android/gradle.properties @@ -1,3 +1,5 @@ org.gradle.jvmargs=-Xmx4G android.useAndroidX=true android.enableJetifier=true +android.useAndroidX=true +android.enableJetifier=true \ No newline at end of file diff --git a/frontend/ios/Runner/Info.plist b/frontend/ios/Runner/Info.plist index 992d529..8cb0658 100644 --- a/frontend/ios/Runner/Info.plist +++ b/frontend/ios/Runner/Info.plist @@ -51,5 +51,9 @@ Camera Usage NSMicrophoneUsageDescription Microphone Usage + LSApplicationQueriesSchemes + + https + diff --git a/frontend/lib/models/new_specific_projectModels.dart b/frontend/lib/models/new_specific_projectModels.dart new file mode 100644 index 0000000..e3d1b1d --- /dev/null +++ b/frontend/lib/models/new_specific_projectModels.dart @@ -0,0 +1,95 @@ +// Team Member data model +class TeamMember { + final String name; + final String imageUrl; + final String linkedInUrl; + + TeamMember({ + required this.name, + required this.imageUrl, + required this.linkedInUrl, + }); + + // TODO: Add fromJson constructor for API integration + // factory TeamMember.fromJson(Map json) { + // return TeamMember( + // name: json['name'], + // imageUrl: json['image_url'], + // linkedInUrl: json['linkedin_url'], + // ); + // } +} + +// Data model for specific project details +class SpecificProjectData { + final String projectName; + final String projectCycle; + final String projectImage; + final String description; + final double progress; + final String githubLink; + final String projectLink; + final List teamMembers; + + SpecificProjectData({ + required this.projectName, + required this.projectCycle, + required this.projectImage, + required this.description, + required this.progress, + required this.githubLink, + required this.projectLink, + required this.teamMembers, + }); + + // TODO: Add fromJson constructor for API integration + // factory SpecificProjectData.fromJson(Map json) { + // return SpecificProjectData( + // projectName: json['project_name'], + // projectCycle: json['project_cycle'], + // projectImage: json['project_image'], + // description: json['description'], + // progress: json['progress'].toDouble(), + // githubLink: json['github_link'], + // projectLink: json['project_link'], + // teamMembers: (json['team_members'] as List) + // .map((member) => TeamMember.fromJson(member)) + // .toList(), + // ); + // } +} + +// Dummy data for development +final dummyProjectData = SpecificProjectData( + projectName: "SAMPLE PROJECT", + projectCycle: "Project Cycle 1", + projectImage: "https://i.imgur.com/ea9PB3H.png", + description: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. " + "Pellentesque at eros finibus, scelerisque elit at, iaculis " + "massa. Phasellus a risus dolor.", + progress: 0.69, + githubLink: "https://github.com/sample/project", + projectLink: "https://project-link.com", + teamMembers: [ + TeamMember( + name: "Piyush Chakarborthy", + imageUrl: "https://i.imgur.com/GKPso4W.jpeg", + linkedInUrl: "https://www.linkedin.com/in/piyushc2003/", + ), + TeamMember( + name: "Jane Smith", + imageUrl: "https://via.placeholder.com/150", + linkedInUrl: "https://www.linkedin.com/in/janesmith", + ), + TeamMember( + name: "Mike Johnson", + imageUrl: "https://via.placeholder.com/150", + linkedInUrl: "https://www.linkedin.com/in/mikejohnson", + ), + TeamMember( + name: "Sarah Wilson", + imageUrl: "https://via.placeholder.com/150", + linkedInUrl: "https://www.linkedin.com/in/sarahwilson", + ), + ], +); diff --git a/frontend/lib/pages/home.dart b/frontend/lib/pages/home.dart index 7fce26b..2c20ccc 100644 --- a/frontend/lib/pages/home.dart +++ b/frontend/lib/pages/home.dart @@ -5,7 +5,7 @@ import 'package:dev_track_app/pages/user_pages/project_pages/project_display/pre import 'package:dev_track_app/theme/splashscreen.dart'; import 'package:dev_track_app/pages/common_pages/confirm_page.dart'; import 'package:dev_track_app/pages/common_pages/domain_pages/domain.dart'; -import 'package:dev_track_app/pages/user_pages/project_pages/project_display/specific_project.dart'; +import 'package:dev_track_app/pages/user_pages/project_pages/project_display/new_specific_project.dart'; import 'package:dev_track_app/pages/common_pages/home_page.dart'; import 'package:flutter/material.dart'; import 'package:dev_track_app/pages/user_pages/tracker.dart'; @@ -227,6 +227,27 @@ class HomePag extends StatelessWidget { }, child: const Text("Student View"), ), + ElevatedButton( + style: ElevatedButton.styleFrom( + backgroundColor: Color.fromARGB(255, 50, 7, 120), + foregroundColor: Color.fromARGB(255, 242, 244, 244), + shadowColor: Colors.black12, + elevation: 5, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(30.0), + ), + padding: EdgeInsets.symmetric(horizontal: 20, vertical: 15), + textStyle: + const TextStyle(fontSize: 18, fontWeight: FontWeight.bold), + ), + onPressed: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => ProjectDetailPage())); + }, + child: const Text("New Project Detail Page"), + ), ], ), ), diff --git a/frontend/lib/pages/user_pages/project_pages/project_display/new_specific_project.dart b/frontend/lib/pages/user_pages/project_pages/project_display/new_specific_project.dart new file mode 100644 index 0000000..d8ef7a4 --- /dev/null +++ b/frontend/lib/pages/user_pages/project_pages/project_display/new_specific_project.dart @@ -0,0 +1,219 @@ +import 'package:flutter/material.dart'; +import 'package:url_launcher/url_launcher.dart'; +import 'package:dev_track_app/theme/colors.dart'; +import 'package:dev_track_app/utils/topnavbar.dart'; +import 'package:dev_track_app/models/new_specific_projectModels.dart'; + +class TeamMemberCard extends StatelessWidget { + final TeamMember member; + + const TeamMemberCard({Key? key, required this.member}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Card( + elevation: 2, + color: AppColors.primaryLight.withOpacity(0.9), + child: Padding( + padding: const EdgeInsets.all(18), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + ClipRRect( + borderRadius: BorderRadius.circular(8), + child: Image.network( + member.imageUrl, + width: 100, + height: 100, + fit: BoxFit.cover, + errorBuilder: (context, error, stackTrace) => + const Icon(Icons.person, size: 100), + ), + ), + const SizedBox(height: 8), + Text( + member.name, + style: Theme.of(context) + .textTheme + .titleMedium + ?.copyWith(color: AppColors.textPrimaryLight), + maxLines: 1, + overflow: TextOverflow.ellipsis, + ), + const SizedBox(height: 8), + InkWell( + onTap: () async { + final Uri url = Uri.parse(member.linkedInUrl); + if (await canLaunchUrl(url)) { + await launchUrl(url, mode: LaunchMode.externalApplication); + } + }, + child: Row( + mainAxisSize: MainAxisSize.min, + children: const [ + Icon(Icons.link, size: 16, color: AppColors.textPrimaryLight), + SizedBox(width: 4), + Text( + "LinkedIn", + style: TextStyle(color: AppColors.textPrimaryLight), + ), + ], + ), + ), + ], + ), + ), + ); + } +} + +class ProjectDetailPage extends StatelessWidget { + const ProjectDetailPage({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + // Use the dummy data from models + final projectData = dummyProjectData; + + return Scaffold( + backgroundColor: AppColors.backgroundLight, + appBar: TopNavBar( + onNotificationTap: () { + // Open notifications page + }, + ), + body: SingleChildScrollView( + padding: const EdgeInsets.symmetric(horizontal: 20), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const SizedBox(height: 16), + Text( + projectData.projectName, + style: Theme.of(context).textTheme.headlineLarge, + ), + const SizedBox(height: 4), + + Text( + projectData.projectCycle, + style: Theme.of(context).textTheme.titleLarge, + ), + const SizedBox(height: 16), + + Container( + height: 150, + width: double.infinity, + decoration: BoxDecoration( + color: AppColors.primaryLight.withOpacity(0.1), + borderRadius: BorderRadius.circular(8), + ), + child: ClipRRect( + borderRadius: BorderRadius.circular(8), + child: Image.network( + dummyProjectData.projectImage, + fit: BoxFit.cover, + errorBuilder: (context, error, stackTrace) { + debugPrint("Error loading image: $error"); + return const Icon( + Icons.image_search, + size: 50, + color: Colors.grey, + ); + }, + ), + ), + ), + const SizedBox(height: 16), + + Row( + children: [ + Expanded( + child: LinearProgressIndicator( + value: projectData.progress, + minHeight: 6, + color: Theme.of(context).colorScheme.primary, + backgroundColor: Colors.grey[300], + ), + ), + const SizedBox(width: 8), + Text("${(projectData.progress * 100).round()}%"), + ], + ), + const SizedBox(height: 24), + + Text( + "About", + style: Theme.of(context).textTheme.titleLarge, + ), + const SizedBox(height: 8), + + Text( + projectData.description, + style: Theme.of(context).textTheme.bodyLarge?.copyWith( + height: 1.4, + ), + textAlign: TextAlign.justify, + ), + const SizedBox(height: 24), + + Row( + children: [ + ElevatedButton( + onPressed: () async { + final Uri url = Uri.parse(projectData.githubLink); + if (await canLaunchUrl(url)) { + await launchUrl(url, + mode: LaunchMode.externalApplication); + } + }, + child: const Text("Github-Link"), + ), + const SizedBox(width: 16), + ElevatedButton( + onPressed: () async { + final Uri url = Uri.parse(projectData.projectLink); + if (await canLaunchUrl(url)) { + await launchUrl(url, + mode: LaunchMode.externalApplication); + } + }, + child: const Text("Link"), + ), + ], + ), + const SizedBox(height: 24), + + Text( + "Team Members", + style: Theme.of(context).textTheme.titleLarge, + ), + const SizedBox(height: 16), + + // Horizontal scrollable team members + SizedBox( + height: 220, // Fixed height for the scroll view + child: ListView.builder( + scrollDirection: Axis.horizontal, + itemCount: projectData.teamMembers.length, + itemBuilder: (context, index) { + return Padding( + padding: EdgeInsets.only( + right: 16, + left: index == 0 ? 0 : 0, + ), + child: SizedBox( + width: 160, // Fixed width for each card + child: TeamMemberCard( + member: projectData.teamMembers[index]), + ), + ); + }, + ), + ), + const SizedBox(height: 24), + ], + ), + ), + ); + } +} diff --git a/frontend/lib/theme/colors.dart b/frontend/lib/theme/colors.dart index 8980fc4..2e50383 100644 --- a/frontend/lib/theme/colors.dart +++ b/frontend/lib/theme/colors.dart @@ -4,8 +4,8 @@ class AppColors { // Light Theme Colors static const Color primaryLight = Color(0xFF6200EA); static const Color secondaryLight = Color(0xFF03DAC6); - static const Color backgroundLight = Color(0xFFF5F5F5); - static const Color textPrimaryLight = Color(0xFF212121); + static const Color backgroundLight = Color.fromARGB(255, 255, 255, 255); + static const Color textPrimaryLight = Color.fromARGB(255, 255, 255, 255); static const Color textSecondaryLight = Color(0xFF757575); static const Color accentLight = Color(0xFFFFC107); static const Color neutralLight = Color(0xFF666666); diff --git a/frontend/lib/utils/topnavbar.dart b/frontend/lib/utils/topnavbar.dart new file mode 100644 index 0000000..3b89740 --- /dev/null +++ b/frontend/lib/utils/topnavbar.dart @@ -0,0 +1,43 @@ +import 'package:flutter/material.dart'; +import "package:dev_track_app/theme/theme.dart"; +import 'package:dev_track_app/theme/colors.dart'; + +class TopNavBar extends StatelessWidget implements PreferredSizeWidget { + const TopNavBar({ + Key? key, + required this.onNotificationTap, + }) : super(key: key); + + final VoidCallback onNotificationTap; + + @override + Widget build(BuildContext context) { + return AppBar( + backgroundColor: AppColors.backgroundLight, + elevation: 0, + leading: IconButton( + icon: const Icon( + Icons.arrow_back, + color: Colors.black, + ), + onPressed: () { + // This will automatically handle the navigation stack + Navigator.pop(context); + }, + ), + actions: [ + IconButton( + icon: const Icon( + Icons.notifications, + color: Colors.black, + ), + onPressed: onNotificationTap, + ), + const SizedBox(width: 8), // Adds some padding to the right + ], + ); + } + + @override + Size get preferredSize => const Size.fromHeight(kToolbarHeight); +} diff --git a/frontend/pubspec.lock b/frontend/pubspec.lock index 12d4bf6..72a8c4b 100644 --- a/frontend/pubspec.lock +++ b/frontend/pubspec.lock @@ -37,10 +37,10 @@ packages: dependency: transitive description: name: collection - sha256: a1ace0a119f20aabc852d165077c036cd864315bd99b7eaa10a60100341941bf + sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a url: "https://pub.dev" source: hosted - version: "1.19.0" + version: "1.18.0" cross_file: dependency: transitive description: @@ -252,18 +252,18 @@ packages: dependency: transitive description: name: leak_tracker - sha256: "7bb2830ebd849694d1ec25bf1f44582d6ac531a57a365a803a6034ff751d2d06" + sha256: "7f0df31977cb2c0b88585095d168e689669a2cc9b97c309665e3386f3e9d341a" url: "https://pub.dev" source: hosted - version: "10.0.7" + version: "10.0.4" leak_tracker_flutter_testing: dependency: transitive description: name: leak_tracker_flutter_testing - sha256: "9491a714cca3667b60b5c420da8217e6de0d1ba7a5ec322fab01758f6998f379" + sha256: "06e98f569d004c1315b991ded39924b21af84cf14cc94791b8aea337d25b57f8" url: "https://pub.dev" source: hosted - version: "3.0.8" + version: "3.0.3" leak_tracker_testing: dependency: transitive description: @@ -292,18 +292,18 @@ packages: dependency: transitive description: name: material_color_utilities - sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec + sha256: "0e0a020085b65b6083975e499759762399b4475f766c21668c4ecca34ea74e5a" url: "https://pub.dev" source: hosted - version: "0.11.1" + version: "0.8.0" meta: dependency: transitive description: name: meta - sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7 + sha256: "7687075e408b093f36e6bbf6c91878cc0d4cd10f409506f7bc996f68220b9136" url: "https://pub.dev" source: hosted - version: "1.15.0" + version: "1.12.0" mime: dependency: transitive description: @@ -500,7 +500,7 @@ packages: dependency: transitive description: flutter source: sdk - version: "0.0.0" + version: "0.0.99" source_span: dependency: transitive description: @@ -513,10 +513,10 @@ packages: dependency: transitive description: name: stack_trace - sha256: "9f47fd3630d76be3ab26f0ee06d213679aa425996925ff3feffdec504931c377" + sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b" url: "https://pub.dev" source: hosted - version: "1.12.0" + version: "1.11.1" stream_channel: dependency: transitive description: @@ -529,10 +529,10 @@ packages: dependency: transitive description: name: string_scanner - sha256: "688af5ed3402a4bde5b3a6c15fd768dbf2621a614950b17f04626c431ab3c4c3" + sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" url: "https://pub.dev" source: hosted - version: "1.3.0" + version: "1.2.0" term_glyph: dependency: transitive description: @@ -545,10 +545,10 @@ packages: dependency: transitive description: name: test_api - sha256: "664d3a9a64782fcdeb83ce9c6b39e78fd2971d4e37827b9b06c3aa1edc5e760c" + sha256: "9955ae474176f7ac8ee4e989dadfb411a58c30415bcfb648fa04b2b8a03afa7f" url: "https://pub.dev" source: hosted - version: "0.7.3" + version: "0.7.0" typed_data: dependency: transitive description: @@ -633,10 +633,10 @@ packages: dependency: transitive description: name: vm_service - sha256: f6be3ed8bd01289b34d679c2b62226f63c0e69f9fd2e50a6b3c1c729a961041b + sha256: "3923c89304b715fb1eb6423f017651664a03bf5f4b29983627c4da791f74a4ec" url: "https://pub.dev" source: hosted - version: "14.3.0" + version: "14.2.1" web: dependency: transitive description: diff --git a/frontend/pubspec.yaml b/frontend/pubspec.yaml index d6a431b..2929519 100644 --- a/frontend/pubspec.yaml +++ b/frontend/pubspec.yaml @@ -37,7 +37,7 @@ dependencies: cupertino_icons: ^1.0.6 google_fonts: ^6.2.1 readmore: ^3.0.0 - url_launcher: ^6.3.0 + url_launcher: ^6.3.1 image_picker: ^1.1.2 shared_preferences: ^2.0.13 permission_handler: ^11.3.1 From 640f45d184a31b78b1df2025e8cf936948088051 Mon Sep 17 00:00:00 2001 From: Piyush Chakarborthy <102757301+Chakravartinsamrat@users.noreply.github.com> Date: Mon, 17 Feb 2025 01:23:35 +0530 Subject: [PATCH 36/63] Minor Changes Moved specific_prooject to to be discarded Path Changes to other pages, nothing much --- .../project_display => To-Be-Discarded}/specific_project.dart | 4 ++-- frontend/lib/pages/admin_pages/projects_card.dart | 2 +- .../project_pages/project_display/previous_projects.dart | 2 +- frontend/lib/routing/previous_projects_routing.dart | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) rename frontend/lib/{pages/user_pages/project_pages/project_display => To-Be-Discarded}/specific_project.dart (98%) diff --git a/frontend/lib/pages/user_pages/project_pages/project_display/specific_project.dart b/frontend/lib/To-Be-Discarded/specific_project.dart similarity index 98% rename from frontend/lib/pages/user_pages/project_pages/project_display/specific_project.dart rename to frontend/lib/To-Be-Discarded/specific_project.dart index 6c9711f..505d20e 100644 --- a/frontend/lib/pages/user_pages/project_pages/project_display/specific_project.dart +++ b/frontend/lib/To-Be-Discarded/specific_project.dart @@ -1,8 +1,8 @@ import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; import 'package:readmore/readmore.dart'; -import '../../../../models/std_details.dart'; -import 'teamcard.dart'; +import '../models/std_details.dart'; +import '../pages/user_pages/project_pages/project_display/teamcard.dart'; class SpecificProject extends StatefulWidget { const SpecificProject({super.key}); diff --git a/frontend/lib/pages/admin_pages/projects_card.dart b/frontend/lib/pages/admin_pages/projects_card.dart index 36fe367..f5934fa 100644 --- a/frontend/lib/pages/admin_pages/projects_card.dart +++ b/frontend/lib/pages/admin_pages/projects_card.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; -import 'package:dev_track_app/pages/user_pages/project_pages/project_display/specific_project.dart'; +import 'package:dev_track_app/To-Be-Discarded/specific_project.dart'; class Data { String domain_name; diff --git a/frontend/lib/pages/user_pages/project_pages/project_display/previous_projects.dart b/frontend/lib/pages/user_pages/project_pages/project_display/previous_projects.dart index b6e2afb..1380be1 100644 --- a/frontend/lib/pages/user_pages/project_pages/project_display/previous_projects.dart +++ b/frontend/lib/pages/user_pages/project_pages/project_display/previous_projects.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'specific_project.dart'; +import '../../../../To-Be-Discarded/specific_project.dart'; import '../../../../routing/previous_projects_routing.dart'; class PreviousProjects extends StatefulWidget { diff --git a/frontend/lib/routing/previous_projects_routing.dart b/frontend/lib/routing/previous_projects_routing.dart index 9d82dae..53d7de1 100644 --- a/frontend/lib/routing/previous_projects_routing.dart +++ b/frontend/lib/routing/previous_projects_routing.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import '../pages/user_pages/project_pages/project_display/specific_project.dart'; +import '../To-Be-Discarded/specific_project.dart'; class PreviousProjectsRouting { static void pop(BuildContext context) { From 2cfd34cbf7832fe83066744bc73bef9fd69bea0e Mon Sep 17 00:00:00 2001 From: ghamani <138302691+Ghamani121@users.noreply.github.com> Date: Mon, 17 Feb 2025 01:36:04 +0530 Subject: [PATCH 37/63] Previous page completed The ui for previous page is done Have added array list for data in model page for reference The colors and fonts had a few doubts, so didnt do compeltely --- .../lib/models/previous_projects_models.dart | 33 ++++++++++++++++ .../project_display/previous_projects.dart | 38 +++---------------- 2 files changed, 39 insertions(+), 32 deletions(-) create mode 100644 frontend/lib/models/previous_projects_models.dart diff --git a/frontend/lib/models/previous_projects_models.dart b/frontend/lib/models/previous_projects_models.dart new file mode 100644 index 0000000..c84ccc4 --- /dev/null +++ b/frontend/lib/models/previous_projects_models.dart @@ -0,0 +1,33 @@ + // final List> projects = + // [ + // { + // "title": "UI/UX 42", + // "subtitle": "Budgeting application", + // "description": "Lorem ipsum dolor sit amet, consectetur adipiscing elit.", + // "image": "assets/images/game.png" + // }, + // { + // "title": "Dev Track", + // "subtitle": "Project management tool", + // "description": "A tool to track developer progress in real-time.", + // "image": "assets/images/devtrack.png" + // }, + // { + // "title": "E-commerce App", + // "subtitle": "Shopping made easy", + // "description": "An intuitive mobile shopping experience.", + // "image": "assets/images/ecommerce.png" + // }, + // { + // "title": "E-commerce App", + // "subtitle": "Shopping made easy", + // "description": "An intuitive mobile shopping experience.", + // "image": "assets/images/ecommerce.png" + // }, + // { + // "title": "E-commerce App", + // "subtitle": "Shopping made easy", + // "description": "An intuitive mobile shopping experience.", + // "image": "assets/images/ecommerce.png" + // }, + // ]; \ No newline at end of file diff --git a/frontend/lib/pages/user_pages/project_pages/project_display/previous_projects.dart b/frontend/lib/pages/user_pages/project_pages/project_display/previous_projects.dart index 58e8ff6..e218ef0 100644 --- a/frontend/lib/pages/user_pages/project_pages/project_display/previous_projects.dart +++ b/frontend/lib/pages/user_pages/project_pages/project_display/previous_projects.dart @@ -3,6 +3,7 @@ import 'package:dev_track_app/pages/common_pages/domain_pages/topNav.dart'; import 'specific_project.dart'; import 'package:dev_track_app/routing/previous_projects_routing.dart'; import 'package:google_fonts/google_fonts.dart'; +import 'package:dev_track_app/theme/colors.dart'; class PreviousProjects extends StatefulWidget { const PreviousProjects({super.key}); @@ -18,7 +19,7 @@ class _PreviousProjectsState extends State { Widget build(BuildContext context) { return SafeArea( child: Scaffold( - backgroundColor: const Color(0xFFF7F4F3), + backgroundColor: AppColors.backgroundLight, body: Stack( children: [ Column( @@ -57,9 +58,9 @@ class _PreviousProjectsState extends State { child: TextField( decoration: InputDecoration( filled: true, - fillColor: Colors.white, + fillColor: AppColors.backgroundLight, labelText: 'search all projects', - prefixIcon: Icon(Icons.search, color: Colors.black54), + prefixIcon: Icon(Icons.search, color: AppColors.neutralDark), enabledBorder: OutlineInputBorder( borderRadius: BorderRadius.circular(14.0), borderSide: BorderSide(color: const Color(0xFF5B2333)), @@ -85,7 +86,8 @@ class _PreviousProjectsState extends State { ); } - final List> projects = [ + final List> projects = + [ { "title": "UI/UX 42", "subtitle": "Budgeting application", @@ -116,36 +118,8 @@ class _PreviousProjectsState extends State { "description": "An intuitive mobile shopping experience.", "image": "assets/images/ecommerce.png" }, - { - "title": "E-commerce App", - "subtitle": "Shopping made easy", - "description": "An intuitive mobile shopping experience.", - "image": "assets/images/ecommerce.png" - }, - { - "title": "E-commerce App", - "subtitle": "Shopping made easy", - "description": "An intuitive mobile shopping experience.", - "image": "assets/images/ecommerce.png" - }, - { - "title": "E-commerce App", - "subtitle": "Shopping made easy", - "description": "An intuitive mobile shopping experience.", - "image": "assets/images/ecommerce.png" - }, ]; -//logic to geneterate project cards - // Widget _buildProjectList() { - // return ListView.builder( - // padding: EdgeInsets.symmetric(horizontal: 15), - // itemCount: projects.length, - // itemBuilder: (context, index) { - // return _buildProjectCard(projects[index]); - // }, - // ); - // } //ui for cards Widget _buildProjectCard(Map project) { From c9d8ba25649c22c856045f6bfa883afa138e7c8e Mon Sep 17 00:00:00 2001 From: ghamani <138302691+Ghamani121@users.noreply.github.com> Date: Mon, 17 Feb 2025 11:40:41 +0530 Subject: [PATCH 38/63] Update pubspec.lock --- frontend/pubspec.lock | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/frontend/pubspec.lock b/frontend/pubspec.lock index a61737f..0685368 100644 --- a/frontend/pubspec.lock +++ b/frontend/pubspec.lock @@ -252,18 +252,18 @@ packages: dependency: transitive description: name: leak_tracker - sha256: c35baad643ba394b40aac41080300150a4f08fd0fd6a10378f8f7c6bc161acec + sha256: "3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05" url: "https://pub.dev" source: hosted - version: "10.0.8" + version: "10.0.5" leak_tracker_flutter_testing: dependency: transitive description: name: leak_tracker_flutter_testing - sha256: f8b613e7e6a13ec79cfdc0e97638fddb3ab848452eff057653abd3edba760573 + sha256: "932549fb305594d82d7183ecd9fa93463e9914e1b67cacc34bc40906594a1806" url: "https://pub.dev" source: hosted - version: "3.0.9" + version: "3.0.5" leak_tracker_testing: dependency: transitive description: @@ -513,10 +513,10 @@ packages: dependency: transitive description: name: stack_trace - sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1" + sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b" url: "https://pub.dev" source: hosted - version: "1.12.1" + version: "1.11.1" stream_channel: dependency: transitive description: @@ -529,10 +529,10 @@ packages: dependency: transitive description: name: string_scanner - sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43" + sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" url: "https://pub.dev" source: hosted - version: "1.4.1" + version: "1.2.0" term_glyph: dependency: transitive description: @@ -545,10 +545,10 @@ packages: dependency: transitive description: name: test_api - sha256: fb31f383e2ee25fbbfe06b40fe21e1e458d14080e3c67e7ba0acfde4df4e0bbd + sha256: "5b8a98dafc4d5c4c9c72d8b31ab2b23fc13422348d2997120294d3bac86b4ddb" url: "https://pub.dev" source: hosted - version: "0.7.4" + version: "0.7.2" typed_data: dependency: transitive description: @@ -633,10 +633,10 @@ packages: dependency: transitive description: name: vm_service - sha256: "0968250880a6c5fe7edc067ed0a13d4bae1577fe2771dcf3010d52c4a9d3ca14" + sha256: f652077d0bdf60abe4c1f6377448e8655008eef28f128bc023f7b5e8dfeb48fc url: "https://pub.dev" source: hosted - version: "14.3.1" + version: "14.2.4" web: dependency: transitive description: From a4fb137faf4942cf9dbeaa728acbe98bf12db2d3 Mon Sep 17 00:00:00 2001 From: ghamani <138302691+Ghamani121@users.noreply.github.com> Date: Mon, 17 Feb 2025 11:50:37 +0530 Subject: [PATCH 39/63] Update Dart_Packages.xml --- .idea/libraries/Dart_Packages.xml | 186 +++++++++++++++--------------- 1 file changed, 93 insertions(+), 93 deletions(-) diff --git a/.idea/libraries/Dart_Packages.xml b/.idea/libraries/Dart_Packages.xml index bcb3a86..35d96f5 100644 --- a/.idea/libraries/Dart_Packages.xml +++ b/.idea/libraries/Dart_Packages.xml @@ -131,7 +131,7 @@ - @@ -180,7 +180,7 @@ - @@ -250,7 +250,7 @@ - @@ -299,7 +299,7 @@ - @@ -397,14 +397,14 @@ - - @@ -495,7 +495,7 @@ - @@ -509,7 +509,7 @@ - @@ -579,7 +579,7 @@ - @@ -593,90 +593,90 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From d50b26d59f263d1e51dd0f0350dbe4aea50f85ad Mon Sep 17 00:00:00 2001 From: ghamani <138302691+Ghamani121@users.noreply.github.com> Date: Mon, 17 Feb 2025 11:51:47 +0530 Subject: [PATCH 40/63] Update Dart_Packages.xml --- .idea/libraries/Dart_Packages.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.idea/libraries/Dart_Packages.xml b/.idea/libraries/Dart_Packages.xml index 35d96f5..4c6f210 100644 --- a/.idea/libraries/Dart_Packages.xml +++ b/.idea/libraries/Dart_Packages.xml @@ -124,7 +124,7 @@ - From 8277a615d91976eb4b112215b56dda5a321d8eac Mon Sep 17 00:00:00 2001 From: Piyush Chakarborthy <102757301+Chakravartinsamrat@users.noreply.github.com> Date: Mon, 17 Feb 2025 22:02:39 +0530 Subject: [PATCH 41/63] Final Bros --- .../lib/To-Be-Discarded/specific_project.dart | 222 ------------------ .../lib/pages/admin_pages/projects_card.dart | 5 +- frontend/lib/pages/home.dart | 2 +- .../project_display/previous_projects.dart | 106 ++++----- ...fic_project.dart => specific_project.dart} | 0 .../routing/previous_projects_routing.dart | 5 +- 6 files changed, 56 insertions(+), 284 deletions(-) delete mode 100644 frontend/lib/To-Be-Discarded/specific_project.dart rename frontend/lib/pages/user_pages/project_pages/project_display/{new_specific_project.dart => specific_project.dart} (100%) diff --git a/frontend/lib/To-Be-Discarded/specific_project.dart b/frontend/lib/To-Be-Discarded/specific_project.dart deleted file mode 100644 index 505d20e..0000000 --- a/frontend/lib/To-Be-Discarded/specific_project.dart +++ /dev/null @@ -1,222 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter/widgets.dart'; -import 'package:readmore/readmore.dart'; -import '../models/std_details.dart'; -import '../pages/user_pages/project_pages/project_display/teamcard.dart'; - -class SpecificProject extends StatefulWidget { - const SpecificProject({super.key}); - - @override - State createState() => _SpecificProjectState(); -} - -class _SpecificProjectState extends State { - @override - Widget build(BuildContext context) { - return SafeArea( - child: Scaffold( - appBar: AppBar( - leading: Container( - child: Row( - mainAxisSize: MainAxisSize.min, - children: [ - Expanded( - child: IconButton( - onPressed: () { - Navigator.pop(context); - }, - icon: Icon( - Icons.arrow_back_ios, - size: 30, - ), - ), - ), - Expanded( - child: Builder( - builder: (context) => IconButton( - icon: Icon( - Icons.menu, - size: 40, - ), - onPressed: () { - Scaffold.of(context).openDrawer(); - }, - ), - ), - ), - ], - ), - ), - backgroundColor: Colors.white, - actions: [ - IconButton( - onPressed: () {}, - icon: Icon( - Icons.notifications_none, - size: 40, - ), - ) - ], - ), - drawer: Drawer( - child: ListView( - padding: EdgeInsets.zero, - children: [ - const DrawerHeader( - decoration: BoxDecoration( - color: Colors.grey, - ), - child: Text('Drawer Header'), - ), - ListTile( - leading: Icon( - Icons.home, - ), - title: const Text('1'), - onTap: () { - Navigator.pop(context); - }, - ), - ListTile( - leading: Icon( - Icons.train, - ), - title: const Text('2'), - onTap: () { - Navigator.pop(context); - }, - ), - ], - ), - ), - body: SingleChildScrollView( - child: Container( - width: double.infinity, - child: Column( - children: [ - SizedBox( - height: 20, - ), - Text( - 'Team Name', - style: TextStyle(fontSize: 30), - ), - Padding( - padding: const EdgeInsets.fromLTRB(28, 5, 28, 5), - child: Container( - height: 200, - width: double.infinity, - decoration: BoxDecoration( - border: Border.all(color: Colors.black26), - borderRadius: BorderRadius.all(Radius.circular(20))), - child: Column( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - Container( - height: 110, - width: 250, - color: Colors.grey[300], - ), - Container( - height: 30, - width: 300, - color: Colors.grey[300], - child: Center(child: Text('github link')), - ) - ], - ), - ), - ), - Padding( - padding: const EdgeInsets.fromLTRB(15, 0, 15, 0), - child: Row( - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Expanded( - child: Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - 'About:', - style: TextStyle(fontSize: 20), - ), - Wrap( - children: [ - ReadMoreText( - 'iuegfib hiuewiubvdsuig ugiuvbugiw gviugiugeuiwfhiviuweguihiwue uiguiuehf iuhjdkhu hdfoihfn ohnj ', - trimLines: 2, - trimMode: TrimMode.Line, - trimCollapsedText: "Show more", - trimExpandedText: "Show less", - moreStyle: const TextStyle( - fontWeight: FontWeight.bold, - color: Colors.blue, - ), - lessStyle: const TextStyle( - fontWeight: FontWeight.bold, - color: Colors.blue, - ), - style: const TextStyle( - color: Colors.black54, - ), - ), - ], - ) - ], - ), - ), - ], - ), - ), - SizedBox( - height: 20, - ), - Row( - children: [ - SizedBox( - width: 10, - ), - Text( - 'Team Members:', - style: TextStyle(fontSize: 20), - ) - ], - ), - Container( - height: 190, - child: ListView.builder( - scrollDirection: Axis.horizontal, - itemCount: STD_details.stdlist.length, - itemBuilder: (context, index) { - return Container( - width: 150, - margin: EdgeInsets.symmetric(horizontal: 2), - child: TeamCard(std: STD_details.stdlist[index]), - ); - }, - ), - ), - Row( - mainAxisAlignment: MainAxisAlignment.end, - children: [ - Text('Upload Pdf'), - Padding( - padding: const EdgeInsets.all(30.0), - child: Container( - height: 120, - width: 250, - color: Colors.grey[300], - ), - ) - ], - ) - ], - ), - ), - ), - ), - ); - } -} diff --git a/frontend/lib/pages/admin_pages/projects_card.dart b/frontend/lib/pages/admin_pages/projects_card.dart index f5934fa..42949c0 100644 --- a/frontend/lib/pages/admin_pages/projects_card.dart +++ b/frontend/lib/pages/admin_pages/projects_card.dart @@ -1,6 +1,5 @@ import 'package:flutter/material.dart'; - -import 'package:dev_track_app/To-Be-Discarded/specific_project.dart'; +import 'package:dev_track_app/pages/user_pages/project_pages/project_display/specific_project.dart'; class Data { String domain_name; @@ -213,7 +212,7 @@ Widget ProjectsCard(List projectlist, int index, BuildContext contextt, Navigator.push( contextt, MaterialPageRoute( - builder: (context) => SpecificProject())); + builder: (context) => ProjectDetailPage())); }, child: Text( 'Learn More', diff --git a/frontend/lib/pages/home.dart b/frontend/lib/pages/home.dart index 2c20ccc..4379aa8 100644 --- a/frontend/lib/pages/home.dart +++ b/frontend/lib/pages/home.dart @@ -5,7 +5,7 @@ import 'package:dev_track_app/pages/user_pages/project_pages/project_display/pre import 'package:dev_track_app/theme/splashscreen.dart'; import 'package:dev_track_app/pages/common_pages/confirm_page.dart'; import 'package:dev_track_app/pages/common_pages/domain_pages/domain.dart'; -import 'package:dev_track_app/pages/user_pages/project_pages/project_display/new_specific_project.dart'; +import 'package:dev_track_app/pages/user_pages/project_pages/project_display/specific_project.dart'; import 'package:dev_track_app/pages/common_pages/home_page.dart'; import 'package:flutter/material.dart'; import 'package:dev_track_app/pages/user_pages/tracker.dart'; diff --git a/frontend/lib/pages/user_pages/project_pages/project_display/previous_projects.dart b/frontend/lib/pages/user_pages/project_pages/project_display/previous_projects.dart index 1e68d31..e474abb 100644 --- a/frontend/lib/pages/user_pages/project_pages/project_display/previous_projects.dart +++ b/frontend/lib/pages/user_pages/project_pages/project_display/previous_projects.dart @@ -1,6 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:dev_track_app/pages/common_pages/domain_pages/topNav.dart'; -import 'package:dev_track_app/To-Be-Discarded/specific_project.dart'; +import 'package:dev_track_app/utils/topnavbar.dart'; import 'package:dev_track_app/routing/previous_projects_routing.dart'; import 'package:google_fonts/google_fonts.dart'; import 'package:dev_track_app/theme/colors.dart'; @@ -14,35 +13,32 @@ class PreviousProjects extends StatefulWidget { class _PreviousProjectsState extends State { @override - - //all our components gets built here Widget build(BuildContext context) { return SafeArea( child: Scaffold( backgroundColor: AppColors.backgroundLight, - body: Stack( + appBar: TopNavBar( + onNotificationTap: () { + // Handle notification tap + }, + ), + body: Column( children: [ - Column( - children: [ - const TopNav(), // Fixed at top - _buildSearchBar(), // Fixed below navbar - Expanded( - child: CustomScrollView( - slivers: [ - SliverToBoxAdapter( - child: _buildTitle(), // Title scrolls with projects - ), - SliverList( - delegate: SliverChildBuilderDelegate( - (context, index) => - _buildProjectCard(projects[index]), - childCount: projects.length, - ), - ), - ], + _buildSearchBar(), + Expanded( + child: CustomScrollView( + slivers: [ + SliverToBoxAdapter( + child: _buildTitle(), ), - ), - ], + SliverList( + delegate: SliverChildBuilderDelegate( + (context, index) => _buildProjectCard(projects[index]), + childCount: projects.length, + ), + ), + ], + ), ), ], ), @@ -50,7 +46,6 @@ class _PreviousProjectsState extends State { ); } - //builds our search bar Widget _buildSearchBar() { return Padding( padding: const EdgeInsets.all(18.0), @@ -60,11 +55,11 @@ class _PreviousProjectsState extends State { decoration: InputDecoration( filled: true, fillColor: AppColors.backgroundLight, - labelText: 'search all projects', + labelText: 'Search all projects', prefixIcon: Icon(Icons.search, color: AppColors.neutralDark), enabledBorder: OutlineInputBorder( borderRadius: BorderRadius.circular(14.0), - borderSide: BorderSide(color: const Color(0xFF5B2333)), + borderSide: const BorderSide(color: Color(0xFF5B2333)), ), ), ), @@ -120,11 +115,10 @@ class _PreviousProjectsState extends State { }, ]; -//ui for cards Widget _buildProjectCard(Map project) { return Container( - padding: EdgeInsets.all(24), - margin: EdgeInsets.symmetric(vertical: 16, horizontal: 15), + padding: const EdgeInsets.all(24), + margin: const EdgeInsets.symmetric(vertical: 16, horizontal: 15), decoration: BoxDecoration( color: const Color(0xFF6901AE), borderRadius: BorderRadius.circular(4), @@ -132,53 +126,53 @@ class _PreviousProjectsState extends State { child: Row( children: [ Flexible( - flex: 1, // Image takes available space proportionally - child: Container( - padding: EdgeInsets.all(16), - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(8), - ), - child: ClipRRect( - borderRadius: BorderRadius.circular(8), - child: Image.network( - 'assets/images/game.png', // Replace with actual image URL or use AssetImage - fit: BoxFit - .cover, // Ensures the image fills the available space - ), + flex: 1, + child: Container( + padding: const EdgeInsets.all(16), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8), + ), + child: ClipRRect( + borderRadius: BorderRadius.circular(8), + child: Image.asset( + project["image"]!, + fit: BoxFit.cover, ), - )), - SizedBox(width: 15), + ), + ), + ), + const SizedBox(width: 15), Expanded( - flex: 3, // Text takes more space + flex: 3, child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - "UI/UX 42", + project["title"]!, style: GoogleFonts.poppins( color: Colors.white, fontSize: 18, fontWeight: FontWeight.bold, ), ), - SizedBox(height: 4), + const SizedBox(height: 4), Text( - "Budgeting application", + project["subtitle"]!, style: GoogleFonts.poppins( color: Colors.white, fontSize: 13, fontWeight: FontWeight.w500, ), ), - SizedBox(height: 4), + const SizedBox(height: 4), Text( - "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor", + project["description"]!, style: GoogleFonts.poppins( color: Colors.white, fontSize: 10, ), ), - SizedBox(height: 8), + const SizedBox(height: 8), ElevatedButton( style: ElevatedButton.styleFrom( backgroundColor: Colors.white, @@ -186,8 +180,8 @@ class _PreviousProjectsState extends State { shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(8), ), - padding: EdgeInsets.only( - left: 20, right: 20, top: 10, bottom: 10), + padding: const EdgeInsets.symmetric( + horizontal: 20, vertical: 10), textStyle: GoogleFonts.poppins( fontSize: 10, fontWeight: FontWeight.bold, @@ -196,7 +190,7 @@ class _PreviousProjectsState extends State { onPressed: () { PreviousProjectsRouting.pushToSpecificProject(context); }, - child: Text("Explore"), + child: const Text("Explore"), ), ], ), diff --git a/frontend/lib/pages/user_pages/project_pages/project_display/new_specific_project.dart b/frontend/lib/pages/user_pages/project_pages/project_display/specific_project.dart similarity index 100% rename from frontend/lib/pages/user_pages/project_pages/project_display/new_specific_project.dart rename to frontend/lib/pages/user_pages/project_pages/project_display/specific_project.dart diff --git a/frontend/lib/routing/previous_projects_routing.dart b/frontend/lib/routing/previous_projects_routing.dart index 53d7de1..190c05d 100644 --- a/frontend/lib/routing/previous_projects_routing.dart +++ b/frontend/lib/routing/previous_projects_routing.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; -import '../To-Be-Discarded/specific_project.dart'; +// import '../To-Be-Discarded/specific_project.dart'; +import 'package:dev_track_app/pages/user_pages/project_pages/project_display/specific_project.dart'; class PreviousProjectsRouting { static void pop(BuildContext context) { @@ -9,7 +10,7 @@ class PreviousProjectsRouting { static void pushToSpecificProject(BuildContext context) { Navigator.push( context, - MaterialPageRoute(builder: (context) => SpecificProject()), + MaterialPageRoute(builder: (context) => ProjectDetailPage()), ); } } From caaa09fa8d0b715fc7603995bd176efc5d95680e Mon Sep 17 00:00:00 2001 From: Kartikjarali010 Date: Mon, 17 Feb 2025 23:23:23 +0530 Subject: [PATCH 42/63] updated home page cz it was mess --- frontend/lib/pages/home.dart | 263 +++++------------------------------ 1 file changed, 34 insertions(+), 229 deletions(-) diff --git a/frontend/lib/pages/home.dart b/frontend/lib/pages/home.dart index 4379aa8..f592ae5 100644 --- a/frontend/lib/pages/home.dart +++ b/frontend/lib/pages/home.dart @@ -1,13 +1,12 @@ -// import 'package:dev_track_app/utils/bottom_nav_bar.dart'; +import 'package:flutter/material.dart'; import 'package:dev_track_app/pages/common_pages/Theme-Demo-Page/sample.dart'; -import 'package:dev_track_app/pages/admin_pages//mgmg_prev_projects.dart'; +import 'package:dev_track_app/pages/admin_pages/mgmg_prev_projects.dart'; import 'package:dev_track_app/pages/user_pages/project_pages/project_display/previous_projects.dart'; import 'package:dev_track_app/theme/splashscreen.dart'; import 'package:dev_track_app/pages/common_pages/confirm_page.dart'; import 'package:dev_track_app/pages/common_pages/domain_pages/domain.dart'; import 'package:dev_track_app/pages/user_pages/project_pages/project_display/specific_project.dart'; import 'package:dev_track_app/pages/common_pages/home_page.dart'; -import 'package:flutter/material.dart'; import 'package:dev_track_app/pages/user_pages/tracker.dart'; import 'package:dev_track_app/pages/user_pages/studentview.dart'; import 'package:dev_track_app/pages/user_pages/project_pages/submission_page/submission_page.dart'; @@ -15,239 +14,45 @@ import 'package:dev_track_app/pages/user_pages/project_pages/submission_page/sub class HomePag extends StatelessWidget { const HomePag({super.key}); + Widget buildNavButton(BuildContext context, String text, Color color, Widget page) { + return ElevatedButton( + style: ElevatedButton.styleFrom( + backgroundColor: color, + foregroundColor: Colors.white, + shadowColor: Colors.blueAccent, + elevation: 5, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(30.0), + ), + padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 15), + textStyle: const TextStyle(fontSize: 18, fontWeight: FontWeight.bold), + ), + onPressed: () { + Navigator.push(context, MaterialPageRoute(builder: (context) => page)); + }, + child: Text(text), + ); + } + @override - Widget build(BuildContext context) { + Widget build(BuildContext context) { return Scaffold( body: Center( child: Column( mainAxisAlignment: MainAxisAlignment.spaceEvenly, crossAxisAlignment: CrossAxisAlignment.center, children: [ - ElevatedButton( - style: ElevatedButton.styleFrom( - backgroundColor: Colors.green, - foregroundColor: Colors.white, - shadowColor: Colors.blueAccent, - elevation: 5, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(30.0), - ), - padding: - const EdgeInsets.symmetric(horizontal: 20, vertical: 15), - textStyle: - const TextStyle(fontSize: 18, fontWeight: FontWeight.bold), - ), - onPressed: () { - Navigator.push(context, - MaterialPageRoute(builder: (context) => HomePage())); - }, - child: Text("Home Page"), - ), - ElevatedButton( - style: ElevatedButton.styleFrom( - backgroundColor: Colors.purple, - foregroundColor: Colors.white, - shadowColor: Colors.blueAccent, - elevation: 5, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(30.0), - ), - padding: - const EdgeInsets.symmetric(horizontal: 20, vertical: 15), - textStyle: - const TextStyle(fontSize: 18, fontWeight: FontWeight.bold), - ), - onPressed: () { - Navigator.push(context, - MaterialPageRoute(builder: (context) => DomainPage())); - }, - child: Text("Domain Page"), - ), - ElevatedButton( - style: ElevatedButton.styleFrom( - backgroundColor: const Color.fromARGB(255, 39, 94, 176), - foregroundColor: Colors.white, - shadowColor: Colors.blueAccent, - elevation: 5, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(30.0), - ), - padding: - const EdgeInsets.symmetric(horizontal: 20, vertical: 15), - textStyle: - const TextStyle(fontSize: 18, fontWeight: FontWeight.bold), - ), - onPressed: () { - Navigator.push(context, - MaterialPageRoute(builder: (context) => ThemedPage())); - }, - child: Text("Theme Page Implementation"), - ), - ElevatedButton( - style: ElevatedButton.styleFrom( - backgroundColor: const Color.fromARGB(255, 39, 94, 176), - foregroundColor: Colors.white, - shadowColor: Colors.blueAccent, - elevation: 5, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(30.0), - ), - padding: - const EdgeInsets.symmetric(horizontal: 20, vertical: 15), - textStyle: - const TextStyle(fontSize: 18, fontWeight: FontWeight.bold), - ), - onPressed: () { - Navigator.push(context, - MaterialPageRoute(builder: (context) => SubmissionPage())); - }, - child: Text("Submission Page"), - ), - ElevatedButton( - style: ElevatedButton.styleFrom( - backgroundColor: Colors.amber, - foregroundColor: Colors.white, - shadowColor: Colors.blueAccent, - elevation: 5, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(30.0), - ), - padding: - const EdgeInsets.symmetric(horizontal: 20, vertical: 15), - textStyle: - const TextStyle(fontSize: 18, fontWeight: FontWeight.bold), - ), - onPressed: () { - Navigator.push(context, - MaterialPageRoute(builder: (context) => ConfirmPage())); - }, - child: const Text("Confirm"), - ), - ElevatedButton( - style: ElevatedButton.styleFrom( - backgroundColor: Colors.deepOrange, - foregroundColor: Colors.white, - shadowColor: Colors.blueAccent, - elevation: 5, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(30.0), - ), - padding: - const EdgeInsets.symmetric(horizontal: 20, vertical: 15), - textStyle: - const TextStyle(fontSize: 18, fontWeight: FontWeight.bold), - ), - onPressed: () { - Navigator.push( - context, - MaterialPageRoute( - builder: (context) => PreviousProjects())); - }, - child: Text("Previous Projects"), - ), - ElevatedButton( - style: ElevatedButton.styleFrom( - backgroundColor: Color.fromARGB(255, 50, 7, 120), - foregroundColor: Color.fromARGB(255, 242, 244, 244), - shadowColor: Colors.black12, - elevation: 5, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(30.0), - ), - padding: EdgeInsets.symmetric(horizontal: 20, vertical: 15), - textStyle: - const TextStyle(fontSize: 18, fontWeight: FontWeight.bold), - ), - onPressed: () { - Navigator.push( - context, MaterialPageRoute(builder: (context) => Splash())); - }, - child: const Text("SplashScreen"), - ), - ElevatedButton( - style: ElevatedButton.styleFrom( - backgroundColor: Colors.teal, - foregroundColor: Colors.white, - shadowColor: Colors.blueAccent, - elevation: 5, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(30.0), - ), - padding: - const EdgeInsets.symmetric(horizontal: 20, vertical: 15), - textStyle: - const TextStyle(fontSize: 18, fontWeight: FontWeight.bold), - ), - onPressed: () { - Navigator.push( - context, - MaterialPageRoute( - builder: (context) => ProgressTrackerPage())); - }, - child: const Text("Tracker Page"), - ), - ElevatedButton( - style: ElevatedButton.styleFrom( - backgroundColor: Colors.teal, - foregroundColor: Colors.white, - shadowColor: Colors.blueAccent, - elevation: 5, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(30.0), - ), - padding: - const EdgeInsets.symmetric(horizontal: 20, vertical: 15), - textStyle: - const TextStyle(fontSize: 18, fontWeight: FontWeight.bold), - ), - onPressed: () { - Navigator.push( - context, - MaterialPageRoute( - builder: (context) => MgmtPreviousProjects())); - }, - child: const Text("Management Project View Page"), - ), - ElevatedButton( - style: ElevatedButton.styleFrom( - backgroundColor: Color.fromARGB(255, 50, 7, 120), - foregroundColor: Color.fromARGB(255, 242, 244, 244), - shadowColor: Colors.black12, - elevation: 5, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(30.0), - ), - padding: EdgeInsets.symmetric(horizontal: 20, vertical: 15), - textStyle: - const TextStyle(fontSize: 18, fontWeight: FontWeight.bold), - ), - onPressed: () { - Navigator.push(context, - MaterialPageRoute(builder: (context) => Studentview())); - }, - child: const Text("Student View"), - ), - ElevatedButton( - style: ElevatedButton.styleFrom( - backgroundColor: Color.fromARGB(255, 50, 7, 120), - foregroundColor: Color.fromARGB(255, 242, 244, 244), - shadowColor: Colors.black12, - elevation: 5, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(30.0), - ), - padding: EdgeInsets.symmetric(horizontal: 20, vertical: 15), - textStyle: - const TextStyle(fontSize: 18, fontWeight: FontWeight.bold), - ), - onPressed: () { - Navigator.push( - context, - MaterialPageRoute( - builder: (context) => ProjectDetailPage())); - }, - child: const Text("New Project Detail Page"), - ), + buildNavButton(context, "Home Page", Colors.green, const HomePage()), + buildNavButton(context, "Domain Page", Colors.purple, const DomainPage()), + buildNavButton(context, "Theme Page Implementation", Colors.blue, const ThemedPage()), + buildNavButton(context, "Submission Page", Colors.blue, SubmissionPage()), + buildNavButton(context, "Confirm", Colors.amber, const ConfirmPage()), + buildNavButton(context, "Previous Projects", Colors.deepOrange, const PreviousProjects()), + buildNavButton(context, "SplashScreen", Colors.indigo, const Splash()), + buildNavButton(context, "Tracker Page", Colors.teal, const ProgressTrackerPage()), + buildNavButton(context, "Management Project View", Colors.teal, const MgmtPreviousProjects()), + buildNavButton(context, "Student View", Colors.indigo, const Studentview()), + buildNavButton(context, "New Project Detail Page", Colors.indigo, const ProjectDetailPage()), ], ), ), From c42e8bef8ded4e4eedadc2279d0013e7f3068142 Mon Sep 17 00:00:00 2001 From: Kartikjarali010 Date: Tue, 18 Feb 2025 00:12:03 +0530 Subject: [PATCH 43/63] created feed pages for admin and general --- .../pages/admin_pages/admin_feed_page.dart | 210 ++++++++++++++++ .../lib/pages/user_pages/user_feed_page.dart | 224 ++++++++++++++++++ 2 files changed, 434 insertions(+) create mode 100644 frontend/lib/pages/admin_pages/admin_feed_page.dart create mode 100644 frontend/lib/pages/user_pages/user_feed_page.dart diff --git a/frontend/lib/pages/admin_pages/admin_feed_page.dart b/frontend/lib/pages/admin_pages/admin_feed_page.dart new file mode 100644 index 0000000..d154422 --- /dev/null +++ b/frontend/lib/pages/admin_pages/admin_feed_page.dart @@ -0,0 +1,210 @@ +import 'package:flutter/material.dart'; + +void main() { + runApp(const MyApp()); +} + +class MyApp extends StatelessWidget { + const MyApp({super.key}); + + @override + Widget build(BuildContext context) { + return const MaterialApp( + debugShowCheckedModeBanner: false, + home: AdminFeedPage(), + ); + } +} + +class AdminFeedPage extends StatefulWidget { + const AdminFeedPage({super.key}); + + @override + State createState() => _FeedScreenState(); +} + +class _FeedScreenState extends State { + @override + Widget build(BuildContext context) { + return SafeArea( + child: Scaffold( + backgroundColor: Colors.white, + body: Padding( + padding: const EdgeInsets.symmetric(horizontal: 16), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + _buildTopBar(), + const SizedBox(height: 10), + _buildHeader(), + const SizedBox(height: 10), + _buildTabBar(), + const SizedBox(height: 10), + Expanded( + child: ListView.builder( + itemCount: 3, + itemBuilder: (context, index) => _buildPostCard(), + ), + ), + ], + ), + ), + ), + ); + } + + Widget _buildTopBar() { + return Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + IconButton( + icon: const Icon(Icons.arrow_back, color: Colors.black), + onPressed: () {}, + ), + IconButton( + icon: const Icon(Icons.notifications, color: Colors.black), + onPressed: () {}, + ), + ], + ); + } + + void showPopup(BuildContext context) { + showDialog( + context: context, + builder: (BuildContext context) { + return AlertDialog( + title: Text("Popup Title"), + content: Text("This is a popup message."), + actions: [ + TextButton( + onPressed: () { + Navigator.of(context).pop(); // Close the popup + }, + child: Text("Close"), + ), + ], + ); + }, + ); + } + + Widget _buildHeader() { + return Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + const Text( + "Feed", + style: TextStyle(fontSize: 28, fontWeight: FontWeight.bold), + ), + ElevatedButton( + style: ElevatedButton.styleFrom( + backgroundColor: Colors.purple, + foregroundColor: Colors.white, + ), + onPressed: () {}, + child: const Text("More details"), + ), + ], + ); + } + + Widget _buildTabBar() { + return Container( + decoration: BoxDecoration( + color: Colors.grey[200], + borderRadius: BorderRadius.circular(8), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + _buildTab("Primary", isSelected: true), + _buildTab("Secondary"), + _buildTab("Ternary"), + ], + ), + ); + } + + Widget _buildTab(String title, {bool isSelected = false}) { + return Padding( + padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 16), + child: Text( + title, + style: TextStyle( + fontSize: 16, + fontWeight: isSelected ? FontWeight.bold : FontWeight.normal, + color: isSelected ? Colors.purple : Colors.black, + ), + ), + ); + } + + Widget _buildPostCard() { + return Container( + margin: const EdgeInsets.symmetric(vertical: 8), + padding: const EdgeInsets.all(16), + decoration: BoxDecoration( + color: Colors.grey[100], + borderRadius: BorderRadius.circular(12), + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + const CircleAvatar( + backgroundColor: Colors.grey, + radius: 20, + ), + const SizedBox(width: 10), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: const [ + Text( + "Name", + style: TextStyle(fontWeight: FontWeight.bold, fontSize: 16), + ), + Text( + "2 Days ago • DD/month Time", + style: TextStyle(fontSize: 12, color: Colors.grey), + ), + ], + ), + ], + ), + const SizedBox(height: 10), + const Text( + "Lorem ipsum dolor sit amet et delectus accommodare " + "his consul copiosae legendos at vix ad putent delectus " + "delicata usu.", + style: TextStyle(fontSize: 14), + ), + const SizedBox(height: 10), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Row( + children: List.generate( + 3, + (index) => Container( + margin: const EdgeInsets.only(right: 8), + height: 10, + width: 30, + color: Colors.grey[300], + ), + ), + ), + FloatingActionButton( + onPressed: () {}, + backgroundColor: Colors.purple, + mini: true, + child: const Icon(Icons.edit, color: Colors.white, size: 18), + ), + ], + ), + ], + ), + ); + } +} diff --git a/frontend/lib/pages/user_pages/user_feed_page.dart b/frontend/lib/pages/user_pages/user_feed_page.dart new file mode 100644 index 0000000..e6a0e1f --- /dev/null +++ b/frontend/lib/pages/user_pages/user_feed_page.dart @@ -0,0 +1,224 @@ +import 'package:flutter/material.dart'; + +void main() { + runApp(const MyApp()); +} + +class MyApp extends StatelessWidget { + const MyApp({super.key}); + + @override + Widget build(BuildContext context) { + return const MaterialApp( + debugShowCheckedModeBanner: false, + home: UserFeedPage(), + ); + } +} + +class UserFeedPage extends StatefulWidget { + const UserFeedPage({super.key}); + + @override + State createState() => _UserFeedPageState(); +} + + +class Post { + final String details; + + Post({required this.details}); +} + +// In your _UserFeedPageState class +final List posts = [ + Post(details: "Lorem ipsum dolor sit amet et delectus accommodare his consul copiosae legendos at vix ad putent delectus delicata usu"), + Post(details: 'Post 2 details'), + Post(details: 'Post 3 details'), +]; + + +class _UserFeedPageState extends State { + @override + Widget build(BuildContext context) { + return SafeArea( + child: Scaffold( + backgroundColor: Colors.white, + body: Padding( + padding: const EdgeInsets.symmetric(horizontal: 16), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + _buildTopBar(), + const SizedBox(height: 10), + _buildHeader(), + const SizedBox(height: 10), + _buildTabBar(), + const SizedBox(height: 10), + Expanded( + child: ListView.builder( + itemCount: posts.length, + itemBuilder: (context, index) => _buildPostCard(context, index), + ), + ), + ], + ), + ), + ), + ); + } + + + + Widget _buildTopBar() { + return Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + IconButton( + icon: const Icon(Icons.arrow_back, color: Colors.black), + onPressed: () {}, + ), + IconButton( + icon: const Icon(Icons.notifications, color: Colors.black), + onPressed: () {}, + ), + ], + ); + } +// when clicked on the more detail button it shulb pop up with a message of more deatils fetched from the card? + void showPopup(BuildContext context , Post post) { + showDialog( + context: context, + builder: (BuildContext context) { + return AlertDialog( + title: Text("Post Details"), + content: Text(post.details), // Display the post details + actions: [ + TextButton( + onPressed: () { + Navigator.of(context).pop(); // Close the popup + }, + child: Text("Close"), + ), + ], + ); + }, + ); +} + + Widget _buildHeader() { + return Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Column(children: [ + Text("WELCOME BACK"), + const Text( + "Bharathan", + style: TextStyle(fontSize: 28, fontWeight: FontWeight.bold), + ),],), + + ], + ); + } + + Widget _buildTabBar() { + return Container( + decoration: BoxDecoration( + color: Colors.grey[200], + borderRadius: BorderRadius.circular(8), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + _buildTab("Primary", isSelected: true), + _buildTab("Secondary"), + _buildTab("Ternary"), + ], + ), + ); + } + + Widget _buildTab(String title, {bool isSelected = false}) { + return Padding( + padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 16), + child: Text( + title, + style: TextStyle( + fontSize: 16, + fontWeight: isSelected ? FontWeight.bold : FontWeight.normal, + color: isSelected ? Colors.purple : Colors.black, + ), + ), + ); + } + + Widget _buildPostCard(BuildContext context, int index) { + final post = posts[index]; + return Container( + margin: const EdgeInsets.symmetric(vertical: 8), + padding: const EdgeInsets.all(16), + decoration: BoxDecoration( + color: Colors.grey[100], + borderRadius: BorderRadius.circular(12), + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + const CircleAvatar( + backgroundColor: Colors.grey, + radius: 20, + ), + const SizedBox(width: 10), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: const [ + Text( + "Name", + style: TextStyle(fontWeight: FontWeight.bold, fontSize: 16), + ), + Text( + "2 Days ago • DD/month Time", + style: TextStyle(fontSize: 12, color: Colors.grey), + ), + ], + ), + ], + ), + const SizedBox(height: 10), + const Text( + "Lorem ipsum dolor sit amet et delectus accommodare " + "his consul copiosae legendos at vix ad putent delectus " + "delicata usu.", + style: TextStyle(fontSize: 14), + ), + const SizedBox(height: 10), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Row( + children: List.generate( + 3, + (index) => Container( + margin: const EdgeInsets.only(right: 8), + height: 10, + width: 30, + color: Colors.grey[300], + ), + ), + ), + FloatingActionButton( + tooltip: 'View More', + onPressed: () => showPopup(context, post), // Pass the post to showPopup + backgroundColor: Colors.purple, + mini: true, + child: const Icon(Icons.arrow_forward, color: Colors.white, size: 18), + ), + ], + ), + ], + ), + ); +} +} From 211c12ad07cf3ff9cffda62a8711207a7b67647d Mon Sep 17 00:00:00 2001 From: Kartikjarali010 Date: Tue, 18 Feb 2025 00:12:28 +0530 Subject: [PATCH 44/63] button to see feed pages --- frontend/lib/pages/home.dart | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/frontend/lib/pages/home.dart b/frontend/lib/pages/home.dart index f592ae5..41cb8d1 100644 --- a/frontend/lib/pages/home.dart +++ b/frontend/lib/pages/home.dart @@ -1,3 +1,5 @@ +import 'package:dev_track_app/pages/admin_pages/admin_feed_page.dart'; +import 'package:dev_track_app/pages/user_pages/user_feed_page.dart'; import 'package:flutter/material.dart'; import 'package:dev_track_app/pages/common_pages/Theme-Demo-Page/sample.dart'; import 'package:dev_track_app/pages/admin_pages/mgmg_prev_projects.dart'; @@ -53,6 +55,8 @@ class HomePag extends StatelessWidget { buildNavButton(context, "Management Project View", Colors.teal, const MgmtPreviousProjects()), buildNavButton(context, "Student View", Colors.indigo, const Studentview()), buildNavButton(context, "New Project Detail Page", Colors.indigo, const ProjectDetailPage()), + buildNavButton(context, "Admin fees", const Color.fromARGB(255, 9, 9, 9), const AdminFeedPage()), + buildNavButton(context, "User feed", const Color.fromARGB(255, 200, 198, 49), const UserFeedPage()), ], ), ), From b4f187a05f2c8718c6872598970a5598638816c9 Mon Sep 17 00:00:00 2001 From: bharathan06 Date: Wed, 19 Feb 2025 01:17:38 +0530 Subject: [PATCH 45/63] supabase setup files --- backend/myproject/.env | 7 ++++ .../announcements/migrations/0001_initial.py | 6 +--- .../announcements/migrations/0002_initial.py | 23 +++++++++++++ .../__pycache__/0001_initial.cpython-313.pyc | Bin 1739 -> 1279 bytes .../__pycache__/0002_initial.cpython-313.pyc | Bin 1191 -> 1191 bytes .../members/__pycache__/admin.cpython-313.pyc | Bin 732 -> 732 bytes .../members/__pycache__/api.cpython-313.pyc | Bin 5575 -> 5575 bytes .../__pycache__/managers.cpython-313.pyc | Bin 1358 -> 1358 bytes .../__pycache__/models.cpython-313.pyc | Bin 4559 -> 4559 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 182 -> 182 bytes .../members/migrations/0001_initial.py | 2 +- .../members/migrations/0002_initial.py | 2 +- .../__pycache__/0001_initial.cpython-313.pyc | Bin 4681 -> 4681 bytes .../__pycache__/0002_initial.cpython-313.pyc | Bin 2019 -> 2019 bytes .../__pycache__/settings.cpython-313.pyc | Bin 3606 -> 4421 bytes .../__pycache__/urls.cpython-313.pyc | Bin 717 -> 717 bytes backend/myproject/myproject/settings.py | 32 ++++++++++++++---- .../projects/migrations/0001_initial.py | 2 +- .../__pycache__/0001_initial.cpython-313.pyc | Bin 5354 -> 5354 bytes .../registrations/migrations/0001_initial.py | 2 +- .../__pycache__/0001_initial.cpython-313.pyc | Bin 2427 -> 2427 bytes 21 files changed, 60 insertions(+), 16 deletions(-) create mode 100644 backend/myproject/.env create mode 100644 backend/myproject/announcements/migrations/0002_initial.py diff --git a/backend/myproject/.env b/backend/myproject/.env new file mode 100644 index 0000000..de4bb43 --- /dev/null +++ b/backend/myproject/.env @@ -0,0 +1,7 @@ +DB_NAME=postgres +DB_USER=postgres +DB_PASSWORD=GOMxZBnMwtF5VPYk +DB_HOST=aws-0-ap-south-1.pooler.supabase.com +DB_PORT=6543 # Try 6543 if 5432 fails +DATABASE_URL=postgres://postgres:GOMxZBnMwtF5VPYk@aws-0-ap-south-1.pooler.supabase.com:6543/postgres?sslmode=require +DJANGO_ENV=production diff --git a/backend/myproject/announcements/migrations/0001_initial.py b/backend/myproject/announcements/migrations/0001_initial.py index e982dff..e7941e9 100644 --- a/backend/myproject/announcements/migrations/0001_initial.py +++ b/backend/myproject/announcements/migrations/0001_initial.py @@ -1,7 +1,5 @@ -# Generated by Django 5.1.6 on 2025-02-14 08:49 +# Generated by Django 5.1.6 on 2025-02-18 19:17 -import django.db.models.deletion -from django.conf import settings from django.db import migrations, models @@ -10,7 +8,6 @@ class Migration(migrations.Migration): initial = True dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), ] operations = [ @@ -22,7 +19,6 @@ class Migration(migrations.Migration): ('created_at', models.DateTimeField(auto_now_add=True)), ('is_read', models.BooleanField(default=False)), ('notification_type', models.CharField(choices=[('EN', 'enrollment'), ('SC', 'scrum'), ('DE', 'deadline')], max_length=2)), - ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), ], ), ] diff --git a/backend/myproject/announcements/migrations/0002_initial.py b/backend/myproject/announcements/migrations/0002_initial.py new file mode 100644 index 0000000..249959d --- /dev/null +++ b/backend/myproject/announcements/migrations/0002_initial.py @@ -0,0 +1,23 @@ +# Generated by Django 5.1.6 on 2025-02-18 19:17 + +import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('announcements', '0001_initial'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.AddField( + model_name='notificationmodel', + name='user', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL), + ), + ] diff --git a/backend/myproject/announcements/migrations/__pycache__/0001_initial.cpython-313.pyc b/backend/myproject/announcements/migrations/__pycache__/0001_initial.cpython-313.pyc index 01e9ea25faabea499fce13142919ca8a119a8aba..e6b570e42cfa70179f96f740411d9a1dac22d324 100644 GIT binary patch delta 478 zcmXwz!D|yi6vp41nH_gG?wZClrYdM-ME25%h!B)qJP6VDkhw0x>W)iFx{;T9ZcCvT zFAYO)p1dh|^X?xY2%dz+gLvz0rD~5l8|Z`g&G#|CkD1TGKQBB90w3)B{Qfb!$>(9a zJFw{p6exTQLnItBV%MP!9Z>8tC?4ZT&YxcKc_t#~xa!UiZ`=whW9Q_rl_Q9OPysQ8 z#1$ja19D>IGZKu8P zAJE5&Ynd+?Uh6sPVxRSp0@b82TaH?Vw?57&*&a{xV`=u;>B^G*P{az6CtJFZFUES3 z&fdXBbiusmgHCZi)h~6P>iqdw&xl*Ns68Z|Z0q%DswX7OJ#pW>5glALpTuTIT7oL6 zcJ|iF0sIIXyN^nNO}YD|bWP&y?UXgy41YPE=a;@g-iB8@ZcN zUj?LuV^^=30*+|ndcCSw%!bk5FS{tUvwh&|mppC4B0wNw2}c!zRt6}El1~k{Gq3tI zCAl^Nh*aV&4MYS45myRWQy|(n3B!QeOX=Mq3HistD2oE6fO^YASQPY-5JhfNIiKwT7$yOnoK9crRo<*HXBSEKe>y>|_k{2#l17Nm@`qwI))y2n{MPdAE?NF|z* zdmO1ytq`qVHS}ZAdJBHv@1&Xzw`F3IVjaoQm&>?@>)2uI1_d}>+rW;nR>ifl`JS#k zYVEU=MZ&o(#oX35H?@@-rld`*m$AOOL!f(gBQyW($?`nPs>_9^v)MT(c$rbfrW2SU zSgYfLL5mUIQs6}DkwI{^qUZ6BBb3)Qy<#|QdBqXEc4)hfZzh9gGP7B$025%qB5-}o zM@tdciS#v3sC&u$kURGtw**G&vcls3 diff --git a/backend/myproject/announcements/migrations/__pycache__/0002_initial.cpython-313.pyc b/backend/myproject/announcements/migrations/__pycache__/0002_initial.cpython-313.pyc index d7de9e762b4aa8d166abea9437aea7133e4c22b2..1352dcd2780629db35f84cf3f29f48cae6699307 100644 GIT binary patch delta 20 acmZ3^xtx>xGcPX}0}wpAvt=Xq92NjQ;RaCv delta 20 acmZ3^xtx>xGcPX}0}wp=ziuP<92NjRl?HAA diff --git a/backend/myproject/members/__pycache__/admin.cpython-313.pyc b/backend/myproject/members/__pycache__/admin.cpython-313.pyc index 11169407dcdb6a5e621f3320941764327ce964f4..d105d696f9d1151c7ce1b0481c7042107c7b580c 100644 GIT binary patch delta 20 acmcb^dWV(!GcPX}0}$Bm-?)+cA`<{WR|X*f delta 20 acmcb^dWV(!GcPX}0}$M+*sziNA`<{Z4+eSw diff --git a/backend/myproject/members/__pycache__/api.cpython-313.pyc b/backend/myproject/members/__pycache__/api.cpython-313.pyc index ac4c364d4b440735c2b06b9c52b4a9e8bd5ebaff..80483f68f0bb50ef1bd168b267534edf1cc82b01 100644 GIT binary patch delta 20 acmX@EeO#OSGcPX}0}$Bm-?))`k0<~_dImuN delta 20 acmX@EeO#OSGcPX}0}!N4+OUy(k0<~_cm_HE diff --git a/backend/myproject/members/__pycache__/managers.cpython-313.pyc b/backend/myproject/members/__pycache__/managers.cpython-313.pyc index 2d0840dfcfd0c2013b70e6eed00f95918d771b59..5140745eb9cabba5e8b7cc7eb3ba5e6ef0d42175 100644 GIT binary patch delta 20 acmX@db&iYsGcPX}0}$Bm-?)+6nH2y%-UWmJ delta 20 acmX@db&iYsGcPX}0}v?vUbm6knH2y&dIh2Y diff --git a/backend/myproject/members/__pycache__/models.cpython-313.pyc b/backend/myproject/members/__pycache__/models.cpython-313.pyc index 571476006dd74478f02ff3bf8a26fa5b99c1a834..ec3d2264efe42477fe62495895fc00ef77d6f460 100644 GIT binary patch delta 20 acmX@Fd|sLRGcPX}0}$Bm-?)+ch#&w$mIg%t delta 20 acmX@Fd|sLRGcPX}0}vE4uiwahL=XT!kOjK{ diff --git a/backend/myproject/members/management/__pycache__/__init__.cpython-313.pyc b/backend/myproject/members/management/__pycache__/__init__.cpython-313.pyc index e2570b8c395fa0b9538ed6428cd28612ddd1a19b..dba95ca89baf124698bce84ca29f8c9f40630bdf 100644 GIT binary patch delta 19 ZcmdnSxQ&tfGcPX}0}$Bm-#C$bH2^cv1%&_r delta 19 ZcmdnSxQ&tfGcPX}0}zCDY?#Qs8UQm-1!e#M diff --git a/backend/myproject/members/migrations/0001_initial.py b/backend/myproject/members/migrations/0001_initial.py index f76338b..785f258 100644 --- a/backend/myproject/members/migrations/0001_initial.py +++ b/backend/myproject/members/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 5.1.6 on 2025-02-14 08:49 +# Generated by Django 5.1.6 on 2025-02-18 19:17 import django.contrib.auth.validators import django.utils.timezone diff --git a/backend/myproject/members/migrations/0002_initial.py b/backend/myproject/members/migrations/0002_initial.py index d10beb2..a31271d 100644 --- a/backend/myproject/members/migrations/0002_initial.py +++ b/backend/myproject/members/migrations/0002_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 5.1.6 on 2025-02-14 08:49 +# Generated by Django 5.1.6 on 2025-02-18 19:17 import django.db.models.deletion from django.conf import settings diff --git a/backend/myproject/members/migrations/__pycache__/0001_initial.cpython-313.pyc b/backend/myproject/members/migrations/__pycache__/0001_initial.cpython-313.pyc index 297c3ef2985f547e3a4b00296c803e0a29980a8d..164509902dbcbb2b3653d86786aaf75467ddda88 100644 GIT binary patch delta 20 acmX@9a#Dr+GcPX}0}wpAvt=Wk{dSPv1 zOsK}hKA31Fwwu1#2Os*_6dyEw&=>!Jl?QPWjn(+hX8i*^%yt%I*62;Lt74)}(0)L)AXJ+O(QZNTd;z=4kQ-BnN z1l>M6D14GE5zYZxezAE^sHf zeTu_CI>z%qFh{}rpFBSBA7G{eZSt=dPQ#1=Jm_aOD&T}%ISKojD~K>3v0`t5C^wAa zD!KD+=7t62jE^Q_SkI!N&Jj{@D=S6}`!^15`_M92Fe3zxC27G0^6{a)2v6ZE7U8%q zgSrgGX^dxH2s0lnF+Xm38lM?B!Db=C=FpypD6TG`%LVk0L5#h=h?ib4USXt_+{iX8 z>^E*qgau)lgM* zb@Q!qz0{0eYcyLGR&Kss(=4lJirLglX>H61>Y;T=E1DH^7gGQ)=af~A=%V+SO>Ue6B;I$v7C^K1rZ!)8%v zw$)TVbtVPr;<|DnMA?*{>HcDQMCo$puILwq{q`B(c_=W11Z7q=L8h^Q*VkqDcO`ju*>dtLgIhF(MZ;h&-T0)96G6Qy*QlPJIEB2@aB zc>W+WkBRj|`|fz>W83Yvjqt)p$q$k@3q6x}yVf&>e;sr7U5UQzx|8`Vvt7OK?a8P9 z;d#7Yh0{EDcPeQ+Pi!@DOpb?^@~0 z{_Xd6=bTf_QnZy_f5`El{=SjUGAA?`@ZmxzU3c$%U=h+4Sy5QR_*b#lzW~EXAG81f delta 559 zcmZuu$!Z%x5bd5-vq@uZ)-qBed66uz#$bF4fk`ri93rsFM}hEe2Vo~=<>HI|3udsf z|H3dwpZx(L1k6ClAwM9Y+>??V#g`QHt5>h9AJyIW)hnkyvMilZd^o+`|CVCx=eU@L z@|TSI{G#sI9kI$f(i(qM+s4IF@ywj|KIQg*G*m&t7|5u(40V@*vd+-})#YeH3^bRo zaI{F*Nsohp2{5UWVXVd1X%`YriMnmDaRz1}*-;_2Y@9I$>83!3laPTdwPj#-g1HIi zSGX%-3JREpB4%iSEUj5^Fb5^f6E8rSY>N|gs4l@XEO&VO<7SQoG%q@qmEuf}KO~zEcJBJc Z7rQo;MOzt&vL&2rgK}_Wf0bU7#~-3IY_thzS5X@CAAR diff --git a/backend/myproject/myproject/settings.py b/backend/myproject/myproject/settings.py index fbc742a..9f1bead 100644 --- a/backend/myproject/myproject/settings.py +++ b/backend/myproject/myproject/settings.py @@ -11,6 +11,11 @@ """ import os from pathlib import Path + +from dotenv import load_dotenv + +load_dotenv() + # import django_heroku # import dj_database_url # import os @@ -98,15 +103,28 @@ # Database # https://docs.djangoproject.com/en/5.0/ref/settings/#databases -DATABASES = { - 'default': { - 'ENGINE': 'django.db.backends.sqlite3', - 'NAME': BASE_DIR / 'db.sqlite3', +if os.getenv('DJANGO_ENV') == 'production': + DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.postgresql', + 'NAME': os.getenv('DB_NAME', 'postgres'), + 'USER': os.getenv('DB_USER', 'postgres'), + 'PASSWORD': os.getenv('DB_PASSWORD', ''), + 'HOST': os.getenv('DB_HOST', 'localhost'), + 'PORT': int(os.getenv('DB_PORT', 6543)), # Cast to integer + } + } +else: + DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.sqlite3', + 'NAME': BASE_DIR / 'db.sqlite3', # Use Pathlib for cross-platform support + } } -} -# if 'DATABASE_URL' in os.environ: -# DATABASES['default'] = dj_database_url.config(default=os.environ['DATABASE_URL']) +import dj_database_url +if 'DATABASE_URL' in os.environ: + DATABASES['default'] = dj_database_url.config(default=os.environ['DATABASE_URL']) # Password validation # https://docs.djangoproject.com/en/5.0/ref/settings/#auth-password-validators diff --git a/backend/myproject/projects/migrations/0001_initial.py b/backend/myproject/projects/migrations/0001_initial.py index 29bc656..0792814 100644 --- a/backend/myproject/projects/migrations/0001_initial.py +++ b/backend/myproject/projects/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 5.1.6 on 2025-02-14 08:49 +# Generated by Django 5.1.6 on 2025-02-18 19:17 import django.db.models.deletion from django.conf import settings diff --git a/backend/myproject/projects/migrations/__pycache__/0001_initial.cpython-313.pyc b/backend/myproject/projects/migrations/__pycache__/0001_initial.cpython-313.pyc index 31ef3f598dc108f553e8aa6bd1cb4fc38656714a..39e51d2372e1f76acab5bf77c48fb3ea1339baff 100644 GIT binary patch delta 20 acmaE*`AU=fGcPX}0}wpAvt=XqeGvdm=?7{6 delta 20 acmaE*`AU=fGcPX}0}xDQUcZt1z6bzCp9Vhw diff --git a/backend/myproject/registrations/migrations/0001_initial.py b/backend/myproject/registrations/migrations/0001_initial.py index 32087aa..c0177b3 100644 --- a/backend/myproject/registrations/migrations/0001_initial.py +++ b/backend/myproject/registrations/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 5.1.6 on 2025-02-14 08:49 +# Generated by Django 5.1.6 on 2025-02-18 19:17 import django.db.models.deletion from django.conf import settings diff --git a/backend/myproject/registrations/migrations/__pycache__/0001_initial.cpython-313.pyc b/backend/myproject/registrations/migrations/__pycache__/0001_initial.cpython-313.pyc index 49d4c34211c550a848124d821ae75a969c998386..18a81e7feb3d1661ea5d7107d38b2f41e1cb4e8e 100644 GIT binary patch delta 20 acmew@^jnDgGcPX}0}wpAvt=W90Ve=UN(STr delta 20 acmew@^jnDgGcPX}0}yOyUcZsMfD-^j?giTb From 713ec6d139b5ffe85e789dc24f373cb6b17b62fa Mon Sep 17 00:00:00 2001 From: bharathan06 Date: Wed, 19 Feb 2025 12:58:45 +0530 Subject: [PATCH 46/63] render setup file updates --- backend/myproject/.env | 2 +- backend/myproject/manage.py | 10 +++++----- .../__pycache__/settings.cpython-313.pyc | Bin 4421 -> 4458 bytes backend/myproject/myproject/settings.py | 3 ++- backend/myproject/requirements.txt | 10 ++++++++++ 5 files changed, 18 insertions(+), 7 deletions(-) diff --git a/backend/myproject/.env b/backend/myproject/.env index de4bb43..099de04 100644 --- a/backend/myproject/.env +++ b/backend/myproject/.env @@ -1,5 +1,5 @@ DB_NAME=postgres -DB_USER=postgres +DB_USER=postgres.swzgdimtkynmkzftxjjv DB_PASSWORD=GOMxZBnMwtF5VPYk DB_HOST=aws-0-ap-south-1.pooler.supabase.com DB_PORT=6543 # Try 6543 if 5432 fails diff --git a/backend/myproject/manage.py b/backend/myproject/manage.py index 7ecc615..79b729e 100644 --- a/backend/myproject/manage.py +++ b/backend/myproject/manage.py @@ -10,11 +10,11 @@ def main(): """Run administrative tasks.""" os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings') - if "runserver" in sys.argv: - import debugpy - debugpy.listen(("0.0.0.0", 5678)) - print("Waiting for debugger attach...") - debugpy.wait_for_client() + # if "runserver" in sys.argv: + # import debugpy + # debugpy.listen(("0.0.0.0", 9000)) + # print("Waiting for debugger attach...") + # debugpy.wait_for_client() try: from django.core.management import execute_from_command_line diff --git a/backend/myproject/myproject/__pycache__/settings.cpython-313.pyc b/backend/myproject/myproject/__pycache__/settings.cpython-313.pyc index 88d9bf409b53cefa50adaecaf782c758604d3b73..b6055ae7aedc1a524bee08b12810a81a985e93b2 100644 GIT binary patch delta 332 zcmW+w%}T>y5X`1+Vn2yi3F(iuHc4xm|M*k2Z=i^H*kjw9r6`KH#Ru>aBnPjGj}X0j z6ZGa$dhzZ-DuOq`FI||~* Date: Wed, 19 Feb 2025 13:27:51 +0530 Subject: [PATCH 47/63] extras --- backend/myproject/myproject/settings.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/myproject/myproject/settings.py b/backend/myproject/myproject/settings.py index b463633..10f9c89 100644 --- a/backend/myproject/myproject/settings.py +++ b/backend/myproject/myproject/settings.py @@ -33,7 +33,7 @@ # SECURITY WARNING: don't run with debug turned on in production! DEBUG = True -ALLOWED_HOSTS = os.getenv("ALLOWED_HOSTS", "127.0.0.1,localhost").split(",") +ALLOWED_HOSTS = os.getenv("ALLOWED_HOSTS", "127.0.0.1","localhost").split(",") From 48743f60bfa4d2e2af10eb2893f0e73c527e6e63 Mon Sep 17 00:00:00 2001 From: yvaishalirao Date: Wed, 19 Feb 2025 22:29:59 +0530 Subject: [PATCH 48/63] login auth ig??? --- .idea/libraries/Dart_Packages.xml | 180 +++++++++++------- frontend/lib/api/login_api.dart | 42 ++++ frontend/lib/models/user_model.dart | 13 ++ .../pages/admin_pages/admin_dummy_home.dart | 19 ++ .../lib/pages/user_pages/user_dummy_home.dart | 19 ++ frontend/pubspec.lock | 88 ++++++--- frontend/pubspec.yaml | 2 + 7 files changed, 261 insertions(+), 102 deletions(-) create mode 100644 frontend/lib/api/login_api.dart create mode 100644 frontend/lib/models/user_model.dart create mode 100644 frontend/lib/pages/admin_pages/admin_dummy_home.dart create mode 100644 frontend/lib/pages/user_pages/user_dummy_home.dart diff --git a/.idea/libraries/Dart_Packages.xml b/.idea/libraries/Dart_Packages.xml index 4c6f210..d6245bd 100644 --- a/.idea/libraries/Dart_Packages.xml +++ b/.idea/libraries/Dart_Packages.xml @@ -5,119 +5,133 @@ - - - - - - - - + + + + + + + + + + + + - - - - - - - - - @@ -138,42 +152,42 @@ - - - - - - @@ -187,63 +201,63 @@ - - - - - - - - - @@ -257,42 +271,49 @@ - - - - + + + + + + - - @@ -306,91 +327,98 @@ - - - - - - - - - - - - + + + + + + - @@ -411,84 +439,84 @@ - - - - - - - - - - - - @@ -502,7 +530,7 @@ - @@ -516,63 +544,63 @@ - - - - - - - - - @@ -586,7 +614,7 @@ - @@ -601,6 +629,8 @@ + + @@ -630,6 +660,7 @@ + @@ -645,6 +676,7 @@ + diff --git a/frontend/lib/api/login_api.dart b/frontend/lib/api/login_api.dart new file mode 100644 index 0000000..632f1ae --- /dev/null +++ b/frontend/lib/api/login_api.dart @@ -0,0 +1,42 @@ +import 'dart:convert'; + +import 'package:http/http.dart' as http; +import 'package:shared_preferences/shared_preferences.dart'; + +import '../models/user_model.dart'; + +class AuthService { + //TODO: add base url + static const String baseUrl = ""; + + Future login(String email, String password) async { + try { + final response = await http.post( + Uri.parse(baseUrl), + headers: {'Content-Type': 'application/json'}, + body: jsonEncode({"email": email, "password": password}), + ); + + if (response.statusCode == 200) { + final data = jsonDecode(response.body); + final user = UserModel.fromJson(data); + + final prefs = await SharedPreferences.getInstance(); + await prefs.setString('user_email', user.email); + await prefs.setString('user_role', user.role); + + return user; + } else { + return null; + } + } catch (e) { + print("Error: $e"); + return null; + } + } + + Future logout() async { + final prefs = await SharedPreferences.getInstance(); + await prefs.clear(); + } +} diff --git a/frontend/lib/models/user_model.dart b/frontend/lib/models/user_model.dart new file mode 100644 index 0000000..7a9501b --- /dev/null +++ b/frontend/lib/models/user_model.dart @@ -0,0 +1,13 @@ +class UserModel { + final String email; + final String role; // 'admin' or 'user' + + UserModel({required this.email, required this.role}); + + factory UserModel.fromJson(Map json) { + return UserModel( + email: json['email'], + role: json['role'], + ); + } +} diff --git a/frontend/lib/pages/admin_pages/admin_dummy_home.dart b/frontend/lib/pages/admin_pages/admin_dummy_home.dart new file mode 100644 index 0000000..31c71f8 --- /dev/null +++ b/frontend/lib/pages/admin_pages/admin_dummy_home.dart @@ -0,0 +1,19 @@ +import 'package:flutter/material.dart'; + +class AdminDummyHome extends StatefulWidget { + const AdminDummyHome({super.key}); + + @override + State createState() => _AdminDummyHomeState(); +} + +class _AdminDummyHomeState extends State { + @override + Widget build(BuildContext context) { + return const Scaffold( + body: Center( + child: Text('admin home'), + ), + ); + } +} diff --git a/frontend/lib/pages/user_pages/user_dummy_home.dart b/frontend/lib/pages/user_pages/user_dummy_home.dart new file mode 100644 index 0000000..fefaef5 --- /dev/null +++ b/frontend/lib/pages/user_pages/user_dummy_home.dart @@ -0,0 +1,19 @@ +import 'package:flutter/material.dart'; + +class UserDummyHome extends StatefulWidget { + const UserDummyHome({super.key}); + + @override + State createState() => _UserDummyHomeState(); +} + +class _UserDummyHomeState extends State { + @override + Widget build(BuildContext context) { + return const Scaffold( + body: Center( + child: Text('user home'), + ), + ); + } +} diff --git a/frontend/pubspec.lock b/frontend/pubspec.lock index 1a2c8c8..d2a78e1 100644 --- a/frontend/pubspec.lock +++ b/frontend/pubspec.lock @@ -5,42 +5,42 @@ packages: dependency: transitive description: name: async - sha256: d2872f9c19731c2e5f10444b14686eb7cc85c76274bd6c16e1816bff9a3bab63 + sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c" url: "https://pub.dev" source: hosted - version: "2.12.0" + version: "2.11.0" boolean_selector: dependency: transitive description: name: boolean_selector - sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea" + sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" url: "https://pub.dev" source: hosted - version: "2.1.2" + version: "2.1.1" characters: dependency: transitive description: name: characters - sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803 + sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605" url: "https://pub.dev" source: hosted - version: "1.4.0" + version: "1.3.0" clock: dependency: transitive description: name: clock - sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b + sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf url: "https://pub.dev" source: hosted - version: "1.1.2" + version: "1.1.1" collection: dependency: transitive description: name: collection - sha256: a1ace0a119f20aabc852d165077c036cd864315bd99b7eaa10a60100341941bf + sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a url: "https://pub.dev" source: hosted - version: "1.19.0" + version: "1.18.0" cross_file: dependency: transitive description: @@ -65,14 +65,30 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.8" + dio: + dependency: "direct main" + description: + name: dio + sha256: "253a18bbd4851fecba42f7343a1df3a9a4c1d31a2c1b37e221086b4fa8c8dbc9" + url: "https://pub.dev" + source: hosted + version: "5.8.0+1" + dio_web_adapter: + dependency: transitive + description: + name: dio_web_adapter + sha256: e485c7a39ff2b384fa1d7e09b4e25f755804de8384358049124830b04fc4f93a + url: "https://pub.dev" + source: hosted + version: "2.1.0" fake_async: dependency: transitive description: name: fake_async - sha256: "6a95e56b2449df2273fd8c45a662d6947ce1ebb7aafe80e550a3f68297f3cacc" + sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" url: "https://pub.dev" source: hosted - version: "1.3.2" + version: "1.3.1" ffi: dependency: transitive description: @@ -284,26 +300,26 @@ packages: dependency: transitive description: name: matcher - sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2 + sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb url: "https://pub.dev" source: hosted - version: "0.12.17" + version: "0.12.16+1" material_color_utilities: dependency: transitive description: name: material_color_utilities - sha256: "0e0a020085b65b6083975e499759762399b4475f766c21668c4ecca34ea74e5a" + sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec url: "https://pub.dev" source: hosted - version: "0.8.0" + version: "0.11.1" meta: dependency: transitive description: name: meta - sha256: e3641ec5d63ebf0d9b41bd43201a66e3fc79a65db5f61fc181f04cd27aab950c + sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7 url: "https://pub.dev" source: hosted - version: "1.16.0" + version: "1.15.0" mime: dependency: transitive description: @@ -312,14 +328,22 @@ packages: url: "https://pub.dev" source: hosted version: "2.0.0" + nested: + dependency: transitive + description: + name: nested + sha256: "03bac4c528c64c95c722ec99280375a6f2fc708eec17c7b3f07253b626cd2a20" + url: "https://pub.dev" + source: hosted + version: "1.0.0" path: dependency: transitive description: name: path - sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5" + sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af" url: "https://pub.dev" source: hosted - version: "1.9.1" + version: "1.9.0" path_provider: dependency: transitive description: @@ -432,6 +456,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.8" + provider: + dependency: "direct main" + description: + name: provider + sha256: c8a055ee5ce3fd98d6fc872478b03823ffdb448699c6ebdbbc71d59b596fd48c + url: "https://pub.dev" + source: hosted + version: "6.1.2" readmore: dependency: "direct main" description: @@ -505,10 +537,10 @@ packages: dependency: transitive description: name: source_span - sha256: "254ee5351d6cb365c859e20ee823c3bb479bf4a293c22d17a9f1bf144ce86f7c" + sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c" url: "https://pub.dev" source: hosted - version: "1.10.1" + version: "1.10.0" stack_trace: dependency: transitive description: @@ -521,10 +553,10 @@ packages: dependency: transitive description: name: stream_channel - sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d" + sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7 url: "https://pub.dev" source: hosted - version: "2.1.4" + version: "2.1.2" string_scanner: dependency: transitive description: @@ -537,10 +569,10 @@ packages: dependency: transitive description: name: term_glyph - sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e" + sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 url: "https://pub.dev" source: hosted - version: "1.2.2" + version: "1.2.1" test_api: dependency: transitive description: @@ -662,5 +694,5 @@ packages: source: hosted version: "1.1.0" sdks: - dart: ">=3.7.0-0 <4.0.0" - flutter: ">=3.24.0" + dart: ">=3.4.0 <4.0.0" + flutter: ">=3.22.0" diff --git a/frontend/pubspec.yaml b/frontend/pubspec.yaml index 2929519..587953f 100644 --- a/frontend/pubspec.yaml +++ b/frontend/pubspec.yaml @@ -42,6 +42,8 @@ dependencies: shared_preferences: ^2.0.13 permission_handler: ^11.3.1 file_picker: ^8.1.2 + dio: ^5.3.2 + provider: ^6.0.5 dev_dependencies: flutter_test: From d23928aee5a4bf2208a806803f9efe467c6edb3a Mon Sep 17 00:00:00 2001 From: Kartikjarali010 Date: Wed, 19 Feb 2025 23:20:55 +0530 Subject: [PATCH 49/63] user feed page done --- .../lib/pages/user_pages/user_feed_page.dart | 202 +++++++++--------- 1 file changed, 103 insertions(+), 99 deletions(-) diff --git a/frontend/lib/pages/user_pages/user_feed_page.dart b/frontend/lib/pages/user_pages/user_feed_page.dart index e6a0e1f..32143d5 100644 --- a/frontend/lib/pages/user_pages/user_feed_page.dart +++ b/frontend/lib/pages/user_pages/user_feed_page.dart @@ -23,22 +23,22 @@ class UserFeedPage extends StatefulWidget { State createState() => _UserFeedPageState(); } - class Post { final String details; Post({required this.details}); } -// In your _UserFeedPageState class -final List posts = [ - Post(details: "Lorem ipsum dolor sit amet et delectus accommodare his consul copiosae legendos at vix ad putent delectus delicata usu"), - Post(details: 'Post 2 details'), - Post(details: 'Post 3 details'), -]; class _UserFeedPageState extends State { + final List posts = [ + Post(details: "Post 1 details"), + Post(details: 'Post 2 details'), + Post(details: 'Post 3 details'), + ]; + + @override Widget build(BuildContext context) { return SafeArea( @@ -58,7 +58,10 @@ class _UserFeedPageState extends State { Expanded( child: ListView.builder( itemCount: posts.length, - itemBuilder: (context, index) => _buildPostCard(context, index), + itemBuilder: (context, index) => PostCard( + post: posts[index], + onViewMore: () => showPopup(context, posts[index]), + ), ), ), ], @@ -68,8 +71,6 @@ class _UserFeedPageState extends State { ); } - - Widget _buildTopBar() { return Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, @@ -85,38 +86,34 @@ class _UserFeedPageState extends State { ], ); } -// when clicked on the more detail button it shulb pop up with a message of more deatils fetched from the card? - void showPopup(BuildContext context , Post post) { + + void showPopup(BuildContext context, Post post) { showDialog( context: context, builder: (BuildContext context) { return AlertDialog( - title: Text("Post Details"), - content: Text(post.details), // Display the post details - actions: [ - TextButton( - onPressed: () { - Navigator.of(context).pop(); // Close the popup - }, - child: Text("Close"), - ), - ], - ); - }, - ); -} + title: const Text("Post Details"), + content: Text(post.details), // fetchhh post details..... + actions: [ + TextButton( + onPressed: () => Navigator.of(context).pop(), + child: const Text("Close"), + ), + ], + ); + }, + ); + } Widget _buildHeader() { - return Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, + return const Column( + crossAxisAlignment: CrossAxisAlignment.start, children: [ - Column(children: [ Text("WELCOME BACK"), - const Text( + Text( "Bharathan", style: TextStyle(fontSize: 28, fontWeight: FontWeight.bold), - ),],), - + ), ], ); } @@ -151,74 +148,81 @@ class _UserFeedPageState extends State { ), ); } +} - Widget _buildPostCard(BuildContext context, int index) { - final post = posts[index]; - return Container( - margin: const EdgeInsets.symmetric(vertical: 8), - padding: const EdgeInsets.all(16), - decoration: BoxDecoration( - color: Colors.grey[100], - borderRadius: BorderRadius.circular(12), - ), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Row( - children: [ - const CircleAvatar( - backgroundColor: Colors.grey, - radius: 20, - ), - const SizedBox(width: 10), - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: const [ - Text( - "Name", - style: TextStyle(fontWeight: FontWeight.bold, fontSize: 16), - ), - Text( - "2 Days ago • DD/month Time", - style: TextStyle(fontSize: 12, color: Colors.grey), - ), - ], - ), - ], - ), - const SizedBox(height: 10), - const Text( - "Lorem ipsum dolor sit amet et delectus accommodare " - "his consul copiosae legendos at vix ad putent delectus " - "delicata usu.", - style: TextStyle(fontSize: 14), - ), - const SizedBox(height: 10), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Row( - children: List.generate( - 3, - (index) => Container( - margin: const EdgeInsets.only(right: 8), - height: 10, - width: 30, - color: Colors.grey[300], + + +class PostCard extends StatelessWidget { + final Post post; + final VoidCallback onViewMore; + + const PostCard({super.key, required this.post, required this.onViewMore}); + + @override + Widget build(BuildContext context) { + return Container( + margin: const EdgeInsets.symmetric(vertical: 8), + padding: const EdgeInsets.all(16), + decoration: BoxDecoration( + color: Colors.grey[100], + borderRadius: BorderRadius.circular(12), + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + const CircleAvatar( + backgroundColor: Colors.grey, + radius: 20, + ), + const SizedBox(width: 10), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: const [ + Text( + "Name", + style: TextStyle(fontWeight: FontWeight.bold, fontSize: 16), + ), + Text( + "2 Days ago • DD/month Time", + style: TextStyle(fontSize: 12, color: Colors.grey), + ), + ], + ), + ], + ), + const SizedBox(height: 10), + Text( + post.details, + style: const TextStyle(fontSize: 14), + ), + const SizedBox(height: 10), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Row( + children: List.generate( + 3, + (index) => Container( + margin: const EdgeInsets.only(right: 8), + height: 10, + width: 30, + color: Colors.grey[300], + ), ), ), - ), - FloatingActionButton( - tooltip: 'View More', - onPressed: () => showPopup(context, post), // Pass the post to showPopup - backgroundColor: Colors.purple, - mini: true, - child: const Icon(Icons.arrow_forward, color: Colors.white, size: 18), - ), - ], - ), - ], - ), - ); -} + FloatingActionButton( + tooltip: 'View More', + onPressed: onViewMore, + backgroundColor: Colors.purple, + mini: true, + child: const Icon(Icons.arrow_forward, color: Colors.white, size: 18), + ), + ], + ), + ], + ), + ); + } } From 73cd79a3fd4cf189da383fd44d148b2f59529887 Mon Sep 17 00:00:00 2001 From: bharathan06 Date: Thu, 20 Feb 2025 11:30:10 +0530 Subject: [PATCH 50/63] api calls for admin in the general feed feed completed, add :crud operations --- .../__pycache__/api.cpython-313.pyc | Bin 0 -> 4241 bytes .../__pycache__/models.cpython-313.pyc | Bin 1741 -> 1761 bytes .../__pycache__/schemas.cpython-313.pyc | Bin 0 -> 1626 bytes backend/myproject/announcements/api.py | 83 ++++++++++++++++++ .../migrations/0003_postmodel.py | 26 ++++++ .../__pycache__/0001_initial.cpython-313.pyc | Bin 1279 -> 1279 bytes .../__pycache__/0002_initial.cpython-313.pyc | Bin 1191 -> 1191 bytes .../0003_postmodel.cpython-313.pyc | Bin 0 -> 1606 bytes backend/myproject/announcements/models.py | 2 +- backend/myproject/announcements/schemas.py | 29 ++++++ .../members/__pycache__/admin.cpython-313.pyc | Bin 732 -> 732 bytes .../members/__pycache__/api.cpython-313.pyc | Bin 5575 -> 5684 bytes .../__pycache__/managers.cpython-313.pyc | Bin 1358 -> 1358 bytes .../__pycache__/models.cpython-313.pyc | Bin 4559 -> 4559 bytes backend/myproject/members/api.py | 4 + .../__pycache__/__init__.cpython-313.pyc | Bin 182 -> 182 bytes .../__pycache__/0001_initial.cpython-313.pyc | Bin 4681 -> 4681 bytes .../__pycache__/0002_initial.cpython-313.pyc | Bin 2019 -> 2019 bytes .../__pycache__/settings.cpython-313.pyc | Bin 4458 -> 4581 bytes .../__pycache__/urls.cpython-313.pyc | Bin 717 -> 717 bytes .../__pycache__/0001_initial.cpython-313.pyc | Bin 5354 -> 5354 bytes .../__pycache__/0001_initial.cpython-313.pyc | Bin 2427 -> 2427 bytes 22 files changed, 143 insertions(+), 1 deletion(-) create mode 100644 backend/myproject/announcements/__pycache__/api.cpython-313.pyc create mode 100644 backend/myproject/announcements/__pycache__/schemas.cpython-313.pyc create mode 100644 backend/myproject/announcements/api.py create mode 100644 backend/myproject/announcements/migrations/0003_postmodel.py create mode 100644 backend/myproject/announcements/migrations/__pycache__/0003_postmodel.cpython-313.pyc create mode 100644 backend/myproject/announcements/schemas.py diff --git a/backend/myproject/announcements/__pycache__/api.cpython-313.pyc b/backend/myproject/announcements/__pycache__/api.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d5d83f50069464ee3c300fd1885d4ef3664231f1 GIT binary patch literal 4241 zcmbVP%WoUU8J~Ue{nEp-L|GDT%aLh4>ql%ENeWqt-B7k*aLuN%2rO3QN?w~>GP6so zR$U%dWjD`D3>Dbq0O;C{{byjfW#td)7BT?Xfv1I`hB~6$)ek!3u)$? z`5yDle82hTV=Wl;5%{dX{BiA9enS3*gU08o6Sdy}@tBB2WEM$+p-c>Ec9BhRl(T7W zkxvLzNVupg;im3{hkERJe$kuoQ6JEP=vwqA0yJRL?!{mtL_;?1Sqvq@G#n#o_Yop` zMW5)OW%~)xfhZA!Y1bLf@#9S09U4gszzvDvS%!A4MdDpAkP~ODt~JGw3M)6240KdF zJ#!i+0|~vLB^A9`&~zovTfrq&yD7i_Q-jKLS3j^q^99YIg(Lnd#? zYkH=>6}xL5b3fR9OwxohBB89vP)=l{gz{-28E98)iAy(Rqoe~|`I4?sE28R>TrzGbnxST7 zL&;h^U{;~%Q=GMUUCFIlZnUBR%y56Pn6)^6KAi$>J-u>6rgC~g(Qg@rBJ{T>uTeR3 zYjUnwOs@c;XxViBPLUSy>ZD~&E0na1l84pwG~9=&;vFj>0iZLtBxfhX`(iQG&PTZF zXQBCod>ih2aQFV*a(Dv%zHV8F|*fJ$`XJc4_;nX!cy& z4qU5*dupIcHuz~do89otWwS9{4vxiBqB%*E^NQsz%6D=FIh&~`2UH+a!Y`;+k=XGfQ!!WVwlrWQTYsn^A5VO|eN&Yt*1%)=sRAvC{({JKSWE zndLNIWK(=Hv{xQS%UzARmggcj1-{1lr8s8^hHB&#%b!*B3{{JUTF@+ChAM~>Y30tw z0G?f}J`vMPnT(?AtEF7-4k)|xFp$^qJV8oQv!JTeRVUBIy>tlHrtmHh%kAV<-Eujm z=uu>iVsjArteT~G9peIpD@5oZHiwbpw;|)e!{Tur9j|E&KYGZPa7;?bvxd;$J=c7y zjokzC`YmVxS$)xR-zfIXL)a{n7e2(WB2U?L;SDx`73J zuaAzPlg#vn@3IO$(vJURs#@!Sk>oHk|q4RahG)dh2YhNShcEXp~!Yi9%d&rMD zot-8+P(Ml$f*9_IKdvMGxK8*33mtHmY~rrvY{O5`=x)t6s7`)}?38eoz49R;ei9=Z z5B~C_;C&4KHExx}xuq6bWdqPN4(8gxbrOfipo#lzAksL{7ANO&mZw0o3I&XJ(y_d% zURW*Aylgn?ZMd`q8-;WdO}VI|mvZ|s>B~W^ZA9wUq5Y6-anU#ZJ~W?@=aGSOf7IP({c(bn^{&907H$+ry&IW3ZSktCne;X)=;>YX6WyGD^fz^MS+~mE`7<^cx+@(blO4gQKUwpf%jUztx#Nu z2660JrG-3{togXBEqh`_>=a5TkV3TDp|vw-BXySSn7%P}wz1zv{oBy|*VGyN?ZDQ$ z89uwoSNz=%-o5{>=^w2O#J(8%d}wpwvjj|*{lg~yov4hwRUSEMj-1?F_-o)$#S?ho zz3=_Z|2*7R4j(qdhs)s;X86R`>7DS*wr9r9q8t7NC8yLexaaL|qHO~_{6F9BCO-C| z4Y1iMx3;40RBiT~O5Xtw=v&a#-%cp-!R74Ux083?#%6S}xI?i$@1GsPR`76-cJS)Y zo}=-`*tM}Qfu@dreb3l^3&HT;_kR|wLPAl06s;gh&W7=J*-*6MYeg_M&fC?7^NWX0fq=!q zk0pA}rivxQ0Xe5?h9mFfp}PDJ(clGa=28BDBw_8VW+d4#sJa3_zI0goeH6fV*giUn zZmS4jkv66znVkyFkVlJg_Y%oGrUtJ}yX0thEU8c$u zE@GExmJ1@Tn1by9ea^s&OHs)2=;Ia?D48S^%4psckj~!rfcLE IoP8$$0a7n~MF0Q* literal 0 HcmV?d00001 diff --git a/backend/myproject/announcements/__pycache__/models.cpython-313.pyc b/backend/myproject/announcements/__pycache__/models.cpython-313.pyc index f7144c2bfda46a75445232351a1fe7bedc809f95..e47194b9f732f598160992dcedb8921e92ab5fc3 100644 GIT binary patch delta 137 zcmX@h`;eFSGcPX}0}!}u-Il&>BCjN4!9;a+y%@$I4v;7+FlC1Di&!NXlo*0pr5J+Q zKq@z;aWS%R2ILoSu3>!5!gGt&H$Npcr-%)xdU7$FhKxRt@qw9~$UJ3G j{m#Y0=*jqz0YrY`<7aecoWVAqXC}{A1`xYQ9;g}sYF#0c diff --git a/backend/myproject/announcements/__pycache__/schemas.cpython-313.pyc b/backend/myproject/announcements/__pycache__/schemas.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dfe30e372c623eb0d74e62025546101358b391d6 GIT binary patch literal 1626 zcmZ`(O=}xh6n*ol(I~DIJC0SmuI)HZGK<7e8c0hUC~hg(Acsy3T?`DP(L^3cGo!pW z7I+g3UbNY?^1`IuwCntVF8d#fp&cF=TG~x^2~zjH_l;z!LVch!N9Vqed*0kTy_p%4 z!1()@pPN6*g#3knhC>^W-T{y^ViQ~1A=?s_R*}m)^0q=1!Id3#TczqMsgfJSRu_q_ zInsS4Ur#lm>Yx_JR9&bBsKqh0&@`>mD_m$vT(|xGAo742yX`bgVy}g~;iW+uMuDI2 zpX1;#()$YjpAm;p$tF~`C8}%?M|Ct?z6}va2c}#yRj>kRnqW9j7tF8=i{$>`1X{EW zYBr0O$<0RzOY^*5=@8~}*x*_krmcXN8UgcZC{pF7PXkD_;d<$a*N=R-<;!6J!^C^v z0-TXOxV=5;i_7qcfI7Zz5CByj%^5OKF|mmODxNkmrk!O=A80p;CD&eRvV>ynBM9t-`)Dq*<%4^PJQ2_p7UwIo}@_|o}Ig2QqO;K_mg&e zvkoMP8=KKlnW` zW|g?%y0I4puFFl=jgrP;3;7k-eR}A%29dJsJ`O2MTVWi;351m}PC2NUf9he4GE`Yg zDYg$U`7MvJC`k8{2AxA?-gOzy^r0|P8rBcf0G80}5To-5vj~MD;HzYt0AG{LD4l$s zmEJnp&aPfNSFdH2>bY9YDsv~he`u9AazQhD3em6jkmY;fHq+bWeTe*jo7f7~or0sH z2WSb=CbmY6rfwB@1z*ILsO~`{EWk8TCVWsR=%!{BsR&dt`ZmHM!ZN};2%@I2g6Rsv z#1*WehJc$eyc)Oy;eKuXc&A(ae*JX$H+4NXiu0x$eF%|Bqqa<;(;Z#dE9Bn;(2Ox{ zXt~&wEj_oq*Tyf;!15AoTN`T)Ox`l58W#N{Y))98=6VD6p$K>Ydlvv)FRdJZ_RWLt z*7J|g)s<{*V`P6Lw~q^Imcg|+j1N4D-xRK=N9{0fQgJdm&5KH0t2pJq_sxxu@}hr8 zEto99kG%)*T9G8_f>bZa(gj)W>t)I8Uhfll^l!-0&2Fbp;L$f^=~lP%5Aa(erGEjT CyGfGcPX}0}yPSzilJ;7Zw0W<_7Hm delta 20 acmey*`Ja>fGcPX}0}wpAvt=Xq7Zw0Zp$Az2 diff --git a/backend/myproject/announcements/migrations/__pycache__/0002_initial.cpython-313.pyc b/backend/myproject/announcements/migrations/__pycache__/0002_initial.cpython-313.pyc index 1352dcd2780629db35f84cf3f29f48cae6699307..60fa7fae03f74f14c3e7ebb7a646a759b50510b6 100644 GIT binary patch delta 20 acmZ3^xtx>xGcPX}0}yPSzilJ;92NjOCI#gH delta 20 acmZ3^xtx>xGcPX}0}wpAvt=Xq92NjQ;RaCv diff --git a/backend/myproject/announcements/migrations/__pycache__/0003_postmodel.cpython-313.pyc b/backend/myproject/announcements/migrations/__pycache__/0003_postmodel.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8dc68e8c62b2d476470282193a72d1a8afc259b1 GIT binary patch literal 1606 zcmZ`(O>7%Q6y9BXH@p5x?9}-oDv61rHjZdwHT=jmLN)m*#0em;b3rSO*4~M`jlH|f zPSUzukdQcW=mn`qj&SP*6i#p~H`^RG8VOOUr`(JJciybyrl@A@-Fffr_h#PDH*=m$ z#snDFk3Tg|B7*RoE5jjQ2VV26$PJ~3V+!iTEcVr^(C`8E$v%;dF zN9P1xHss3qaG}fjZP}l7t`Yf5fBML%#B3IdQu-RNPw9D%+>$Fq{3CwfS4bJ zFjAGpSM8O|2;0&K+qGA1qwA(m@<`WY{YpVv6G=wTkg3L0ZklO(!`_{#uo!eRX*!O3 z*eT*Elg_%rk+QerT-&F(-nGaACI}Li5#VzdDiS2Pl*@6^C zCD)p!b4Yk$SnOgWWK!@P?CrSsk!e|%-)e2hMROelv0{puL|rgM!>yGA8#gWg2Vn9v zQ&AWXLM(<5u=l8mK~5m_`H|V=aL^_YI!Yt z@dG*#lbcZ9s@=i^HMZ>%Y&V=TR9Ug^nNGuHl2v1Bm@(9jjct_ljnd{8i@6>ip3o_T zd%n|{qe{&B;f<2#88r|f zWuw*hh8sDuQ;&{=nU&tm%1QL;Qs*<&aY%Q@ z@1*EydiL?PU~Z*1xALUkox9aZ6;IRi-zh;h-^=Eo(5I1ZcDIw-J59g-_&8Wt?=7tV zn&~cVcT#sQO!?kI{^Xrs3O^TuV!2x^2gPc)SPhCsw`g=sJ22Z__%A%{q`v6KmCX2G zvZlrQk@%$Y)egBi%q^#~*9L7_wQ8$j?*8hqH{?x#0n@{_t=3)VU_c!0g-6J-kQ{?@ z@dgbRU+1psdjqb%Pu>NUUyDA!N%|2{6wehweB%!x`=_w{w=yXzk77Y;she8*M*t;U F<6mm4p7#I% literal 0 HcmV?d00001 diff --git a/backend/myproject/announcements/models.py b/backend/myproject/announcements/models.py index b896e38..40540c5 100644 --- a/backend/myproject/announcements/models.py +++ b/backend/myproject/announcements/models.py @@ -5,7 +5,7 @@ -class AnnouncementModel: +class PostModel(models.Model): title = models.CharField(max_length=100, blank=False, null=False) description = models.TextField(max_length=512, blank=True) created_at = models.DateTimeField(auto_now_add=True) diff --git a/backend/myproject/announcements/schemas.py b/backend/myproject/announcements/schemas.py new file mode 100644 index 0000000..fa44630 --- /dev/null +++ b/backend/myproject/announcements/schemas.py @@ -0,0 +1,29 @@ +from ninja import Schema +from typing import Optional +from datetime import datetime + + +class PostSchema(Schema): + id: int + title: str + description: str + created_at: datetime + created_by: int + + @classmethod + def from_orm(cls, obj): + return cls( + id=obj.id, + title=obj.title, + description=obj.description, + created_at=obj.created_at, + created_by=obj.created_by.id, + ) + +class PostCreateSchema(Schema): + title: str + description: Optional[str] = "" + +class PostUpdateSchema(Schema): + title: Optional[str] = None + description: Optional[str] = None diff --git a/backend/myproject/members/__pycache__/admin.cpython-313.pyc b/backend/myproject/members/__pycache__/admin.cpython-313.pyc index d105d696f9d1151c7ce1b0481c7042107c7b580c..80ee687a00a905a0772c35708ef4532944d1c41b 100644 GIT binary patch delta 20 acmcb^dWV(!GcPX}0}yPSzilJ;MJ513+y;68 delta 20 acmcb^dWV(!GcPX}0}$Bm-?)+cA`<{WR|X*f diff --git a/backend/myproject/members/__pycache__/api.cpython-313.pyc b/backend/myproject/members/__pycache__/api.cpython-313.pyc index 80483f68f0bb50ef1bd168b267534edf1cc82b01..c34b40e88ff8c0578686adfd2bf5de74272151a0 100644 GIT binary patch delta 816 zcmZuvO-vI(6rR`8vQSF5KU-O9(`{|RQlS1&6$2(jQV|alR*Z*UR$L0E-IBLk^kUST z2Q?uRjaR*T(X27XlQ(XrCK#Jd@Wjc37Y`Z_#+k(wO`O9w@4fGP-_E?*t-`C(;J09~ zm$3EOeqFt}8I1Mr8kzJA5Ee%Vi5ja!N?zVaNNH~) zn688wE2;5Gz)U5xc zHVg|JwVIChCC@Ve$^P!OAfT{D^l`}04POe9^s(<2$Ta4E4r%(%KNQJxa)g2DVW22D zN`LtCxnW+B7~CPdLjS!R_d{(_ZY3sKp;AjIVUaNyx69pW7))a8OT*T#0mu6Y$_%^g!Q#bvrqPUA) zUkeoAG<^`Tph!J^SxDH!eY;*Zu0HVy%+P7E9N0H3(}&_g|0uVeqc6lHlUR^US9o6Mky{_Rb7lt{^(YKL=yu?FyysoLtQw|dS8rhD! z1W(KC?YovuT*+tgB5g-YFirboUk079W*Cj8v8>m1!!pOU^)=+rh%)^dOC9>x-4Ukh zjcd)Ceg@Z>hX0A?BRVA=?-mH;c1V$$(!AV~N480!O}wATzy~t$B=M2t+!Ou=JJGM( delta 783 zcmZ`%O-vI(6yDcg=u-N-*wRXu{)kI!1F=;RG!O-%F{o7Hr3tC9Y)kq>-p*=bVjwXl zns^~|z_an@iL8lw^60fBn&_Un=+!fcGm9yDa1P(RpKreR=FPk-e9rrS`TahDtt+4Q zHEGu$hw9kkL<#1IxY9uC-Lmu-Ie&QisURj;5*Wa-)q|PUhl@7svUTU_)Q68KkbZ zNn@=>)OGCXVTqIZ$dHd3Cm8g)WVSV6=qggBKMe(XtA7)U=KKC-fDHACr{gD;z;f!? zR(y6ryg+BgC`{88F@3Igc}(&Gc0;ZjA!xZD)|!T@dstYu7n{o)F%Oq$S0qrR^8;BJ zHa7vx)}<6 zfKq`oCppupsRS?D)|Nr6!DUrz=tRZJT3v0`kpC16aag2B;Y9o%H|_VZi^aIhAwnl3 zUxw@icNY|}Tx&XRC}~`xiD(&S=-uc~2gc}%l*;_8V)f0mI_pMLy^3vimVZP2DczIK UyF3Eq=z(<8_bTyK$k}y&10=_&761SM diff --git a/backend/myproject/members/__pycache__/managers.cpython-313.pyc b/backend/myproject/members/__pycache__/managers.cpython-313.pyc index 5140745eb9cabba5e8b7cc7eb3ba5e6ef0d42175..e017f28d7f9059ffe51e60bd62707d95085f39b7 100644 GIT binary patch delta 20 acmX@db&iYsGcPX}0}yPQzilJ8Gb;cXPw delta 19 ZcmdnSxQ&tfGcPX}0}$Bm-#C$bH2^cv1%&_r diff --git a/backend/myproject/members/migrations/__pycache__/0001_initial.cpython-313.pyc b/backend/myproject/members/migrations/__pycache__/0001_initial.cpython-313.pyc index 164509902dbcbb2b3653d86786aaf75467ddda88..07606544bb496700eb8659d2935988919cff92e7 100644 GIT binary patch delta 20 acmX@9a#Dr+GcPX}0}yPQzilJ8oe%&+R|XIO delta 20 acmX@9a#Dr+GcPX}0}wpAvt=WYum5Z-s8P_}GY3+=9@A9N|@dlwK|sm6$D(>_zd{a4-!Q#u&|jbWx=mGiCqjp0B6UFn6;b0+~y;WYd)jKGAI_`=&>+UjJHhg z&)Y)B)>(kX|8kaK`J6MSa${?SV8!N*)a6N(3SpXQRddtaaz!AKk-7)g(o>X+YP^L4 z1OBdp3dE>%&Is{Ahf>QMw|Kdq`^SD`6V{gFMOK$Vj#_>KlGGyssi92|t(IZB6N8}R z0%ULzT)0GU8L}9H9IlYB!Zq4+cxYECjzAvQNWr~}p670@dI8!VjZv`Y#W<{E0yZ!S z*D(b}Ov5H>^wp_w25w-s#m8@&s^c|_4#ZNqTzR;?)!41T9`yX#+=iB+n@zP3pETP~ z4?EofOPQaX_j%?sC*41J7BGH$w1`TrF-&IQ-74*s?v!A=@t{_Y(+=%SZ`U|=`pt&$ zp0S+a@HYLf)_!;Y`K!T1=SBOVi`McC^u9EIcq6>fpvd}LI}KyrSCLOV$DTL(m*nj; Ysq|IaIhA%kJIvt}DoN1rocGG_JUkl9+(uN>5UXLOI6LUU;Z-V^(WDJXKcL z8|wKlM0uPMmNsNNi`hyKS5W0571a86xo=lI>Bi_fRw;)%%^^7upM9z;b-$jBHlTEb^Ppgw4;}lvCkR3-|})hJWU1Bm(*_=d&2%7$sKWe diff --git a/backend/myproject/myproject/__pycache__/urls.cpython-313.pyc b/backend/myproject/myproject/__pycache__/urls.cpython-313.pyc index e0389fc47d3f406c5a0865ae76efbda0548641a7..3d732e1c8f5a219e26bf08dc55dce95be0a0615f 100644 GIT binary patch delta 20 acmX@hdX|;@GcPX}0}yPQzilJ;AtnGoiv~^r delta 20 acmX@hdX|;@GcPX}0}$Bm-?)+c5EB4B{{{2_ diff --git a/backend/myproject/projects/migrations/__pycache__/0001_initial.cpython-313.pyc b/backend/myproject/projects/migrations/__pycache__/0001_initial.cpython-313.pyc index 39e51d2372e1f76acab5bf77c48fb3ea1339baff..36f6290238d6a91ba26f1718057ca1d9c70a9140 100644 GIT binary patch delta 20 acmaE*`AU=fGcPX}0}yPQzilJ;eGvdkH3t6x delta 20 acmaE*`AU=fGcPX}0}wpAvt=XqeGvdm=?7{6 diff --git a/backend/myproject/registrations/migrations/__pycache__/0001_initial.cpython-313.pyc b/backend/myproject/registrations/migrations/__pycache__/0001_initial.cpython-313.pyc index 18a81e7feb3d1661ea5d7107d38b2f41e1cb4e8e..3d57f418057a9f55a7d41f1fbc51f8fdcb5beff1 100644 GIT binary patch delta 20 acmew@^jnDgGcPX}0}yPQzilIT0Ve=RmIiqM delta 20 acmew@^jnDgGcPX}0}wpAvt=W90Ve=UN(STr From e62dddcf037490ff6bba26b7b62fb2211a307af4 Mon Sep 17 00:00:00 2001 From: yvaishalirao Date: Thu, 20 Feb 2025 23:11:22 +0530 Subject: [PATCH 51/63] adding viewmodel --- frontend/lib/models/login_view_model.dart | 33 +++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 frontend/lib/models/login_view_model.dart diff --git a/frontend/lib/models/login_view_model.dart b/frontend/lib/models/login_view_model.dart new file mode 100644 index 0000000..124fdd5 --- /dev/null +++ b/frontend/lib/models/login_view_model.dart @@ -0,0 +1,33 @@ +import 'package:flutter/material.dart'; +import '../api/login_api.dart'; +import '../models/user_model.dart'; + +class LoginViewModel extends ChangeNotifier { + final AuthService _authService = AuthService(); + + bool _isLoading = false; + bool get isLoading => _isLoading; + + UserModel? _user; + UserModel? get user => _user; + + String? _errorMessage; + String? get errorMessage => _errorMessage; + + Future login(String email, String password) async { + _isLoading = true; + _errorMessage = null; + notifyListeners(); + + final user = await _authService.login(email, password); + + if (user != null) { + _user = user; + } else { + _errorMessage = "Invalid email or password!"; + } + + _isLoading = false; + notifyListeners(); + } +} From dfbdc8c8f35030941d3a9d612ac3c3e8029f7598 Mon Sep 17 00:00:00 2001 From: Kartikjarali010 Date: Thu, 20 Feb 2025 23:32:29 +0530 Subject: [PATCH 52/63] admin feed update --- .../pages/admin_pages/admin_feed_page.dart | 135 +++++++++++++++--- 1 file changed, 112 insertions(+), 23 deletions(-) diff --git a/frontend/lib/pages/admin_pages/admin_feed_page.dart b/frontend/lib/pages/admin_pages/admin_feed_page.dart index d154422..94fc679 100644 --- a/frontend/lib/pages/admin_pages/admin_feed_page.dart +++ b/frontend/lib/pages/admin_pages/admin_feed_page.dart @@ -69,26 +69,6 @@ class _FeedScreenState extends State { ); } - void showPopup(BuildContext context) { - showDialog( - context: context, - builder: (BuildContext context) { - return AlertDialog( - title: Text("Popup Title"), - content: Text("This is a popup message."), - actions: [ - TextButton( - onPressed: () { - Navigator.of(context).pop(); // Close the popup - }, - child: Text("Close"), - ), - ], - ); - }, - ); - } - Widget _buildHeader() { return Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, @@ -102,8 +82,13 @@ class _FeedScreenState extends State { backgroundColor: Colors.purple, foregroundColor: Colors.white, ), - onPressed: () {}, - child: const Text("More details"), + onPressed: () { + Navigator.push( + context, + MaterialPageRoute(builder: (context) => const CreatePostPage()), + ); + }, + child: const Text("+ Create Post"), ), ], ); @@ -196,7 +181,12 @@ class _FeedScreenState extends State { ), ), FloatingActionButton( - onPressed: () {}, + onPressed: () { + Navigator.push( + context, + MaterialPageRoute(builder: (context) => EditPostPage()), + ); + }, backgroundColor: Colors.purple, mini: true, child: const Icon(Icons.edit, color: Colors.white, size: 18), @@ -208,3 +198,102 @@ class _FeedScreenState extends State { ); } } + +class CreatePostPage extends StatelessWidget { + const CreatePostPage({Key? key}) : super(key: key); + @override + Widget build(BuildContext context) { + return MaterialApp( + home: Scaffold( + body: Center( + child: Container( + width: MediaQuery.of(context).size.width * 0.8, // 80% of the screen width + height: MediaQuery.of(context).size.height * 0.5, // 50% of the screen height + decoration: BoxDecoration( + color: Colors.white, + border: Border.all(color: Colors.purple, width: 2), + borderRadius: BorderRadius.circular(12), + ), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + 'Create Post', + style: TextStyle(fontSize: 24, fontWeight: FontWeight.bold), + ), + Padding( + padding: const EdgeInsets.all(16.0), + child: TextField( + maxLines: 4, + decoration: InputDecoration( + border: OutlineInputBorder(), + hintText: 'Type your message', + ), + ), + ), + ElevatedButton( + style: ElevatedButton.styleFrom( + backgroundColor: Colors.purple), + onPressed: () { + }, + child: Text('Post', + style: TextStyle(color: Colors.white), + ), + ), + ], + ), + ), + ), + ), + ); + } +} + +class EditPostPage extends StatelessWidget { + @override + Widget build(BuildContext context) { + return MaterialApp( + home: Scaffold( + body: Center( + child: Container( + width: MediaQuery.of(context).size.width * 0.8, // 80% of the screen width + height: MediaQuery.of(context).size.height * 0.5, // 50% of the screen height + decoration: BoxDecoration( + color: Colors.white, + border: Border.all(color: Colors.purple, width: 2), + borderRadius: BorderRadius.circular(12), + ), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + 'Edit Post', + style: TextStyle(fontSize: 24, fontWeight: FontWeight.bold), + ), + Padding( + padding: const EdgeInsets.all(16.0), + child: TextField( + maxLines: 4, + decoration: InputDecoration( + border: OutlineInputBorder(), + hintText: 'Type your message', + ), + ), + ), + ElevatedButton( + style: ElevatedButton.styleFrom( + backgroundColor: Colors.purple), + onPressed: () { + }, + child: Text('Save', + style: TextStyle(color: Colors.white), + ), + ), + ], + ), + ), + ), + ), + ); + } +} \ No newline at end of file From 47a596223845fc348f5292ae92f574a46c30e7ac Mon Sep 17 00:00:00 2001 From: Kartikjarali010 Date: Fri, 21 Feb 2025 03:44:12 +0530 Subject: [PATCH 53/63] minor updates.....!!!! in terms of code efficiency --- .../pages/admin_pages/admin_feed_page.dart | 23 ++++--------------- .../lib/pages/user_pages/user_feed_page.dart | 14 ----------- 2 files changed, 4 insertions(+), 33 deletions(-) diff --git a/frontend/lib/pages/admin_pages/admin_feed_page.dart b/frontend/lib/pages/admin_pages/admin_feed_page.dart index 94fc679..4453a42 100644 --- a/frontend/lib/pages/admin_pages/admin_feed_page.dart +++ b/frontend/lib/pages/admin_pages/admin_feed_page.dart @@ -1,20 +1,5 @@ import 'package:flutter/material.dart'; -void main() { - runApp(const MyApp()); -} - -class MyApp extends StatelessWidget { - const MyApp({super.key}); - - @override - Widget build(BuildContext context) { - return const MaterialApp( - debugShowCheckedModeBanner: false, - home: AdminFeedPage(), - ); - } -} class AdminFeedPage extends StatefulWidget { const AdminFeedPage({super.key}); @@ -207,8 +192,8 @@ class CreatePostPage extends StatelessWidget { home: Scaffold( body: Center( child: Container( - width: MediaQuery.of(context).size.width * 0.8, // 80% of the screen width - height: MediaQuery.of(context).size.height * 0.5, // 50% of the screen height + width: MediaQuery.of(context).size.width * 0.8, + height: MediaQuery.of(context).size.height * 0.5, decoration: BoxDecoration( color: Colors.white, border: Border.all(color: Colors.purple, width: 2), @@ -256,8 +241,8 @@ class EditPostPage extends StatelessWidget { home: Scaffold( body: Center( child: Container( - width: MediaQuery.of(context).size.width * 0.8, // 80% of the screen width - height: MediaQuery.of(context).size.height * 0.5, // 50% of the screen height + width: MediaQuery.of(context).size.width * 0.8, + height: MediaQuery.of(context).size.height * 0.5, decoration: BoxDecoration( color: Colors.white, border: Border.all(color: Colors.purple, width: 2), diff --git a/frontend/lib/pages/user_pages/user_feed_page.dart b/frontend/lib/pages/user_pages/user_feed_page.dart index 32143d5..1024410 100644 --- a/frontend/lib/pages/user_pages/user_feed_page.dart +++ b/frontend/lib/pages/user_pages/user_feed_page.dart @@ -1,20 +1,6 @@ import 'package:flutter/material.dart'; -void main() { - runApp(const MyApp()); -} - -class MyApp extends StatelessWidget { - const MyApp({super.key}); - @override - Widget build(BuildContext context) { - return const MaterialApp( - debugShowCheckedModeBanner: false, - home: UserFeedPage(), - ); - } -} class UserFeedPage extends StatefulWidget { const UserFeedPage({super.key}); From 65886cb9aa0e10e5029a9e3a588075a8458bc571 Mon Sep 17 00:00:00 2001 From: bharathan06 Date: Sat, 22 Feb 2025 12:38:58 +0530 Subject: [PATCH 54/63] added formatted schema for frontend django docs --- backend/myproject/members/api.py | 4 ++-- backend/myproject/members/schemas.py | 14 +++++++++++++- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/backend/myproject/members/api.py b/backend/myproject/members/api.py index 84a8819..46bdb93 100644 --- a/backend/myproject/members/api.py +++ b/backend/myproject/members/api.py @@ -23,7 +23,7 @@ class UserAuthAPI(ControllerBase): #API call for user to login by giving username and password. @route.post("/login", url_name="User login", auth=None) - def login_view(self, request, payload: schemas.SignInSchema): + def login_view(self, request, payload: schemas.SignInSchema, response=schemas.LoginResponseSchema): user = authenticate(request, username=payload.email, password=payload.password) if user is not None: login(request, user) @@ -44,7 +44,7 @@ def logout_view(self, request): #API call made by user to view their profile. @route.get("/user") - def user_profile(self, request): + def user_profile(self, request, response=schemas.UserProfileResponseSchema): if request.user.is_authenticated: return { "username": request.user.username, diff --git a/backend/myproject/members/schemas.py b/backend/myproject/members/schemas.py index 9510f36..c055f00 100644 --- a/backend/myproject/members/schemas.py +++ b/backend/myproject/members/schemas.py @@ -19,4 +19,16 @@ class Meta: 'last_name', 'password', 'srn', - ] \ No newline at end of file + ] + +class LoginResponseSchema(ModelSchema): + message: str + role: str + csrf_token: str + + +class UserProfileResponseSchema(ModelSchema): + username: str + email: str + github: str + fname: str \ No newline at end of file From 4d5d5a4adcd8b652089427732d0717dd365b94d1 Mon Sep 17 00:00:00 2001 From: bharathan06 Date: Sat, 22 Feb 2025 14:27:38 +0530 Subject: [PATCH 55/63] extra config changes --- backend/myproject/.env | 2 +- .../__pycache__/api.cpython-313.pyc | Bin 4241 -> 4241 bytes .../__pycache__/models.cpython-313.pyc | Bin 1761 -> 1761 bytes .../__pycache__/schemas.cpython-313.pyc | Bin 1626 -> 1626 bytes .../0003_postmodel.cpython-313.pyc | Bin 1606 -> 1606 bytes .../members/__pycache__/api.cpython-313.pyc | Bin 5684 -> 5795 bytes .../__pycache__/schemas.cpython-313.pyc | Bin 1101 -> 1754 bytes backend/myproject/members/api.py | 8 ++++---- backend/myproject/members/schemas.py | 16 +++++++++++++--- .../__pycache__/settings.cpython-313.pyc | Bin 4581 -> 4641 bytes backend/myproject/myproject/settings.py | 4 ++-- 11 files changed, 20 insertions(+), 10 deletions(-) diff --git a/backend/myproject/.env b/backend/myproject/.env index 099de04..361fe0b 100644 --- a/backend/myproject/.env +++ b/backend/myproject/.env @@ -4,4 +4,4 @@ DB_PASSWORD=GOMxZBnMwtF5VPYk DB_HOST=aws-0-ap-south-1.pooler.supabase.com DB_PORT=6543 # Try 6543 if 5432 fails DATABASE_URL=postgres://postgres:GOMxZBnMwtF5VPYk@aws-0-ap-south-1.pooler.supabase.com:6543/postgres?sslmode=require -DJANGO_ENV=production +DJANGO_ENV=test diff --git a/backend/myproject/announcements/__pycache__/api.cpython-313.pyc b/backend/myproject/announcements/__pycache__/api.cpython-313.pyc index d5d83f50069464ee3c300fd1885d4ef3664231f1..b29434f42005421da04ebbadfc2e8f418d17f859 100644 GIT binary patch delta 20 acmbQJI8l-NGcPX}0}#X%@7&1UCIA38)&*ez delta 20 acmbQJI8l-NGcPX}0}$Lgylo?Qn*abk83rr> diff --git a/backend/myproject/announcements/__pycache__/models.cpython-313.pyc b/backend/myproject/announcements/__pycache__/models.cpython-313.pyc index e47194b9f732f598160992dcedb8921e92ab5fc3..a47c39e12c1a0e6bedc0561d6e9045e7911a3d20 100644 GIT binary patch delta 20 acmaFJ`;eFWGcPX}0}#X%@7&0JjST=nd)|=6a^v%mB=a3$XwI diff --git a/backend/myproject/announcements/migrations/__pycache__/0003_postmodel.cpython-313.pyc b/backend/myproject/announcements/migrations/__pycache__/0003_postmodel.cpython-313.pyc index 8dc68e8c62b2d476470282193a72d1a8afc259b1..a2df112be0b0bcca5755cf4734383ddee83ea55a 100644 GIT binary patch delta 20 acmX@cbBu@kGcPX}0}#X%@7&03%?1EGAO%bS delta 20 acmX@cbBu@kGcPX}0}!Na-L{e2nhgLw)diCP diff --git a/backend/myproject/members/__pycache__/api.cpython-313.pyc b/backend/myproject/members/__pycache__/api.cpython-313.pyc index c34b40e88ff8c0578686adfd2bf5de74272151a0..3257f690fa0bfe65095b2befec4b36d69c48f28e 100644 GIT binary patch delta 800 zcmY*WTWb?R6wd4|$!=D+xwNL*y0Nq+nl!~*TMQ!Fii%drB0>q&ZFjO+Nj5UOt55{N zhl-%0%pWM#ca`{3eDPJ$hx$^w;9n3+|A1$b8tY;BICJKF-?_}k!kePHtEzGY?A`MX z`|Ahw6DLR66>Rqr{lS&=s#H194eUoloDmEO-ZZN4BPdQwd`Xn6LZzSX@EKmNO7u0K z?l+Vf&PWVK&g^lC3MofeN=^mx@P5gz-(fJ}VfqDxH4x6`4jP)#2TI9m-)YWB4My$> zJ;kJvCMh~D6b|!YEFg_V*KFcYFay6H#t8QAw_FdmE#Vqca!`VZ3`XdNcoYq{x5Yd{ z$0#2iOCD$O6966upzEYa&qc4OlPug1kVj;w{VbY8k98Kx1B8<8`1N2Z6l<&~8HL!2 zI^Xj3M$5Lbr8_PeW69$H`6wwcj^=oatU2uZ&a&xai|8zc>5;PxrWmk4AtwQP-GCn^ z0uK|KkH1h@TPtD-TaMrU9xo#_N@Zmz`>z@bd5^exxl@!((+kQ}u{R=Ni|@80n7&U! z@qyV0uqQ!S?-)$~R#`)n?YTr;fDPT$9!gz0{ifwmvHeS1MJP>!`g~_=?(QZW(WEz0hqxs~YpIEWwSleN#Z5Tkr5!FN&Y@jC iBF!SYo?3>vq_l@Jy)t2}+-zAv1D_{^zRau(?Bx#%?7H0m delta 729 zcmYjNzi-n(6!zIZ$BE-MKb(XHg*v4~gd{}#NJB+L7eEvwkZPtXsB#nI7$r`1wgFX0 zNDO5{YIPDTRaqE8Ml5WsumlDq5BvjNT4iED;w}Zl4d1=@y?fvL?!B(PugYUtjxpr? z@IRQ3-^m}@okA4c#b4RFput5>6ENVi_yU)NVw+!y;q7S!-{W#HN-~9Jc`eoeRDoeM zDbF;HLIz1~9`A6<{2Zgj+rmoz5C7k#$&0Ke&>BAEPQs~Bzs5_s>5HtE&NC1AP%xn> zD2eaz)g&8;9_p{z`oIWy-E({XOa3O1RHBU_g*m(rXF`saXsEiVAex#2&A^E(+j7z3&;0 zKxlPx$Qnk{E~xt`9_7iZo+KU#NA37$q6n(~@#Gc&DZH1uej=_}roC)yot`n!QH@HU zClGL^;i5};A$@guvd${4%>0E637pRawwMEv5v1p<&sMj^-PYUg2wpy5qwp4Z)BIjp z8da9Y49&(IBed|B^x3IzFn7p`@Y;krhLcK%81)nfWWqUt*cuGGUf;NaHt?^^9#1R3 E0b|XijsO4v diff --git a/backend/myproject/members/__pycache__/schemas.cpython-313.pyc b/backend/myproject/members/__pycache__/schemas.cpython-313.pyc index dfcd7e8b99973f576ddeb48d08c383e7f7a25497..0480daf86029906b04b07f790ea8526f855ba501 100644 GIT binary patch literal 1754 zcmb7E&2Jl35P$34eO|A>(mJI{fi|ktRz4)HP<^1PkV+9!K7npHvC?X7KRcVQcg?&t zmCu$65Qw*^31b#tsNU|&D&_hfp4%icAI(p z2J`a1-N4v%Ag`qkN(;VmE_JljMQPFJ=hA|fmQY&0Aa%Qydi8{Y)eTkLPun8)T1TQ6 zo)|Nk`*a|)wD+|XfEI;MLn*Ws{@^pq7I~kY`IoWDM<{vCdUs#xD1#7&K{o6Q z8H911z7Xxhx9s4pqnsc}!k!2M!DTq+-B*FBO{gZQS z_fLl8bd_D(TELJ@7g~J2Opj5sh~e^O(rabuwL&EITII3*PQ9RNducaHo(b8u;fDBRqM2gUqaf6VsWYPyO>8g z1Ju)VFq=Q#jk2RbQ`sFYyMX@E+BY!-5TRId0}0knt2tZJQgyVexyzeME(i6ZvXdw| z4uLRMTo10CO|jD-w!;J;8Q`dcJQ4jE=y}pD*SRlEw)1%Q(tQFA^q|*UK0$J78iw(X xefW;u)PHMJ$1)l}eLQ7&O)Ev@znL<;rZ@5i|M~8e;Wb_5M&k|to8hGw;$JS4iKGAk delta 404 zcmcb`dzORmGcPX}0}zC5YD!J3^%y>n!RrD3AXtbiB2wOl4I1EJdH_R zqKFlw_ZDAJYI-h5m_4{dZ6!8J+B7P7d03rlI z1S^oZ#hRO+lA3diEiE%OC#ASZ1SA2{R3r)_#6U_|d{avji==@}zRByD#k0UNN+4;7 z>1H4kGcPX}0}yPQzb$?GL|#covyJM;OiaNVllL)+ZJx)(&C3|Sc@=*eBbVTW Rpy^Q)qb@VcPu3Fr4gfe>6A1tS diff --git a/backend/myproject/myproject/settings.py b/backend/myproject/myproject/settings.py index 10f9c89..71ea92a 100644 --- a/backend/myproject/myproject/settings.py +++ b/backend/myproject/myproject/settings.py @@ -33,7 +33,7 @@ # SECURITY WARNING: don't run with debug turned on in production! DEBUG = True -ALLOWED_HOSTS = os.getenv("ALLOWED_HOSTS", "127.0.0.1","localhost").split(",") +ALLOWED_HOSTS = os.getenv("ALLOWED_HOSTS", "127.0.0.1,localhost").split(",") @@ -124,7 +124,7 @@ } import dj_database_url -if 'DATABASE_URL' in os.environ: +if os.getenv('DJANGO_ENV') == 'production' and 'DATABASE_URL' in os.environ: DATABASES['default'] = dj_database_url.config(default=os.environ['DATABASE_URL']) # Password validation From f1c19464b9f720899db610aa31de730f1ac449f1 Mon Sep 17 00:00:00 2001 From: yvaishalirao Date: Sat, 22 Feb 2025 19:58:12 +0530 Subject: [PATCH 56/63] api 422 error --- frontend/lib/api/login_api.dart | 32 ++-- frontend/lib/main.dart | 19 ++- frontend/lib/models/login_view_model.dart | 36 +++-- frontend/lib/models/user_model.dart | 11 +- .../lib/pages/common_pages/home_page.dart | 9 +- .../lib/pages/common_pages/login_page.dart | 153 ++++++++++-------- 6 files changed, 140 insertions(+), 120 deletions(-) diff --git a/frontend/lib/api/login_api.dart b/frontend/lib/api/login_api.dart index 632f1ae..5d337c9 100644 --- a/frontend/lib/api/login_api.dart +++ b/frontend/lib/api/login_api.dart @@ -1,42 +1,34 @@ import 'dart:convert'; import 'package:http/http.dart' as http; -import 'package:shared_preferences/shared_preferences.dart'; import '../models/user_model.dart'; +// static const String baseUrl = "https://dev-track-app.onrender.com"; +// static const String loginEndpoint = "$baseUrl/user/login"; class AuthService { - //TODO: add base url - static const String baseUrl = ""; + final String baseUrl = "https://dev-track-app.onrender.com/api/user/login/"; - Future login(String email, String password) async { + Future login(String email, String password) async { try { final response = await http.post( Uri.parse(baseUrl), headers: {'Content-Type': 'application/json'}, - body: jsonEncode({"email": email, "password": password}), + body: jsonEncode({ + "payload": {"email": email, "password": password} + }), ); + print("Response Status Code: ${response.statusCode}"); + print("Response Body: ${response.body}"); if (response.statusCode == 200) { final data = jsonDecode(response.body); - final user = UserModel.fromJson(data); - - final prefs = await SharedPreferences.getInstance(); - await prefs.setString('user_email', user.email); - await prefs.setString('user_role', user.role); - - return user; + return UserModel.fromJson(data); } else { - return null; + throw Exception('Failed to login ${response.body}'); } } catch (e) { - print("Error: $e"); - return null; + throw Exception('Error: $e'); } } - - Future logout() async { - final prefs = await SharedPreferences.getInstance(); - await prefs.clear(); - } } diff --git a/frontend/lib/main.dart b/frontend/lib/main.dart index b8a282e..f95bc9f 100644 --- a/frontend/lib/main.dart +++ b/frontend/lib/main.dart @@ -1,9 +1,22 @@ +import 'package:dev_track_app/pages/common_pages/login_page.dart'; import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; -import 'package:dev_track_app/pages/home.dart'; +import 'models/login_view_model.dart'; + +// void main() { +// runApp(const MyApp()); +// } void main() { - runApp(const MyApp()); + runApp( + MultiProvider( + providers: [ + ChangeNotifierProvider(create: (_) => LoginViewModel()), + ], + child: const MyApp(), + ), + ); } class MyApp extends StatelessWidget { @@ -17,7 +30,7 @@ class MyApp extends StatelessWidget { primarySwatch: Colors.green, ), debugShowCheckedModeBanner: false, - home: const HomePag(), + home: LoginPage(), ); } } diff --git a/frontend/lib/models/login_view_model.dart b/frontend/lib/models/login_view_model.dart index 124fdd5..efaccd1 100644 --- a/frontend/lib/models/login_view_model.dart +++ b/frontend/lib/models/login_view_model.dart @@ -1,33 +1,37 @@ import 'package:flutter/material.dart'; +import 'package:shared_preferences/shared_preferences.dart'; + import '../api/login_api.dart'; import '../models/user_model.dart'; class LoginViewModel extends ChangeNotifier { final AuthService _authService = AuthService(); - bool _isLoading = false; - bool get isLoading => _isLoading; - - UserModel? _user; - UserModel? get user => _user; - - String? _errorMessage; - String? get errorMessage => _errorMessage; + bool isLoading = false; + String? errorMessage; + UserModel? user; Future login(String email, String password) async { - _isLoading = true; - _errorMessage = null; + isLoading = true; + errorMessage = null; notifyListeners(); - final user = await _authService.login(email, password); + try { + user = await _authService.login(email, password); - if (user != null) { - _user = user; - } else { - _errorMessage = "Invalid email or password!"; + final prefs = await SharedPreferences.getInstance(); + await prefs.setString('role', user!.role); + await prefs.setString('csrf_token', user!.csrfToken); + } catch (e) { + errorMessage = 'Login failed. Please check your credentials.'; } - _isLoading = false; + isLoading = false; notifyListeners(); } + + Future getUserRole() async { + final prefs = await SharedPreferences.getInstance(); + return prefs.getString('role'); + } } diff --git a/frontend/lib/models/user_model.dart b/frontend/lib/models/user_model.dart index 7a9501b..60be2b7 100644 --- a/frontend/lib/models/user_model.dart +++ b/frontend/lib/models/user_model.dart @@ -1,13 +1,16 @@ class UserModel { - final String email; - final String role; // 'admin' or 'user' + final String message; + final String role; + final String csrfToken; - UserModel({required this.email, required this.role}); + UserModel( + {required this.message, required this.role, required this.csrfToken}); factory UserModel.fromJson(Map json) { return UserModel( - email: json['email'], + message: json['message'], role: json['role'], + csrfToken: json['csrf_token'], ); } } diff --git a/frontend/lib/pages/common_pages/home_page.dart b/frontend/lib/pages/common_pages/home_page.dart index 37348c4..929cad3 100644 --- a/frontend/lib/pages/common_pages/home_page.dart +++ b/frontend/lib/pages/common_pages/home_page.dart @@ -1,12 +1,9 @@ - +import 'package:dev_track_app/pages/common_pages/login_page.dart'; +import 'package:dev_track_app/pages/common_pages/register_page.dart'; import 'package:dev_track_app/utils/bottom_nav_bar.dart'; import 'package:dev_track_app/utils/custom_button.dart'; import 'package:flutter/material.dart'; -import 'package:dev_track_app/pages/common_pages/login_page.dart'; -import 'package:dev_track_app/pages/common_pages/register_page.dart'; - - class HomePage extends StatelessWidget { const HomePage({super.key}); @@ -55,7 +52,7 @@ class HomePage extends StatelessWidget { Navigator.push( context, MaterialPageRoute( - builder: (context) => const LoginPage(), + builder: (context) => LoginPage(), ), ); }, diff --git a/frontend/lib/pages/common_pages/login_page.dart b/frontend/lib/pages/common_pages/login_page.dart index a8920ed..ee52a85 100644 --- a/frontend/lib/pages/common_pages/login_page.dart +++ b/frontend/lib/pages/common_pages/login_page.dart @@ -1,13 +1,22 @@ +import 'package:dev_track_app/pages/admin_pages/admin_dummy_home.dart'; import 'package:dev_track_app/pages/common_pages/register_page.dart'; +import 'package:dev_track_app/pages/user_pages/user_dummy_home.dart'; import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import '../../models/login_view_model.dart'; class LoginPage extends StatelessWidget { - const LoginPage({Key? key}) : super(key: key); + final TextEditingController emailController = TextEditingController(); + final TextEditingController passwordController = TextEditingController(); + + LoginPage({Key? key}) : super(key: key); @override Widget build(BuildContext context) { + final loginViewModel = Provider.of(context); + return Scaffold( backgroundColor: Colors.white, body: SingleChildScrollView( @@ -19,15 +28,14 @@ class LoginPage extends StatelessWidget { children: [ Container( height: 150, - decoration: BoxDecoration( + decoration: const BoxDecoration( color: Color(0xFF5e00b0), shape: BoxShape.rectangle, - borderRadius: BorderRadius.vertical( - top: Radius.circular(10), - ), + borderRadius: + BorderRadius.vertical(top: Radius.circular(10)), ), ), - Positioned( + const Positioned( top: 48, child: CircleAvatar( radius: 50, @@ -42,108 +50,111 @@ class LoginPage extends StatelessWidget { ), ], ), - SizedBox(height: 60), - Text( + const SizedBox(height: 60), + const Text( 'Welcome Back', - style: TextStyle( - fontSize: 32, - fontWeight: FontWeight.bold, - ), + style: TextStyle(fontSize: 32, fontWeight: FontWeight.bold), ), - SizedBox(height: 10), - Padding( - padding: const EdgeInsets.fromLTRB(0, 0, 0, 0), - child: Text( - 'Sign in to your account', - textAlign: TextAlign.left, - style: TextStyle( - fontSize: 16, - color: Colors.black54, - ), - ), + const SizedBox(height: 10), + const Text( + 'Sign in to your account', + style: TextStyle(fontSize: 16, color: Colors.black54), ), - SizedBox(height: 0), + const SizedBox(height: 20), Padding( - padding: const EdgeInsets.fromLTRB(25, 10, 25, 10), + padding: const EdgeInsets.symmetric(horizontal: 25), child: TextField( - decoration: InputDecoration( + controller: emailController, + decoration: const InputDecoration( prefixIcon: Icon(Icons.person), - labelText: 'Username', - // border: OutlineInputBorder(), + labelText: 'Email', ), ), ), - SizedBox(height: 0), Padding( - padding: const EdgeInsets.fromLTRB(25, 0, 25, 25), // Adjust padding + padding: + const EdgeInsets.symmetric(horizontal: 25, vertical: 10), child: TextField( + controller: passwordController, obscureText: true, - decoration: InputDecoration( + decoration: const InputDecoration( prefixIcon: Icon(Icons.lock), labelText: 'Password', - // border: OutlineInputBorder(), - suffix: GestureDetector( - onTap: () { - // logic.... - }, - child: Text( - 'Forgot ?', - style: TextStyle(color: Colors.black54), - ), - ), + suffix: Text( + 'Forgot ?', + style: TextStyle(color: Colors.black54), + ), ), ), ), - SizedBox(height: 0), + if (loginViewModel.errorMessage != null) + Padding( + padding: const EdgeInsets.symmetric(vertical: 10), + child: Text( + loginViewModel.errorMessage!, + style: const TextStyle(color: Colors.red), + ), + ), Padding( - padding: const EdgeInsets.fromLTRB(25, 10, 25, 10), + padding: const EdgeInsets.symmetric(horizontal: 25), child: ElevatedButton( - onPressed: () { - // Add your login logic here - }, + onPressed: loginViewModel.isLoading + ? null + : () async { + await loginViewModel.login( + emailController.text, + passwordController.text, + ); + + if (loginViewModel.user != null) { + Navigator.pushReplacement( + context, + MaterialPageRoute( + builder: (context) => + loginViewModel.user!.role == 'admin' + ? AdminDummyHome() + : UserDummyHome(), + ), + ); + } + }, style: ElevatedButton.styleFrom( - backgroundColor: Color(0xFF5e00b0), - padding: EdgeInsets.symmetric(vertical: 10), - textStyle: TextStyle(fontSize: 18), - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(10), - ), - ), - child: Center( - child: Text('login', - style: TextStyle(color: Colors.white)), + backgroundColor: const Color(0xFF5e00b0), + padding: const EdgeInsets.symmetric(vertical: 10), ), + child: loginViewModel.isLoading + ? const CircularProgressIndicator(color: Colors.white) + : const Text('Login', + style: TextStyle(color: Colors.white)), ), ), - SizedBox(height: 15), + const SizedBox(height: 15), Text.rich( TextSpan( text: "Don't have an account? ", children: [ TextSpan( text: 'Create', - style: TextStyle( + style: const TextStyle( color: Color(0xFF5e00b0), decoration: TextDecoration.underline, ), recognizer: TapGestureRecognizer() - ..onTap = () { - // write on tap logiv here..... - // Example given below.... - Navigator.push( + ..onTap = () { + Navigator.push( context, MaterialPageRoute( - builder: (context) => const RegisterPage()),); - } + builder: (context) => const RegisterPage()), + ); + }, ), ], ), ), - SizedBox(height: 20), - const Text('OR', - style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold) - ), - Padding( + const SizedBox(height: 20), + const Text('OR', + style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold)), + Padding( padding: const EdgeInsets.fromLTRB(25, 15, 25, 10), child: ElevatedButton( onPressed: () { @@ -153,14 +164,14 @@ class LoginPage extends StatelessWidget { backgroundColor: Colors.white, side: BorderSide(color: Color(0xFF5e00b0)), padding: EdgeInsets.symmetric(vertical: 10), - textStyle: TextStyle(fontSize: 18,color: Colors.grey), + textStyle: TextStyle(fontSize: 18, color: Colors.grey), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(10), ), ), child: Center( child: Text('Browse as a Guest', - style: TextStyle(color: Colors.black)), + style: TextStyle(color: Colors.black)), ), ), ), From 93129adfc4e14237c5b7171b6fd1f5507a4806fb Mon Sep 17 00:00:00 2001 From: yvaishalirao Date: Sat, 22 Feb 2025 20:28:39 +0530 Subject: [PATCH 57/63] working login auth --- frontend/lib/api/login_api.dart | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/frontend/lib/api/login_api.dart b/frontend/lib/api/login_api.dart index 5d337c9..a718c68 100644 --- a/frontend/lib/api/login_api.dart +++ b/frontend/lib/api/login_api.dart @@ -7,16 +7,14 @@ import '../models/user_model.dart'; // static const String loginEndpoint = "$baseUrl/user/login"; class AuthService { - final String baseUrl = "https://dev-track-app.onrender.com/api/user/login/"; + final String baseUrl = "https://dev-track-app.onrender.com/api/user/login"; Future login(String email, String password) async { try { final response = await http.post( Uri.parse(baseUrl), headers: {'Content-Type': 'application/json'}, - body: jsonEncode({ - "payload": {"email": email, "password": password} - }), + body: jsonEncode({"email": email, "password": password}), ); print("Response Status Code: ${response.statusCode}"); print("Response Body: ${response.body}"); From ed22e46efc434cdb08de3dbc49f24cfe04a5e53b Mon Sep 17 00:00:00 2001 From: bharathan06 Date: Mon, 24 Feb 2025 21:33:46 +0530 Subject: [PATCH 58/63] announcements api and services file split, tested and works well --- .../__pycache__/api.cpython-313.pyc | Bin 4241 -> 3344 bytes .../__pycache__/services.cpython-313.pyc | Bin 0 -> 2550 bytes backend/myproject/announcements/api.py | 57 ++++-------------- backend/myproject/announcements/services.py | 42 +++++++++++++ backend/myproject/db.sqlite3 | Bin 303104 -> 307200 bytes .../members/__pycache__/api.cpython-313.pyc | Bin 5795 -> 5795 bytes .../__pycache__/schemas.cpython-313.pyc | Bin 1754 -> 1754 bytes .../__pycache__/settings.cpython-313.pyc | Bin 4641 -> 4754 bytes backend/myproject/myproject/settings.py | 4 +- 9 files changed, 58 insertions(+), 45 deletions(-) create mode 100644 backend/myproject/announcements/__pycache__/services.cpython-313.pyc diff --git a/backend/myproject/announcements/__pycache__/api.cpython-313.pyc b/backend/myproject/announcements/__pycache__/api.cpython-313.pyc index b29434f42005421da04ebbadfc2e8f418d17f859..421ff8e01f0fe7116cebbbe8dff0e0651983ddb1 100644 GIT binary patch literal 3344 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 KJV3zwJpKWm)C@!b literal 0 HcmV?d00001 diff --git a/backend/myproject/announcements/api.py b/backend/myproject/announcements/api.py index 45b3e52..2261c8b 100644 --- a/backend/myproject/announcements/api.py +++ b/backend/myproject/announcements/api.py @@ -1,32 +1,24 @@ from django.shortcuts import get_object_or_404 -from django.http import JsonResponse -from ninja_extra import NinjaExtraAPI, ControllerBase, api_controller, route from django.middleware.csrf import get_token +from ninja_extra import NinjaExtraAPI, ControllerBase, api_controller, route from .models import PostModel from . import schemas from .schemas import PostSchema +from .services import AnnouncementService @api_controller("/posts", tags="Posts") class PostAPIController(ControllerBase): - - def _check_admin(self, request): - # Check if the user is authenticated and has an admin role. - if not request.user.is_authenticated or request.user.role != 'admin': - return JsonResponse({"detail": "Admin privileges required"}, status=403) - return None + def __init__(self) -> None: + self.post_service = AnnouncementService() # API endpoint to create a new post (admin only). @route.post("/add", url_name="Add Post") def create_post(self, request, payload: schemas.PostCreateSchema): - admin_check = self._check_admin(request) + admin_check = self.post_service._check_admin(request) if admin_check: return admin_check - - post = PostModel.objects.create( - title=payload.title, - description=payload.description, - created_by=request.user - ) + + post = self.post_service.create_post(request, payload) return { "message": "Post created successfully", "post_id": post.id, @@ -36,47 +28,24 @@ def create_post(self, request, payload: schemas.PostCreateSchema): # API endpoint to list all posts. @route.get("/", url_name="List Posts") def list_posts(self, request): - posts = PostModel.objects.all().order_by("created_at") - - result = [ - { - "id": post.id, - "title": post.title, - "description": post.description, - "created_at": post.created_at.isoformat(), - "created_by": post.created_by.id, - } - for post in posts - ] - return result - + return self.post_service.list_posts() @route.put("/{post_id}", url_name="Update Post", response=PostSchema) def update_post(self, request, post_id: int, payload: schemas.PostUpdateSchema): - admin_check = self._check_admin(request) - if admin_check: - return admin_check - + self.post_service._check_admin(request) post = get_object_or_404(PostModel, id=post_id) - if payload.title is not None: - post.title = payload.title - if payload.description is not None: - post.description = payload.description - post.save() - # Convert to schema: + post = self.post_service.update_post(post, payload) return schemas.PostSchema.from_orm(post) - # API endpoint to delete a post (admin only). @route.delete("/{post_id}", url_name="Delete Post") def delete_post(self, request, post_id: int): - admin_check = self._check_admin(request) + admin_check = self.post_service._check_admin(request) if admin_check: return admin_check - + post = get_object_or_404(PostModel, id=post_id) - - post.delete() + self.post_service.delete_post(post) return {"message": "Post deleted successfully"} # Register the PostAPIController with your NinjaExtraAPI instance. diff --git a/backend/myproject/announcements/services.py b/backend/myproject/announcements/services.py index e69de29..bc3d35e 100644 --- a/backend/myproject/announcements/services.py +++ b/backend/myproject/announcements/services.py @@ -0,0 +1,42 @@ +from django.shortcuts import get_object_or_404 +from .models import PostModel +from ninja.errors import HttpError + +class AnnouncementService: + def _check_admin(self, request): + if request.user.role != "admin": + raise HttpError(401, "Unauthorized: Admin access required.") + return None + + def create_post(self, request, payload): + post = PostModel.objects.create( + title=payload.title, + description=payload.description, + created_by=request.user + ) + return post + + def list_posts(self): + posts = PostModel.objects.all().order_by("created_at") + result = [ + { + "id": post.id, + "title": post.title, + "description": post.description, + "created_at": post.created_at.isoformat(), + "created_by": post.created_by.id, + } + for post in posts + ] + return result + + def update_post(self, post, payload): + if payload.title is not None: + post.title = payload.title + if payload.description is not None: + post.description = payload.description + post.save() + return post + + def delete_post(self, post): + post.delete() diff --git a/backend/myproject/db.sqlite3 b/backend/myproject/db.sqlite3 index c830e0054396bc4b607e3440ba8413a8e06a22c5..014905f80b852042033b973a0ef1ff5d2c43741d 100644 GIT binary patch delta 1927 zcmah~S!@$W7~b)$W3Q9!#*`}u#0f_T)XA>BK2rkgD~34EWjh=dW}RIpK6dTco5Xe> zk{}RoKw=@kAt+U!P?gqdEwxo!A^JdHN>Te%A%WCB^in0%he|!@Iw?6QQCB;o-G9EB z|Np-KpPBj3w#`4@cCA?(K@g;0ZqJ`ni?13%0w8cB!2S8)-VfPWOOU!CymRj74;2eGn_m=BOJKoZacC>;` ztF4jImbu=W0J^X%Mb+^IHTD(uA$A+PB5U!tdTcuiI)Qd3#?P*MckM)h9%yA9c!^&( zJ6Fx)ldL$g!R&Yi1sy=ka@;zUDSv;WwFYYOzM^WVO@a5xl=t8*OQ^P;;`Pu1Z!{RY$jy>myDXsJHx=t_)q3U?bSE3Vu<9>bk48f5Atp zWpsd%(H+!gZK_aNtPP8n_kZ{Lp>3oS@t(q^bE)q!6WD+6XbNy)D~U@}`w zmlp{jH$`QUfZ5|s8f6}-bJkwge2V?19#CDc`MTzSGGF(!?rCN35c~q77y=e6Kaaxg zzBiW}mgdzc@eR^b)}H@_u+X3eY3yV$S&vTnbH^?Q%k%7HwHY?=0+X@23#>MS)oQ9Q zgXL%4?=7RGMo}*p;@kD!daInP!}W6uG^!j}m}SK2bR?NbTQ8i2%7Ke+hD&5vzQ9_t zblwz;Tceh#d{nY>NkNF_%n6R};!oy6@gV7&NHD>XXxNu=4+(>TcwAx%&VEli<@S5} zOj*jCqQ{)6oTo2bAUz(-n9XL(6^!PQ;IKaIJHgGxrZY_Lj63hl7-#dL8A%d+iM%8v zvk`M7lAfNOiuaus#{7wZmy+V%GlDnl@X($iGZ~noLy08gb@ws;LM$##jP@tv&R8&% z4Z6jIE0tzWj(Bn@uQxb39U0FibEhT$nW@B(s25qY;LSy*t$IE`7n+r6DB3QmrPZDWp^ynfi{aJxC9ostAra@ffXnU7HY(Qs~f%tsH#CS4wSB<>mQ>vs(d z)4BBNxF;0N1^mNC>uM^DdWzIhYqemZO|U0J=b>H;UeET)J7S^vV~F fN6zc7MCI946f|h6HxJT)AjF?5R+an*A%^_}yFg5J delta 546 zcmZp8Ak=U`Xo9q$KLZ1U7Z7^_F(VKMP1G@F^xv4Ugr8ZQ%YHJufc|Dh1x~Kb_EJY# z1=#r0nE7|}Pv(EgzlJ}J|I%i`gdqOOY5J~=0+ZM1t1^mDzND|s?~qr_1vE*3FNJ|G zg>T_zJ_9Sh$pHd#n^Wu-Ffu!EKAp_&(74%AAeM9UQ%`v|W&ytB$?O4&KzpqDHYdj| zG-P(*Yn{wKp%EzZmv?jPyn07w2Nspd><>V?<}hzoc@m=`WN4~jXkle+U}b2iXJ}+< zYGAT`5)b2BCWM5Ep`L+}v8jb|`$T?5AZFS=k)OHPL5hc2l7YvWyPa!4=NArN_Ni=F z*i>07nO`tVZkG#SKE=%3%x61&eF}@$cGD2%)83mJSOm7STwwg8zi5NOq74F*8dx|O z`Ia&8E#sR6bYUBxNTUf8t8ZhuV^&pVqGfTeS(c?i#r9=-EOCq+jQraf__ylADs7MwmSokgA%%-p^+o#hPUcDpo|Ly`i(Xo3L`Aj1vllK1@E|M#;n G3IG6^*_)aG diff --git a/backend/myproject/members/__pycache__/api.cpython-313.pyc b/backend/myproject/members/__pycache__/api.cpython-313.pyc index 3257f690fa0bfe65095b2befec4b36d69c48f28e..4a1b36733c83dfbed6b352593242af7fda0eeb0f 100644 GIT binary patch delta 20 acmZ3iyI7a|GcPX}0}%L6+q02-h8O@m;swqC delta 20 acmZ3iyI7a|GcPX}0}!n5*}0K>h8O@pHwGa9 diff --git a/backend/myproject/members/__pycache__/schemas.cpython-313.pyc b/backend/myproject/members/__pycache__/schemas.cpython-313.pyc index 0480daf86029906b04b07f790ea8526f855ba501..e7921007375d7c453647bbe41cf0354ad1fbf28b 100644 GIT binary patch delta 20 acmcb`dyAL*GcPX}0}!kU*|U-RJR1N(=>|Rk delta 20 acmcb`dyAL*GcPX}0}xpC?A*wGo(%v%3o6Kqwa8*E*q2Q*zj*rvz;NE-sp zH43&ZGEQgGv`f@uWMJTO**ulGlY{3LXL4~-T1kF(YM$F1Cm#@uWk~?41^^gMRWASl delta 253 zcmbQFx=@AhGcPX}0}vQa+?jq@Y$BfoW70$-d69OoMUhUhWsz>MRgoT$)(4tv5Nus!n9ihW zlc>kYz`*5_m6(^FuTY#?QnGm^b3KQ6m1ssuNr9EVeolUJVopYWafy|Mfq}u~0-g|F zw@ijoA%72Ol92M%U8 Date: Mon, 24 Feb 2025 21:44:13 +0530 Subject: [PATCH 59/63] cleaned up the members directory to seperate into api and services.py files --- backend/myproject/members/api.py | 109 ++++++-------------------- backend/myproject/members/services.py | 56 +++++++++++++ 2 files changed, 81 insertions(+), 84 deletions(-) diff --git a/backend/myproject/members/api.py b/backend/myproject/members/api.py index b95615f..38a841b 100644 --- a/backend/myproject/members/api.py +++ b/backend/myproject/members/api.py @@ -1,115 +1,56 @@ -import os -from django.contrib.auth import authenticate, logout, login -from .models import CustomUser as User -from django.core.management import call_command -from . import schemas from django.http import JsonResponse +from ninja_extra import NinjaExtraAPI, ControllerBase, api_controller, route +from ninja import UploadedFile from django.shortcuts import get_object_or_404 -from ninja_extra import NinjaExtraAPI, ControllerBase, api_controller, route from django.middleware.csrf import get_token -from ninja import UploadedFile -from django.core.files.base import ContentFile -from django.core.files.storage import default_storage - - +from . import schemas +from .models import CustomUser as User +from .services import UserAuthService from projects.api import ProjectsAPI -from announcements.api import PostAPIController - - +from announcements.api import PostAPIController @api_controller("/user", tags="User Authentication") class UserAuthAPI(ControllerBase): + def __init__(self) -> None: + self.auth_service = UserAuthService() - #API call for user to login by giving username and password. + # API call for user to login by giving username and password. @route.post("/login", url_name="User login", auth=None, response=schemas.LoginResponseSchema) def login_view(self, request, payload: schemas.SignInSchema): - user = authenticate(request, username=payload.email, password=payload.password) - if user is not None: - login(request, user) - return { - "message": "Login successful", - "role": user.role, - "csrf_token": get_token(request) # Provide CSRF token for frontend - } + result = self.auth_service.login_user(request, payload.email, payload.password) + if result: + return result return JsonResponse({"detail": "Invalid credentials"}, status=401) - - #API call made by a user to logout. + # API call made by a user to logout. @route.post("/logout") def logout_view(self, request): - logout(request) - return {"message": "Logged out successfully"} - + return self.auth_service.logout_user(request) - #API call made by user to view their profile. + # API call made by user to view their profile. @route.get("/user", response=schemas.UserProfileResponseSchema) def user_profile(self, request): - if request.user.is_authenticated: - return { - "username": request.user.username, - "email": request.user.email, - "github": request.user.github, - "fname" : request.user.fname, - } + result = self.auth_service.get_user_profile(request) + if result: + return result return JsonResponse({"detail": "Not logged in"}, status=401) - - @route.put("/edit",response=schemas.RegisterSchema) - def edit_profile(self, request, payload : schemas.RegisterSchema): + # API call made by user to edit their profile. + @route.put("/edit", response=schemas.RegisterSchema) + def edit_profile(self, request, payload: schemas.RegisterSchema): if not request.user.is_authenticated: return JsonResponse({"detail": "Authentication required"}, status=401) - - user = get_object_or_404(User, srn=request.user.srn) - for attr, value in payload.dict().items(): - setattr(user, attr, value) - user.save() + user = self.auth_service.edit_user_profile(request, payload) return user - + # API call to import users using the management command. @route.post("/import-users/", url_name="Import Users") def import_users(self, request, file: UploadedFile): - """API endpoint to import users using the management command""" - file_path = default_storage.save(f"temp/{file.name}", ContentFile(file.read())) - - try: - # Call the management command - call_command("import_users", default_storage.path(file_path)) - except Exception as e: - return {"error": str(e)} - finally: - # Ensure file deletion after processing - if os.path.exists(default_storage.path(file_path)): - os.remove(default_storage.path(file_path)) - - return {"message": "User import initiated successfully!"} - - - + return self.auth_service.import_users_from_file(file) +# Register controllers with the NinjaExtraAPI instance. api = NinjaExtraAPI(csrf=False) api.register_controllers(UserAuthAPI) api.register_controllers(PostAPIController) api.register_controllers(ProjectsAPI) - - - - - - - - - - - - - - - - - - - - - - diff --git a/backend/myproject/members/services.py b/backend/myproject/members/services.py index e69de29..15290e4 100644 --- a/backend/myproject/members/services.py +++ b/backend/myproject/members/services.py @@ -0,0 +1,56 @@ +import os +from django.contrib.auth import authenticate, logout, login +from django.core.management import call_command +from django.shortcuts import get_object_or_404 +from django.http import JsonResponse +from django.middleware.csrf import get_token +from django.core.files.base import ContentFile +from django.core.files.storage import default_storage +from .models import CustomUser as User + +class UserAuthService: + def login_user(self, request, email, password): + user = authenticate(request, username=email, password=password) + if user is not None: + login(request, user) + return { + "message": "Login successful", + "role": user.role, + "csrf_token": get_token(request) + } + return None # caller can then return an error response + + def logout_user(self, request): + logout(request) + return {"message": "Logged out successfully"} + + def get_user_profile(self, request): + if request.user.is_authenticated: + return { + "username": request.user.username, + "email": request.user.email, + "github": request.user.github, + "first_name": request.user.first_name, + } + return None + + def edit_user_profile(self, request, payload): + if not request.user.is_authenticated: + return None + user = get_object_or_404(User, srn=request.user.srn) + for attr, value in payload.dict().items(): + setattr(user, attr, value) + user.save() + return user + + def import_users_from_file(self, file): + file_path = default_storage.save(f"temp/{file.name}", ContentFile(file.read())) + try: + call_command("import_users", default_storage.path(file_path)) + except Exception as e: + return {"error": str(e)} + finally: + full_path = default_storage.path(file_path) + if os.path.exists(full_path): + os.remove(full_path) + return {"message": "User import initiated successfully!"} From a24c76e3e1ba6e71d1c957955484feb737162de9 Mon Sep 17 00:00:00 2001 From: Kartikjarali010 Date: Mon, 24 Feb 2025 23:43:41 +0530 Subject: [PATCH 60/63] new page general-feed created and routing done --- .../pages/common_pages/general_feed_page.dart | 237 ++++++++++++++++++ .../lib/pages/common_pages/login_page.dart | 7 +- 2 files changed, 243 insertions(+), 1 deletion(-) create mode 100644 frontend/lib/pages/common_pages/general_feed_page.dart diff --git a/frontend/lib/pages/common_pages/general_feed_page.dart b/frontend/lib/pages/common_pages/general_feed_page.dart new file mode 100644 index 0000000..2be75c3 --- /dev/null +++ b/frontend/lib/pages/common_pages/general_feed_page.dart @@ -0,0 +1,237 @@ +import 'package:dev_track_app/pages/common_pages/login_page.dart'; +import 'package:flutter/material.dart'; + + + +class GeneralFeedPage extends StatefulWidget { + const GeneralFeedPage({super.key}); + + @override + State createState() => _GeneralFeedPageState(); +} + +class Post { + final String details; + + Post({required this.details}); +} + + + +class _GeneralFeedPageState extends State { + final List posts = [ + Post(details: "Post 1 details"), + Post(details: 'Post 2 details'), + Post(details: 'Post 3 details'), + ]; + + + @override + Widget build(BuildContext context) { + return SafeArea( + child: Scaffold( + backgroundColor: Colors.white, + body: Padding( + padding: const EdgeInsets.symmetric(horizontal: 16), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + _buildTopBar(), + const SizedBox(height: 10), + _buildHeader(), + const SizedBox(height: 10), + _buildTabBar(), + const SizedBox(height: 10), + Expanded( + child: ListView.builder( + itemCount: posts.length, + itemBuilder: (context, index) => PostCard( + post: posts[index], + onViewMore: () => showPopup(context, posts[index]), + ), + ), + ), + ], + ), + ), + ), + ); + } + + Widget _buildTopBar() { + return Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + IconButton( + icon: const Icon(Icons.arrow_back, color: Colors.black), + onPressed: () { + Navigator.pop(context); }, + ), + Padding( + padding: const EdgeInsets.fromLTRB(25, 15, 25, 10), + child: ElevatedButton( + onPressed: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => LoginPage()), + ); + }, + style: ElevatedButton.styleFrom( + backgroundColor: Colors.purple, + side: BorderSide(color: Color.fromARGB(255, 253, 253, 253)), + padding: EdgeInsets.symmetric(vertical: 10), + textStyle: TextStyle(fontSize: 18, color: Colors.grey), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(10), + ), + ), + child: Center( + child: Text('login', + style: TextStyle(color: Colors.white)), + ), + ), + ), + ], + ); + } + + void showPopup(BuildContext context, Post post) { + showDialog( + context: context, + builder: (BuildContext context) { + return AlertDialog( + title: const Text("Post Details"), + content: Text(post.details), // fetchhh post details..... + actions: [ + TextButton( + onPressed: () => Navigator.of(context).pop(), + child: const Text("Close"), + ), + ], + ); + }, + ); + } + + Widget _buildHeader() { + return const Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text("WELCOME BACK"), + Text( + "Bharathan", + style: TextStyle(fontSize: 28, fontWeight: FontWeight.bold), + ), + ], + ); + } + + Widget _buildTabBar() { + return Container( + decoration: BoxDecoration( + color: Colors.grey[200], + borderRadius: BorderRadius.circular(8), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + _buildTab("Primary", isSelected: true), + _buildTab("Secondary"), + _buildTab("Ternary"), + ], + ), + ); + } + + Widget _buildTab(String title, {bool isSelected = false}) { + return Padding( + padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 16), + child: Text( + title, + style: TextStyle( + fontSize: 16, + fontWeight: isSelected ? FontWeight.bold : FontWeight.normal, + color: isSelected ? Colors.purple : Colors.black, + ), + ), + ); + } +} + + + +class PostCard extends StatelessWidget { + final Post post; + final VoidCallback onViewMore; + + const PostCard({super.key, required this.post, required this.onViewMore}); + + @override + Widget build(BuildContext context) { + return Container( + margin: const EdgeInsets.symmetric(vertical: 8), + padding: const EdgeInsets.all(16), + decoration: BoxDecoration( + color: Colors.grey[100], + borderRadius: BorderRadius.circular(12), + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + const CircleAvatar( + backgroundColor: Colors.grey, + radius: 20, + ), + const SizedBox(width: 10), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: const [ + Text( + "Name", + style: TextStyle(fontWeight: FontWeight.bold, fontSize: 16), + ), + Text( + "2 Days ago • DD/month Time", + style: TextStyle(fontSize: 12, color: Colors.grey), + ), + ], + ), + ], + ), + const SizedBox(height: 10), + Text( + post.details, + style: const TextStyle(fontSize: 14), + ), + const SizedBox(height: 10), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Row( + children: List.generate( + 3, + (index) => Container( + margin: const EdgeInsets.only(right: 8), + height: 10, + width: 30, + color: Colors.grey[300], + ), + ), + ), + FloatingActionButton( + tooltip: 'View More', + onPressed: onViewMore, + backgroundColor: Colors.purple, + mini: true, + child: const Icon(Icons.arrow_forward, color: Colors.white, size: 18), + ), + ], + ), + ], + ), + ); + } +} diff --git a/frontend/lib/pages/common_pages/login_page.dart b/frontend/lib/pages/common_pages/login_page.dart index ee52a85..6564d65 100644 --- a/frontend/lib/pages/common_pages/login_page.dart +++ b/frontend/lib/pages/common_pages/login_page.dart @@ -1,4 +1,5 @@ import 'package:dev_track_app/pages/admin_pages/admin_dummy_home.dart'; +import 'package:dev_track_app/pages/common_pages/general_feed_page.dart'; import 'package:dev_track_app/pages/common_pages/register_page.dart'; import 'package:dev_track_app/pages/user_pages/user_dummy_home.dart'; import 'package:flutter/gestures.dart'; @@ -158,7 +159,11 @@ class LoginPage extends StatelessWidget { padding: const EdgeInsets.fromLTRB(25, 15, 25, 10), child: ElevatedButton( onPressed: () { - // Add your login logic here + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => const GeneralFeedPage()), + ); }, style: ElevatedButton.styleFrom( backgroundColor: Colors.white, From 7909f32e80f9ad756dd778846bf455fd21974634 Mon Sep 17 00:00:00 2001 From: bharathan06 Date: Wed, 26 Feb 2025 20:18:17 +0530 Subject: [PATCH 61/63] enroll end pointis done and tested, ready for integ --- backend/myproject/db.sqlite3 | Bin 307200 -> 307200 bytes .../members/__pycache__/api.cpython-313.pyc | Bin 5795 -> 3982 bytes .../__pycache__/services.cpython-313.pyc | Bin 0 -> 4046 bytes backend/myproject/members/api.py | 2 + .../projects/__pycache__/api.cpython-313.pyc | Bin 4359 -> 3275 bytes .../__pycache__/schemas.cpython-313.pyc | Bin 1479 -> 1861 bytes .../__pycache__/services.cpython-313.pyc | Bin 3007 -> 3783 bytes backend/myproject/projects/api.py | 52 ++++++++++-------- backend/myproject/projects/schemas.py | 9 ++- backend/myproject/projects/services.py | 16 +++++- .../__pycache__/api.cpython-313.pyc | Bin 0 -> 1385 bytes .../__pycache__/schemas.cpython-313.pyc | Bin 0 -> 602 bytes .../__pycache__/services.cpython-313.pyc | Bin 0 -> 2076 bytes backend/myproject/registrations/api.py | 15 +++++ backend/myproject/registrations/schemas.py | 6 ++ backend/myproject/registrations/services.py | 44 +++++++++++++++ 16 files changed, 119 insertions(+), 25 deletions(-) create mode 100644 backend/myproject/members/__pycache__/services.cpython-313.pyc create mode 100644 backend/myproject/registrations/__pycache__/api.cpython-313.pyc create mode 100644 backend/myproject/registrations/__pycache__/schemas.cpython-313.pyc create mode 100644 backend/myproject/registrations/__pycache__/services.cpython-313.pyc create mode 100644 backend/myproject/registrations/schemas.py diff --git a/backend/myproject/db.sqlite3 b/backend/myproject/db.sqlite3 index 014905f80b852042033b973a0ef1ff5d2c43741d..61ada480b3ad85e77c349dd6647683648d60cfbe 100644 GIT binary patch delta 1756 zcmah~OKclO7~aj=R^4Jx(-yTVt-44p0unnLKazDSRIMGy*pA7gaUPW**rfN&m$DpfVBp6c>-0~?R2j`jW`*hJ>RZKj?+8Jdf0T+ zR*(UC+w~>u#CBe4{E)XwNfcStA@xUFhSYIhS}g7xb_|)+ZP(;&haeMm2NM(TvOetw z9koN&9yOcwkWur!9o5^03PyyQ^b0^YFDn?%P~D}YNBIwh(5BNaD>6PP{GcIi+tqRW zIKwa@@Hqp%0l$Ht!4KdW-7q_+x9$P!G&jb+@&bgy+*x)oenEdV7>B?aF2=svD$Y-) zl{~aW9gUpg#==K!(pZG@v*0lU9`B59{RFOxY>2s%OorP7*Sy+M4VVxT>6nm+O$xjq z%nY7kD0ws#*=3)we_#6I_DTBOTO9d*kqbB>7CdFZQ;Pir2$$I~BOMFV-|zusV(?i= zh%;#+o=%EsVRFQ;2n${?;04Y46O7U=$A!bg@N)({KL`gnHvHeWUjbqEK@P*O?_>K# z7>N{_=z~ZxBGNC=yOF*a3q*T&KIHD);DVLAImr~fx&<|YWGgk9Noy(HLVBtz2qa}E z>#!b&rCX~vSB3e;O=&}`Z_c}VC9#}txftb&dam4>(v`%tzPP?p$vfo_<~F;j{CaJ@ zwV++14A(GP*7;_RB5FPKsVm#*8&O35tb z+IY^aHp#4FuVT;kGNP9iGH}t`FkRhgw&ZG8RGR6j*m6CqWa@=QN0e%seZ3&gOcJYj zBQfLVQ#an9H5^f&Uh;04in_chS*47rtzx*AZaZ}&ziwh&nMd~FxFnAJ3#3vRQQUnH w52$Q#7kmOt+SpCdH?IZWx$=M2<}Py;w*PfJ!0-NkE$|l@{WtL5LV(};2Qxw^JOBUy delta 593 zcmaixy^qpx0EXpSlG6l!a&a(fa+v5Pnv`ql2L)p;rL@$ed>$==L!m$qT1pEo(6Ssc z#@W+>-I$w_2CcQaMRirYah)+8G$(ZpPoX?K&nJ=GAUDp&1-!%u0 zN~x+nnT_;p-K-Uis(`t=&@crh%@cfyLaQS}HU^BqWtqafue--bxq;61CE1ap{ z=CHzhmLN#IiQ0AsUfnG;Mn-9f3|o{bcP zeWWa=Ij)1JFxPCk=@dFfeHF`TidU|QM6ut?@I*!DkFvQ;zD#&_UFT)Zs}{;Q9Y^CN zg5n525%qw60B@GlVg_jpr; Gqs>25^}hoE diff --git a/backend/myproject/members/__pycache__/api.cpython-313.pyc b/backend/myproject/members/__pycache__/api.cpython-313.pyc index 4a1b36733c83dfbed6b352593242af7fda0eeb0f..f8bd8b098db02152d7662b20ebf7dc0ef6c94c9e 100644 GIT binary patch literal 3982 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 literal 0 HcmV?d00001 diff --git a/backend/myproject/members/api.py b/backend/myproject/members/api.py index 38a841b..61719fc 100644 --- a/backend/myproject/members/api.py +++ b/backend/myproject/members/api.py @@ -9,6 +9,7 @@ from .services import UserAuthService from projects.api import ProjectsAPI from announcements.api import PostAPIController +from registrations.api import ProjectApplicationAPI @api_controller("/user", tags="User Authentication") class UserAuthAPI(ControllerBase): @@ -54,3 +55,4 @@ def import_users(self, request, file: UploadedFile): api.register_controllers(UserAuthAPI) api.register_controllers(PostAPIController) api.register_controllers(ProjectsAPI) +api.register_controllers(ProjectApplicationAPI) diff --git a/backend/myproject/projects/__pycache__/api.cpython-313.pyc b/backend/myproject/projects/__pycache__/api.cpython-313.pyc index bdc1ccff5145677938efa6af3218e7d106556675..0464f5b076a866a24a3c77b73bc1c30834c83c1a 100644 GIT binary patch delta 632 zcmY*V&ubG=5Pt9NW|NjCFVT>i*w!_h5?5@BC2ESrs)5=zR7fxX7K{qRxcgHz^yc-Tg*Hm zz9}90s<)!XV+GBSJz$DIv7A=IbV?MoCM}CS&Ct#vQ0cwUCMmrjKEx-qi-^pK zpYhYw5JQPsS`zidr>n_n`;pytrfqOGJ!dal52L;V?zUrldPv%eoc(L6Ot21WVsU78 zsYF1RmC4|&41PA!X&%ov!+BGI@YXA`15D|)gm=&5pe`E2g@vfUf-QOJ9+U6< z&uec-KlA0o#4?m6D|Z%U2p5~o*TC_1;o)sFBfcar-eL^@yHal0Pi zO30y`LQrWrp0BpIBr}TO9D=8!*RMv8uj7xg><3O~6Xu1R8qed_=;m?E&}HP;eJWn2 zwoHC_{(3)l;}@f`27P^NP+jj=*8_r8pb+gQ4MGOWJ(uUG(LjlRihg3Q69?&qu?gCs`;~xTlsc^Pn_(J`9sv8+;tuwZvrBB-5o0;Ft&fA%J z`%~~?*jx5^oCMYf&ki=9Ilu9K$~8qPA)k;qVN@fG(!o#mMv!+c> z4VWgMq3RJ84(ZJ<@U%TCrYG}yVm+5hrnAfkHkD^#*w|I%9ZWZNa#=$+cu*BZVcp1G zGk+Enw9kx4-BLdqt{<&Py_61^AIqK65L$-KFXT2FHouoAXt(*N{7aWSSWUL)ovkEQ zc35spPvs-Fu#w)@Q@lyVCdy1&H?g1PHM-1C!i$pigskFMRhGsr1B2=)SGDL=VQlPfZ+~bzYiCHL*HzAzGe9Iab+-Q& zghC+{*lcgDMm5)Jk%WJX#BPEYyAEIo08pe_m1Z!ywU*zQSzL%*ep3WPW&s|M-~EB2 zzu)rr7yVO+g@jeVR&cDbJ_y(o2e;Eke$VqRpmLre zRVxWN5K;#Z_N+WbO(reTIr9hU#(vC!+~u{*$K01KsKub}|6k_=rO^p~k$Z2R5EoHM zR><SO$WkNaFxAJfJLo`e%EPN?gPS7ps$0>EtEq4UGN_-~lNK?mG3iKzA`PUfk7)U zcpMmh^v7Q)(bhO2Hla`;`y0zs?#-L(u%l(K)ZeK@P$* zM5oDEP_#>!HI@|z>>G@rjy{$Hzf7FfL z?Li8M!xnaOP$nEG)`D;ijr^vbw}nap18Bti%Dl+*Ob z?z75X=7}^`;?MzVBe@>lIk@xa{?pL6(ZckSH5s!+?UeI~D*C-o%P6wGqajxd?Ow*z q7bmeDZ)S4qyW9E{O9DahI4fq_Js%vQ>S3fzV1t)%ky8$&O58uYrC=@q diff --git a/backend/myproject/projects/__pycache__/schemas.cpython-313.pyc b/backend/myproject/projects/__pycache__/schemas.cpython-313.pyc index b9a95c802cc4f5be7453b023866089b67ce9607d..7fcbd296a2853783ec962e6c7ee5708c97700134 100644 GIT binary patch delta 958 zcmZuvO=uHA6rRb>{${iBCpKxYO(-dvwuqM=D&oOHv0GY%r3a-D*X&xiZZ>6hTkI)9 zL9fap6ueaNq$lrQ#ghjSqz;sxdlMV)&YNvDLKo)S_r7_*^WNwDC#!H&C>V%;uik!K zegC2`+Tt$wu zB2P;Y7$K?)R^_ZVz#4+pIcp5Cck+VHbJ`rBO~Dp8YYni4)nfC^A>?RcmS608e(1Cx z`W?5KWBN@u_65b{xxf#-5BnHnD?Px=3Uo}3^jfZ}lr!;e&NodEEe=afEqzT&^Gph& zgkAu;1Tb`BK!sNY)anU18RLfjg#n-HsbX%xF{JO?l-wELxy{z zE1AcmS0O05-|dE{HaGz`0FXQ$S~vEY$$SDv2c!!xC>T>iK_^ zOuNoqH$wjgo#t+spLmhOPl+$(J{mbdWNLJ9N(+^8U~1aa;Zp^AYyoO|XzPVPJ=pLFxxG&RJ&y@#`ka$~03*DSb0HnMRM zS(xG+aG@wzA{99onNBF-oD?NXrm~fwi5!|hGsu=Q$d(VtvItEPq6$|NOjY_+m8&XK zwLVp2>I$-TCL4XSUNH;FXXsYIvA*3XyEVIX?A9F?s+&&Wa_RmHV{G0EyRr&%)o5SH z$YVX)5?oIQYBJaF7wbS7Bl-mm77*^JA?(LdNGy45UuTo}u5(@sanum*g^hsvh+&{!S1tXSx&#yWZo+nnCr)9?vy%HsmErFJ5 z(ni%Sg~4JS79CI-t`Y!zuY3jECZF)zf2^#rs*{?#PUl$#W+&Ky|9lhK<8;wf7iFU_ Nc}e>~1dsE5eFGHUcYOc= diff --git a/backend/myproject/projects/__pycache__/services.cpython-313.pyc b/backend/myproject/projects/__pycache__/services.cpython-313.pyc index 07b6e44d5d972ff356586c226810f8109d20d4da..5f503d24c941c26c10f8a59afbe1b8dff8254ee0 100644 GIT binary patch delta 1219 zcmY+DO>7%Q6oB8XcfCLUt4R~PNo=;Q-E`YJwopQvw#0Emq&8KfmQ_zdSj&2nI@n%o z)~zU)00$Jr0YxkBh+DZ<>Iqck1UGDPaI|U_Re}RILy*!N%v*=Hj5Oc8dGp@PoA+j( zq<+f84`MM5czgWa4;y#1op_pT?@Zmex)NhC9ZWFg8}XF{ORUID)*%h2z*NS;RA&Wr z0$|4ioyK*Mm%8Le)QIhT`&C)+Bkwv*tKPcl)M&#`-eS%swL41>>;?@~hTx}{7_~a| z^(E83OPdx`yo7Rsl)PKynqBo(p8u z`$+scGK$fSAyS?s6$&F<^ws5$ZQAbCot7VRJB;rky0o#*lDMd}YwOkZdV{jGSCt-< z=%calIx&2?Z9Ql>R?R-TGq(khc@Ob^@EgZBkcBnyei1U>_exp3L*CQ8q%i6Up^-Bt znHO7vDVU)W$-zlji*tvd$zY`bS|L+hOL_@)W=r%n8&gwlSxxF|ZpUJsYK?@A*C(d4l-L~$N6!F%A$N=Zz6Jt8N@8& zZNwbhTEw%>ZMBk)Lbt$x0lKFGsRw}_)3^K)t@-un>fEWdAdJY=uH*| zDx@zCKuX8AuMMIwn(by6x+CRowCpWv`c#&0{&^)*iNkJOs}w`K>1gF#Xg5btJ|}TL zgjGZJK9es;O5B#k5SP6l<%#8YxOl)j1lM5+lo0qW+ziJTFc346(Ve>VH}G+=NHi(m zEi4}bAK6l1&!6gTbsj}bnAcSH#_$39ks5VvRu7&WyNF9wb$mW3h|D5r|EeIti@k=r zmsMc68W~ MgyjDM4vdk&zv{jyr~m)} delta 590 zcmY+A&ui2`6vt=ErpfLkskOFU7Z*#RE}`A6_7|lVy)0hDDg?X;4QVo4BIzc~WD8yd zdnif|y3GGj@ZdqKUd5Bw_9g+59=)kO?A7-o3LTiwy!YliZ{|B+>Ypa)PE8ueyCFRwT3UvS;%D|qBM(= zZmzq%AmCD}O|y3YB5XUlVA!UPm_`)#)-jqvTmv{I(ZF~OkQ;)_H0eq%<{*_Nz!VJ8 zRBz3B+ES)%LYFnpCdzX)K^ri{+~CV=A7KfNo0q5uE@ diff --git a/backend/myproject/projects/api.py b/backend/myproject/projects/api.py index 5b569f4..48f87a9 100644 --- a/backend/myproject/projects/api.py +++ b/backend/myproject/projects/api.py @@ -40,33 +40,39 @@ def list_domain(self, request): return domain_list except Exception as e: raise HttpError(400, str(e)) + + #API call to create a new project cycle. + @route.post("/cycle/create", url_name="Create project cycle") + def create_project_cycle(self, request, payload:schemas.CreateProjectCycleSchema): + return self.project_service.create_project_cycle(request, payload) - #API call to create a new project - @route.post("/create", url_name="Create project") - def create_project(self, payload:schemas.CreateProjectSchema, file: UploadedFile = File(...)): - response = self.project_service.create_project(payload,file) - if 'error' in response: - raise HttpError(400, response['error']) - return {"message": "Project created successfully", "project_id": response['project_id']} + # #API call to create a new project + # @route.post("/create", url_name="Create project") + # def create_project(self, payload:schemas.CreateProjectSchema, file: UploadedFile = File(...)): + # response = self.project_service.create_project(payload,file) + # if 'error' in response: + # raise HttpError(400, response['error']) + # return {"message": "Project created successfully", "project_id": response['project_id']} - #Api to list all the names of the projects. - @route.get("/list", url_name="List Projects", response=list[ListProjectSchema]) - def list_projects(self,request): - try: - projects = ProjectModel.objects.all() - project_list = [ - ListProjectSchema( - name=project.name, - domain=project.domain.name, - created_at=project.created_at.isoformat() - ) - for project in projects - ] - return project_list - except Exception as e: - raise HttpError(400, str(e)) + + # #Api to list all the names of the projects. + # @route.get("/list", url_name="List Projects", response=list[ListProjectSchema]) + # def list_projects(self,request): + # try: + # projects = ProjectModel.objects.all() + # project_list = [ + # ListProjectSchema( + # name=project.name, + # domain=project.domain.name, + # created_at=project.created_at.isoformat() + # ) + # for project in projects + # ] + # return project_list + # except Exception as e: + # raise HttpError(400, str(e)) diff --git a/backend/myproject/projects/schemas.py b/backend/myproject/projects/schemas.py index 314f299..2ae75dc 100644 --- a/backend/myproject/projects/schemas.py +++ b/backend/myproject/projects/schemas.py @@ -1,5 +1,5 @@ from ninja import ModelSchema -from pydantic import BaseModel +from pydantic import BaseModel, Field from ninja import Schema from projects.models import ProjectModel, DomainModel @@ -27,3 +27,10 @@ class CreateProjectSchema(Schema): youtube_link : str +class CreateProjectCycleSchema(Schema): + cycle_name : str + start_date : str + end_date : str + is_active : bool = Field(default=False) + + diff --git a/backend/myproject/projects/services.py b/backend/myproject/projects/services.py index d4673d0..104a566 100644 --- a/backend/myproject/projects/services.py +++ b/backend/myproject/projects/services.py @@ -3,7 +3,8 @@ from .models import ProjectModel from .schemas import CreateProjectSchema, ListProjectSchema, CreateDomainSchema, ListDomainSchema from members.models import FileModel -from projects.models import DomainModel +from projects.models import DomainModel, ProjectCycleModel +from projects.schemas import CreateProjectCycleSchema, CreateDomainSchema class ProjectService: @@ -40,6 +41,19 @@ def create_project(self, details : CreateProjectSchema, pdf_file): return {"error": str(e)} + def create_project_cycle(self, payload : CreateProjectCycleSchema): + try: + response = ProjectCycleModel.objects.create( + cycle_name = payload.cycle_name, + start_date = payload.start_date, #Notes for frontend : Dates will be in the format : + end_date = payload.end_date, #ISO 8601 format : YYYY-MM-DD + is_active = payload.is_active + ) + return {"Success":"Project cycle has been created"} + except Exception as e: + return {"error": str(e)} + + class DomainService: #Service to create a new domain diff --git a/backend/myproject/registrations/__pycache__/api.cpython-313.pyc b/backend/myproject/registrations/__pycache__/api.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f0b7ae1cf0bacf616ac8638d9798123328e20411 GIT binary patch literal 1385 zcmZuwPj4Gl5P$oBZ6`IY8^u(Bto}nLB)&8XK}kvp9BNBem2D){uJp9oygHk1cHMdF zLUO7&K#sjc;>5k*fCC>QR)vaIM1VNu7UX^aW_H)9Mf;?EZ)V=i>~DTEZ!|q!X1G56 z`PW{eGWHKC<7F1YXa|KO<}gR;u(kq9gJiX%wl&b&I_PZ!476#E-Z9%2Sea~e>~;xC z4d&`snPWOuOL6RFwa!p0U13hy)fTn<4~xZ*pxmo8r%p+0Dyg{<4-x@QExoWFM+wAX zDBw#^iu8il54eABOAR2;Qzeh9--CEp_{p7qKMZ^?3F64{cf_8DIp2TBoq(r-FAk<# z-kShfJ_<+7WuQ0=R7U~LDLdK~wu=UiSP%a}C zx??!zvg%l_bxU<@@;;}-c96iH+N`8AZ{xmm@9rsesOwYR3?+K*%F+Po!4g+Ye)J+b<@Lf|-tA z#?=Z6M{JXAkoA9SV=|(+`{vRj@r*0dHnr;vswg6l@8OYFazuQ9L^XA|NHz<^lYu}A zW=XR_$bKA2AqhbP7hEEHxrmJ7Z_{xV6VrzcUwGp|(}OQsx1v` zOTSnzYj+Rr->b8SRhU7Krjj9Rs;LPg89>x+mWh612I((zz87x~LXxLAe=_jG;-<>^ zqX1+Q29bzj&Y_0cfQByB`!SYdll}qeGn~r=8|-s0Ng&w5_b54k!7>0@c|eG>jS|Qf zZa=WsrefSaGnrZW@xk{Go|lfVFAa^)&Q#T?AJ46i7@i}Inad-xKDqtWXV$h2jRL~ AEC2ui literal 0 HcmV?d00001 diff --git a/backend/myproject/registrations/__pycache__/schemas.cpython-313.pyc b/backend/myproject/registrations/__pycache__/schemas.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..255a20a91f31dbc0ca156d2028ace23163e3cdf5 GIT binary patch literal 602 zcmY*V&1w`u5U!p-m&GU;qiakg2x3-<2O$>`LG+YBBDCHbn%>#Yrjyy8vAQ>~Pv8>- zym|I1ddnu+{Fo4Iv({7FUrBStxjUtfz`l@38TvwyG+-yiPBR zVDXIjIS4?;0Ta$JeF7pAIZvKaq(x~&Ji{Um2!r=npXk!RX`0HED)#PXU1gLOR*wui zFB{ZH8nrF8G~;mB>9V%t|GnSfV0a_+q_k?Pr3`&3r}cPNMSN4rPcv05Be$h&yH>_( zTT?hS)(7$`Yir+r!I5`ON*7rvmG@{yGq1^w@!AU#2#0T9ijPjC6Qg5=O1#tV)YlE! zvz-s9%F`WMN{k3-I~LP<(`_nHPmJ@}4HB-stb5+fv7oN4imSU@q&~yNgN+~A#>M*P z&ukO#Tqhh1^N?F(PZY+}hr-VrV<#93yEgHgUH)oJ=)LNW@fz=Fi- R@bFKTut#6c{sNh{@E^n;q7485 literal 0 HcmV?d00001 diff --git a/backend/myproject/registrations/__pycache__/services.cpython-313.pyc b/backend/myproject/registrations/__pycache__/services.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c24f3e6ee7f1392432bd18016c0401702220c9ed GIT binary patch literal 2076 zcmZ`)NpIUm6dp>{Vo|ne#j%^DsTspdlqRZCBuL`~L9+>|ydV%QpoIkxG&z!)(4;a$ zy0x1_PlbDGF9G@kdT4et&-k z!FV8K6uytm#>#OLFN;Kkb6gc?6XhgH2DHR% zs+=Zi1-*mDkeWP;)YP?Dh(`Jv=|bOYekcfRuz@|zU4D!WScrCY`f4G@r2FowZaMR= ziETFch`5}5Z{4tQaP?XUc}F73oo3Uv4BfNbkOg4-9(rE$0U<6iLaE`*8Tr^h3)6E{ zLqt#!iKzmKtFg0)h-#c98e$>A&K$*7Fmq8mb`|0v~JbmfRu z@kE^xJvzlI14mJ+v5I{3cIH!r^uzWg53rU_b$OPCx;sER2479xh&hQ9-X9}5c%NJv z?xG&+r!!sZ!CH-1#cHCORMTo-F|KBA#C?ce^NVWwKi@!MsFIqU7RLG7&)34hg7qE5 ze`Dm1@2z0Ri!xFn_^EFZY%cP&w5X;Vp0$QI-dk{$aH}-K1Xm26;Y!{09kaOcLCGT2 zQ*_5vC^lSJngrJ|!H$6yLw6k4Q|pERzi#F&1tKuTR4J8G$B;SbxxVh-QE>9xn7T5u8zHDIP3L zJ(g$a<#fo_DSD9aoOV^WU{CIzkt`wvTnh$ig=9;G|jqkA*8D!7=|mREG5*Y0Eb z#B-alu3cFqy7A-+xUIGf8|;|1)%7SPY6Led>XD$g(Ha2o4n&L1btYklxVEhYftxt7 zTNQhram(pjn7%^0x#4f0eeht9V~KWUvR zx3cA3`AqBFTq`%5= tu=K6a#M|UUkjsC8^gK*^aX}DvQ1KO-*+K8`ps~NjNnt_w6Y)9F^Is^w4HW None: + self.application_service = ProjectApplicationService() + + @route.post("/enroll", url_name="Enroll in Project") + def enroll_now(self, request, payload: ProjectApplicationSchema): + response = self.application_service.enroll_user(request, payload) + return response diff --git a/backend/myproject/registrations/schemas.py b/backend/myproject/registrations/schemas.py new file mode 100644 index 0000000..6d2df50 --- /dev/null +++ b/backend/myproject/registrations/schemas.py @@ -0,0 +1,6 @@ +from ninja import Schema +from typing import Optional + +class ProjectApplicationSchema(Schema): + first_preference_id: int + second_preference_id: int diff --git a/backend/myproject/registrations/services.py b/backend/myproject/registrations/services.py index e69de29..ff9d00a 100644 --- a/backend/myproject/registrations/services.py +++ b/backend/myproject/registrations/services.py @@ -0,0 +1,44 @@ +from django.shortcuts import get_object_or_404 +from projects.models import DomainModel, ProjectCycleModel +from .models import ProjectApplicationModel +from ninja.errors import HttpError + +class ProjectApplicationService: + def enroll_user(self, request, payload): + # Check if user is authenticated + if not request.user.is_authenticated: + raise HttpError(400, "Authentication required") + + user = request.user + + # Retrieve the current active project cycle + cycle = ProjectCycleModel.objects.filter(is_active=True).first() + if not cycle: + raise HttpError(400, "No active project cycle found.") + + if payload.first_preference_id == payload.second_preference_id: + raise HttpError(400, "First and second preference cannot be the same.") + + # Retrieve the domain choices + #Instructions for frontend : + # Send the domain id in the payload, + # But in the ui, show the domain name to the user + # This way, the user will see the domain name, but the backend will receive the domain id + first_pref = get_object_or_404(DomainModel, id=payload.first_preference_id) + second_pref = get_object_or_404(DomainModel, id=payload.second_preference_id) + + # Create or get the application + application, created = ProjectApplicationModel.objects.get_or_create( + user=user, + cycle=cycle, + defaults={ + "first_preference": first_pref, + "second_preference": second_pref, + "is_selected": False + } + ) + + if not created: + return {"message": "You have already applied for this cycle."} + + return {"message": "Application submitted successfully, hang tight!"} From b458855febd3d2e62dec4e25258c5e5448d3f481 Mon Sep 17 00:00:00 2001 From: bharathan06 Date: Wed, 26 Feb 2025 22:04:18 +0530 Subject: [PATCH 62/63] action to avoid merging to main --- .github/workflows/prevent-main-pr.yml | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 .github/workflows/prevent-main-pr.yml diff --git a/.github/workflows/prevent-main-pr.yml b/.github/workflows/prevent-main-pr.yml new file mode 100644 index 0000000..03f0f52 --- /dev/null +++ b/.github/workflows/prevent-main-pr.yml @@ -0,0 +1,15 @@ +name: Prevent PR to Main + +on: + pull_request: + branches: + - main # This triggers the action when a PR is made to "main" + +jobs: + block-main-pr: + runs-on: ubuntu-latest + steps: + - name: Fail PR if targeting main + run: | + echo "❌ Pull requests to 'main' are not allowed. Please target 'develop' instead." + exit 1 From 75880c2d4381b127bcb0e7ee04b0e13ee080ab50 Mon Sep 17 00:00:00 2001 From: bharathan06 Date: Wed, 26 Feb 2025 22:07:12 +0530 Subject: [PATCH 63/63] issue template editted --- .github/ISSUE_TEMPLATE/feature_request.md | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md index bbcbbe7..84a13eb 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -7,14 +7,16 @@ assignees: '' --- -**Is your feature request related to a problem? Please describe.** -A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] +**Team:** + -**Describe the solution you'd like** -A clear and concise description of what you want to happen. +**Overview:** + + +**Additional Instructions:** + + +**Deadline:** + -**Describe alternatives you've considered** -A clear and concise description of any alternative solutions or features you've considered. -**Additional context** -Add any other context or screenshots about the feature request here.