From 1cfa015d1e33b8991e5038904dd21255d3d5708f Mon Sep 17 00:00:00 2001 From: bharathan06 Date: Sat, 11 Jan 2025 23:28:44 +0530 Subject: [PATCH 01/97] 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/97] 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/97] 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/97] 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/97] 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/97] 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/97] 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/97] 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/97] 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/97] 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/97] 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/97] 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/97] 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/97] 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/97] 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/97] 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/97] 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/97] 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 zcmahMOKcm*b@s=YnM7+6Swria`pD2F1s^u1XwNy#)aSj@h8 z@6EiK_nSAneSHA}ZT@e!3%>*j`40}<=4k=D(*hwM6OCv>nxq6Oq(mwvh$d=MT1v@O z;joFXg9x4tvspRFDQa>`jMKeYB6mzH~Shp%D)I)BULdI>6yT`amj5 zqp28;rQ$T68l;09A50IWhUsvEWaCGO7Sj5%kt5_nYl~WVMj9r7kBkznKO4IsIRuwZ zN3v0%4rm8v1Ui}>%{=2Cvh&aOU4V090~x(JMt+rJxWiG1s<9t&IaOpKy>6`-6|0!n zErWSV)k3vy{fOdJfdyWun^v_vZyFRvUNgU9lywupP|B=UGKN{JR!jrN0|mp%RTpm< zdHB)X^wcyUN3ItuH}upSug@9Fdc9=5P_0FzmGBwPV*Q@Us6;)<^ zeBRafEUI6A?HUVr=3UWEgN5~4F_&+z#S{uV#!UoYqgC923A27y&embqt5Mv00tL0s zSgcmy)Uu@)OeW*m^QZ{7wH<4fJ64uZK_gVu1S)0a40lME)%k^Hn;zhPME(BpjQ)ZIJiy_(kF(oAnj1A8R(YX|5+K~|$Ih=xPEfiZuKfbdn% zS#Zu`Wi`M}%Hiu^N?)CpauvO7P*f80*7WyFRedSniZi}#G%JpG{{`L0WT6#JguHnm zBXW*C-MpBQ_aOK{6K14}G%qbegf6&_LNdO`IggNe$&I#(ya3tDY4fs+?Z#z7F1_=2 z`7|*p9wQ5Qe%{d4rUXsVJTrh-y^aDvQ>XyutLdhBt4fz1h|Ei!pkf|9pEpdCd6o=I zFP2uL*D5#lQgJDfr^XTng~J) zbB6hjRjtAQ=9$;2o`2`e;@AU{OL)?fO({Gj}0q4DDHZ1^H?tjSx!h#eez6o0A_KlOF|)W-C~ z_|)1?Y;Nfo$L=DU3iHOqZ50YJAe&I_*9;Z_keaY_ISOV^pV4Cd1d#%kb| zYN22(C7gxPLm!BA0)F%)bS4T(B3C8c>Tbymspkk*)rb z_1VqH$xYu$dIkve0CanHkLKgM{{n!I$-Iz(|Nho9rh0Ssh_ffG*^ao5v?p-(h)7LH z%Aig0x+>E#Sb!ddj(G}2Yo)%(lw}MbRiP@9+H^XNL(JNA3c79ub57RZt=Kxa9vZ{E z0^J9s=^-PD&qDV?jo~x)@R_an_$S%B*+zWAj!$e29{i+qx6~L^?LoCYIB5@_-0>^@ zfhJM>0j~d5|5<7jil$}IJ^2hz$gNQ0*VG}h00^h`(tQT4wy!~s>!r~rVSDHlR_Jjd z0=7p!gWRc9q=ok7nCaiQ9T@J*ni#aab!E*iT(2w9jUOj#K1CJ=-8H;KKTJqPS-^C} znM2f2W&;30)*PfWb_>7bt)#41tAwh`NdN!cTFef{sx%o40fnedJMbc z*qwlm`LDj0H)<9XG*0UEbaDaDx{fzv(q)2SqOmdUx*5XfIu?s{d$Ef>5A5cjpaV~q z!~RQ;qC=m|-kohkC++Cu7I^l-dk4{T%XiB#YK*A%h`Kd?v@xEv$CF!QM;c?N?XlC% zAc>uB5>G6=HuqDQ3>|F@PJTT&xiR-}@Z7KF*Z*OH9oZ!UNElX9to>gAc4b+P%MZUKPD5RADnKSde(+7{2biOV@E!ly*K;m#m3lKd+h9YW9L3fugyIQ zMeoerSH26K*pbNi`G5ODfAoLk|3h#q5?u@O%=v(*2beF%12UImfn2U!U88)m)BZW@2)!3bl(D!H`xgRIXJt{`R4hfTHIRFTs>K5Z~IZv%_Q9K@t=W?MlQm>kyj5?gamR*;bD4h@zq* z{X`R?W(dh|-F|EB*1b1AealuRc0`X7K!%e|gqksTe(?S=AUDN`a%p3zpgNp_=56yW(OJpJ%)hr5JV0112;|CPiQ4?#qZ{qF`&@ie=S!E@b^JjJZ;!R=#eT z+~--Wf-lnCja!x@gFi+o-ePRHLqf5g*CMwu>+g_xwQD*BanL~<_*SJDrWCI@iso}1 zDb%W3%_Nko6hhjuFOy)%Vs5tWdd`~re1iFA9nZZ;4VVpg2r)l|4sxF$d{3sg$%$4S6ZL!Y%0u$Xf61{O9})ZScsCC{{f~)%sr`yBzv2V!nuF<#TI5*_~0S0=v2mk;8 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 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 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 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 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/97] 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/97] 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/97] 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/97] 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/97] 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 zcmey&%ge<81YsQ;(n0iN5CH>>P{wB#AY&>+I)f&o-%5reCLr%KNa|LovsFxJacWU< zOj1T-QDTfsYH@Z+egTj!(+w#~OwQJIEGURc0y0wbQetu|3ySiyQj<$!a#M4YK)P}h z^Agijb5rw5V&da7^D;}~>P{wB#AY&>+I)f&o-%5reCLr%KNa|LcvsFxJacWU< zOj1T-QDTfsYH@Z+egTj!(+w#~OwQJIEGURc0y0wbQetu|3ySiyQj<$!a#M4YK)P}h z^Agijb5rw5Vv_T7fxMLBnE3e2yv&mLc)fzkTO2mI`6;D2sdh!IK7&-6`tjC`A^FFGbxECmy%_LicHIre`VQ`tUt$$Q4xnyRS zmc>JnQ=znn=;A^u3P?Vg0Sc5o)khthx&^qQ12P+@m->>M5;;hbT>557>d$fO!pH#o zX5R3W9PWeq=5oX3usn(mk zB#fm~DPD{LYZ=Q*ayk{31Pq)##V-qy3@=G5X-s}LO37?Iv9KDgj#Z^pjoIsk#(gx0 zh@n`=QJCg*SkKYz2s4}>sDWdE8aV?t#f^TGYOGECl?gO+!*8cDX)Lo@m|S8Pa5}~E z>=^fRb|H}zSg?%r( zg`+OkBsd*Wt#hI-tP^RD7WK3Gx=M(w*s&5aAL{@%Omq6HREQXVtX!<|Z`5l3I!Nmr zD6Ds&L6|QLad;NC+fO_zEb}y(nLdsDOs;oI5Cu#^mS?kK;{B|k1-Hnj1eOGCj7^KI zkm3``fJ%*E5+h#`%wVUP$Z`@vzX20)R7T1q6EY@{smAm?i3&+IK%~k7Rt>_vgd|IT z2A|MmwJ}vYnL~>UG7xUlRHNyv2r3d;5|$L)MEYIvnyHbhq5EnoTaTZYNjN}X`VEi| z&@-2Jn|Ww`V9k$}*#1JJ!VZ>P7uM{RW_Ha~X=+|GK6ALr4pwonWk-+V=qb30j-H}p zsO%V39HV8&nBo|#wD)Xy^Ul1v=p0zPRk1a%zyIMoYg5k|)X?@{bxV%1T@yOtT5G_q zU`}*DK!It5uK~WjbwCr21UQ}u0uYEgQ4b&EIULXso}8XzuF^Ur8V-($(0;&zYOQpl zuwg&6jbURmn$q1GgON>PQ^;7CI;c4VM_(i>4dur|ydKD+c~-k8G&!3leuRXGH^)lY z%o$;O5MPg#`l$Qc<0L|}&2=Hp6gE2$XC9>Mp0Fs)a29RDFw;v%WUWMYPUucpnN_HpgnzI7kWc;Nk%Zh8_S zE7CGT$QJAC3OoC!u*63$TCOw90PPxN>UPv?l3MxD?CH7>M#T5P8EHFo2Az5-qMon~ zR!V;`mKXdHZKF2u@e!=K)?T0%&~@627APO;L;EKR+yM(Z7I^^&7R~&sE-`!NkR{jP zCM2lTmFho1{eP^_n}^hDP0kyp0T1@a*2fEo)GhX(p26f$(=q@R<(RCzaP|u1kVa8h zNhU-=H3?!g9ZQID>;XAHrByjIx17jipqI^^WZxipCCeuvM~E&g#?!52+0jpbCRz&napAuW~3!7s)l*Yi_t~ZBtgz8kxYX+uNvYBc`-Y$ zn!vJU0gQrYft-y&PU^R6c4@<7SYLz*q}Wdgc^qJZ5$+>|WajuB5LJ)UNg-#FVf>Nv z1A{p`$KO3LHOFXfz9N3$cLzq^eJ61W~1< z(p}Xuo`}jJfE#e3-CW8~AjD4hSlLUGHRiz;Yj|K2f zHAr$SorQ5$a6%TyaH~l{HFDvxu?db-%@g;cLPk!cMYWMQGLx1ki4U5ynzDeg%1nep zcS3%9H5JsuvjphUus-9@8 zlpsMejY$5uU#f|uVG&+xpzf%rja9xKq@|~j_rQCjrG4X?($ceLuDIGDHzZ_N-*0Yy z+St0D$Tt<@pElmu>3Q1b-tzq3lQ)*y`qvH5I(+M66}NY5YIACPDjzDj`^)Z2iu+Q@ zePw;(xdFL4%TB-I^p~CeinG6vEjs&)&g*68xZ)fyJ0}(A zT(>H&?tG)->fNw^?qZ*{v~AqUPvkEb+XtVtT-Y@rwrgu;b7ebM7$|u!mA%7?cev!e zv3~2H9bJ{Ko^scS(lxTvTI!nGFo6N?GZjx)#pkbdoq2fq!R7q$qoz{VaJlQI(si@c zHD2lLe%SM%C;w&vmpX^aog+%;NU8H?#pBzGZ^pOdd0g@gls#7z&y|vAsP5@RexT$I zl-(B;_l1)CQpMY;nRKtvRPtUZdxsS7P{})7@tuC?eBjKt7r2t|YT5Ue;(M#)8~vZs zp_1=P*>^+n-6;7+DyPnT?XJ|Fsr~L}rj>s`Z$R$uJw$@!WLDGxNlD=W|=rE(03hOS2H=zqP)D(C?-$ z2G7xdwT+&+eNF$#00Yb?mrd})->zALea6R3N3h5Em^DKG;~s|e^wFe!&Jw(Ce0-G# z$;a0T{W}`fO*8aA^c2vK;V&DrYKmxQb|j)&B9T-&mW4knBC0JCc|Xf1$!QK;LnNY| z?&R_i(~$@!yA_j!Ups`#D`AB0p|{}O`D7esAz@cfoVh1=&s#1 zlQik3%dVTa?{A=sCUnwWlkS=l?GNZxq^Z8--81LhbKkx1Wqya=O~%h$E<3@s*Z#Eg z)knyWb23<#%a60x+xV-a6amXR#~d)6;+PYxU`ugnj=4~`qwWR=8v!RWGn{MgbbE@JQ^j;FbliTNPJ{4l`+U}j^uBLYma zAWX4wBq0dnu@e_@68RKF^a__s-MGW|XJ*qd&1PVRMIp*!5M#42%jOW{=$?l;me}DF z@sp3-Yff;r{gu5^eW#HuH|i}`+e(%y2erDMHhs{)nQrs#guZF@?`@UJ`_+1-nOtjB zs?Qhu%m^>htXRycnpjj4wce_g zORZX?o`h<%i6~xCb(i@k=REmi-sU;~$y4hQ$G4;UXLB(6Z-&a2VQcnlYn5z`9D0c{ zlqv$IwX7np(T%*as_)u=je0Vm zWVIqt4KDyvURNA?!MEbZODO3|xZBfZ@09Eio z@<0vmz;Ib5E>k0LO#_-KD%24Emt)vrMO6!VIrrph1`~j-K~kyy#<6Lq_ycgboA32g zhqQ3&9P#qU?p}H32m;?W*#DfRp(UTYM{ta@gW8%fc$iWyO-aI%h5~DMj_kG{IZ{Ezjm+>DH=`%$UIW_{n z-feG$IqpkeTny!|(zcFag8`1YS0!tzqCn1_c5T zoEM3b;b3G9kpROG!ytso2t=6j!YGUC8p<1jUd(^-`9kWrW+Dx}C5c*!_hQJ5t$m?IO6Pr@ZuHa>_6xa=;XOeCG- z&woW`;0j4?^O|<}20cSvM1^*9*J(Hp+Vx{E^Js|rcbj{iw$nOB=i1Y#KWb5L39jdE zvb1l}sS}4#zS*GuPRk*7v!RJp)$@4_U|ZEPuGpqg#Fnvw=~xXHYZyxZ@2j<{rCVKW z|C0wAT{QK4*)+hi^`eDq_P}RUD^$?UrE1NvN-I-O>;iw2AeSh{KAf~~Kvf}0b+ zyE*BGE6I1o3iI~c+3L6**|`1F$DyecAD2wOeR!0(_L1S*Q8Lp@%=D(`dZB19lIW?i lUTm%()#QmPDg1$OnhJ*bgTQIZ{U(2K-z!P~Q-PSQ>TjZ}!qWf% 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/97] 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/97] 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/97] 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/97] 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/97] 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/97] 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/97] 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/97] 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/97] 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/97] 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/97] 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/97] =?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/97] 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/97] 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/97] 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/97] 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/97] 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/97] 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/97] 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/97] 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/97] 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/97] 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/97] 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/97] 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/97] 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/97] 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/97] 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/97] 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/97] 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/97] 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/97] 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/97] 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/97] 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/97] 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/97] 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/97] 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/97] 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 a3a400aca7602d661b3e3afddcd24fe52be14c44 Mon Sep 17 00:00:00 2001 From: yvaishalirao Date: Wed, 26 Feb 2025 19:19:53 +0530 Subject: [PATCH 61/97] create post logic --- .idea/libraries/Dart_Packages.xml | 8 ++ frontend/lib/api/login_api.dart | 2 +- frontend/lib/main.dart | 15 ++-- frontend/lib/models/admin_post_model.dart | 32 +++++++ .../pages/admin_pages/admin_feed_page.dart | 85 ++++++++++-------- .../pages/admin_pages/create_post_dialog.dart | 87 +++++++++++++++++++ .../lib/pages/common_pages/login_page.dart | 8 +- frontend/pubspec.lock | 8 ++ frontend/pubspec.yaml | 1 + 9 files changed, 197 insertions(+), 49 deletions(-) create mode 100644 frontend/lib/models/admin_post_model.dart create mode 100644 frontend/lib/pages/admin_pages/create_post_dialog.dart diff --git a/.idea/libraries/Dart_Packages.xml b/.idea/libraries/Dart_Packages.xml index d6245bd..48275ee 100644 --- a/.idea/libraries/Dart_Packages.xml +++ b/.idea/libraries/Dart_Packages.xml @@ -240,6 +240,13 @@ + + + + + + @@ -652,6 +659,7 @@ + diff --git a/frontend/lib/api/login_api.dart b/frontend/lib/api/login_api.dart index a718c68..668976d 100644 --- a/frontend/lib/api/login_api.dart +++ b/frontend/lib/api/login_api.dart @@ -3,7 +3,7 @@ import 'dart:convert'; import 'package:http/http.dart' as http; import '../models/user_model.dart'; -// static const String baseUrl = "https://dev-track-app.onrender.com"; +// static const String baseUrl = "https://dev-track-app.onrender.com/api/user/user"; // static const String loginEndpoint = "$baseUrl/user/login"; class AuthService { diff --git a/frontend/lib/main.dart b/frontend/lib/main.dart index f95bc9f..40e3d1a 100644 --- a/frontend/lib/main.dart +++ b/frontend/lib/main.dart @@ -1,4 +1,4 @@ -import 'package:dev_track_app/pages/common_pages/login_page.dart'; +import 'package:dev_track_app/pages/admin_pages/admin_feed_page.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; @@ -25,12 +25,11 @@ class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( - title: 'Dev Track App', - theme: ThemeData( - primarySwatch: Colors.green, - ), - debugShowCheckedModeBanner: false, - home: LoginPage(), - ); + title: 'Dev Track App', + theme: ThemeData( + primarySwatch: Colors.green, + ), + debugShowCheckedModeBanner: false, + home: AdminFeedPage()); } } diff --git a/frontend/lib/models/admin_post_model.dart b/frontend/lib/models/admin_post_model.dart new file mode 100644 index 0000000..b9ae86f --- /dev/null +++ b/frontend/lib/models/admin_post_model.dart @@ -0,0 +1,32 @@ +class Post { + final String name; + final String dateTime; + final String description; + + Post({ + required this.name, + required this.dateTime, + required this.description, + }); + + static List samplePosts = [ + Post( + name: "Event Announcement", + dateTime: "3 Days ago • 12/Feb 10:30 AM", + description: + "Lorem ipsum dolor sit amet et delectus accommodare his consul copiosae legendos at vix ad putent delectus delicata usu.", + ), + Post( + name: "DevArena Deets", + dateTime: "5 Hours ago • 14/Feb 03:15 PM", + description: + "Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes.", + ), + Post( + name: "Project Cycle Deets", + dateTime: "1 Week ago • 07/Feb 06:45 PM", + description: + "Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.", + ), + ]; +} diff --git a/frontend/lib/pages/admin_pages/admin_feed_page.dart b/frontend/lib/pages/admin_pages/admin_feed_page.dart index 4453a42..d0c516c 100644 --- a/frontend/lib/pages/admin_pages/admin_feed_page.dart +++ b/frontend/lib/pages/admin_pages/admin_feed_page.dart @@ -1,5 +1,7 @@ import 'package:flutter/material.dart'; +import '../../models/admin_post_model.dart'; +import 'create_post_dialog.dart'; class AdminFeedPage extends StatefulWidget { const AdminFeedPage({super.key}); @@ -23,12 +25,12 @@ class _FeedScreenState extends State { const SizedBox(height: 10), _buildHeader(), const SizedBox(height: 10), - _buildTabBar(), const SizedBox(height: 10), Expanded( child: ListView.builder( - itemCount: 3, - itemBuilder: (context, index) => _buildPostCard(), + itemCount: Post.samplePosts.length, + itemBuilder: (context, index) => + _buildPostCard(Post.samplePosts[index], context), ), ), ], @@ -68,9 +70,16 @@ class _FeedScreenState extends State { foregroundColor: Colors.white, ), onPressed: () { - Navigator.push( - context, - MaterialPageRoute(builder: (context) => const CreatePostPage()), + showDialog( + context: context, + builder: (context) => CreatePostDialog( + onPostCreated: (newPost) { + setState(() { + Post.samplePosts + .insert(0, newPost); // Add new post at the top + }); + }, + ), ); }, child: const Text("+ Create Post"), @@ -110,7 +119,7 @@ class _FeedScreenState extends State { ); } - Widget _buildPostCard() { + Widget _buildPostCard(Post post, BuildContext context) { return Container( margin: const EdgeInsets.symmetric(vertical: 8), padding: const EdgeInsets.all(16), @@ -130,25 +139,24 @@ class _FeedScreenState extends State { const SizedBox(width: 10), Column( crossAxisAlignment: CrossAxisAlignment.start, - children: const [ + children: [ Text( - "Name", - style: TextStyle(fontWeight: FontWeight.bold, fontSize: 16), + post.name, + style: const TextStyle( + fontWeight: FontWeight.bold, fontSize: 16), ), Text( - "2 Days ago • DD/month Time", - style: TextStyle(fontSize: 12, color: Colors.grey), + post.dateTime, + style: const TextStyle(fontSize: 14, color: Colors.black), ), ], ), ], ), 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), + Text( + post.description, + style: const TextStyle(fontSize: 17), ), const SizedBox(height: 10), Row( @@ -169,7 +177,7 @@ class _FeedScreenState extends State { onPressed: () { Navigator.push( context, - MaterialPageRoute(builder: (context) => EditPostPage()), + MaterialPageRoute(builder: (context) => EditPostPage()), ); }, backgroundColor: Colors.purple, @@ -192,8 +200,8 @@ class CreatePostPage extends StatelessWidget { home: Scaffold( body: Center( child: Container( - width: MediaQuery.of(context).size.width * 0.8, - height: MediaQuery.of(context).size.height * 0.5, + 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), @@ -217,14 +225,19 @@ class CreatePostPage extends StatelessWidget { ), ), ElevatedButton( - style: ElevatedButton.styleFrom( - backgroundColor: Colors.purple), + style: + ElevatedButton.styleFrom(backgroundColor: Colors.purple), onPressed: () { + Navigator.push( + context, + MaterialPageRoute(builder: (context) => AdminFeedPage()), + ); }, - child: Text('Post', + child: Text( + 'Post', style: TextStyle(color: Colors.white), - ), - ), + ), + ), ], ), ), @@ -241,8 +254,8 @@ class EditPostPage extends StatelessWidget { home: Scaffold( body: Center( child: Container( - width: MediaQuery.of(context).size.width * 0.8, - height: MediaQuery.of(context).size.height * 0.5, + 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), @@ -266,19 +279,19 @@ class EditPostPage extends StatelessWidget { ), ), ElevatedButton( - style: ElevatedButton.styleFrom( - backgroundColor: Colors.purple), - onPressed: () { - }, - child: Text('Save', + style: + ElevatedButton.styleFrom(backgroundColor: Colors.purple), + onPressed: () {}, + child: Text( + 'Save', style: TextStyle(color: Colors.white), - ), - ), - ], + ), + ), + ], ), ), ), ), ); } -} \ No newline at end of file +} diff --git a/frontend/lib/pages/admin_pages/create_post_dialog.dart b/frontend/lib/pages/admin_pages/create_post_dialog.dart new file mode 100644 index 0000000..2a75295 --- /dev/null +++ b/frontend/lib/pages/admin_pages/create_post_dialog.dart @@ -0,0 +1,87 @@ +import 'package:flutter/material.dart'; +import 'package:intl/intl.dart'; + +import '../../models/admin_post_model.dart'; + +class CreatePostDialog extends StatefulWidget { + final Function(Post) onPostCreated; + + const CreatePostDialog({Key? key, required this.onPostCreated}) + : super(key: key); + + @override + _CreatePostDialogState createState() => _CreatePostDialogState(); +} + +class _CreatePostDialogState extends State { + final TextEditingController _nameController = TextEditingController(); + final TextEditingController _postController = TextEditingController(); + + @override + Widget build(BuildContext context) { + return AlertDialog( + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12)), + title: const Text("Create Post"), + content: Column( + mainAxisSize: MainAxisSize.min, + children: [ + TextField( + controller: _nameController, + decoration: const InputDecoration( + border: OutlineInputBorder(), + hintText: 'Enter your name', + ), + ), + const SizedBox(height: 10), + TextField( + controller: _postController, + maxLines: 4, + decoration: const InputDecoration( + border: OutlineInputBorder(), + hintText: 'Type your message', + ), + ), + ], + ), + actions: [ + TextButton( + onPressed: () => Navigator.pop(context), // Close dialog + child: const Text("Cancel"), + ), + ElevatedButton( + style: ElevatedButton.styleFrom(backgroundColor: Colors.purple), + onPressed: () { + if (_nameController.text.isNotEmpty && + _postController.text.isNotEmpty) { + DateTime now = DateTime.now(); + String formattedDate = DateFormat('dd/MMM hh:mm a').format(now); + + String daysAgo = "Today"; + DateTime postDate = now.subtract(const Duration(days: 0)); + int difference = now.difference(postDate).inDays; + + if (difference == 1) { + daysAgo = "Yesterday"; + } else if (difference > 1) { + daysAgo = "$difference Days ago"; + } + + String finalTime = "$daysAgo • $formattedDate"; + Post newPost = Post( + name: _nameController.text, + dateTime: finalTime, + description: _postController.text, + ); + widget.onPostCreated(newPost); // Add post to list + Navigator.pop(context); // Close dialog + } + }, + child: const Text( + 'Post', + style: TextStyle(color: Colors.white), + ), + ), + ], + ); + } +} diff --git a/frontend/lib/pages/common_pages/login_page.dart b/frontend/lib/pages/common_pages/login_page.dart index ee52a85..9cfa724 100644 --- a/frontend/lib/pages/common_pages/login_page.dart +++ b/frontend/lib/pages/common_pages/login_page.dart @@ -1,6 +1,6 @@ -import 'package:dev_track_app/pages/admin_pages/admin_dummy_home.dart'; +import 'package:dev_track_app/pages/admin_pages/admin_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:dev_track_app/pages/user_pages/user_feed_page.dart'; import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; @@ -112,8 +112,8 @@ class LoginPage extends StatelessWidget { MaterialPageRoute( builder: (context) => loginViewModel.user!.role == 'admin' - ? AdminDummyHome() - : UserDummyHome(), + ? AdminFeedPage() + : UserFeedPage(), ), ); } diff --git a/frontend/pubspec.lock b/frontend/pubspec.lock index d2a78e1..30dd8b1 100644 --- a/frontend/pubspec.lock +++ b/frontend/pubspec.lock @@ -264,6 +264,14 @@ packages: url: "https://pub.dev" source: hosted version: "0.2.1+1" + intl: + dependency: "direct main" + description: + name: intl + sha256: "3df61194eb431efc39c4ceba583b95633a403f46c9fd341e550ce0bfa50e9aa5" + url: "https://pub.dev" + source: hosted + version: "0.20.2" leak_tracker: dependency: transitive description: diff --git a/frontend/pubspec.yaml b/frontend/pubspec.yaml index 587953f..55d5da9 100644 --- a/frontend/pubspec.yaml +++ b/frontend/pubspec.yaml @@ -44,6 +44,7 @@ dependencies: file_picker: ^8.1.2 dio: ^5.3.2 provider: ^6.0.5 + intl: ^0.20.2 dev_dependencies: flutter_test: From a7b481da9c8f287957abca1258171d09cf366561 Mon Sep 17 00:00:00 2001 From: yvaishalirao Date: Wed, 26 Feb 2025 19:36:06 +0530 Subject: [PATCH 62/97] edit logic --- .../pages/admin_pages/admin_feed_page.dart | 54 ++++------ .../pages/admin_pages/edit_post_dialog.dart | 98 +++++++++++++++++++ 2 files changed, 116 insertions(+), 36 deletions(-) create mode 100644 frontend/lib/pages/admin_pages/edit_post_dialog.dart diff --git a/frontend/lib/pages/admin_pages/admin_feed_page.dart b/frontend/lib/pages/admin_pages/admin_feed_page.dart index d0c516c..70f42db 100644 --- a/frontend/lib/pages/admin_pages/admin_feed_page.dart +++ b/frontend/lib/pages/admin_pages/admin_feed_page.dart @@ -1,3 +1,4 @@ +import 'package:dev_track_app/pages/admin_pages/edit_post_dialog.dart'; import 'package:flutter/material.dart'; import '../../models/admin_post_model.dart'; @@ -30,7 +31,7 @@ class _FeedScreenState extends State { child: ListView.builder( itemCount: Post.samplePosts.length, itemBuilder: (context, index) => - _buildPostCard(Post.samplePosts[index], context), + _buildPostCard(Post.samplePosts[index], context, index), ), ), ], @@ -88,38 +89,7 @@ class _FeedScreenState extends State { ); } - 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(Post post, BuildContext context) { + Widget _buildPostCard(Post post, BuildContext context, int index) { return Container( margin: const EdgeInsets.symmetric(vertical: 8), padding: const EdgeInsets.all(16), @@ -175,9 +145,21 @@ class _FeedScreenState extends State { ), FloatingActionButton( onPressed: () { - Navigator.push( - context, - MaterialPageRoute(builder: (context) => EditPostPage()), + showDialog( + context: context, + builder: (context) => EditPostDialog( + index: index, + onPostUpdated: (updatedPost) { + setState(() { + Post.samplePosts[index] = updatedPost; + }); + }, + onPostDeleted: () { + setState(() { + Post.samplePosts.removeAt(index); + }); + }, + ), ); }, backgroundColor: Colors.purple, diff --git a/frontend/lib/pages/admin_pages/edit_post_dialog.dart b/frontend/lib/pages/admin_pages/edit_post_dialog.dart new file mode 100644 index 0000000..b91909e --- /dev/null +++ b/frontend/lib/pages/admin_pages/edit_post_dialog.dart @@ -0,0 +1,98 @@ +import 'package:flutter/material.dart'; +import 'package:intl/intl.dart'; + +import '../../models/admin_post_model.dart'; + +class EditPostDialog extends StatefulWidget { + final int index; + final Function(Post) onPostUpdated; + final Function() onPostDeleted; + + const EditPostDialog({ + Key? key, + required this.index, + required this.onPostUpdated, + required this.onPostDeleted, + }) : super(key: key); + + @override + _EditPostDialogState createState() => _EditPostDialogState(); +} + +class _EditPostDialogState extends State { + late TextEditingController _postController; + + @override + void initState() { + super.initState(); + _postController = + TextEditingController(text: Post.samplePosts[widget.index].description); + } + + @override + Widget build(BuildContext context) { + return Dialog( + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12)), + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Text( + 'Edit Post', + style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold), + ), + const SizedBox(height: 10), + TextField( + controller: _postController, + maxLines: 4, + decoration: InputDecoration( + border: OutlineInputBorder(), + hintText: 'Edit your message', + ), + ), + const SizedBox(height: 10), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + // DELETE BUTTON + ElevatedButton( + style: ElevatedButton.styleFrom( + backgroundColor: Colors.red, + ), + onPressed: () { + widget.onPostDeleted(); // Remove post + Navigator.pop(context); + }, + child: Text('Delete', style: TextStyle(color: Colors.white)), + ), + + // SAVE BUTTON + ElevatedButton( + style: ElevatedButton.styleFrom( + backgroundColor: Colors.purple, + ), + onPressed: () { + if (_postController.text.isNotEmpty) { + String updatedTime = + DateFormat("d/MMM hh:mm a").format(DateTime.now()); + Post updatedPost = Post( + name: Post.samplePosts[widget.index].name, + dateTime: "Edited • $updatedTime", // Mark as edited + description: _postController.text, + ); + + widget.onPostUpdated(updatedPost); + Navigator.pop(context); + } + }, + child: Text('Save', style: TextStyle(color: Colors.white)), + ), + ], + ), + ], + ), + ), + ); + } +} From 7909f32e80f9ad756dd778846bf455fd21974634 Mon Sep 17 00:00:00 2001 From: bharathan06 Date: Wed, 26 Feb 2025 20:18:17 +0530 Subject: [PATCH 63/97] 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 64/97] 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 65/97] 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. From 426f227fc22bf90c1195e0778d5defcf4f186498 Mon Sep 17 00:00:00 2001 From: bharathan06 Date: Wed, 26 Feb 2025 22:12:13 +0530 Subject: [PATCH 66/97] nvm --- .github/workflows/prevent-main-pr.yml | 15 --------------- 1 file changed, 15 deletions(-) delete mode 100644 .github/workflows/prevent-main-pr.yml diff --git a/.github/workflows/prevent-main-pr.yml b/.github/workflows/prevent-main-pr.yml deleted file mode 100644 index 03f0f52..0000000 --- a/.github/workflows/prevent-main-pr.yml +++ /dev/null @@ -1,15 +0,0 @@ -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 6327577c10fd22b1e9bf56f7c8329d8d871b4327 Mon Sep 17 00:00:00 2001 From: yvaishalirao Date: Wed, 26 Feb 2025 22:39:28 +0530 Subject: [PATCH 67/97] deleting waste --- .../pages/admin_pages/admin_feed_page.dart | 104 ------------------ 1 file changed, 104 deletions(-) diff --git a/frontend/lib/pages/admin_pages/admin_feed_page.dart b/frontend/lib/pages/admin_pages/admin_feed_page.dart index 70f42db..16c1ebc 100644 --- a/frontend/lib/pages/admin_pages/admin_feed_page.dart +++ b/frontend/lib/pages/admin_pages/admin_feed_page.dart @@ -173,107 +173,3 @@ 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, - height: MediaQuery.of(context).size.height * 0.5, - 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: () { - Navigator.push( - context, - MaterialPageRoute(builder: (context) => AdminFeedPage()), - ); - }, - 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, - height: MediaQuery.of(context).size.height * 0.5, - 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), - ), - ), - ], - ), - ), - ), - ), - ); - } -} From a0346ad20cc163d4e8ed379974a9c4a740016e8a Mon Sep 17 00:00:00 2001 From: Kartikjarali010 Date: Fri, 28 Feb 2025 00:17:42 +0530 Subject: [PATCH 68/97] team card --- frontend/lib/models/team_member.dart | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 frontend/lib/models/team_member.dart diff --git a/frontend/lib/models/team_member.dart b/frontend/lib/models/team_member.dart new file mode 100644 index 0000000..277958b --- /dev/null +++ b/frontend/lib/models/team_member.dart @@ -0,0 +1,17 @@ +class TeamMember { + final String name; + final String branch; + final String sem; + final String link; + + TeamMember({required this.name, required this.branch, required this.sem, required this.link}); + + factory TeamMember.fromJson(Map json) { + return TeamMember( + name: json['name'], + branch: json['branch'], + sem: json['sem'], + link: json['link'], + ); + } +} \ No newline at end of file From 262d31b77ad8769bf9682747443d4e5b10798369 Mon Sep 17 00:00:00 2001 From: Kartikjarali010 Date: Fri, 28 Feb 2025 00:27:52 +0530 Subject: [PATCH 69/97] made team card page and seperated member card model...... --- .../project_display/teamcard.dart | 191 +++++++++++++----- 1 file changed, 137 insertions(+), 54 deletions(-) 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 bfc0eb8..42bfd99 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,75 +1,158 @@ import 'package:flutter/material.dart'; -import 'package:url_launcher/url_launcher.dart'; -import '../../../../models/std_class.dart'; -class TeamCard extends StatefulWidget { - final STD std; - const TeamCard({super.key, required this.std}); + +class TeamcardPage extends StatefulWidget { @override - State createState() => _TeamCardState(); + _TeamPageState createState() => _TeamPageState(); } -class _TeamCardState extends State { +class _TeamPageState extends State with SingleTickerProviderStateMixin { + late TabController _tabController; + @override - Widget build(BuildContext context) { - return SingleChildScrollView( - scrollDirection: Axis.horizontal, - child: Container( - child: SizedBox( - width: 150, - child: Card( - clipBehavior: Clip.antiAlias, - elevation: 0, + void initState() { + super.initState(); + _tabController = TabController(length: 3, vsync: this); + } + + @override + void dispose() { + _tabController.dispose(); + super.dispose(); + } - // shape: RoundedRectangleBorder( - // borderRadius: BorderRadius.circular(10) - // ), + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: Colors.white, + appBar: AppBar( + backgroundColor: Colors.white, + actions: [ + IconButton( + icon: Icon(Icons.notifications), + onPressed: () {}, + ) + ], + ), + body: Column( + children: [ + Padding( + padding: const EdgeInsets.all(16.0), child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Container( - height: 150, - decoration: BoxDecoration( - border: Border.all(color: Colors.black26), - borderRadius: BorderRadius.circular( - 10), // Adjust the radius as needed - ), - child: ClipRRect( - 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 - ), - ), - ), - SizedBox( - height: 5, + crossAxisAlignment: CrossAxisAlignment.values[0], + children: const [ + Text('Team name.', style: TextStyle(fontSize: 18)), + SizedBox(height: 8), + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text('Project name', style: TextStyle(fontSize: 24, fontWeight: FontWeight.bold)), + SizedBox(height: 8), + ] ), Row( + mainAxisAlignment: MainAxisAlignment.center, children: [ - InkWell( - onTap: () async { - final url = widget.std.linkedin; - if (await canLaunch(url)) { - await launch(url); - } else { - throw 'Could not launch $url'; - } - }, - child: Icon(Icons.person), - ), - Text(widget.std.name), + Text('Team no.', style: TextStyle(fontSize: 16)), ], ), + SizedBox(height: 40), + //idk this was there in the design....!!! + //shuld i keep it...?? + // Padding( + // padding: const EdgeInsets.fromLTRB(30, 0, 30, 0), + // child: TextField( + // decoration: InputDecoration( + // filled: true, + // fillColor: Colors.white, + // border: OutlineInputBorder(), + // ), + // ), + // ), + // SizedBox(height: 16), + // Padding( + // padding: const EdgeInsets.fromLTRB(30, 0, 30, 0), + // child: TextField( + // decoration: InputDecoration( + // filled: true, + // fillColor: Colors.white, + // border: OutlineInputBorder(), + // ), + // ), + // ), ], ), ), - ), + TabBar( + controller: _tabController, + tabs: [ + Tab(text: 'About'), + Tab(text: 'Members'), + Tab(text: 'Project'), + ], + indicatorColor: Colors.purple, + ), + Expanded( + child: TabBarView( + controller: _tabController, + children: [ + Center(child: Text('About Content')), + MembersTab(), + Center(child: Text('Project Content')), + ], + ), + ), + ], ), ); } } + +class MembersTab extends StatelessWidget { + @override + Widget build(BuildContext context) { + return ListView( + padding: EdgeInsets.all(16.0), + children: [ + memberCard('Nameeeee', 'Aiml', '6', 'in'), + memberCard('Nameeeee', 'Aiml', '6', 'in'), + memberCard('Nameeeee', 'Aiml', '6', 'in'), + memberCard('Nameeeee', 'Aiml', '6', 'in'), + Padding( + padding: const EdgeInsets.only(top: 16.0), + child: GestureDetector( + child: Text('edit members', style: TextStyle(color: Colors.purple)), + onTap: () { + // handle edit logic + }, + ), + ), + ], + ); + } + + Widget memberCard(String name, String branch, String sem, String link) { + return Card( + elevation: 4, + margin: EdgeInsets.symmetric(vertical: 8), + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(name, style: TextStyle(fontWeight: FontWeight.bold)), + Text(branch), + Text('Sem: $sem'), + ], + ), + Text(link, style: TextStyle(color: Colors.purple)), + ], + ), + ), + ); + } +} \ No newline at end of file From 2b0d2537a407972e3a6022e6f10ed6a21fb8028e Mon Sep 17 00:00:00 2001 From: Kartikjarali010 Date: Fri, 28 Feb 2025 00:45:43 +0530 Subject: [PATCH 70/97] deleted model and added it in the card page itslef --- frontend/lib/models/team_member.dart | 17 ----------------- 1 file changed, 17 deletions(-) delete mode 100644 frontend/lib/models/team_member.dart diff --git a/frontend/lib/models/team_member.dart b/frontend/lib/models/team_member.dart deleted file mode 100644 index 277958b..0000000 --- a/frontend/lib/models/team_member.dart +++ /dev/null @@ -1,17 +0,0 @@ -class TeamMember { - final String name; - final String branch; - final String sem; - final String link; - - TeamMember({required this.name, required this.branch, required this.sem, required this.link}); - - factory TeamMember.fromJson(Map json) { - return TeamMember( - name: json['name'], - branch: json['branch'], - sem: json['sem'], - link: json['link'], - ); - } -} \ No newline at end of file From 6f425d9b0e41ef8b429e3cd7506e73709cbe1cb0 Mon Sep 17 00:00:00 2001 From: bharathan06 Date: Fri, 28 Feb 2025 18:02:05 +0530 Subject: [PATCH 71/97] solved backend error --- backend/myproject/.env | 19 +++++--- backend/myproject/myproject/settings.py | 40 ++++++++--------- requirements.txt | 58 +++++++++++++++++++++++++ 3 files changed, 91 insertions(+), 26 deletions(-) create mode 100644 requirements.txt diff --git a/backend/myproject/.env b/backend/myproject/.env index 361fe0b..5e25a82 100644 --- a/backend/myproject/.env +++ b/backend/myproject/.env @@ -1,7 +1,14 @@ -DB_NAME=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 -DATABASE_URL=postgres://postgres:GOMxZBnMwtF5VPYk@aws-0-ap-south-1.pooler.supabase.com:6543/postgres?sslmode=require +# # DB_NAME=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 + +# user=postgres.amvehcfjlboxobrignky +# password=[YOUR-PASSWORD] +# host=aws-0-ap-south-1.pooler.supabase.com +# port=5432 +# dbname=postgres + +DATABASE_URL=postgresql://postgres.amvehcfjlboxobrignky:GOMxZBnMwtF5VPYk@aws-0-ap-south-1.pooler.supabase.com:5432/postgres DJANGO_ENV=test diff --git a/backend/myproject/myproject/settings.py b/backend/myproject/myproject/settings.py index a91eeb5..1a0558b 100644 --- a/backend/myproject/myproject/settings.py +++ b/backend/myproject/myproject/settings.py @@ -103,30 +103,30 @@ # Database # https://docs.djangoproject.com/en/5.0/ref/settings/#databases -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 - 'OPTIONS': {'sslmode': 'require'}, - } +import os +import dj_database_url +from pathlib import Path + +BASE_DIR = Path(__file__).resolve().parent.parent + +# Default: Use SQLite in development +DATABASES = { + "default": { + "ENGINE": "django.db.backends.sqlite3", + "NAME": BASE_DIR / "db.sqlite3", } -else: +} + +# Use PostgreSQL in production +if os.getenv("DJANGO_ENV") == "production": DATABASES = { - 'default': { - 'ENGINE': 'django.db.backends.sqlite3', - 'NAME': BASE_DIR / 'db.sqlite3', # Use Pathlib for cross-platform support - } + "default": dj_database_url.config( + default=os.getenv("DATABASE_URL"), # Use Render's environment variable + conn_max_age=600, + ssl_require=True + ) } -import dj_database_url -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 # https://docs.djangoproject.com/en/5.0/ref/settings/#auth-password-validators diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..4296410 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,58 @@ +aiohappyeyeballs==2.4.6 +aiohttp==3.11.13 +aiosignal==1.3.2 +annotated-types==0.7.0 +anyio==4.8.0 +asgiref==3.8.1 +attrs==25.1.0 +certifi==2025.1.31 +cffi==1.17.1 +contextlib2==21.6.0 +cryptography==44.0.1 +debugpy==1.8.12 +deprecation==2.1.0 +dj-database-url==2.3.0 +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 +djangorestframework==3.15.2 +djangorestframework_simplejwt==5.4.0 +frozenlist==1.5.0 +gotrue==2.11.4 +gunicorn==23.0.0 +h11==0.14.0 +h2==4.2.0 +hpack==4.1.0 +httpcore==1.0.7 +httpx==0.28.1 +hyperframe==6.1.0 +idna==3.10 +injector==0.22.0 +multidict==6.1.0 +packaging==24.2 +pillow==11.1.0 +postgrest==0.19.3 +propcache==0.3.0 +psycopg2==2.9.10 +psycopg2-binary==2.9.10 +pycparser==2.22 +pydantic==2.10.6 +pydantic_core==2.27.2 +PyJWT==2.10.1 +python-dateutil==2.9.0.post0 +python-dotenv==1.0.1 +realtime==2.4.1 +six==1.17.0 +sniffio==1.3.1 +sqlparse==0.5.3 +storage3==0.11.3 +StrEnum==0.4.15 +supabase==2.13.0 +supafunc==0.9.3 +typing_extensions==4.12.2 +tzdata==2025.1 +websockets==14.2 +whitenoise==6.9.0 +yarl==1.18.3 From 73b98afa56a74e4f5db2cbe388605fc86ad4086e Mon Sep 17 00:00:00 2001 From: bharathan06 Date: Fri, 28 Feb 2025 18:17:52 +0530 Subject: [PATCH 72/97] hotfiix --- backend/myproject/members/api.py | 4 ++-- backend/myproject/members/schemas.py | 18 +++++++++--------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/backend/myproject/members/api.py b/backend/myproject/members/api.py index 61719fc..4a5ff4f 100644 --- a/backend/myproject/members/api.py +++ b/backend/myproject/members/api.py @@ -18,8 +18,8 @@ def __init__(self) -> None: # 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): - result = self.auth_service.login_user(request, payload.email, payload.password) + def login_view(self, request, data: schemas.SignInSchema): + result = self.auth_service.login_user(request, data.email, data.password) if result: return result return JsonResponse({"detail": "Invalid credentials"}, status=401) diff --git a/backend/myproject/members/schemas.py b/backend/myproject/members/schemas.py index 7686249..0063e64 100644 --- a/backend/myproject/members/schemas.py +++ b/backend/myproject/members/schemas.py @@ -5,12 +5,12 @@ -class SignInSchema(BaseModel): +class SignInSchema(Schema): email: str password: str - model_config = {"arbitrary_types_allowed": True} - + class Config: + arbitrary_types_allowed = True class RegisterSchema(ModelSchema): class Meta: @@ -23,17 +23,16 @@ class Meta: 'srn', ] - model_config = {"arbitrary_types_allowed": True} + class Config: + arbitrary_types_allowed = True class LoginResponseSchema(Schema): message: str role: str csrf_token: str - model_config = { - "arbitrary_types_allowed": True, - } - + class Config: + arbitrary_types_allowed = True class UserProfileResponseSchema(Schema): username: str @@ -41,4 +40,5 @@ class UserProfileResponseSchema(Schema): github: str fname: str - model_config = {"arbitrary_types_allowed": True} \ No newline at end of file + class Config: + arbitrary_types_allowed = True From d079385ef60989a27ebf685f9f6bb3c575e178d2 Mon Sep 17 00:00:00 2001 From: ghamani <138302691+Ghamani121@users.noreply.github.com> Date: Fri, 28 Feb 2025 23:11:11 +0530 Subject: [PATCH 73/97] Integrated user feed api 1. Moved files to "to be discarded" 2. Updated ui for user feed page 3. Created 3 new files, model, view model, and api file 4. Added view models folder --- .../lib/{api => To-Be-Discarded}/api.dart | 0 .../{models => To-Be-Discarded}/models.dart | 0 .../{routing => To-Be-Discarded}/routes.dart | 0 .../topNav.dart | 0 frontend/lib/api/user_feed_api.dart | 73 ++++++++++ frontend/lib/main.dart | 8 +- frontend/lib/models/user_feed_model.dart | 27 ++++ .../lib/pages/common_pages/login_page.dart | 3 +- .../lib/pages/user_pages/user_feed_page.dart | 134 +++++++++++------- .../login_view_model.dart | 0 .../lib/view_models/user_feed_view_model.dart | 30 ++++ frontend/pubspec.yaml | 2 +- 12 files changed, 220 insertions(+), 57 deletions(-) rename frontend/lib/{api => To-Be-Discarded}/api.dart (100%) rename frontend/lib/{models => To-Be-Discarded}/models.dart (100%) rename frontend/lib/{routing => To-Be-Discarded}/routes.dart (100%) rename frontend/lib/{pages/common_pages/domain_pages => To-Be-Discarded}/topNav.dart (100%) create mode 100644 frontend/lib/api/user_feed_api.dart create mode 100644 frontend/lib/models/user_feed_model.dart rename frontend/lib/{models => view_models}/login_view_model.dart (100%) create mode 100644 frontend/lib/view_models/user_feed_view_model.dart diff --git a/frontend/lib/api/api.dart b/frontend/lib/To-Be-Discarded/api.dart similarity index 100% rename from frontend/lib/api/api.dart rename to frontend/lib/To-Be-Discarded/api.dart diff --git a/frontend/lib/models/models.dart b/frontend/lib/To-Be-Discarded/models.dart similarity index 100% rename from frontend/lib/models/models.dart rename to frontend/lib/To-Be-Discarded/models.dart diff --git a/frontend/lib/routing/routes.dart b/frontend/lib/To-Be-Discarded/routes.dart similarity index 100% rename from frontend/lib/routing/routes.dart rename to frontend/lib/To-Be-Discarded/routes.dart diff --git a/frontend/lib/pages/common_pages/domain_pages/topNav.dart b/frontend/lib/To-Be-Discarded/topNav.dart similarity index 100% rename from frontend/lib/pages/common_pages/domain_pages/topNav.dart rename to frontend/lib/To-Be-Discarded/topNav.dart diff --git a/frontend/lib/api/user_feed_api.dart b/frontend/lib/api/user_feed_api.dart new file mode 100644 index 0000000..c0b272e --- /dev/null +++ b/frontend/lib/api/user_feed_api.dart @@ -0,0 +1,73 @@ +// user_feed_api.dart + +import 'dart:convert'; +import 'package:http/http.dart' as http; +import '../models/user_feed_model.dart'; +import 'package:shared_preferences/shared_preferences.dart'; + +class UserFeedApi { + static const String feedUrl = 'https://dev-track-app.onrender.com/api/posts/'; + + Future> getUserFeed() async { + + print('--- UserFeedService: getUserFeed() called ---'); + + // Retrieve the stored CSRF token + final prefs = await SharedPreferences.getInstance(); + final csrfToken = prefs.getString('csrf_token'); + print('CSRF token from prefs: $csrfToken'); + + // 2. Prepare the headers + final headers = { + 'Content-Type': 'application/json', + // If your server expects a different header (e.g., Authorization), change it here + 'X-CSRFToken': csrfToken ?? '', + }; + + print('Making GET request to $feedUrl'); + print('Request headers: $headers'); + + + + // // If your Django backend expects the CSRF token in a header like "X-CSRFToken": + // final response = await http.get( + // Uri.parse(feedUrl), + // headers: { + // 'Content-Type': 'application/json', + // 'X-CSRFToken': csrfToken ?? '', + // }, + // ); + try { + // 3. Make the GET request + final response = await http.get(Uri.parse(feedUrl), headers: headers); + + print('Response status: ${response.statusCode}'); + print('Response body: ${response.body}'); + + // 4. Check if the call was successful + if (response.statusCode == 200) { + final List data = json.decode(response.body); + print('Parsed data length: ${data.length}'); + // Convert each item in the list to UserFeedModel + return data.map((item) => UserFeedModel.fromJson(item)).toList(); + } else { + // If not 200, throw an error with status & body + throw Exception('Could not fetch user feed: ' + 'Status ${response.statusCode} - ${response.body}'); + } + } catch (e) { + // Catch any network or parsing exceptions + print('Exception in getUserFeed: $e'); + rethrow; // rethrow so the ViewModel can handle it + } + } +} + +// if (response.statusCode == 200) { +// final List data = json.decode(response.body); +// return data.map((jsonItem) => UserFeedModel.fromJson(jsonItem)).toList(); +// } else { +// throw Exception('Failed to load feed: ${response.body}'); +// } +// } +// } diff --git a/frontend/lib/main.dart b/frontend/lib/main.dart index f95bc9f..d271ab0 100644 --- a/frontend/lib/main.dart +++ b/frontend/lib/main.dart @@ -1,8 +1,10 @@ +import 'package:dev_track_app/view_models/user_feed_view_model.dart'; import 'package:dev_track_app/pages/common_pages/login_page.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; +import 'view_models/login_view_model.dart'; +import 'pages/user_pages/user_feed_page.dart'; -import 'models/login_view_model.dart'; // void main() { // runApp(const MyApp()); @@ -13,6 +15,7 @@ void main() { MultiProvider( providers: [ ChangeNotifierProvider(create: (_) => LoginViewModel()), + ChangeNotifierProvider(create: (_) => UserFeedViewModel()), ], child: const MyApp(), ), @@ -30,7 +33,8 @@ class MyApp extends StatelessWidget { primarySwatch: Colors.green, ), debugShowCheckedModeBanner: false, - home: LoginPage(), + home: UserFeedPage(), + // home: LoginPage(), ); } } diff --git a/frontend/lib/models/user_feed_model.dart b/frontend/lib/models/user_feed_model.dart new file mode 100644 index 0000000..c5811c3 --- /dev/null +++ b/frontend/lib/models/user_feed_model.dart @@ -0,0 +1,27 @@ +// user_feed_model.dart + +class UserFeedModel { + final int id; + final String title; + final String description; + final DateTime createdAt; + final int createdById; + + UserFeedModel({ + required this.id, + required this.title, + required this.description, + required this.createdAt, + required this.createdById, + }); + + factory UserFeedModel.fromJson(Map json) { + return UserFeedModel( + id: json['id'], + title: json['title'], + description: json['description'], + createdAt: DateTime.parse(json['created_at']), + createdById: json['created_by'], + ); + } +} diff --git a/frontend/lib/pages/common_pages/login_page.dart b/frontend/lib/pages/common_pages/login_page.dart index ee52a85..331a9dc 100644 --- a/frontend/lib/pages/common_pages/login_page.dart +++ b/frontend/lib/pages/common_pages/login_page.dart @@ -4,8 +4,7 @@ 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'; +import '../../view_models/login_view_model.dart'; class LoginPage extends StatelessWidget { final TextEditingController emailController = TextEditingController(); diff --git a/frontend/lib/pages/user_pages/user_feed_page.dart b/frontend/lib/pages/user_pages/user_feed_page.dart index 1024410..da303f0 100644 --- a/frontend/lib/pages/user_pages/user_feed_page.dart +++ b/frontend/lib/pages/user_pages/user_feed_page.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; - - +import 'package:provider/provider.dart'; +import 'package:dev_track_app/models/user_feed_model.dart'; +import 'package:dev_track_app/view_models/user_feed_view_model.dart'; class UserFeedPage extends StatefulWidget { const UserFeedPage({super.key}); @@ -9,21 +10,33 @@ class UserFeedPage extends StatefulWidget { State createState() => _UserFeedPageState(); } -class Post { - final String details; - - Post({required this.details}); -} - +// class Post { +// final String details; +// Post({required this.details}); +// } class _UserFeedPageState extends State { - final List posts = [ - Post(details: "Post 1 details"), - Post(details: 'Post 2 details'), - Post(details: 'Post 3 details'), - ]; + // final List posts = [ + // Post(details: "Post 1 details"), + // Post(details: 'Post 2 details'), + // Post(details: 'Post 3 details'), + // ]; + + @override + // void initState() { + // super.initState(); + // // Fetch feed data as soon as the screen is initialized + // Provider.of(context, listen: false).fetchUserFeed(); + // } + + void initState() { + super.initState(); + Future.microtask(() { + context.read().fetchUserFeed(); + }); + } @override Widget build(BuildContext context) { @@ -39,15 +52,30 @@ class _UserFeedPageState extends State { const SizedBox(height: 10), _buildHeader(), const SizedBox(height: 10), - _buildTabBar(), - const SizedBox(height: 10), + // _buildTabBar(), + // const SizedBox(height: 10), + + // Main Feed Area Expanded( - child: ListView.builder( - itemCount: posts.length, - itemBuilder: (context, index) => PostCard( - post: posts[index], - onViewMore: () => showPopup(context, posts[index]), - ), + child: Consumer( + builder: (context, feedVM, child) { + if (feedVM.isLoading) { + return const Center(child: CircularProgressIndicator()); + } + if (feedVM.errorMessage != null) { + return Center(child: Text(feedVM.errorMessage!)); + } + return ListView.builder( + itemCount: feedVM.feedItems.length, + itemBuilder: (context, index) { + final post = feedVM.feedItems[index]; + return UserFeedCard( + post: post, + onViewMore: () => _showPopup(context, post), + ); + }, + ); + }, ), ), ], @@ -73,16 +101,16 @@ class _UserFeedPageState extends State { ); } - void showPopup(BuildContext context, Post post) { + void _showPopup(BuildContext context, UserFeedModel post) { showDialog( context: context, builder: (BuildContext context) { return AlertDialog( - title: const Text("Post Details"), - content: Text(post.details), // fetchhh post details..... + title: Text(post.title), + content: Text(post.description), // fetchhh post details..... actions: [ TextButton( - onPressed: () => Navigator.of(context).pop(), + onPressed: () => Navigator.of(context).pop(), child: const Text("Close"), ), ], @@ -104,22 +132,22 @@ class _UserFeedPageState extends State { ); } - 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 _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( @@ -136,13 +164,11 @@ class _UserFeedPageState extends State { } } - - -class PostCard extends StatelessWidget { - final Post post; +class UserFeedCard extends StatelessWidget { + final UserFeedModel post; final VoidCallback onViewMore; - const PostCard({super.key, required this.post, required this.onViewMore}); + const UserFeedCard({Key? key, required this.post, required this.onViewMore,}):super(key: key); @override Widget build(BuildContext context) { @@ -165,14 +191,16 @@ class PostCard extends StatelessWidget { const SizedBox(width: 10), Column( crossAxisAlignment: CrossAxisAlignment.start, - children: const [ - Text( + children: [ + // Name or "created_by_id" can be used if your API returns it + const Text( "Name", style: TextStyle(fontWeight: FontWeight.bold, fontSize: 16), ), + // Example: format from post.createdAt Text( - "2 Days ago • DD/month Time", - style: TextStyle(fontSize: 12, color: Colors.grey), + "Posted on ${post.createdAt}", + style: const TextStyle(fontSize: 12, color: Colors.grey), ), ], ), @@ -180,10 +208,11 @@ class PostCard extends StatelessWidget { ), const SizedBox(height: 10), Text( - post.details, + post.description, style: const TextStyle(fontSize: 14), ), const SizedBox(height: 10), + Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ @@ -203,7 +232,8 @@ class PostCard extends StatelessWidget { onPressed: onViewMore, backgroundColor: Colors.purple, mini: true, - child: const Icon(Icons.arrow_forward, color: Colors.white, size: 18), + child: const Icon(Icons.arrow_forward, + color: Colors.white, size: 18), ), ], ), diff --git a/frontend/lib/models/login_view_model.dart b/frontend/lib/view_models/login_view_model.dart similarity index 100% rename from frontend/lib/models/login_view_model.dart rename to frontend/lib/view_models/login_view_model.dart diff --git a/frontend/lib/view_models/user_feed_view_model.dart b/frontend/lib/view_models/user_feed_view_model.dart new file mode 100644 index 0000000..ca36594 --- /dev/null +++ b/frontend/lib/view_models/user_feed_view_model.dart @@ -0,0 +1,30 @@ +// user_feed_view_model.dart + +import 'package:dev_track_app/api/user_feed_api.dart'; +import 'package:flutter/material.dart'; +import '../models/user_feed_model.dart'; + +class UserFeedViewModel extends ChangeNotifier { + final UserFeedApi _feedApi = UserFeedApi(); + + bool isLoading = false; + String? errorMessage; + List feedItems = []; + + Future fetchUserFeed() async { + isLoading = true; + errorMessage = null; + notifyListeners(); + + try { + feedItems = await _feedApi.getUserFeed(); + // Sort by date (most recent on top) if needed + feedItems.sort((a, b) => b.createdAt.compareTo(a.createdAt)); + } catch (e) { + errorMessage = 'Could not fetch user feed: $e'; + } + + isLoading = false; + notifyListeners(); + } +} diff --git a/frontend/pubspec.yaml b/frontend/pubspec.yaml index 587953f..4db5072 100644 --- a/frontend/pubspec.yaml +++ b/frontend/pubspec.yaml @@ -30,7 +30,7 @@ environment: dependencies: flutter: sdk: flutter - + http: ^1.3.0 # The following adds the Cupertino Icons font to your application. # Use with the CupertinoIcons class for iOS style icons. From 7b2fc278f3dc43650e93ca5d62e4f1a175b8a0ac Mon Sep 17 00:00:00 2001 From: bharathan06 Date: Fri, 28 Feb 2025 23:18:16 +0530 Subject: [PATCH 74/97] yeah --- backend/myproject/projects/api.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/myproject/projects/api.py b/backend/myproject/projects/api.py index 48f87a9..86449d0 100644 --- a/backend/myproject/projects/api.py +++ b/backend/myproject/projects/api.py @@ -45,7 +45,7 @@ def list_domain(self, request): #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) + return self.project_service.create_project_cycle(payload) # #API call to create a new project From c0b588063d009bb31980635e126819c4884c20a9 Mon Sep 17 00:00:00 2001 From: ghamani <138302691+Ghamani121@users.noreply.github.com> Date: Fri, 28 Feb 2025 23:27:16 +0530 Subject: [PATCH 75/97] Updated --- frontend/lib/api/user_feed_api.dart | 18 ------------------ frontend/lib/main.dart | 4 ++-- 2 files changed, 2 insertions(+), 20 deletions(-) diff --git a/frontend/lib/api/user_feed_api.dart b/frontend/lib/api/user_feed_api.dart index c0b272e..6187b64 100644 --- a/frontend/lib/api/user_feed_api.dart +++ b/frontend/lib/api/user_feed_api.dart @@ -27,16 +27,6 @@ class UserFeedApi { print('Making GET request to $feedUrl'); print('Request headers: $headers'); - - - // // If your Django backend expects the CSRF token in a header like "X-CSRFToken": - // final response = await http.get( - // Uri.parse(feedUrl), - // headers: { - // 'Content-Type': 'application/json', - // 'X-CSRFToken': csrfToken ?? '', - // }, - // ); try { // 3. Make the GET request final response = await http.get(Uri.parse(feedUrl), headers: headers); @@ -63,11 +53,3 @@ class UserFeedApi { } } -// if (response.statusCode == 200) { -// final List data = json.decode(response.body); -// return data.map((jsonItem) => UserFeedModel.fromJson(jsonItem)).toList(); -// } else { -// throw Exception('Failed to load feed: ${response.body}'); -// } -// } -// } diff --git a/frontend/lib/main.dart b/frontend/lib/main.dart index d271ab0..5d8ee03 100644 --- a/frontend/lib/main.dart +++ b/frontend/lib/main.dart @@ -33,8 +33,8 @@ class MyApp extends StatelessWidget { primarySwatch: Colors.green, ), debugShowCheckedModeBanner: false, - home: UserFeedPage(), - // home: LoginPage(), + // home: UserFeedPage(), + home: LoginPage(), ); } } From a1e321514f8d340afea2b3961009cb10654ab1e1 Mon Sep 17 00:00:00 2001 From: ghamani <138302691+Ghamani121@users.noreply.github.com> Date: Sat, 1 Mar 2025 01:20:06 +0530 Subject: [PATCH 76/97] Updated Added polling to update data in real time --- .../lib/view_models/user_feed_view_model.dart | 89 ++++++++++++++++--- 1 file changed, 77 insertions(+), 12 deletions(-) diff --git a/frontend/lib/view_models/user_feed_view_model.dart b/frontend/lib/view_models/user_feed_view_model.dart index ca36594..21b7586 100644 --- a/frontend/lib/view_models/user_feed_view_model.dart +++ b/frontend/lib/view_models/user_feed_view_model.dart @@ -1,5 +1,4 @@ -// user_feed_view_model.dart - +import 'dart:async'; import 'package:dev_track_app/api/user_feed_api.dart'; import 'package:flutter/material.dart'; import '../models/user_feed_model.dart'; @@ -10,21 +9,87 @@ class UserFeedViewModel extends ChangeNotifier { bool isLoading = false; String? errorMessage; List feedItems = []; + Timer? _pollingTimer; + + UserFeedViewModel() { + fetchUserFeed(); // Initial fetch when ViewModel is created + startPolling(); // Start polling automatically + } + + Future fetchUserFeed({bool showLoading = false}) async { + if (showLoading) { + isLoading = true; + notifyListeners(); + } + + try { - Future fetchUserFeed() async { - isLoading = true; - errorMessage = null; - notifyListeners(); + final newFeedItems = await _feedApi.getUserFeed(); + newFeedItems.sort((a, b) => b.createdAt.compareTo(a.createdAt)); - try { - feedItems = await _feedApi.getUserFeed(); - // Sort by date (most recent on top) if needed - feedItems.sort((a, b) => b.createdAt.compareTo(a.createdAt)); + // Force UI update by replacing the list reference(ensures ui is replaced during update operation) + feedItems.clear(); + feedItems.addAll(newFeedItems); + notifyListeners(); + } catch (e) { errorMessage = 'Could not fetch user feed: $e'; + notifyListeners(); } - isLoading = false; - notifyListeners(); + if (showLoading) { + isLoading = false; + notifyListeners(); + } + } + + void startPolling({int intervalSeconds = 10}) { + _pollingTimer?.cancel(); + _pollingTimer = Timer.periodic(Duration(seconds: intervalSeconds), (timer) { + fetchUserFeed(); // Fetch without showing a loading indicator + }); + } + + void stopPolling() { + _pollingTimer?.cancel(); + } + + @override + void dispose() { + stopPolling(); + super.dispose(); } } + + + +// import 'package:dev_track_app/api/user_feed_api.dart'; +// import 'package:flutter/material.dart'; +// import '../models/user_feed_model.dart'; + +// class UserFeedViewModel extends ChangeNotifier { +// final UserFeedApi _feedApi = UserFeedApi(); + +// bool isLoading = false; +// String? errorMessage; +// List feedItems = []; + +// Future fetchUserFeed() async { +// isLoading = true; +// errorMessage = null; +// notifyListeners(); + +// try { +// feedItems = await _feedApi.getUserFeed(); +// // Sort by date (most recent on top) if needed +// feedItems.sort((a, b) => b.createdAt.compareTo(a.createdAt)); +// } catch (e) { +// errorMessage = 'Could not fetch user feed: $e'; +// } + +// isLoading = false; +// notifyListeners(); +// } +// } + + From 76b91eecab7095b82c4614292733203528b766df Mon Sep 17 00:00:00 2001 From: bharathan06 Date: Sat, 1 Mar 2025 10:19:15 +0530 Subject: [PATCH 77/97] hotfix for user auth session id --- backend/myproject/myproject/settings.py | 5 +++++ backend/myproject/registrations/api.py | 8 ++++++-- backend/myproject/registrations/services.py | 12 +++++++++++- 3 files changed, 22 insertions(+), 3 deletions(-) diff --git a/backend/myproject/myproject/settings.py b/backend/myproject/myproject/settings.py index 1a0558b..46be4f8 100644 --- a/backend/myproject/myproject/settings.py +++ b/backend/myproject/myproject/settings.py @@ -60,6 +60,11 @@ "django.contrib.auth.backends.ModelBackend", ] +NINJA_AUTHENTICATION = [ + "members.services.CustomSessionAuth" +] + + REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': [ 'rest_framework.authentication.SessionAuthentication', diff --git a/backend/myproject/registrations/api.py b/backend/myproject/registrations/api.py index b1fdd21..cd966e4 100644 --- a/backend/myproject/registrations/api.py +++ b/backend/myproject/registrations/api.py @@ -1,7 +1,10 @@ from ninja import Router from ninja_extra import ControllerBase, api_controller, route from .schemas import ProjectApplicationSchema -from .services import ProjectApplicationService +from .services import ProjectApplicationService, CustomSessionAuth +from ninja.security import HttpBearer + + @api_controller("/applications", tags=["Project Applications"]) class ProjectApplicationAPI(ControllerBase): @@ -9,7 +12,8 @@ class ProjectApplicationAPI(ControllerBase): def __init__(self) -> None: self.application_service = ProjectApplicationService() - @route.post("/enroll", url_name="Enroll in Project") + + @route.post("/enroll", url_name="Enroll in Project", auth=CustomSessionAuth()) def enroll_now(self, request, payload: ProjectApplicationSchema): response = self.application_service.enroll_user(request, payload) return response diff --git a/backend/myproject/registrations/services.py b/backend/myproject/registrations/services.py index ff9d00a..5d58729 100644 --- a/backend/myproject/registrations/services.py +++ b/backend/myproject/registrations/services.py @@ -1,7 +1,9 @@ from django.shortcuts import get_object_or_404 from projects.models import DomainModel, ProjectCycleModel from .models import ProjectApplicationModel -from ninja.errors import HttpError +from ninja.errors import HttpError, AuthenticationError +from ninja.security import HttpBearer + class ProjectApplicationService: def enroll_user(self, request, payload): @@ -42,3 +44,11 @@ def enroll_user(self, request, payload): return {"message": "You have already applied for this cycle."} return {"message": "Application submitted successfully, hang tight!"} + + +class CustomSessionAuth(HttpBearer): + def authenticate(self, request, token=None): + print(f"Session Key: {request.session.session_key}") # Debugging + if request.user.is_authenticated: + return request.user + raise AuthenticationError("Session authentication failed") From ad4d41f0ba9bc811447f394449a7fc134fc3a79a Mon Sep 17 00:00:00 2001 From: Piyush Chakarborthy <102757301+Chakravartinsamrat@users.noreply.github.com> Date: Sat, 1 Mar 2025 21:05:29 +0530 Subject: [PATCH 78/97] Commit before merging another branch --- frontend/lib/api/enrollment_api.dart | 140 +++++++++ frontend/lib/main.dart | 5 +- frontend/lib/models/domain_model.dart | 13 + frontend/lib/models/enrollment_model.dart | 64 ++++ .../user_pages/enroll_pages/enroll_page.dart | 99 +++++++ .../enroll_pages/enroll_sucess.dart | 0 .../enroll_pages/enrollment_select.dart | 278 ++++++++++++++++++ .../lib/pages/user_pages/user_dummy_home.dart | 1 + frontend/lib/theme/colors.dart | 1 + .../view_models/enrollment_view_model.dart | 141 +++++++++ 10 files changed, 740 insertions(+), 2 deletions(-) create mode 100644 frontend/lib/api/enrollment_api.dart create mode 100644 frontend/lib/models/enrollment_model.dart create mode 100644 frontend/lib/pages/user_pages/enroll_pages/enroll_page.dart create mode 100644 frontend/lib/pages/user_pages/enroll_pages/enroll_sucess.dart create mode 100644 frontend/lib/pages/user_pages/enroll_pages/enrollment_select.dart create mode 100644 frontend/lib/view_models/enrollment_view_model.dart diff --git a/frontend/lib/api/enrollment_api.dart b/frontend/lib/api/enrollment_api.dart new file mode 100644 index 0000000..d5ea79e --- /dev/null +++ b/frontend/lib/api/enrollment_api.dart @@ -0,0 +1,140 @@ +import 'dart:convert'; +import 'package:http/http.dart' as http; +import 'package:shared_preferences/shared_preferences.dart'; +import '../models/enrollment_model.dart'; + +class EnrollmentApi { + static const String domainListUrl = + 'https://dev-track-app.onrender.com/api/projects/domains/list'; + static const String enrollUrl = + 'https://dev-track-app.onrender.com/api/applications/enroll'; + + // Get CSRF token from SharedPreferences + Future _getCsrfToken() async { + final prefs = await SharedPreferences.getInstance(); + final token = prefs.getString('csrf_token'); + print('CSRF token from prefs: $token'); + return token; + } + + // Get session cookie from SharedPreferences + Future _getSessionCookie() async { + final prefs = await SharedPreferences.getInstance(); + final possibleKeys = ['sessionid', 'session']; + for (var key in possibleKeys) { + final sessionCookie = prefs.getString(key); + if (sessionCookie != null && sessionCookie.isNotEmpty) { + print('✅ Using session cookie key: $key'); + return sessionCookie; + } + } + print('⚠️ No valid session cookie found.'); + return null; + } + + // Get HTTP headers with CSRF token and session cookie + Future> _getHeaders() async { + final csrfToken = await _getCsrfToken(); + final sessionCookie = await _getSessionCookie(); + + final headers = { + 'Content-Type': 'application/json', + 'X-CSRFToken': csrfToken ?? '', + }; + + if (sessionCookie != null && sessionCookie.isNotEmpty) { + headers['Cookie'] = 'sessionid=$sessionCookie'; + } + + return headers; + } + + // Fetch available domains + Future> getDomains() async { + print('EnrollmentApi: getDomains() called'); + + try { + final headers = await _getHeaders(); + print('Making GET request to $domainListUrl'); + print('Request headers: $headers'); + + final response = + await http.get(Uri.parse(domainListUrl), headers: headers); + print('Response status: ${response.statusCode}'); + print('Response body: ${response.body}'); + + if (response.statusCode == 200) { + final List domainsJson = jsonDecode(response.body); + return domainsJson.map((json) => Domain.fromJson(json)).toList(); + } else if (response.statusCode == 401 || response.statusCode == 403) { + throw Exception('Authentication failed: Please log in again'); + } else { + throw Exception('Failed to load domains: ${response.reasonPhrase}'); + } + } catch (e) { + print('Exception in getDomains: $e'); + rethrow; + } + } + + // Submit enrollment preferences + Future submitEnrollment(EnrollmentRequest request) async { + print('EnrollmentApi: submitEnrollment() called'); + + try { + final headers = await _getHeaders(); + final requestBody = jsonEncode(request.toJson()); + + print('Making POST request to $enrollUrl'); + print('Request headers: $headers'); + print('Request body: $requestBody'); + + final response = await http.post( + Uri.parse(enrollUrl), + headers: headers, + body: requestBody, + ); + + print('Response status: ${response.statusCode}'); + print('Response body: ${response.body}'); + + if (response.statusCode == 200 || response.statusCode == 201) { + return EnrollmentResponse.fromJson(jsonDecode(response.body)); + } else { + String errorMessage = 'Enrollment failed'; + try { + final responseData = jsonDecode(response.body); + errorMessage = + responseData['detail'] ?? responseData['message'] ?? errorMessage; + } catch (e) { + errorMessage = 'Enrollment failed: ${response.reasonPhrase}'; + } + throw Exception(errorMessage); + } + } catch (e) { + print('Exception in submitEnrollment: $e'); + rethrow; + } + } + + // Debug authentication state + Future debugAuthState() async { + final prefs = await SharedPreferences.getInstance(); + final allKeys = prefs.getKeys(); + print('--- Auth Debug Information ---'); + print('Available SharedPreferences keys: $allKeys'); + + final keysToCheck = ['csrf_token', 'sessionid', 'session']; + for (var key in keysToCheck) { + if (prefs.containsKey(key)) { + final value = prefs.getString(key); + final maskedValue = + value != null ? '${value.substring(0, 4)}...[masked]' : 'null'; + print('$key: $maskedValue'); + } else { + print('$key: not found'); + } + } + print('-------------------------------'); + } +} diff --git a/frontend/lib/main.dart b/frontend/lib/main.dart index f95bc9f..eea6b1e 100644 --- a/frontend/lib/main.dart +++ b/frontend/lib/main.dart @@ -1,9 +1,9 @@ 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/user_pages/enroll_pages/enroll_page.dart'; import 'models/login_view_model.dart'; - +import 'view_models/enrollment_view_model.dart'; // void main() { // runApp(const MyApp()); // } @@ -13,6 +13,7 @@ void main() { MultiProvider( providers: [ ChangeNotifierProvider(create: (_) => LoginViewModel()), + ChangeNotifierProvider(create: (_) => EnrollmentViewModel()), ], child: const MyApp(), ), diff --git a/frontend/lib/models/domain_model.dart b/frontend/lib/models/domain_model.dart index 37de0f3..fbaf25f 100644 --- a/frontend/lib/models/domain_model.dart +++ b/frontend/lib/models/domain_model.dart @@ -6,3 +6,16 @@ // "description": "Lorem ipsum dolor sit amet.", // }, // ); +class Domain { + final int id; + final String name; + + Domain({required this.id, required this.name}); + + factory Domain.fromJson(Map json) { + return Domain( + id: json['id'] ?? 0, + name: json['name'] ?? '', + ); + } +} diff --git a/frontend/lib/models/enrollment_model.dart b/frontend/lib/models/enrollment_model.dart new file mode 100644 index 0000000..c121662 --- /dev/null +++ b/frontend/lib/models/enrollment_model.dart @@ -0,0 +1,64 @@ +// lib/models/enrollment_model.dart + +class Domain { + final int id; + final String name; + + Domain({required this.id, required this.name}); + + factory Domain.fromJson(Map json) { + return Domain( + id: json['id'], + name: json['name'], + ); + } + + Map toJson() { + return { + 'id': id, + 'name': name, + }; + } +} + +class User { + final String username; + // Add other user properties as needed + + User({required this.username}); + + factory User.fromJson(Map json) { + return User( + username: json['username'] ?? '', + ); + } +} + +class EnrollmentRequest { + final int firstPreferenceId; + final int secondPreferenceId; + + EnrollmentRequest({ + required this.firstPreferenceId, + required this.secondPreferenceId, + }); + + Map toJson() { + return { + 'first_preference_id': firstPreferenceId, + 'second_preference_id': secondPreferenceId, + }; + } +} + +class EnrollmentResponse { + final String message; + + EnrollmentResponse({required this.message}); + + factory EnrollmentResponse.fromJson(Map json) { + return EnrollmentResponse( + message: json['message'] ?? 'Enrollment successful!', + ); + } +} diff --git a/frontend/lib/pages/user_pages/enroll_pages/enroll_page.dart b/frontend/lib/pages/user_pages/enroll_pages/enroll_page.dart new file mode 100644 index 0000000..c179907 --- /dev/null +++ b/frontend/lib/pages/user_pages/enroll_pages/enroll_page.dart @@ -0,0 +1,99 @@ +import 'package:flutter/material.dart'; +import 'package:dev_track_app/utils/topnavbar.dart'; +import 'package:dev_track_app/theme/colors.dart'; +import 'package:dev_track_app/pages/user_pages/enroll_pages/enrollment_select.dart'; +import 'package:provider/provider.dart'; +import 'package:dev_track_app/models/enrollment_model.dart'; +import 'package:dev_track_app/view_models/enrollment_view_model.dart'; + +class EnrollPage extends StatelessWidget { + const EnrollPage({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return ChangeNotifierProvider( + create: (_) => EnrollmentViewModel()..fetchUser(), + child: Consumer( + builder: (context, viewModel, child) { + return Scaffold( + backgroundColor: AppColors.backgroundLight, + appBar: TopNavBar( + onNotificationTap: () {}, + ), + body: viewModel.isLoading + ? const Center(child: CircularProgressIndicator()) + : _buildContent(context, viewModel), + ); + }, + ), + ); + } + + Widget _buildContent(BuildContext context, EnrollmentViewModel viewModel) { + final user = viewModel.user; + + return Stack( + children: [ + Positioned( + left: 0, + right: 0, + bottom: 150, + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 20), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Text( + "Hey, ${user?.username ?? 'Guest'}!", + style: const TextStyle( + fontSize: 32, fontWeight: FontWeight.bold), + ), + const SizedBox(height: 20), + const Text( + "Start your journey with Dev/Track", + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 16, color: AppColors.textTernaryLight), + ), + const Text( + "Enroll now by giving basic details", + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 16, color: AppColors.textSecondaryLight), + ), + const SizedBox(height: 40), + SizedBox( + width: double.infinity, + height: 56, + child: ElevatedButton( + onPressed: () { + Navigator.of(context).push( + MaterialPageRoute( + builder: (context) => EnrollmentSelectPage( + username: user?.username ?? ''), + ), + ); + }, + style: ElevatedButton.styleFrom( + backgroundColor: AppColors.primaryLight, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(4)), + ), + child: const Text( + "Enroll", + style: TextStyle( + fontSize: 18, + color: AppColors.textPrimaryLight, + fontWeight: FontWeight.w500), + ), + ), + ), + const SizedBox(height: 20), + ], + ), + ), + ), + ], + ); + } +} diff --git a/frontend/lib/pages/user_pages/enroll_pages/enroll_sucess.dart b/frontend/lib/pages/user_pages/enroll_pages/enroll_sucess.dart new file mode 100644 index 0000000..e69de29 diff --git a/frontend/lib/pages/user_pages/enroll_pages/enrollment_select.dart b/frontend/lib/pages/user_pages/enroll_pages/enrollment_select.dart new file mode 100644 index 0000000..22dba1c --- /dev/null +++ b/frontend/lib/pages/user_pages/enroll_pages/enrollment_select.dart @@ -0,0 +1,278 @@ +// lib/pages/enrollment_select_page.dart + +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import 'package:dev_track_app/utils/topnavbar.dart'; +import 'package:dev_track_app/theme/colors.dart'; +import 'package:dev_track_app/view_models/enrollment_view_model.dart'; +import 'package:dev_track_app/models/enrollment_model.dart'; + +class EnrollmentSelectPage extends StatefulWidget { + final String username; + + const EnrollmentSelectPage({ + Key? key, + required this.username, + }) : super(key: key); + + @override + State createState() => _EnrollmentSelectPageState(); +} + +class _EnrollmentSelectPageState extends State { + late EnrollmentViewModel _viewModel; + + @override + void initState() { + super.initState(); + // Initialize view model after the widget is inserted in the tree + WidgetsBinding.instance.addPostFrameCallback((_) { + _viewModel = Provider.of(context, listen: false); + _viewModel.initialize(); + }); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: AppColors.backgroundLight, + appBar: TopNavBar( + onNotificationTap: () { + // Handle notification tap + }, + ), + body: Consumer( + builder: (context, viewModel, child) { + // Handle messages + _handleMessages(viewModel); + + return Stack( + children: [ + Padding( + padding: const EdgeInsets.symmetric(horizontal: 20), + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + const SizedBox(height: 40), + + // Greeting + Text( + "Hey, ${widget.username}!", + style: TextStyle( + fontSize: 32, + fontWeight: FontWeight.bold, + color: AppColors.textTernaryLight, + ), + textAlign: TextAlign.center, + ), + const SizedBox(height: 12), + + // Description + Text( + "Enroll now by giving basic details", + style: TextStyle( + fontSize: 16, + color: AppColors.textSecondaryLight, + ), + textAlign: TextAlign.center, + ), + const SizedBox(height: 40), + + // Preference 1 Dropdown + _buildPreferenceDropdown( + context: context, + viewModel: viewModel, + isFirst: true, + value: viewModel.firstPreference, + onChanged: viewModel.setFirstPreference, + hint: 'Preference 1', + transparentBg: true, + ), + + // Caption for Preference 1 + Align( + alignment: Alignment.centerLeft, + child: Padding( + padding: const EdgeInsets.only(left: 8, bottom: 24), + child: Text( + 'Select your First Preference', + style: TextStyle( + fontSize: 12, + color: AppColors.neutralLight, + ), + ), + ), + ), + + // Preference 2 Dropdown + _buildPreferenceDropdown( + context: context, + viewModel: viewModel, + isFirst: false, + value: viewModel.secondPreference, + onChanged: viewModel.setSecondPreference, + hint: 'Preference 2', + transparentBg: false, + ), + + // Caption for Preference 2 + Align( + alignment: Alignment.centerLeft, + child: Padding( + padding: const EdgeInsets.only(left: 8), + child: Text( + 'Select your Second Preference', + style: TextStyle( + fontSize: 12, + color: AppColors.neutralLight, + ), + ), + ), + ), + ], + ), + ), + + // Bottom positioned Enroll button + Positioned( + left: 20, + right: 20, + bottom: 40, + child: SizedBox( + width: double.infinity, + height: 56, + child: ElevatedButton( + onPressed: + viewModel.isLoadingDomains || viewModel.isSubmitting + ? null + : _onEnrollPressed, + style: ElevatedButton.styleFrom( + backgroundColor: AppColors.primaryLight, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(4), + ), + disabledBackgroundColor: AppColors.neutralLight, + ), + child: viewModel.isSubmitting + ? CircularProgressIndicator( + color: AppColors.textPrimaryLight) + : Text( + "ENROLL", + style: TextStyle( + fontSize: 18, + color: AppColors.textPrimaryLight, + fontWeight: FontWeight.w500, + ), + ), + ), + ), + ), + ], + ); + }, + ), + ); + } + + Widget _buildPreferenceDropdown({ + required BuildContext context, + required EnrollmentViewModel viewModel, + required bool isFirst, + required Domain? value, + required Function(Domain?) onChanged, + required String hint, + required bool transparentBg, + }) { + return Container( + decoration: BoxDecoration( + color: transparentBg + ? AppColors.primaryLight.withOpacity(0.05) + : AppColors.backgroundLight, + borderRadius: BorderRadius.circular(8), + border: Border.all(color: AppColors.neutralLight.withOpacity(0.3)), + ), + margin: const EdgeInsets.only(bottom: 16), + child: viewModel.isLoadingDomains + ? _buildLoadingIndicator() + : _buildDropdown(viewModel.domains, value, onChanged, hint), + ); + } + + Widget _buildLoadingIndicator() { + return Center( + child: Padding( + padding: const EdgeInsets.all(12.0), + child: CircularProgressIndicator( + color: AppColors.primaryLight, + strokeWidth: 2, + ), + )); + } + + Widget _buildDropdown(List domains, Domain? value, + Function(Domain?) onChanged, String hint) { + return DropdownButtonHideUnderline( + child: DropdownButton( + value: value, + isExpanded: true, + hint: Padding( + padding: const EdgeInsets.symmetric(horizontal: 16), + child: Text( + hint, + style: TextStyle(color: AppColors.textSecondaryLight), + ), + ), + icon: Icon(Icons.keyboard_arrow_down, color: AppColors.primaryLight), + padding: const EdgeInsets.symmetric(horizontal: 16), + borderRadius: BorderRadius.circular(8), + items: domains.map((domain) { + return DropdownMenuItem( + value: domain, + child: Text(domain.name), + ); + }).toList(), + onChanged: onChanged, + ), + ); + } + + void _handleMessages(EnrollmentViewModel viewModel) { + // Show error message if any + if (viewModel.errorMessage != null) { + WidgetsBinding.instance.addPostFrameCallback((_) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text(viewModel.errorMessage!), + backgroundColor: Colors.red, + ), + ); + viewModel.clearMessages(); + }); + } + + // Show success message if any + if (viewModel.successMessage != null) { + WidgetsBinding.instance.addPostFrameCallback((_) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text(viewModel.successMessage!), + backgroundColor: Colors.green, + ), + ); + viewModel.clearMessages(); + + // Here you can add navigation to the next page + // Navigator.of(context).pushReplacement( + // MaterialPageRoute(builder: (context) => SuccessPage()), + // ); + }); + } + } + + void _onEnrollPressed() async { + final success = await _viewModel.submitEnrollment(); + if (success) { + // Additional actions on success can be added here + } + } +} diff --git a/frontend/lib/pages/user_pages/user_dummy_home.dart b/frontend/lib/pages/user_pages/user_dummy_home.dart index fefaef5..123e985 100644 --- a/frontend/lib/pages/user_pages/user_dummy_home.dart +++ b/frontend/lib/pages/user_pages/user_dummy_home.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:dev_track_app/pages/user_pages/enroll_pages/enroll_page.dart'; class UserDummyHome extends StatefulWidget { const UserDummyHome({super.key}); diff --git a/frontend/lib/theme/colors.dart b/frontend/lib/theme/colors.dart index 2e50383..8b3ad29 100644 --- a/frontend/lib/theme/colors.dart +++ b/frontend/lib/theme/colors.dart @@ -7,6 +7,7 @@ class AppColors { 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 textTernaryLight = Color.fromARGB(255, 0, 0, 0); static const Color accentLight = Color(0xFFFFC107); static const Color neutralLight = Color(0xFF666666); diff --git a/frontend/lib/view_models/enrollment_view_model.dart b/frontend/lib/view_models/enrollment_view_model.dart new file mode 100644 index 0000000..3fdaaf6 --- /dev/null +++ b/frontend/lib/view_models/enrollment_view_model.dart @@ -0,0 +1,141 @@ +// lib/view_models/enrollment_view_model.dart + +import 'package:flutter/material.dart'; +import '../models/enrollment_model.dart'; +import '../api/enrollment_api.dart'; + +class EnrollmentViewModel extends ChangeNotifier { + final EnrollmentApi _api = EnrollmentApi(); + + // State management + List _domains = []; + bool _isLoadingDomains = true; + bool _isSubmitting = false; + String? _errorMessage; + String? _successMessage; + + User? _user; + bool _isLoading = true; + + // Selected domains + Domain? _firstPreference; + Domain? _secondPreference; + + // Getters + List get domains => _domains; + bool get isLoadingDomains => _isLoadingDomains; + bool get isSubmitting => _isSubmitting; + String? get errorMessage => _errorMessage; + String? get successMessage => _successMessage; + Domain? get firstPreference => _firstPreference; + Domain? get secondPreference => _secondPreference; + User? get user => _user; + bool get isLoading => _isLoading; + + // Initialize and fetch domains + Future initialize() async { + await fetchDomains(); + } + + Future fetchUser() async { + _isLoading = true; + notifyListeners(); + + try { + // TODO: Replace with actual API call + await Future.delayed(Duration(seconds: 1)); // Simulate network delay + _user = User(username: 'User'); // Placeholder + _isLoading = false; + notifyListeners(); + } catch (e) { + _errorMessage = e.toString(); + _isLoading = false; + notifyListeners(); + } + } + + // Fetch domains from API + Future fetchDomains() async { + _isLoadingDomains = true; + _errorMessage = null; + notifyListeners(); + + try { + _domains = await _api.getDomains(); + _isLoadingDomains = false; + notifyListeners(); + } catch (e) { + _errorMessage = e.toString(); + _isLoadingDomains = false; + notifyListeners(); + } + } + + // Set first preference + void setFirstPreference(Domain? domain) { + _firstPreference = domain; + _errorMessage = null; + notifyListeners(); + } + + // Set second preference + void setSecondPreference(Domain? domain) { + _secondPreference = domain; + _errorMessage = null; + notifyListeners(); + } + + // Validate preferences + bool validatePreferences() { + if (_firstPreference == null || _secondPreference == null) { + _errorMessage = 'Please select both preferences'; + notifyListeners(); + return false; + } + + if (_firstPreference!.id == _secondPreference!.id) { + _errorMessage = 'First and second preferences cannot be the same'; + notifyListeners(); + return false; + } + + return true; + } + + // Submit enrollment + Future submitEnrollment() async { + if (!validatePreferences()) { + return false; + } + + _isSubmitting = true; + _errorMessage = null; + _successMessage = null; + notifyListeners(); + + try { + final request = EnrollmentRequest( + firstPreferenceId: _firstPreference!.id, + secondPreferenceId: _secondPreference!.id, + ); + + final response = await _api.submitEnrollment(request); + _successMessage = response.message; + _isSubmitting = false; + notifyListeners(); + return true; + } catch (e) { + _errorMessage = e.toString(); + _isSubmitting = false; + notifyListeners(); + return false; + } + } + + // Clear messages + void clearMessages() { + _errorMessage = null; + _successMessage = null; + notifyListeners(); + } +} From 089ac646e4006c0761afdea52563de18a5dc7178 Mon Sep 17 00:00:00 2001 From: yvaishalirao Date: Sat, 1 Mar 2025 21:07:27 +0530 Subject: [PATCH 79/97] admin-api-done?? --- .../android/app/src/main/AndroidManifest.xml | 5 +- .../admin_dummy_home.dart | 0 .../user_dummy_home.dart | 0 frontend/lib/api/admin_post_api.dart | 95 +++++++++++++++++++ frontend/lib/api/api.dart | 1 + frontend/lib/api/login_api.dart | 19 +++- frontend/lib/main.dart | 6 +- frontend/lib/models/admin_post_model.dart | 68 ++++++++----- .../lib/models/admin_post_view_model.dart | 69 ++++++++++++++ .../{user_model.dart => login_model.dart} | 8 +- frontend/lib/models/login_view_model.dart | 18 ++-- .../admin_feed_page.dart | 65 +++++++------ .../admin_feed_view/create_post_dialog.dart | 75 +++++++++++++++ .../edit_post_dialog.dart | 72 +++++++------- .../pages/admin_pages/create_post_dialog.dart | 87 ----------------- .../lib/pages/common_pages/login_page.dart | 12 +-- frontend/lib/pages/home.dart | 62 +++++++----- 17 files changed, 437 insertions(+), 225 deletions(-) rename frontend/lib/{pages/admin_pages => To-Be-Discarded}/admin_dummy_home.dart (100%) rename frontend/lib/{pages/user_pages => To-Be-Discarded}/user_dummy_home.dart (100%) create mode 100644 frontend/lib/api/admin_post_api.dart create mode 100644 frontend/lib/models/admin_post_view_model.dart rename frontend/lib/models/{user_model.dart => login_model.dart} (69%) rename frontend/lib/pages/admin_pages/{ => admin_feed_view}/admin_feed_page.dart (71%) create mode 100644 frontend/lib/pages/admin_pages/admin_feed_view/create_post_dialog.dart rename frontend/lib/pages/admin_pages/{ => admin_feed_view}/edit_post_dialog.dart (50%) delete mode 100644 frontend/lib/pages/admin_pages/create_post_dialog.dart diff --git a/frontend/android/app/src/main/AndroidManifest.xml b/frontend/android/app/src/main/AndroidManifest.xml index 949d141..9024df5 100644 --- a/frontend/android/app/src/main/AndroidManifest.xml +++ b/frontend/android/app/src/main/AndroidManifest.xml @@ -2,10 +2,13 @@ + + android:icon="@mipmap/ic_launcher" + android:usesCleartextTraffic="true"> + createPost(Post post) async { + SharedPreferences prefs = await SharedPreferences.getInstance(); + String? csrfToken = prefs.getString('csrf_token'); + String? sessionCookie = prefs.getString('session_cookie'); + + print("Stored CSRF Token: $csrfToken"); + print("Stored Session Cookie: $sessionCookie"); + Map headers = { + "Content-Type": "application/json", + "X-CSRFToken": csrfToken ?? "", + }; + + if (sessionCookie != null && sessionCookie.isNotEmpty) { + headers["Cookie"] = sessionCookie; + } + + final response = await http.post( + Uri.parse('$baseUrl/add'), + headers: headers, + body: jsonEncode(post.toJson()), + ); + + print("Response Status Code: ${response.statusCode}"); + print("Response Body: ${response.body}"); + + if (response.statusCode == 200) { + return PostResponse.fromJson(jsonDecode(response.body)); + } else { + throw Exception("Failed to create post"); + } + } + + // LISTING ALL POSTS FOR DA ADMIN + Future> getPosts() async { + SharedPreferences prefs = await SharedPreferences.getInstance(); + String? token = prefs.getString('session_cookie'); + + final response = await http.get( + Uri.parse('$baseUrl/'), + headers: { + "Authorization": "Bearer $token", + }, + ); + print("Response Status Code: ${response.statusCode}"); + print("Response Body: ${response.body}"); + + if (response.statusCode == 200) { + List jsonData = jsonDecode(response.body); + return jsonData.map((post) => Post.fromJson(post)).toList(); + } else { + throw Exception("Failed to fetch posts"); + } + } + + //CHAD EDITOR + Future editPost(int postId, String title, String description) async { + SharedPreferences prefs = await SharedPreferences.getInstance(); + String? csrfToken = prefs.getString('csrf_token'); + String? sessionCookie = prefs.getString('session_cookie'); + + print("Stored Session Cookie: $sessionCookie"); + + final response = await http.put( + Uri.parse('$baseUrl/$postId'), + headers: { + "Content-Type": "application/json", + "Cookie": sessionCookie ?? "", + "X-CSRFToken": csrfToken ?? "", + }, + body: jsonEncode({ + "title": title, + "description": description, + }), + ); + print("Response Status Code: ${response.statusCode}"); + print("Response Body: ${response.body}"); + + if (response.statusCode == 200) { + return Post.fromJson(jsonDecode(response.body)); + } else { + throw Exception("Failed to edit post"); + } + } +} diff --git a/frontend/lib/api/api.dart b/frontend/lib/api/api.dart index e69de29..381e9bb 100644 --- a/frontend/lib/api/api.dart +++ b/frontend/lib/api/api.dart @@ -0,0 +1 @@ +//baseUrl = "https://dev-track-app.onrender.com/ diff --git a/frontend/lib/api/login_api.dart b/frontend/lib/api/login_api.dart index 668976d..c0d9b71 100644 --- a/frontend/lib/api/login_api.dart +++ b/frontend/lib/api/login_api.dart @@ -1,16 +1,19 @@ import 'dart:convert'; import 'package:http/http.dart' as http; +import 'package:shared_preferences/shared_preferences.dart'; -import '../models/user_model.dart'; +import '../models/login_model.dart'; // static const String baseUrl = "https://dev-track-app.onrender.com/api/user/user"; // static const String loginEndpoint = "$baseUrl/user/login"; class AuthService { 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 { + print("Logging in ... "); + final response = await http.post( Uri.parse(baseUrl), headers: {'Content-Type': 'application/json'}, @@ -21,7 +24,17 @@ class AuthService { if (response.statusCode == 200) { final data = jsonDecode(response.body); - return UserModel.fromJson(data); + final prefs = await SharedPreferences.getInstance(); + + await prefs.setString('role', data["role"]); + await prefs.setString('csrf_token', data["csrf_token"]); + + String? sessionCookie = response.headers['set-cookie']; + if (sessionCookie != null) { + await prefs.setString('session_cookie', sessionCookie); + print("Stored Session Cookie: $sessionCookie"); + } + return LoginModel.fromJson(data); } else { throw Exception('Failed to login ${response.body}'); } diff --git a/frontend/lib/main.dart b/frontend/lib/main.dart index 40e3d1a..13486e5 100644 --- a/frontend/lib/main.dart +++ b/frontend/lib/main.dart @@ -1,7 +1,8 @@ -import 'package:dev_track_app/pages/admin_pages/admin_feed_page.dart'; +import 'package:dev_track_app/pages/common_pages/login_page.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; +import 'models/admin_post_view_model.dart'; import 'models/login_view_model.dart'; // void main() { @@ -13,6 +14,7 @@ void main() { MultiProvider( providers: [ ChangeNotifierProvider(create: (_) => LoginViewModel()), + ChangeNotifierProvider(create: (_) => PostViewModel()), ], child: const MyApp(), ), @@ -30,6 +32,6 @@ class MyApp extends StatelessWidget { primarySwatch: Colors.green, ), debugShowCheckedModeBanner: false, - home: AdminFeedPage()); + home: LoginPage()); } } diff --git a/frontend/lib/models/admin_post_model.dart b/frontend/lib/models/admin_post_model.dart index b9ae86f..0e554e4 100644 --- a/frontend/lib/models/admin_post_model.dart +++ b/frontend/lib/models/admin_post_model.dart @@ -1,32 +1,52 @@ class Post { - final String name; - final String dateTime; + final int id; + final String title; final String description; + final String createdAt; + final int createdBy; Post({ - required this.name, - required this.dateTime, + required this.id, + required this.title, required this.description, + required this.createdAt, + required this.createdBy, }); - static List samplePosts = [ - Post( - name: "Event Announcement", - dateTime: "3 Days ago • 12/Feb 10:30 AM", - description: - "Lorem ipsum dolor sit amet et delectus accommodare his consul copiosae legendos at vix ad putent delectus delicata usu.", - ), - Post( - name: "DevArena Deets", - dateTime: "5 Hours ago • 14/Feb 03:15 PM", - description: - "Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes.", - ), - Post( - name: "Project Cycle Deets", - dateTime: "1 Week ago • 07/Feb 06:45 PM", - description: - "Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.", - ), - ]; + factory Post.fromJson(Map json) { + return Post( + id: json["id"], + title: json["title"], + description: json["description"], + createdAt: json["created_at"], + createdBy: json["created_by"], + ); + } + + Map toJson() { + return { + "title": title, + "description": description, + }; + } +} + +class PostResponse { + final String message; + final int postId; + final String csrfToken; + + PostResponse({ + required this.message, + required this.postId, + required this.csrfToken, + }); + + factory PostResponse.fromJson(Map json) { + return PostResponse( + message: json["message"], + postId: json["post_id"], + csrfToken: json["csrf_token"], + ); + } } diff --git a/frontend/lib/models/admin_post_view_model.dart b/frontend/lib/models/admin_post_view_model.dart new file mode 100644 index 0000000..34b1d05 --- /dev/null +++ b/frontend/lib/models/admin_post_view_model.dart @@ -0,0 +1,69 @@ +import 'package:flutter/material.dart'; + +import '../api/admin_post_api.dart'; +import '../models/admin_post_model.dart'; + +class PostViewModel extends ChangeNotifier { + final PostService _postService = PostService(); + + bool _isLoading = false; + bool get isLoading => _isLoading; + + List _posts = []; + List get posts => _posts; + + String _message = ""; + String get message => _message; + + // Create a post + Future createPost(Post post) async { + try { + _isLoading = true; + notifyListeners(); + + PostResponse response = await _postService.createPost(post); + _message = response.message; + fetchPosts(); // Refresh the post list after creation + } catch (e) { + _message = "Failed to create post"; + } finally { + _isLoading = false; + notifyListeners(); + } + } + + // Fetch all posts + Future fetchPosts() async { + try { + _isLoading = true; + notifyListeners(); + + _posts = await _postService.getPosts(); + } catch (e) { + _message = "Failed to fetch posts"; + } finally { + _isLoading = false; + notifyListeners(); + } + } + + Future editPost(int postId, String title, String description) async { + try { + _isLoading = true; + notifyListeners(); + + Post updatedPost = + await _postService.editPost(postId, title, description); + int index = _posts.indexWhere((post) => post.id == postId); + if (index != -1) { + _posts[index] = updatedPost; + } + _message = "Post updated successfully"; + } catch (e) { + _message = "Failed to edit post"; + } finally { + _isLoading = false; + notifyListeners(); + } + } +} diff --git a/frontend/lib/models/user_model.dart b/frontend/lib/models/login_model.dart similarity index 69% rename from frontend/lib/models/user_model.dart rename to frontend/lib/models/login_model.dart index 60be2b7..f4785b8 100644 --- a/frontend/lib/models/user_model.dart +++ b/frontend/lib/models/login_model.dart @@ -1,13 +1,13 @@ -class UserModel { +class LoginModel { final String message; final String role; final String csrfToken; - UserModel( + LoginModel( {required this.message, required this.role, required this.csrfToken}); - factory UserModel.fromJson(Map json) { - return UserModel( + factory LoginModel.fromJson(Map json) { + return LoginModel( message: json['message'], role: json['role'], csrfToken: json['csrf_token'], diff --git a/frontend/lib/models/login_view_model.dart b/frontend/lib/models/login_view_model.dart index efaccd1..89fa4a4 100644 --- a/frontend/lib/models/login_view_model.dart +++ b/frontend/lib/models/login_view_model.dart @@ -2,14 +2,14 @@ import 'package:flutter/material.dart'; import 'package:shared_preferences/shared_preferences.dart'; import '../api/login_api.dart'; -import '../models/user_model.dart'; +import '../models/login_model.dart'; class LoginViewModel extends ChangeNotifier { final AuthService _authService = AuthService(); bool isLoading = false; String? errorMessage; - UserModel? user; + LoginModel? user; Future login(String email, String password) async { isLoading = true; @@ -18,10 +18,6 @@ class LoginViewModel extends ChangeNotifier { try { user = await _authService.login(email, 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.'; } @@ -34,4 +30,14 @@ class LoginViewModel extends ChangeNotifier { final prefs = await SharedPreferences.getInstance(); return prefs.getString('role'); } + + Future getCsrfToken() async { + final prefs = await SharedPreferences.getInstance(); + return prefs.getString('csrf_token'); + } + + Future getSessionCookie() async { + final prefs = await SharedPreferences.getInstance(); + return prefs.getString('session_cookie'); + } } diff --git a/frontend/lib/pages/admin_pages/admin_feed_page.dart b/frontend/lib/pages/admin_pages/admin_feed_view/admin_feed_page.dart similarity index 71% rename from frontend/lib/pages/admin_pages/admin_feed_page.dart rename to frontend/lib/pages/admin_pages/admin_feed_view/admin_feed_page.dart index 16c1ebc..417138e 100644 --- a/frontend/lib/pages/admin_pages/admin_feed_page.dart +++ b/frontend/lib/pages/admin_pages/admin_feed_view/admin_feed_page.dart @@ -1,8 +1,10 @@ -import 'package:dev_track_app/pages/admin_pages/edit_post_dialog.dart'; +import 'package:dev_track_app/pages/admin_pages/admin_feed_view/edit_post_dialog.dart'; import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; -import '../../models/admin_post_model.dart'; -import 'create_post_dialog.dart'; +import '../../../models/admin_post_model.dart'; +import '../../../models/admin_post_view_model.dart'; +import '../admin_feed_view/create_post_dialog.dart'; class AdminFeedPage extends StatefulWidget { const AdminFeedPage({super.key}); @@ -13,7 +15,13 @@ class AdminFeedPage extends StatefulWidget { class _FeedScreenState extends State { @override + void initState() { + super.initState(); + Provider.of(context, listen: false).fetchPosts(); + } + Widget build(BuildContext context) { + final postViewModel = Provider.of(context); return SafeArea( child: Scaffold( backgroundColor: Colors.white, @@ -27,12 +35,23 @@ class _FeedScreenState extends State { _buildHeader(), const SizedBox(height: 10), const SizedBox(height: 10), + // Expanded( + // child: ListView.builder( + // itemCount: Post.samplePosts.length, + // itemBuilder: (context, index) => + // _buildPostCard(Post.samplePosts[index], context, index), + // ), + // ), Expanded( - child: ListView.builder( - itemCount: Post.samplePosts.length, - itemBuilder: (context, index) => - _buildPostCard(Post.samplePosts[index], context, index), - ), + child: postViewModel.isLoading + ? Center(child: CircularProgressIndicator()) + : ListView.builder( + itemCount: postViewModel.posts.length, + itemBuilder: (context, index) { + return _buildPostCard( + postViewModel.posts[index], context, index); + }, + ), ), ], ), @@ -71,17 +90,7 @@ class _FeedScreenState extends State { foregroundColor: Colors.white, ), onPressed: () { - showDialog( - context: context, - builder: (context) => CreatePostDialog( - onPostCreated: (newPost) { - setState(() { - Post.samplePosts - .insert(0, newPost); // Add new post at the top - }); - }, - ), - ); + showDialog(context: context, builder: (_) => CreatePostDialog()); }, child: const Text("+ Create Post"), ), @@ -111,12 +120,12 @@ class _FeedScreenState extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - post.name, + post.title, style: const TextStyle( fontWeight: FontWeight.bold, fontSize: 16), ), Text( - post.dateTime, + post.createdAt, style: const TextStyle(fontSize: 14, color: Colors.black), ), ], @@ -149,16 +158,10 @@ class _FeedScreenState extends State { context: context, builder: (context) => EditPostDialog( index: index, - onPostUpdated: (updatedPost) { - setState(() { - Post.samplePosts[index] = updatedPost; - }); - }, - onPostDeleted: () { - setState(() { - Post.samplePosts.removeAt(index); - }); - }, + postId: post.id, // ✅ Pass post ID for API call + currentTitle: post.title, // ✅ Pass current title + currentDescription: + post.description, // ✅ Pass current description ), ); }, diff --git a/frontend/lib/pages/admin_pages/admin_feed_view/create_post_dialog.dart b/frontend/lib/pages/admin_pages/admin_feed_view/create_post_dialog.dart new file mode 100644 index 0000000..f25ee55 --- /dev/null +++ b/frontend/lib/pages/admin_pages/admin_feed_view/create_post_dialog.dart @@ -0,0 +1,75 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +import '../../../models/admin_post_model.dart'; +import '../../../models/admin_post_view_model.dart'; + +class CreatePostDialog extends StatefulWidget { + const CreatePostDialog({Key? key}) : super(key: key); + + @override + _CreatePostDialogState createState() => _CreatePostDialogState(); +} + +class _CreatePostDialogState extends State { + final TextEditingController _titleController = TextEditingController(); + final TextEditingController _descController = TextEditingController(); + + @override + Widget build(BuildContext context) { + final postViewModel = Provider.of(context); + + return AlertDialog( + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12)), + title: const Text("Create Post"), + content: Column( + mainAxisSize: MainAxisSize.min, + children: [ + TextField( + controller: _titleController, + decoration: const InputDecoration( + border: OutlineInputBorder(), + hintText: 'Enter Title', + ), + ), + const SizedBox(height: 10), + TextField( + controller: _descController, + maxLines: 4, + decoration: const InputDecoration( + border: OutlineInputBorder(), + hintText: 'Type your message', + ), + ), + ], + ), + actions: [ + TextButton( + onPressed: () => Navigator.pop(context), + child: const Text("Cancel"), + ), + ElevatedButton( + style: ElevatedButton.styleFrom(backgroundColor: Colors.purple), + onPressed: () async { + if (_titleController.text.isNotEmpty && + _descController.text.isNotEmpty) { + Post newPost = Post( + id: 0, // ID will be assigned by the backend + title: _titleController.text, + description: _descController.text, + createdAt: "", + createdBy: 0, + ); + + await postViewModel.createPost(newPost); + Navigator.pop(context); // Close dialog + } + }, + child: postViewModel.isLoading + ? CircularProgressIndicator() + : const Text('Post', style: TextStyle(color: Colors.white)), + ), + ], + ); + } +} diff --git a/frontend/lib/pages/admin_pages/edit_post_dialog.dart b/frontend/lib/pages/admin_pages/admin_feed_view/edit_post_dialog.dart similarity index 50% rename from frontend/lib/pages/admin_pages/edit_post_dialog.dart rename to frontend/lib/pages/admin_pages/admin_feed_view/edit_post_dialog.dart index b91909e..10b22b6 100644 --- a/frontend/lib/pages/admin_pages/edit_post_dialog.dart +++ b/frontend/lib/pages/admin_pages/admin_feed_view/edit_post_dialog.dart @@ -1,18 +1,20 @@ import 'package:flutter/material.dart'; -import 'package:intl/intl.dart'; +import 'package:provider/provider.dart'; -import '../../models/admin_post_model.dart'; +import '../../../models/admin_post_view_model.dart'; class EditPostDialog extends StatefulWidget { final int index; - final Function(Post) onPostUpdated; - final Function() onPostDeleted; + final int postId; + final String currentTitle; + final String currentDescription; const EditPostDialog({ Key? key, required this.index, - required this.onPostUpdated, - required this.onPostDeleted, + required this.postId, + required this.currentTitle, + required this.currentDescription, }) : super(key: key); @override @@ -20,17 +22,20 @@ class EditPostDialog extends StatefulWidget { } class _EditPostDialogState extends State { - late TextEditingController _postController; + late TextEditingController _titleController; + late TextEditingController _descController; @override void initState() { super.initState(); - _postController = - TextEditingController(text: Post.samplePosts[widget.index].description); + _titleController = TextEditingController(text: widget.currentTitle); + _descController = TextEditingController(text: widget.currentDescription); } @override Widget build(BuildContext context) { + final postViewModel = Provider.of(context); + return Dialog( shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12)), child: Padding( @@ -38,15 +43,23 @@ class _EditPostDialogState extends State { child: Column( mainAxisSize: MainAxisSize.min, children: [ - Text( + const Text( 'Edit Post', style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold), ), const SizedBox(height: 10), TextField( - controller: _postController, + controller: _titleController, + decoration: const InputDecoration( + border: OutlineInputBorder(), + hintText: 'Edit your title', + ), + ), + const SizedBox(height: 10), + TextField( + controller: _descController, maxLines: 4, - decoration: InputDecoration( + decoration: const InputDecoration( border: OutlineInputBorder(), hintText: 'Edit your message', ), @@ -55,38 +68,25 @@ class _EditPostDialogState extends State { Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - // DELETE BUTTON - ElevatedButton( - style: ElevatedButton.styleFrom( - backgroundColor: Colors.red, - ), - onPressed: () { - widget.onPostDeleted(); // Remove post - Navigator.pop(context); - }, - child: Text('Delete', style: TextStyle(color: Colors.white)), - ), - - // SAVE BUTTON ElevatedButton( style: ElevatedButton.styleFrom( backgroundColor: Colors.purple, ), - onPressed: () { - if (_postController.text.isNotEmpty) { - String updatedTime = - DateFormat("d/MMM hh:mm a").format(DateTime.now()); - Post updatedPost = Post( - name: Post.samplePosts[widget.index].name, - dateTime: "Edited • $updatedTime", // Mark as edited - description: _postController.text, + onPressed: () async { + if (_titleController.text.isNotEmpty && + _descController.text.isNotEmpty) { + await postViewModel.editPost( + widget.postId, + _titleController.text, + _descController.text, ); - - widget.onPostUpdated(updatedPost); Navigator.pop(context); } }, - child: Text('Save', style: TextStyle(color: Colors.white)), + child: postViewModel.isLoading + ? CircularProgressIndicator() + : const Text('Save', + style: TextStyle(color: Colors.white)), ), ], ), diff --git a/frontend/lib/pages/admin_pages/create_post_dialog.dart b/frontend/lib/pages/admin_pages/create_post_dialog.dart deleted file mode 100644 index 2a75295..0000000 --- a/frontend/lib/pages/admin_pages/create_post_dialog.dart +++ /dev/null @@ -1,87 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:intl/intl.dart'; - -import '../../models/admin_post_model.dart'; - -class CreatePostDialog extends StatefulWidget { - final Function(Post) onPostCreated; - - const CreatePostDialog({Key? key, required this.onPostCreated}) - : super(key: key); - - @override - _CreatePostDialogState createState() => _CreatePostDialogState(); -} - -class _CreatePostDialogState extends State { - final TextEditingController _nameController = TextEditingController(); - final TextEditingController _postController = TextEditingController(); - - @override - Widget build(BuildContext context) { - return AlertDialog( - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12)), - title: const Text("Create Post"), - content: Column( - mainAxisSize: MainAxisSize.min, - children: [ - TextField( - controller: _nameController, - decoration: const InputDecoration( - border: OutlineInputBorder(), - hintText: 'Enter your name', - ), - ), - const SizedBox(height: 10), - TextField( - controller: _postController, - maxLines: 4, - decoration: const InputDecoration( - border: OutlineInputBorder(), - hintText: 'Type your message', - ), - ), - ], - ), - actions: [ - TextButton( - onPressed: () => Navigator.pop(context), // Close dialog - child: const Text("Cancel"), - ), - ElevatedButton( - style: ElevatedButton.styleFrom(backgroundColor: Colors.purple), - onPressed: () { - if (_nameController.text.isNotEmpty && - _postController.text.isNotEmpty) { - DateTime now = DateTime.now(); - String formattedDate = DateFormat('dd/MMM hh:mm a').format(now); - - String daysAgo = "Today"; - DateTime postDate = now.subtract(const Duration(days: 0)); - int difference = now.difference(postDate).inDays; - - if (difference == 1) { - daysAgo = "Yesterday"; - } else if (difference > 1) { - daysAgo = "$difference Days ago"; - } - - String finalTime = "$daysAgo • $formattedDate"; - Post newPost = Post( - name: _nameController.text, - dateTime: finalTime, - description: _postController.text, - ); - widget.onPostCreated(newPost); // Add post to list - Navigator.pop(context); // Close dialog - } - }, - child: const Text( - 'Post', - style: TextStyle(color: Colors.white), - ), - ), - ], - ); - } -} diff --git a/frontend/lib/pages/common_pages/login_page.dart b/frontend/lib/pages/common_pages/login_page.dart index 9cfa724..d8df210 100644 --- a/frontend/lib/pages/common_pages/login_page.dart +++ b/frontend/lib/pages/common_pages/login_page.dart @@ -1,4 +1,4 @@ -import 'package:dev_track_app/pages/admin_pages/admin_feed_page.dart'; +import 'package:dev_track_app/pages/admin_pages/admin_feed_view/admin_feed_page.dart'; import 'package:dev_track_app/pages/common_pages/register_page.dart'; import 'package:dev_track_app/pages/user_pages/user_feed_page.dart'; import 'package:flutter/gestures.dart'; @@ -42,9 +42,9 @@ class LoginPage extends StatelessWidget { backgroundColor: Colors.white, child: CircleAvatar( radius: 45, - backgroundImage: NetworkImage( - 'https://storage.googleapis.com/a1aa/image/FMzESL12uGqBDRIcbgyzHWSJA_eagcTLOcV2KYexVXY.jpg', - ), + // backgroundImage: NetworkImage( + // 'https://storage.googleapis.com/a1aa/image/FMzESL12uGqBDRIcbgyzHWSJA_eagcTLOcV2KYexVXY.jpg', + // ), ), ), ), @@ -157,9 +157,7 @@ class LoginPage extends StatelessWidget { Padding( padding: const EdgeInsets.fromLTRB(25, 15, 25, 10), child: ElevatedButton( - onPressed: () { - // Add your login logic here - }, + onPressed: () {}, style: ElevatedButton.styleFrom( backgroundColor: Colors.white, side: BorderSide(color: Color(0xFF5e00b0)), diff --git a/frontend/lib/pages/home.dart b/frontend/lib/pages/home.dart index 41cb8d1..cfe632f 100644 --- a/frontend/lib/pages/home.dart +++ b/frontend/lib/pages/home.dart @@ -1,22 +1,23 @@ -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/admin_feed_view/admin_feed_page.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/Theme-Demo-Page/sample.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: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/project_display/previous_projects.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/submission_page/submission_page.dart'; +import 'package:dev_track_app/pages/user_pages/studentview.dart'; +import 'package:dev_track_app/pages/user_pages/tracker.dart'; +import 'package:dev_track_app/pages/user_pages/user_feed_page.dart'; +import 'package:dev_track_app/theme/splashscreen.dart'; +import 'package:flutter/material.dart'; class HomePag extends StatelessWidget { const HomePag({super.key}); - Widget buildNavButton(BuildContext context, String text, Color color, Widget page) { + Widget buildNavButton( + BuildContext context, String text, Color color, Widget page) { return ElevatedButton( style: ElevatedButton.styleFrom( backgroundColor: color, @@ -37,26 +38,39 @@ class HomePag extends StatelessWidget { } @override - Widget build(BuildContext context) { + Widget build(BuildContext context) { return Scaffold( body: Center( child: Column( mainAxisAlignment: MainAxisAlignment.spaceEvenly, crossAxisAlignment: CrossAxisAlignment.center, children: [ - 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()), - 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()), + 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()), + 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 419689578b9199937ad0437479c78a4b649ad6c6 Mon Sep 17 00:00:00 2001 From: Piyush Chakarborthy <102757301+Chakravartinsamrat@users.noreply.github.com> Date: Sat, 1 Mar 2025 21:30:56 +0530 Subject: [PATCH 80/97] yes --- frontend/lib/api/enrollment_api.dart | 69 ++++++++++++++++++---------- 1 file changed, 44 insertions(+), 25 deletions(-) diff --git a/frontend/lib/api/enrollment_api.dart b/frontend/lib/api/enrollment_api.dart index d5ea79e..2afaa35 100644 --- a/frontend/lib/api/enrollment_api.dart +++ b/frontend/lib/api/enrollment_api.dart @@ -20,14 +20,24 @@ class EnrollmentApi { // Get session cookie from SharedPreferences Future _getSessionCookie() async { final prefs = await SharedPreferences.getInstance(); + + // First try to get the session cookie stored by AuthService + final sessionCookie = prefs.getString('session_cookie'); + if (sessionCookie != null && sessionCookie.isNotEmpty) { + print('✅ Using session cookie from AuthService'); + return sessionCookie; + } + + // Fallback to checking for specific keys final possibleKeys = ['sessionid', 'session']; for (var key in possibleKeys) { - final sessionCookie = prefs.getString(key); - if (sessionCookie != null && sessionCookie.isNotEmpty) { + final cookie = prefs.getString(key); + if (cookie != null && cookie.isNotEmpty) { print('✅ Using session cookie key: $key'); - return sessionCookie; + return cookie; } } + print('⚠️ No valid session cookie found.'); return null; } @@ -43,17 +53,46 @@ class EnrollmentApi { }; if (sessionCookie != null && sessionCookie.isNotEmpty) { - headers['Cookie'] = 'sessionid=$sessionCookie'; + // Use the full cookie string as it's stored by AuthService + headers['Cookie'] = sessionCookie; + print('✅ Added session cookie to headers'); } return headers; } + // Debug authentication state + Future debugAuthState() async { + final prefs = await SharedPreferences.getInstance(); + final allKeys = prefs.getKeys(); + print('--- Auth Debug Information ---'); + print('Available SharedPreferences keys: $allKeys'); + + final keysToCheck = [ + 'csrf_token', + 'sessionid', + 'session', + 'session_cookie' + ]; + for (var key in keysToCheck) { + if (prefs.containsKey(key)) { + final value = prefs.getString(key); + final maskedValue = + value != null ? '${value.substring(0, 4)}...[masked]' : 'null'; + print('$key: $maskedValue'); + } else { + print('$key: not found'); + } + } + print('-------------------------------'); + } + // Fetch available domains Future> getDomains() async { print('EnrollmentApi: getDomains() called'); try { + await debugAuthState(); // Debug auth state before making request final headers = await _getHeaders(); print('Making GET request to $domainListUrl'); print('Request headers: $headers'); @@ -82,6 +121,7 @@ class EnrollmentApi { print('EnrollmentApi: submitEnrollment() called'); try { + await debugAuthState(); // Debug auth state before making request final headers = await _getHeaders(); final requestBody = jsonEncode(request.toJson()); @@ -116,25 +156,4 @@ class EnrollmentApi { rethrow; } } - - // Debug authentication state - Future debugAuthState() async { - final prefs = await SharedPreferences.getInstance(); - final allKeys = prefs.getKeys(); - print('--- Auth Debug Information ---'); - print('Available SharedPreferences keys: $allKeys'); - - final keysToCheck = ['csrf_token', 'sessionid', 'session']; - for (var key in keysToCheck) { - if (prefs.containsKey(key)) { - final value = prefs.getString(key); - final maskedValue = - value != null ? '${value.substring(0, 4)}...[masked]' : 'null'; - print('$key: $maskedValue'); - } else { - print('$key: not found'); - } - } - print('-------------------------------'); - } } From 6abd72d1330215a32bca8e3f208a3cf26f4d472d Mon Sep 17 00:00:00 2001 From: yvaishalirao Date: Sat, 1 Mar 2025 21:45:21 +0530 Subject: [PATCH 81/97] delete posts api added --- .../lib/{api => To-Be-Discarded}/api.dart | 0 frontend/lib/api/admin_post_api.dart | 28 +++++++ .../lib/models/admin_post_view_model.dart | 12 +++ .../admin_feed_view/admin_feed_page.dart | 80 +++++++++++++------ 4 files changed, 97 insertions(+), 23 deletions(-) rename frontend/lib/{api => To-Be-Discarded}/api.dart (100%) diff --git a/frontend/lib/api/api.dart b/frontend/lib/To-Be-Discarded/api.dart similarity index 100% rename from frontend/lib/api/api.dart rename to frontend/lib/To-Be-Discarded/api.dart diff --git a/frontend/lib/api/admin_post_api.dart b/frontend/lib/api/admin_post_api.dart index 21e7952..5cb30cb 100644 --- a/frontend/lib/api/admin_post_api.dart +++ b/frontend/lib/api/admin_post_api.dart @@ -92,4 +92,32 @@ class PostService { throw Exception("Failed to edit post"); } } + + //TRASH POST + Future deletePost(int postId) async { + SharedPreferences prefs = await SharedPreferences.getInstance(); + String? sessionCookie = prefs.getString('session_cookie'); + String? csrfToken = prefs.getString('csrf_token'); + + print("Deleting Post ID: $postId"); + print("Stored Session Cookie: $sessionCookie"); + + final response = await http.delete( + Uri.parse('$baseUrl/$postId'), + headers: { + "Content-Type": "application/json", + "Cookie": sessionCookie ?? "", + "X-CSRFToken": csrfToken ?? "", + }, + ); + + print("Response Status Code: ${response.statusCode}"); + print("Response Body: ${response.body}"); + + if (response.statusCode == 200) { + return true; + } else { + return false; + } + } } diff --git a/frontend/lib/models/admin_post_view_model.dart b/frontend/lib/models/admin_post_view_model.dart index 34b1d05..8f465f9 100644 --- a/frontend/lib/models/admin_post_view_model.dart +++ b/frontend/lib/models/admin_post_view_model.dart @@ -66,4 +66,16 @@ class PostViewModel extends ChangeNotifier { notifyListeners(); } } + + Future deletePost(int postId) async { + bool success = await _postService.deletePost(postId); + + if (success) { + posts.removeWhere((post) => post.id == postId); + notifyListeners(); + print("Post deleted successfully"); + } else { + print("Failed to delete post"); + } + } } diff --git a/frontend/lib/pages/admin_pages/admin_feed_view/admin_feed_page.dart b/frontend/lib/pages/admin_pages/admin_feed_view/admin_feed_page.dart index 417138e..1c88651 100644 --- a/frontend/lib/pages/admin_pages/admin_feed_view/admin_feed_page.dart +++ b/frontend/lib/pages/admin_pages/admin_feed_view/admin_feed_page.dart @@ -35,13 +35,6 @@ class _FeedScreenState extends State { _buildHeader(), const SizedBox(height: 10), const SizedBox(height: 10), - // Expanded( - // child: ListView.builder( - // itemCount: Post.samplePosts.length, - // itemBuilder: (context, index) => - // _buildPostCard(Post.samplePosts[index], context, index), - // ), - // ), Expanded( child: postViewModel.isLoading ? Center(child: CircularProgressIndicator()) @@ -152,22 +145,63 @@ class _FeedScreenState extends State { ), ), ), - FloatingActionButton( - onPressed: () { - showDialog( - context: context, - builder: (context) => EditPostDialog( - index: index, - postId: post.id, // ✅ Pass post ID for API call - currentTitle: post.title, // ✅ Pass current title - currentDescription: - post.description, // ✅ Pass current description - ), - ); - }, - backgroundColor: Colors.purple, - mini: true, - child: const Icon(Icons.edit, color: Colors.white, size: 18), + Row( + children: [ + FloatingActionButton( + onPressed: () { + showDialog( + context: context, + builder: (context) => EditPostDialog( + index: index, + postId: post.id, + currentTitle: post.title, + currentDescription: post.description, + ), + ); + }, + backgroundColor: Colors.purple, + mini: true, + child: + const Icon(Icons.edit, color: Colors.white, size: 18), + ), + FloatingActionButton( + onPressed: () { + showDialog( + context: context, + builder: (BuildContext context) { + return AlertDialog( + title: const Text("Delete Post"), + content: const Text( + "Are you sure you want to delete this post?"), + actions: [ + TextButton( + onPressed: () { + Navigator.pop(context); + }, + child: const Text("Cancel"), + ), + TextButton( + onPressed: () async { + final postViewModel = + Provider.of(context, + listen: false); + await postViewModel.deletePost(post.id); + Navigator.pop(context); + }, + child: const Text("Delete", + style: TextStyle(color: Colors.red)), + ), + ], + ); + }, + ); + }, + backgroundColor: Colors.purple, + mini: true, + child: const Icon(Icons.delete_forever, + color: Colors.white, size: 18), + ), + ], ), ], ), From 3fd50b6f55a4020d1144c4eca64071bd8c3366e9 Mon Sep 17 00:00:00 2001 From: yvaishalirao Date: Sat, 1 Mar 2025 22:02:07 +0530 Subject: [PATCH 82/97] dp added --- frontend/assets/images/dev_track_logo.jpg | Bin 0 -> 5769 bytes .../admin_feed_view/admin_feed_page.dart | 7 ++++--- frontend/lib/pages/common_pages/login_page.dart | 7 +++---- 3 files changed, 7 insertions(+), 7 deletions(-) create mode 100644 frontend/assets/images/dev_track_logo.jpg diff --git a/frontend/assets/images/dev_track_logo.jpg b/frontend/assets/images/dev_track_logo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..de636b556d4610fc4938fc187b8158245c688a3e GIT binary patch literal 5769 zcmb7HcT`i$w@x9nPy!^NH0iyAG((jdngj#|q+U7*58{Yi zuTaAg@XI1VFg}L>LIQ!1z{#QH@c*}6v;nAy0X={oFpv!Zq5^`cfEOJAM*JW_VBqC= z{}>_BXsHc~

G1rGjdZq$?t5da?C$9R)?!}5ZBm|T;$%IroASJO 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 { Row( children: [ const CircleAvatar( - backgroundColor: Colors.grey, - radius: 20, - ), + backgroundColor: Colors.grey, + radius: 20, + backgroundImage: + AssetImage("assets/images/dev_track_logo.jpg")), const SizedBox(width: 10), Column( crossAxisAlignment: CrossAxisAlignment.start, diff --git a/frontend/lib/pages/common_pages/login_page.dart b/frontend/lib/pages/common_pages/login_page.dart index d8df210..c3bdf73 100644 --- a/frontend/lib/pages/common_pages/login_page.dart +++ b/frontend/lib/pages/common_pages/login_page.dart @@ -42,12 +42,11 @@ class LoginPage extends StatelessWidget { backgroundColor: Colors.white, child: CircleAvatar( radius: 45, - // backgroundImage: NetworkImage( - // 'https://storage.googleapis.com/a1aa/image/FMzESL12uGqBDRIcbgyzHWSJA_eagcTLOcV2KYexVXY.jpg', - // ), + // backgroundImage: AssetImage( + // "frontend/assets/images/dev_track_logo.jpg") ), ), - ), + ) ], ), const SizedBox(height: 60), From 567e34faf248e6c3c657d9cce03255f9c10734ff Mon Sep 17 00:00:00 2001 From: bharathan06 Date: Mon, 3 Mar 2025 21:12:00 +0530 Subject: [PATCH 83/97] ghamani backend trolling fix --- backend/myproject/members/models.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/backend/myproject/members/models.py b/backend/myproject/members/models.py index 385524d..cb712fc 100644 --- a/backend/myproject/members/models.py +++ b/backend/myproject/members/models.py @@ -3,6 +3,7 @@ from django.db import models from pydantic import ValidationError from .managers import CustomUserManager +from django.core.validators import MinValueValidator from django.core.exceptions import ValidationError @@ -22,7 +23,7 @@ class CustomUser(AbstractUser): phone = models.CharField(max_length=10) srn = models.CharField(max_length=8) branch = models.CharField(max_length=50) - semester = models.CharField(max_length=2, default='1') + passout_year = models.PositiveIntegerField(validators=[MinValueValidator(2025)], default=2025) github = models.URLField(default='', blank=True) linkedin = models.URLField(default='', blank=True) is_active = models.BooleanField(default=True) From 32f425a063963f8c723b6dc0b776ef3231d33b6f Mon Sep 17 00:00:00 2001 From: bharathan06 Date: Mon, 3 Mar 2025 21:12:42 +0530 Subject: [PATCH 84/97] migrations --- .../__pycache__/api.cpython-313.pyc | Bin 3344 -> 3344 bytes .../__pycache__/models.cpython-313.pyc | Bin 1761 -> 1761 bytes .../__pycache__/schemas.cpython-313.pyc | Bin 1626 -> 1626 bytes .../__pycache__/services.cpython-313.pyc | Bin 2550 -> 2550 bytes .../__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 1606 -> 1606 bytes backend/myproject/db.sqlite3 | Bin 307200 -> 319488 bytes .../members/__pycache__/admin.cpython-313.pyc | Bin 732 -> 732 bytes .../members/__pycache__/api.cpython-313.pyc | Bin 3982 -> 3986 bytes .../__pycache__/managers.cpython-313.pyc | Bin 1358 -> 1358 bytes .../__pycache__/models.cpython-313.pyc | Bin 4559 -> 4688 bytes .../__pycache__/schemas.cpython-313.pyc | Bin 1754 -> 2359 bytes .../__pycache__/services.cpython-313.pyc | Bin 4046 -> 4046 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 182 -> 182 bytes ...omuser_semester_customuser_passout_year.py | 23 ++++++++++++++++++ .../__pycache__/0001_initial.cpython-313.pyc | Bin 4681 -> 4681 bytes .../__pycache__/0002_initial.cpython-313.pyc | Bin 2019 -> 2019 bytes ...er_customuser_passout_year.cpython-313.pyc | Bin 0 -> 1123 bytes .../__pycache__/settings.cpython-313.pyc | Bin 4754 -> 4420 bytes .../__pycache__/urls.cpython-313.pyc | Bin 717 -> 717 bytes .../projects/__pycache__/api.cpython-313.pyc | Bin 3275 -> 3275 bytes .../__pycache__/schemas.cpython-313.pyc | Bin 1861 -> 1861 bytes .../__pycache__/services.cpython-313.pyc | Bin 3783 -> 3783 bytes .../__pycache__/0001_initial.cpython-313.pyc | Bin 5354 -> 5354 bytes .../__pycache__/api.cpython-313.pyc | Bin 1385 -> 1495 bytes .../__pycache__/schemas.cpython-313.pyc | Bin 602 -> 602 bytes .../__pycache__/services.cpython-313.pyc | Bin 2076 -> 2819 bytes .../__pycache__/0001_initial.cpython-313.pyc | Bin 2427 -> 2427 bytes 29 files changed, 23 insertions(+) create mode 100644 backend/myproject/members/migrations/0003_remove_customuser_semester_customuser_passout_year.py create mode 100644 backend/myproject/members/migrations/__pycache__/0003_remove_customuser_semester_customuser_passout_year.cpython-313.pyc diff --git a/backend/myproject/announcements/__pycache__/api.cpython-313.pyc b/backend/myproject/announcements/__pycache__/api.cpython-313.pyc index 421ff8e01f0fe7116cebbbe8dff0e0651983ddb1..69daa99d06e83a9d89947f7e5caff6e25131ca3f 100644 GIT binary patch delta 20 acmbOrH9?B|GcPX}0}x1`KDv>cl@|auGz9Pf delta 20 acmbOrH9?B|GcPX}0}#xbzGovhD=z>zNCh$g diff --git a/backend/myproject/announcements/__pycache__/models.cpython-313.pyc b/backend/myproject/announcements/__pycache__/models.cpython-313.pyc index a47c39e12c1a0e6bedc0561d6e9045e7911a3d20..7fe26b9afd9cee5154ffda3be0cf8173b2fd417e 100644 GIT binary patch delta 20 acmaFJ`;eFWGcPX}0}x1`KDv?n8XEvY0R}<< delta 20 acmaFJ`;eFWGcPX}0}#X%@7&0JjST=ndfGcPX}0}x1`KDv?n3kv{79|n>D delta 20 acmey*`Ja>fGcPX}0}yPSzilJ;7Zw0W<_7Hm 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 60fa7fae03f74f14c3e7ebb7a646a759b50510b6..73eba0b2e4313818e790fc22281e70e918479e4c 100644 GIT binary patch delta 20 acmZ3^xtx>xGcPX}0}x1`KDv>64hsM{Uj>Q) delta 20 acmZ3^xtx>xGcPX}0}yPSzilJ;92NjOCI#gH 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 a2df112be0b0bcca5755cf4734383ddee83ea55a..dc423bb6190a88e06f31bf1abedb94540bcf6155 100644 GIT binary patch delta 20 acmX@cbBu@kGcPX}0}x1`KDv?HnhgLvr3G&Q delta 20 acmX@cbBu@kGcPX}0}#X%@7&03%?1EGAO%bS diff --git a/backend/myproject/db.sqlite3 b/backend/myproject/db.sqlite3 index 61ada480b3ad85e77c349dd6647683648d60cfbe..1a95bbb3afa5aa73722de7e559205e106498d895 100644 GIT binary patch delta 1338 zcmZWo|4&<06u;-)M_=FT>$^ZH1-e2@0s%qj7Z@9a*+MYW$XC%V(AgFH9PQS2w1tiE z17G4s!hTuP&HD!!7L&~%7@B7^5tA*Vzii8*CK^plOcpVjG2p~RgWgxlGULrV=iGPi zx#ym9?&q`cW9h zv5ymD>w)4HF?6b`2-)WXaWy`nrqXV=+ZRfy@#KsedUHCRNyewsYATdg<7zs?CeN&$ z52w?~=}c%=4X3NZb0Cl}8QLZy}R%2a``oj%<-z zMx0mdY+Q$*^NxYBBBya5yXw@VFdS z-vyu!8K$jhCLB#qhR;P0Y$}{YbXA5P`m+qj9gxmUN7O`SNfh)D2y8YR1e#n9i*E{O zzZu3$&`dNk8O^J+;dnTMsAh&^`tep;r$G6UgBXiFTp4m8a9AziYh)o_nrCI$GwjX$ z9Fe!b-M2BG(Bz{3{vgJZgs zNeSD!PPEll2p03)9wM~J4=xT@YYl$*hT{?9e#(AvNV?>=2{w-hR+`rC@toG&2VYA9 zpFw7B0#SJgszh#rn}8P7TbcV6x6-j8DC78yc76zWo<%`@x!-V)_VFmZ{8ueOD@gvs z^r7)xp@IL1H{lWPeUnMql>*9h@C05&E3|%yi_ncA*P(qnj@v+cGR%>^dIdI-v?2a( z>=&*ZzB1Gm&C1)NWO~HM@EL9aHpOqn9Q-Zu1)8f@V%>Wc9d`~eZlio6F?i*lhHPU2+54Vj3iRs;euKqhG|t~DG8&5o8Z$3j{?Mr#i6wNC zvf{l9qVy&MZPaIIDd>%N78P_6)lFdFjcN7+(zitD9L{s`a2}rXoEvkt8=rR!rzS@b zLPyQnu7;6)UWiP#3{$<#~0fMbgPLDX)z`wdE>6kJ5qenQOu`ZLy9(!=`@Ye zWjapJ(l@k%x~ZzIX!G&pmQl@;t>Aiz)z;#y*h+4Hf!%`hA>0;jZM)dpd?wP{*By@Z zwp|nx9#ZIBu&cehIT#9ebTxN&x9c4CLM&*t#UAIm!4ZFxSFofKRX~*2Dy&7SU|zDJ zkbxZ0&J-2CvtKi$IAuT->?m4_L|xZK-(Hu~M!gqUnhFjU(4dlyz9h$?kUgMaV?Sm{ z8go*xXY}?(LTz1rQ6HCroJe%0*hH@eElbEF(TpYJ)WS7HxPQKZq3wnM&+&<4B zOgxht6P)p-3NqzAs0&f#L8K3Pv`5xV^{O%`Ps<>_7C!MSe7fZwdBL?pE~<2}XprQw zMnCN25HfoFKnPd4E5TM6QzzlrpWRkiN9qsdnfOr1CR0SgC%7kyqHV}NZ4a!gvyj8w zelBFBHRAJNtk-gM(=A*2ky@z?$+Oa$cwD&0zvZ(m{pxC><#bdfeUK`o10%jvqsos5 zfO+fi5#wtURslzk9b%u)kR~W$B_Yy7Bm^UDB1CH7pz%9I4uf&I4&TDE`HwZdyA+}q z*hmvjXQurQk+0@W9w9c^L7vLd>LTI4m8}ceY=A3bubObSvFztm7+MWrV>Li1&N77* z77(>-vie8)sU*t{a;h{aT;Z4aQZkM|ayMZi?n}B4#zK(X6-l(PN-zTF$SIDMbrR9= SoWy?E%E9E*_}f?yDgO&rK-tCs diff --git a/backend/myproject/members/__pycache__/admin.cpython-313.pyc b/backend/myproject/members/__pycache__/admin.cpython-313.pyc index 80ee687a00a905a0772c35708ef4532944d1c41b..017455849a7284e0f8a040a083cfd900cdb90714 100644 GIT binary patch delta 20 acmcb^dWV(!GcPX}0}x1`KDv?nA`<{W6$T#w delta 20 acmcb^dWV(!GcPX}0}yPSzilJ;MJ513+y;68 diff --git a/backend/myproject/members/__pycache__/api.cpython-313.pyc b/backend/myproject/members/__pycache__/api.cpython-313.pyc index f8bd8b098db02152d7662b20ebf7dc0ef6c94c9e..5dda2768472dc8f47a39428d4bf3085689834bef 100644 GIT binary patch delta 227 zcmeB^pCr%wnU|M~0SKf|A5Fi!k#{u{qxj~XOoEJz{FB!+i?Nt61q)1m%B-#`7%UVl zY{?WX5+ei@6P04fVlf5j1A-#qV6h^RbS6!S&4w%*jI1mvi6x1f6Ip{8RcwLM4Ga$i zMXw7gT@+NhE~tA^P;s6njlb7%$va?^;u(_yVvzdqY7^74GNL&s?NCSym95%W6DWy57 Mc0~!3-|#I00C!?LdH?_b delta 214 zcmbOv-zU%enU|M~0SL@C?@7P2k#{u{quA!1OoEJz?333si?Nt61@ljS%B-#`5G)uh zWXTjP93uo26Om%bVlf5j1A-#qV9_FxbS6#l&4w%*j2!F*iIq9|i7A`oSc4cD?I&+! z6X&blSbHG-x?9*qx3J5C;hV3p`7=$9V-=h1#QB#^31o)FW>+pFMn>Ds72K+f+}0o= z4iMomc?C}*yZLo(`-|H4n+14}F-rM^#N|MQG?2K(VUwGmQks)$R}??_1K%P5oi{h# diff --git a/backend/myproject/members/__pycache__/managers.cpython-313.pyc b/backend/myproject/members/__pycache__/managers.cpython-313.pyc index e017f28d7f9059ffe51e60bd62707d95085f39b7..25dd7e09e178dc587139a858165c82a158c127e5 100644 GIT binary patch delta 20 acmX@db&iYsGcPX}0}x1`KDv?HnH2y%oCSga delta 20 acmX@db&iYsGcPX}0}yPQzilJ8Gb;cSCJB@*{w0p*z6R^+=5J3Elm~&xQFNlIZfIM-4ym^@7Sr7o&cftyk74!U3 zw6W9elFB~K-*_{7S%Xes&aB?mE9(XYv!vH7TxD*q5)p@dlu`a;Iw{k~G#(E5(+~&A1dJ&X)pJNr^H`<+LFNxI zMxi;vs1pT7I2@tM_(VQ}f=H#pu6(o)q)xlTF%-h_5rD#r5Ovqjry<;2rFiiHjVbwhJ0HAS>SU;QDCSHCJ%4C$!LV0h4_rvp7Xl~n2VGI0F)aRSq zn@w-*m=)Xw^V&J`y2H?%(1K-~HM4F^S8GPuz**C%l(3hI9RHeb+tzxm@YK*TkzD%< zdq&J4Os{=Jez~&UYV5n3{Hi7oGP9p5!wKaabk`!WeCPTc|_yP7LrcM}kr&QlM@}$(j{o&MFy|WU*rC)mx+}{f5hA zQ67eiM$PmBM14S~V z%#E|USYvR5f+H0Q#R}a*(Wq1k1r6edl(pG!Gl2&w;;Azj-FvG{LJza&HJSYBTuJ?V zoAy26h(O9dQR@FXPsN*`B6Hk$9pyxuJW?@Ba*5nZnA^Zuhwm_l< O`deV21+J0Zz@@)c&Cvz` delta 724 zcmYk2&ubGw6vyZ7=GX3Kv)MGiZCYuA?Y3f5OQdNoX@wB2k=n6E%a#z5B?LB&%(mjO zcTZtFcoRGcdZ-OZ{{YWgJtzd?O`)P7^ei}&rqVrpnD6&}-+Qxjoc=heo~o*h*mwBi zT|@7v3E1yUEtbVq-)%Q>Uq*2>fv_iuu-AmF$b$$GY2f;pE1BYY_{_b?|4F4G8%pQs zPONsZ>=}yFH#7s!XdR-84@+3i2}Chn^w=9y6f9sr)9RU4&vn3bt&h%3%1QKS+WWfyM5gca0h#8$g+2KV<3`a$a;cFpl0Et6p0nF-Z8#P=3DdvAtac)>z8=gQ?0)P-^Wrq9v@RAw?YZtjs$?83=*tD&3yKdRnYPMC~ zDbn}qZ`h=Vfmv9i-vU|XKA-h~;~^c>5;r#a5%XS&_ZFL$T_+n{%ePw9#?UD7)B?vA zM~=3%6iD=`R$k(JiNR4|=&6-T&8|95&9d!E#Q?I+Tn88mWSWtzoFmf>1((6g^HD{EXetn4>$-+MD}=6&D19nQ}?44+%S z{n|Ow8T*4?E*^8N41YxBC3Bgp?Xn#Wv>I~@uD)B?(LqO@xyG)sV}hx46Jso}YHXRU zG1ppUZqc(gacz2_sH`?xOP)5d+REynb?#DZNm3t+f9m>r{T%Eim;ZfqrSJM5g5an9ih+dr|S?fY@i<-RW+-|r@^enfiN_rK`} z(b!Y<{dNc16|*-m$c@!$1Ysr2`GAXfN35+P&ZHcYw+Qt0XA-{)r9O>1C0`4H8Qzq%KmBc)TEv z6WVtY({|Ogn-oNIv!zx@D_samCEh~u9Xp+?40cW{*9Lp%hGwph7>aBPMdvV^Fy}tOYx<0z&oKxIgA-oolZ8U7#r69lgu-~e1KQ+OAQIABLNjr z@(XV4@iaK2^Vdz7!$CTV1BxxO6a^wxDp2XMju2;suFotqP)m>|@{32(YKJ^(37An~ zX;4~t7o#b)AZ!uR>dN=#-v#Ts^MjR@_C2)cN_*Aourzhb@r5A753>WnHPokpSB&@o z9ZI=H5mN-K7iSR+Xrr&^Q;obN2tCE87wo)Xo6cVh#rcgqpC~YQ=n0=bLr?#LDDkzYX44kJE=!(GfN?LPXcJ7-tZ z>V)Z0zah;w*>ZcmDipQXX1oC8eN6mDKgI%Rf zqe4^m>vPhK!}w_cI=)IvH5id~8@qSh3S#^gfrUOOl28r2Mw;S*%AF^Ov>#?)!AG!# zaa2C>7{#BurfIL(omcE_^;;gk-3YblcL_f4(nSq2<@mC*Aiwy?giWb3fiqB)Wc}>ly)j z+kW4@zpJlPX?N?DCSVHe;4*(M&C8Z(Np;Fs=pz3?r{(rOS=(3n2YPi`2tteGJs@lL1iX*HjXlZQs5WFb5l6UN+{DHiMZ;94x8b&SlOAw ztPavI9GANSC#b5A43M}owAOuO# zjxTc=F7wikC0TNvGTBm?(p48ml0wVx_PpC}@DOg#wK`jF-}!nL7A8vH4Fad@CL;5< z-9+mIY|{??2d?+$u^5v5i#?Ay6l@ffL7tIVH=|ZF*7WFlY!;$h1DTAR-&-08xuP7k zhWNN-hz|kUG5reCn;YVWWJy?M!3p3~w3RBY@+Zpd`iV?6SjAAPFoFsQFd5^~YCLL0 zH{!8;bTf;7|A!${jYn$J%pM{;R@TShAJr0V@GollibxwTnkfO78lw>3NeQ_0v_j>V S)s%osi!yEO$%h17*7PSW(y1K) diff --git a/backend/myproject/members/__pycache__/services.cpython-313.pyc b/backend/myproject/members/__pycache__/services.cpython-313.pyc index aa1053e1579c32639ef2d41a2f91f7a225a8cec7..f2d4485056c3cffd1c9cf9d61419018849565959 100644 GIT binary patch delta 20 acmX>ne@>qJGcPX}0}x1`KDv?nFh2l6ng%ui delta 20 acmX>ne@>qJGcPX}0}wFI+Ov`SFh2l4kpXPw diff --git a/backend/myproject/members/migrations/0003_remove_customuser_semester_customuser_passout_year.py b/backend/myproject/members/migrations/0003_remove_customuser_semester_customuser_passout_year.py new file mode 100644 index 0000000..b8d4e2b --- /dev/null +++ b/backend/myproject/members/migrations/0003_remove_customuser_semester_customuser_passout_year.py @@ -0,0 +1,23 @@ +# Generated by Django 5.1.6 on 2025-03-03 15:42 + +import django.core.validators +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('members', '0002_initial'), + ] + + operations = [ + migrations.RemoveField( + model_name='customuser', + name='semester', + ), + migrations.AddField( + model_name='customuser', + name='passout_year', + field=models.PositiveIntegerField(default=2025, validators=[django.core.validators.MinValueValidator(2025)]), + ), + ] 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 07606544bb496700eb8659d2935988919cff92e7..0882a48afa5650876e3ff4281f5520fa1a608b01 100644 GIT binary patch delta 20 acmX@9a#Dr+GcPX}0}x1`KDv?HP6z-%i3PL( delta 20 acmX@9a#Dr+GcPX}0}yPQzilJ8oe%&+R|XIO diff --git a/backend/myproject/members/migrations/__pycache__/0002_initial.cpython-313.pyc b/backend/myproject/members/migrations/__pycache__/0002_initial.cpython-313.pyc index d761016b395ff321dbe07b1f76698b9eb2b49051..15d5651f88839136a4831d01bcad2c6d91ae6d89 100644 GIT binary patch delta 20 acmaFN|CpcqGcPX}0}x1`KDv?n20H*kng&e( delta 20 acmaFN|CpcqGcPX}0}yPQzilJ;4R!!UXa=bO diff --git a/backend/myproject/members/migrations/__pycache__/0003_remove_customuser_semester_customuser_passout_year.cpython-313.pyc b/backend/myproject/members/migrations/__pycache__/0003_remove_customuser_semester_customuser_passout_year.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..67b3a408adbf9eb6e97dfc06a73fed2f3454bf4c GIT binary patch literal 1123 zcmZ`%%TE(Q7@vJ~yWJKk6_H4SuO94yM>HHT#)N3Ff*8|PPa7uN?obx?#W%ZEZYCPf zUic%t`A=x{U<5pr%!Pv|ZZ*}rGrKg9fSc_1o^QVS{l5Otkb(Gj`2BNxT}J4aa0XxQ z*yt~EV+WbYl$H@lT+7Syk^;(-3hFg9j&2}Rxq?j9QW|NuL4!=sDVc^`TdL)bg!8l} zGsAb=V8?D4P^S5zLp<8b3Nu+ecKTnqv4gDiW{^z@6jPp&K(%s>(&+=4EoL!QGdC~u z{DuGIHA`<)&dud5qcL_i(-=P|HgPs)=I5j=IwP6-ylfWcl^Gc>m<9~Di?tFftPEa# zl;?#UhrCbxCIQMyv$M0eu^YItYkSOSB{UBGgc4vnB|f1sffP0Y6%K5lFg2B>$fh(* zV!Taka7A0u)gfzk;>FD9*q-ayaR{`gfB+1JxL~<8mw3)cPDPpNIPHfqGce{et*dTt`A&a6j(-#~kwLlfQ(Pts$ zFYA!UK}^~NvLemdu!DBU)K&-t%A#;&#SLECUP8FY24_YXk-@55!kET(113uv?o`3sGb>xxuHm{Ot(B4bqCO zV;ZcJwX`@PcQB-H!Y6d#0UM`dr#YC8wn5{gq(ZPvH@J9@dKxNJdx|`&y?N3zP~l=% zpWN3c4=&$47@7E;Qwl~;Pooq2`a~MNdQchfR;KnVQ=go#+K=M5Vz<7!S6}VcqrG~x zyOsQ`cXl7W+N-?&omctsqEXS_F2S|I4Q>vl=5hy(*j{pW7H8ET9Dy!iel1aGSCrg`p`42F>EAm zG_HhMSU3Ixcl`s#=*kU`g-wmdN8-AMwTZW2^(@YJ&i&5$&bjvGR>xcX5-V z)BxdKX}9r)5oo`$PkSHv{#9Hcqx)lQvlj+nkc=OIp)>D4^TSa(VnQzjun$Ji2ON?P z?1xbtfH52-@equoAA&dxA+mM=CI~V(LYPsQ#IZEJzS??|7A7ca9a_nMB$o-#GUqvl zK*R}%;3PybOyotF!U(}A5uSo+oZexAGt~-v!~}Nzc`d)Cp)TqgKFDrsx;R(XOT|2B zx}Gf-q;ly_HOr}NM|(!Qt(J2oyPQ_3S3uFUX>kY+1K%7YhX?uRc`N9j$KB^_+s*{c;vHbQ69z zVO-^e>TmNgP0tvI)>lqJPRfgtB5kA+aXFQolTyhQ*~r@xechS6N=7ZITdJ-pWz5w( zTT`L>#TH=98$_`At9s0^@_UwGgJnF-Atf}d#xs7o>(olo=1-LCGv)ba={7{(cdLVH z>#FsLHQrOXbi|MSYGZk>!M53$z0L+tnYbsh$FZmB6V_YFov@*=9rou}K01QOj$lo2 my+|G;D}@swTXT;fx%b?6-g#Fu ze|qkWc#my19+5R$d9dyk5qhpCtz|s{$7SXh?~5?lLR6T-ogoArS1IfOJMMxDBr}6v zb6h1XbOqTEg#{3Bx6(oPh}}`@tqM4&uOlRHAOs?~bdK)1---(07Kk zU4;IV6y=zF90!*I?c~(aAgxz{0(!xP4F@~t z-Gxb?H%Db6tr48Y83N@2gmSLT)M>SaJm~*-f!9P@z!#%(B8a0p_QM$Q=!fwzwL?O{ zNP=N1#9|3TxEI2>56t)?dHP`j4?qMD66}FVJOopC7@}mrBk%!WbQTPz+rZX)w zr!lj1id%>b6zM8**j68Z4{^SLL;@ij_hwxLK{$ z*Kx77Rn{zXv-wo~NOrKXRx5v9Efh5iE^cj?aM5Sc%!$-|GL_I+;~3UZZhI%o8j7qgfdw)W%x`0I&0^)760TMb|FsU&{3;RAe}mdBg|Y7{Kid~}j;x3^{}}rrb~~ps?!B_g z_@B0QHl5L?;QTdtC%IQTaI3=9xykKEULiC9s?$HM8JIJc8h$>7r zU4#3vzs107dz-)?F?^@_`{a=uagL^QInoq*_r7ZgW3Nq&PMSK+yUF7YM2Stt^uDiy zTaO%nxgWdL&_Yx4|0hlSBTfA7dFcPc|7fK#ooz@td0LY1GcPX}0}#lZKAQf6dn4aV4o2q5KR7H{LYYh%C!28gvN&GgaNK;9)0a`& ziE)Gbb(4^bCLy007+IYdKQlA10ZAqxd$TTg3!{`1;{?6W404QMDJH#-Odw{FI?#9k D*f||n delta 108 zcmX>td0LY1GcPX}0}yz~?@wps*~s^jgOO$O4-N~K2q9CZ$tIk=EM6Blyfz=@^ktOx zX58R@-6Z6qNyujgMpkde&&&*LPK=+Kfb7k>+%1e!-i#CUJ~PNMf~A=BJ~DxrMe0D~ E0bzI?H~;_u diff --git a/backend/myproject/projects/__pycache__/schemas.cpython-313.pyc b/backend/myproject/projects/__pycache__/schemas.cpython-313.pyc index 7fcbd296a2853783ec962e6c7ee5708c97700134..a9b951951dc817c4881bd570dab7ae91c9340deb 100644 GIT binary patch delta 20 acmX@gca)F&GcPX}0}#lZKDv?HiX8wv%>{A* delta 20 acmX@gca)F&GcPX}0}#w!vS%Z=6*~YwF9pE> diff --git a/backend/myproject/projects/__pycache__/services.cpython-313.pyc b/backend/myproject/projects/__pycache__/services.cpython-313.pyc index 5f503d24c941c26c10f8a59afbe1b8dff8254ee0..e20c0004efa95c90a55a29cf064781587809189b 100644 GIT binary patch delta 20 acmX>udt8?LGcPX}0}#ADeRL!D9zFm?_Xh3& delta 20 acmX>udt8?LGcPX}0}yOmv}Yst9zFm=QwD_q 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 36f6290238d6a91ba26f1718057ca1d9c70a9140..c975a1a810ad5b8e19e56fe678e187b54be33fdb 100644 GIT binary patch delta 20 acmaE*`AU=fGcPX}0}#lZKDv?nz6bzEZU&?P delta 20 acmaE*`AU=fGcPX}0}yPQzilJ;eGvdkH3t6x diff --git a/backend/myproject/registrations/__pycache__/api.cpython-313.pyc b/backend/myproject/registrations/__pycache__/api.cpython-313.pyc index f0b7ae1cf0bacf616ac8638d9798123328e20411..330189a36e296eec77a8e0fba3ff030b06e094d9 100644 GIT binary patch delta 635 zcmX|7&ubGw7@e8jZ1zVsHrmiND%PT{t5^|iL)D}<1+^7ob#5WBUE>fFlHGK67W7o` zpm=Lo5B>ul{1^1%#giZj9)yL^iy%Fjl3u(y(_jYXec!x~@4d$y=syi}WSTnQ=j^wy z_3vHtG*BH?6Jy@{}z15J72pka;bbz~cHc8mH=Qe$hKPODLKnQ++JIMAXm@E1%)A5cDn zVl|{K$8*~xmR)Wi{YKkYGCZw~=t*8;gLu?$wVW^@)RyTf!6hl#2}!_cF4~c1;B@p> zx&f!6&(gd#BUa(@s*PfW5*AXgY#Y&EX?Zuxhg1;?a>wWE;&Z7g;JhHSjuS8*v*x&r z(ZRnwQ0bZ?<1QZNMf*WfJxw4&(KFRlXMVL74HN2*~7?4^>8|)=DI5{@GEV@aMSiRHs zpM@<_q>Fq2`3;I3h7yEu0IYpb=!3!lT-yhw0l0Li0yMREqPI}!%@_M{^$2OudS4y^ PUU(>U7anSYIyU$RXv&-sk;x{@RHsk+6w;E62Z@y)ZEc zpTgzxdWO{Xr^I7kEDxSpqA4Psl_s8D*9w}NC!}yE1ns8d#>1aAfbe!+lws30?px72 zaR9|dkCmtwtH)ka&rFlg`ef7eEVRTKEC3VN@CPh$L5mIy%>Y}C&R&~~oc7^OQqo+C z52Oqo-ob9G)d+l!u8t2?7DN6e;C>Hhl{1n1``wPueO=m&d^jaev^9u}8!el9EJGK@ zFqaM)@?L1MH2uhy*$tSY zMi2#08bYz6;N5Fa{sHykC8E%>G*s~9K~Q4p)p?suX@kS=Z)V=S_h#P5yF*Wp4%8!& z5b$yQ^LqB94DbUt%^`V2~$ebl_^B6Dlh$?sx84qaqDxYjrv$u{SWyoFiOG|jD*6W(`=;Y3?gI~&`7et}zB z*EycRmK=E%Sm+=?z4doR7Hru;i$IJ0*xMxc} zQSBZ3swS#(qR|J~Habb_em2Ng>8B8Iq(IEQFyFRV2~;P189uHci#RjRb4X-y$KT2C;1z gt-;_n4A-D<*WXW)YG{r~^~ delta 289 zcmZn`nB!oE{}51+GO!`I9vngBjU2*D?k$GYU;U$1y zW^A^ML8?HJTcYvt#U+U)naS~qB_&0fNu?#J#qse)8X(o`AVLL1fZPWr*no^;4j|FS z@RdoG)sGRP2qf>P$u-%CE7%vT7FGW(4x8Nkl+v73yCNf?N=A?&vOwYkGb1D8T?W1T Z3|4m;wC^$~eP>Z)^ke+Q03yLA0|3OiI%WU> 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 3d57f418057a9f55a7d41f1fbc51f8fdcb5beff1..1ce9e4df06955176378d53e9bf7ed5fe00ee6581 100644 GIT binary patch delta 20 acmew@^jnDgGcPX}0}#lZKDv>+fD-^k&jua< delta 20 acmew@^jnDgGcPX}0}yPQzilIT0Ve=RmIiqM From 8267883a9354872c25e339f54754ee150f0fc893 Mon Sep 17 00:00:00 2001 From: yvaishalirao Date: Mon, 3 Mar 2025 21:26:37 +0530 Subject: [PATCH 85/97] date format --- .../admin_feed_view/admin_feed_page.dart | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/frontend/lib/pages/admin_pages/admin_feed_view/admin_feed_page.dart b/frontend/lib/pages/admin_pages/admin_feed_view/admin_feed_page.dart index e52c58c..8d43beb 100644 --- a/frontend/lib/pages/admin_pages/admin_feed_view/admin_feed_page.dart +++ b/frontend/lib/pages/admin_pages/admin_feed_view/admin_feed_page.dart @@ -1,5 +1,6 @@ import 'package:dev_track_app/pages/admin_pages/admin_feed_view/edit_post_dialog.dart'; import 'package:flutter/material.dart'; +import 'package:intl/intl.dart'; import 'package:provider/provider.dart'; import '../../../models/admin_post_model.dart'; @@ -14,6 +15,22 @@ class AdminFeedPage extends StatefulWidget { } class _FeedScreenState extends State { + String formatDate(String createdAt) { + DateTime postDate = DateTime.parse(createdAt).toLocal(); + DateTime now = DateTime.now(); + + String formattedDate = DateFormat("dd/MMM hh:mm a").format(postDate); + int difference = now.difference(postDate).inDays; + + String daysAgo = (difference == 0) + ? "Today" + : (difference == 1) + ? "Yesterday" + : "$difference Days ago"; + + return "$daysAgo • $formattedDate"; + } + @override void initState() { super.initState(); @@ -119,7 +136,7 @@ class _FeedScreenState extends State { fontWeight: FontWeight.bold, fontSize: 16), ), Text( - post.createdAt, + formatDate(post.createdAt), style: const TextStyle(fontSize: 14, color: Colors.black), ), ], From a5b1a2823d54509adea253e7e24ce031c79d49d5 Mon Sep 17 00:00:00 2001 From: bharathan06 Date: Mon, 3 Mar 2025 21:38:44 +0530 Subject: [PATCH 86/97] my face when the uhhh --- .../announcements/migrations/0001_initial.py | 11 +++++++- .../announcements/migrations/0002_initial.py | 7 ++++- .../migrations/0003_postmodel.py | 26 ------------------ .../__pycache__/0001_initial.cpython-313.pyc | Bin 1279 -> 1631 bytes .../__pycache__/0002_initial.cpython-313.pyc | Bin 1191 -> 1445 bytes backend/myproject/db.sqlite3 | Bin 319488 -> 307200 bytes .../__pycache__/models.cpython-313.pyc | Bin 4688 -> 4683 bytes .../members/migrations/0001_initial.py | 5 ++-- .../members/migrations/0002_initial.py | 2 +- ...omuser_semester_customuser_passout_year.py | 23 ---------------- .../__pycache__/0001_initial.cpython-312.pyc | Bin 4213 -> 0 bytes .../__pycache__/0001_initial.cpython-313.pyc | Bin 4681 -> 4892 bytes .../0002_alter_customuser_srn.cpython-312.pyc | Bin 756 -> 0 bytes .../__pycache__/0002_initial.cpython-313.pyc | Bin 2019 -> 2019 bytes ...customuser_branch_and_more.cpython-312.pyc | Bin 1319 -> 0 bytes ...emove_customuser_alt_email.cpython-312.pyc | Bin 672 -> 0 bytes ...er_customuser_passout_year.cpython-313.pyc | Bin 1123 -> 0 bytes ..._customuser_email_and_more.cpython-312.pyc | Bin 2003 -> 0 bytes ...l_related_project_and_more.cpython-312.pyc | Bin 2078 -> 0 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 182 -> 0 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 182 -> 182 bytes backend/myproject/members/models.py | 2 +- .../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 26 files changed, 23 insertions(+), 57 deletions(-) delete mode 100644 backend/myproject/announcements/migrations/0003_postmodel.py delete mode 100644 backend/myproject/members/migrations/0003_remove_customuser_semester_customuser_passout_year.py delete mode 100644 backend/myproject/members/migrations/__pycache__/0001_initial.cpython-312.pyc delete mode 100644 backend/myproject/members/migrations/__pycache__/0002_alter_customuser_srn.cpython-312.pyc delete mode 100644 backend/myproject/members/migrations/__pycache__/0002_remove_customuser_alt_email_alter_customuser_branch_and_more.cpython-312.pyc delete mode 100644 backend/myproject/members/migrations/__pycache__/0003_remove_customuser_alt_email.cpython-312.pyc delete mode 100644 backend/myproject/members/migrations/__pycache__/0003_remove_customuser_semester_customuser_passout_year.cpython-313.pyc delete mode 100644 backend/myproject/members/migrations/__pycache__/0004_filemodel_alter_customuser_email_and_more.cpython-312.pyc delete mode 100644 backend/myproject/members/migrations/__pycache__/0005_filemodel_related_project_and_more.cpython-312.pyc delete mode 100644 backend/myproject/members/migrations/__pycache__/__init__.cpython-312.pyc diff --git a/backend/myproject/announcements/migrations/0001_initial.py b/backend/myproject/announcements/migrations/0001_initial.py index e7941e9..31dd938 100644 --- a/backend/myproject/announcements/migrations/0001_initial.py +++ b/backend/myproject/announcements/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 5.1.6 on 2025-02-18 19:17 +# Generated by Django 5.1.6 on 2025-03-03 15:57 from django.db import migrations, models @@ -21,4 +21,13 @@ class Migration(migrations.Migration): ('notification_type', models.CharField(choices=[('EN', 'enrollment'), ('SC', 'scrum'), ('DE', 'deadline')], max_length=2)), ], ), + migrations.CreateModel( + name='PostModel', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('title', models.CharField(max_length=100)), + ('description', models.TextField(blank=True, max_length=512)), + ('created_at', models.DateTimeField(auto_now_add=True)), + ], + ), ] diff --git a/backend/myproject/announcements/migrations/0002_initial.py b/backend/myproject/announcements/migrations/0002_initial.py index 249959d..f769df8 100644 --- a/backend/myproject/announcements/migrations/0002_initial.py +++ b/backend/myproject/announcements/migrations/0002_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 5.1.6 on 2025-02-18 19:17 +# Generated by Django 5.1.6 on 2025-03-03 15:57 import django.db.models.deletion from django.conf import settings @@ -20,4 +20,9 @@ class Migration(migrations.Migration): name='user', field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL), ), + migrations.AddField( + model_name='postmodel', + name='created_by', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL), + ), ] diff --git a/backend/myproject/announcements/migrations/0003_postmodel.py b/backend/myproject/announcements/migrations/0003_postmodel.py deleted file mode 100644 index 93abcf5..0000000 --- a/backend/myproject/announcements/migrations/0003_postmodel.py +++ /dev/null @@ -1,26 +0,0 @@ -# Generated by Django 5.1.6 on 2025-02-20 04:53 - -import django.db.models.deletion -from django.conf import settings -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('announcements', '0002_initial'), - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ] - - operations = [ - migrations.CreateModel( - name='PostModel', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('title', models.CharField(max_length=100)), - ('description', models.TextField(blank=True, max_length=512)), - ('created_at', models.DateTimeField(auto_now_add=True)), - ('created_by', 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 0af9e95ffb7cef598e4eb51825c929f0f84e2e70..bc0ff9c1634cd4ab0fc3acfcf217174e5b486aa9 100644 GIT binary patch delta 377 zcmey*d7p>xGcPX}0}!-aJevNDWg=fM(=x`1bKkMVum$l=c4QP~6q$HllTmbXJfj3( zuvjpcC8G&buy_ndkQ7LkpD9=(SkjUSD8>yG69b7!G6nO1ROzz>3tKYjGZpa#OBL~_ zOKZw(p3W%2Xmg7*Aiuc8H$Npc=N4;8W=T%!%M_pkZgHoi7AF^F7L;V>=VdZ5F)(N{ z-C|A3NzBVG5(LVxWbo4zn7oB)7At2+YDLLp4`xk9waG=y6-)w*lix7U;}v1x6u!%3E*4oIi5Y6wrL-CZpC}nj)!1{)u+yb`i3I>-H3^tUUV7{o}b3wrO zhM??>vg`83m*kBPh+LF+yCC5Hfs<8)?;|S*C)WpY5h1o_uOidQlUUT;)qw6OG6fN4 zAQyAkMT+>+MK#4XyE92JvaV$C z)8wB#n|an`2Nq>U#mOlw6-Ew4z4;Y0epJ%RMES&7YlE=Z!CdAh4Rir$bkyVXRcCrSmfv*rydyz7TPyrIRIBatB zQ%ZAE?TR#jTt*-+Rss?qm>C%vKeI6~D&A#KxX+;Rg^iz)Z35SI0hNmaDqk6Z9IzPx D)14=_ diff --git a/backend/myproject/db.sqlite3 b/backend/myproject/db.sqlite3 index 1a95bbb3afa5aa73722de7e559205e106498d895..6c3c61251b2e4f4782bfe85c67c9a1d142b880f1 100644 GIT binary patch delta 6922 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�(pK*|#o-G#I&zeWq+ z+Daq&xXVg!EI4@1%hQasBZCF+O%?Sfw7N~zz$1=pwI%c~RMaoZXaYytU(LNwh)NMs zLDws?B}Fk~P-Xh0F=+I{2B#l3I4(jxy}j;F6*3En_|<#xtCw)~^nD}#Bwbic!4^Cg zO1T&xzwC;qVsY0NP3K){ZZW#(h)!&rTRBHhEv@)3E-%hcW#iNAX?`u6i;V>1Ba>_H z_yX&RpSmzN9mq_c9Gl;A1ujG`tj&aZ&(`VHv*Be=I=oc0C#EvKz)WCaj^8@#UtREJ zF1jZpxz$bn^o6-KdNeZ`oEXn7#Isv-nS651Ghts!td2#QL}8^cIdUrKb#vr9}bKs{nNRLGwFr7iRAdmdTuOvb~Qh`kUp0yqzgW8VVL$6 zqo)cNli7G?buDyu%e%_E?WY%q7krE3r!roDWI26i+&jqRQ^8B@U^d{obYe7-@y0!~ zg^lDw`1HI#HQ`GxpUXwh^Xr+#MBqX)mz$o7DQ9;`OYE*Phs)*jdas_xz`aNOD_ff( zUoKg6ulVSVEgs&|p}Eb?rDUF8$%ezLnPkbo)A7mm75~}Oi{3IIq%9OosUfTwH;TC#K6oa7W_4?v@tt1Iua4%nCKg7+XJ=9w_tO0I+$?)?%QL%p zwy?Br-(0&iH$KDqybIBjo*B=~`0}}h$*4OwmIC*6qYbtwwW8zXcJmCq)xeedadSEGf7dUridYvCkxg)D|VKumZYVPbs zdfLUEyO6LCXGc~}%&nZA9tmBFk1x@2*K9t%Ue5V6BNawCdeFr+3$UtC|3ck{S7%;;PM@TL zY8)Z8TK*>FZ(RPyq%}uv)Ll>+P*J68*4{^6u6m;C2=O`m2iW`2Hw|x~qT$P6gz|?D z3GJ5GtET6w%%LIq=tY#@zo}ERWw5sXBuG3E8bT_0r<7Yw#PTC&#Pr?B38%SQVtV`N ztk^t_&7w&$IgO>zDe>89Y!Ds3WloTIRj z`2HxI@lJ~R05*Yw*Ukm75ol69EoNr0Bj|*9`xG1izcYhz_;%lv_~}#d;=-7Oj6iR5 zvuFTKT!Wnb48rQh#Xq(XM^Heb){C!M2tPJ7Cf;l(2Gyf5aF;}`9dhOF6#tuMZweck zlk6WRPTpU2`hySAXi7Xff*QmJ2Jo6c{rMvZj^%$Qd>R|8wMsFgre1-3LA^n}4%_or zU!Mebh;~0{a0h_J3z8@@lP$vLPeV z`uTlD2wYvxRZ6{)8|2|FIFHZmro99-W8`M;J4+gOv}6Z)AH3xUMO}`^D;+|Ws<@}@ zv9}#`#||=X2M+};pO?of?YLj5D5PN*90MFKn)A@UVaU0Z6>e~~es*tt>8{Hip@=gQ zjdToJF2DD^_w2EjffYo0=a2Tfy^K$Cv|JS`C1x``Nr_oXo`eBcQEJn1qsxGUM}ML( zLMgRjZwuhFq?t{+3Fq#b39E{A-txe|6ok`0uZzDuqhD@wmiygTNp(9b-hfJKJycRP zP)XG&l~mao#NKg}R4L3>fN~9ZulLyh=rvL(QV&HZ@`kix5Y%`7qjltxm`|vv7pNzw PPf%Z%_XYo%b>#mKTB?0y diff --git a/backend/myproject/members/__pycache__/models.cpython-313.pyc b/backend/myproject/members/__pycache__/models.cpython-313.pyc index e671d2fd3f9862f243cd5fef287d48e91b36eb86..2cd2caafd4d95423ecabf3e36232032c03828820 100644 GIT binary patch delta 242 zcmcbha$1G=GcPX}0}wpCcr?9yBkwzAUY>%);^O?$lK9Hh#G=Wid?uSMSmYR4i6V$3>XwFcVG!xeoK&~W)SQ%}2oRskGdD3ED&PfDWeOr< zL4@_>4E}7hco0()L^uJ7TfFh{$vHqrCa31)#K&tg79{{hiy480Ly-oMEOG%8n>hts X85vzB`wLD7lFtQY8OtWK3b_FQrOrls diff --git a/backend/myproject/members/migrations/0001_initial.py b/backend/myproject/members/migrations/0001_initial.py index 785f258..e2a312e 100644 --- a/backend/myproject/members/migrations/0001_initial.py +++ b/backend/myproject/members/migrations/0001_initial.py @@ -1,6 +1,7 @@ -# Generated by Django 5.1.6 on 2025-02-18 19:17 +# Generated by Django 5.1.6 on 2025-03-03 15:57 import django.contrib.auth.validators +import django.core.validators import django.utils.timezone from django.db import migrations, models @@ -42,7 +43,7 @@ class Migration(migrations.Migration): ('phone', models.CharField(max_length=10)), ('srn', models.CharField(max_length=8)), ('branch', models.CharField(max_length=50)), - ('semester', models.CharField(default='1', max_length=2)), + ('passout_year', models.PositiveIntegerField(default=2025, validators=[django.core.validators.MinValueValidator(2025)])), ('github', models.URLField(blank=True, default='')), ('linkedin', models.URLField(blank=True, default='')), ('is_active', models.BooleanField(default=True)), diff --git a/backend/myproject/members/migrations/0002_initial.py b/backend/myproject/members/migrations/0002_initial.py index a31271d..13cb7e5 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-18 19:17 +# Generated by Django 5.1.6 on 2025-03-03 15:57 import django.db.models.deletion from django.conf import settings diff --git a/backend/myproject/members/migrations/0003_remove_customuser_semester_customuser_passout_year.py b/backend/myproject/members/migrations/0003_remove_customuser_semester_customuser_passout_year.py deleted file mode 100644 index b8d4e2b..0000000 --- a/backend/myproject/members/migrations/0003_remove_customuser_semester_customuser_passout_year.py +++ /dev/null @@ -1,23 +0,0 @@ -# Generated by Django 5.1.6 on 2025-03-03 15:42 - -import django.core.validators -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('members', '0002_initial'), - ] - - operations = [ - migrations.RemoveField( - model_name='customuser', - name='semester', - ), - migrations.AddField( - model_name='customuser', - name='passout_year', - field=models.PositiveIntegerField(default=2025, validators=[django.core.validators.MinValueValidator(2025)]), - ), - ] diff --git a/backend/myproject/members/migrations/__pycache__/0001_initial.cpython-312.pyc b/backend/myproject/members/migrations/__pycache__/0001_initial.cpython-312.pyc deleted file mode 100644 index 875d377f6f5413b5bf071f120929bd7838130d27..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4213 zcmb7HPfQ!x8K3dk#&!&`Nk|A7GbE5;2sQ*Zy9voA{0W3?l6EPu2|}HY{hsZC@r*Mw zCc#yuRN6z2duoYPDY;hoz>%KHF;XvM)soTMLs#kvsRvd`RcQ}ZzxT!jXECeR5`OP{ z@ArP+_r8CA{I$6`z`^IAPpj!$%^dd+Dja@1waL3BnEZi59O6}OnP;P`HVSNXsqUO- z*^~1wdwI^q&2mWinnP~vS#3EaI~unHXTIFD!N)xNRCpY7kw8w#7_z14nn}Dl9bwf> z9UbDh?was!+fA*(%#vjn;+F;F%J9o>7YF)+^+%jJ5)j>MS`9VW;}MTM$XjaK0#^D- zyO58eTOGOn8~Ks16xeb(Yk)k(kZ0>L&Ky{I6f89#-W9Md412Bt)`L!?P$^u8Z9UO~ zGw7_sqc(I7@i@5Jahz>6(qJvxV6Er)+E#5T!=u*H`7N&_g6-`m+QWk-7fKyOS? zrR#Mze#(#o4Q~Be=|-K6H~&Z6IKy3Sz{jIo=r;Ns-9h7}yLCA^@e?N|*@-DMU4J5T z7Fg~VtBK>59#&5px>4!=VctS#YTuZPJs|!^hy85Z*N=mWR4H0Yu0!7QfQJjkxLm$XR(~_-%305>AoR$l! zMf_Q;<|PZiupDE2R1>?Tx1cG{3b+`XaI{lRjzxzMFb3R)HbA*zT4uaBGmoDY6a%BU zIP%G`n99nAoPsczqHc(3{2Uu`@gcV8%2g358O4GNX-K@Ah$jXULkUULHFYDt|9k3H zFKNMsp&L>To2Hz>rqK?|2CZO&wrCPqhu9$5(halb^t57t*Qxcz0Go?+9uo}OhMbcu zI(`-%hGSC(BOaC~`~LxKv6;<986g9-$J})cRCmo+G;o%jP8V;~1?_njgWnD6e8+Jq zS)j3*8RtJ- z*$-vq)DtWpg~F51>Kfjsubvps)`?&m+P)7Kh&O4-S}MDLjS4;!Lp&h^2tTqY6IKI~i7n!$jm;FY-90q?Oc1<(!5>`B3oj;%TP&=va~Q)Sn<8$_yp# z=s8p0r=+}EFl3eZmU~M&5ZO`f{=c#b%g~V;6`| zV%Lx)5|AW#Jr-09^PnU>E66H64^oq&DHe1|5=1zUHH5X40<}t?qvX^S%gsmh-D%LL zAPG(?nF(mPGgK|{PeF%prp?pf$ps~c9Wgkm>nfHtNAjXoS zVf&({q=0|1*0z=odjbjEqix?I@DwaXHHpsx1x3hIB53+^;#-`5=2=s$7qKr8pd)2W*)6k@IB+oAMcxZCa-dvmVZ zGgj^y+gUu|xS#Q|3x>RFQh3jC7pDXe!qdW!$g}o+)4pxN-h^w8LY9Q5bVv$mI#@zc z_%|IU-QPO{lV%-h*3G1ON1At}HAh-=gX=9J=LQy2(CF|R_pAp@iQe~s5T5g}`y}Xn z66Nm1Hrh4qr?}FcwnLe{aKw(rH`CQ$@28zDmXQ&?*T`3n;j;IjEE~a6GY8WX;M|OG{ z(x96Y!W{Kj_XFm!FTi6_TO51it%_r1acpPlFDrjusotJ1-=44DUMk;SvawMSow$L~ z2}+qLM-w}vyH+Lo&<;If77tL12g)4-+sR7D4LfvmFMQ5!@89%R+xyGy{o4~esM0=V zho<+!7wpc#&Fj_9!E)!|wo&Q4X@|x?4%>EWSFUv3w?lJ)-n_GU{q>z!cebxpIDY` z2O@J67=Ga13tzJP#@{Se`^L+C($6)IWqaT$g~~0 z2ZeL4<^8zm4;%;=TfM)1U_3c2w3v@{I2|TlYcO%vcb)&2jfa3E(MEuy2MB4a?XyM` z|IlarwPloK9g#Ibr^3IY+L;MYVfKUXmeXH9H+~5s{ddIdgRcXD=lOSDj=%UV*Y_&W&3^$@O>A%g 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 0882a48afa5650876e3ff4281f5520fa1a608b01..7c6b147433eec75eab79425454c7b286d8755f06 100644 GIT binary patch delta 661 zcmY*WL2nX47@e727Pc(}8Vf~&wT-1AX+TZ2Qn41bw18;kt8A^*x|9vB0oKd{(NjHm zHX$25nP_4>nrQF`m>3Uw5-%9MdE-{Y5760dd*~d#FK^y^-}@%>?bNG~Yv6PaA$Fd1 zzLvq=a*fCH481^r0A~=zRwoCYvpUJ}X&ber1uC3G<7f&2cN_s%>cHyn&4)5PYF+BWT5VO8g>$RVyvU(gMS2AmEE}%$YHkY(e{V%a=7b8M^^DqXgDq0d84} zT)~mMV7T#^j{v|r+=e{lK#B>>y>ZAb5V&J;n{aoZi+Y)|00L}9IJg(%qJ#!vo1Q4& z56e93N&+9*=t*%t;NX4#H?MT(GwA+z(_Yg{uWimi$11AYX z5?&#H5t>>xfhR@U4fix2rsie>D`AK6&J*%^OAqB*S&Nu^M4E^3y7ApJAF;GL)Ak(k js#a=LltucOLGxerX;$_)jPXD~IP@C@joDE@Z(9BX7Tc&= delta 502 zcmbQEc2b4!GcPX}0}x1`KAQfOeVB5(7ERvjd zP@X-A$L$cz7wl-s1eA4}#463{9P9$-xB@x6FpgUcN08ja58~|ZU}HQ$8hM$5J%gEo z#VwhETD>MuV3lR}2J7?z$%^_0`{^?U`v+SE2Y^)s0*x>N8X+1K92^`H92y)L9A?P| z)EW+zu!sOlLk6tea_56IvjGWB z_Q|nAYLjORnQ4Q?3V>p_IBatBQ%ZAE?TSi(Tt*-+Rss?qm>C%vKeI6~s!jecB*_9& F4**3ucV7Si diff --git a/backend/myproject/members/migrations/__pycache__/0002_alter_customuser_srn.cpython-312.pyc b/backend/myproject/members/migrations/__pycache__/0002_alter_customuser_srn.cpython-312.pyc deleted file mode 100644 index b13e9018ac0d5116628d9136549fc8b77b7b8c40..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 756 zcmY*W&ubGw6n?Y2+3YT<)F4*TdWb>TLre51S|}9-(Vq0+vM_EklXTPli zgWv=hFcLvbJQ8c3MnHpSz_cS^IwyT|nY6l3^*Q$Rq2X4}6>&A`#9>baMVKbJG~<-< zDDSLt0ICZzdyC)%ICzACr!mqao~{8m`sKj?rT~t?)SKDA^1oj(W}H<{QJOku=5i>k zW(}*ZCGD5Xd2qOD%;Po}xvaHXt@|`g!XgYJ>2wBpk;a3Z3#sQKIk&KuOHfPjfkr&( z6$h@4OsSzs5OZmiw$crG#P(fVTD0_2DjiBOZV++AHA>$Nf=IBEP{5AK|jQ_t1ZhL*{-P!vg;a&ku_XJ>3}j;zhe#@)%)>yvup_};kQ7}XnJgCF(QMb)sKsczQIPtV1TWxajZ zkT&ZFNiW@I?Q#dD?s>-z6;{UHM09CAnlExk+(N2;IKPc%suM!~m_XbMvqsEgXT07V Ltv7!Ik}~@*o65ki diff --git a/backend/myproject/members/migrations/__pycache__/0002_initial.cpython-313.pyc b/backend/myproject/members/migrations/__pycache__/0002_initial.cpython-313.pyc index 15d5651f88839136a4831d01bcad2c6d91ae6d89..372d3ac0e51e893029a3355754d464c22d7b1a4c 100644 GIT binary patch delta 19 ZcmaFN|CpcaGcPX}0}!-a+{ks49RNL81@-^{ delta 19 ZcmaFN|CpcaGcPX}0}x1`-pF;69RNDS1&06t diff --git a/backend/myproject/members/migrations/__pycache__/0002_remove_customuser_alt_email_alter_customuser_branch_and_more.cpython-312.pyc b/backend/myproject/members/migrations/__pycache__/0002_remove_customuser_alt_email_alter_customuser_branch_and_more.cpython-312.pyc deleted file mode 100644 index 3c14e5bce47875f5c078c0324a51ca7b3ac3bbe8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1319 zcmb7D&1(}u6rb7MY<9P)O=D4u{eU(U_R!MQn`og_6hwQ_dI<}|Br{Dm-LKAWin%HD z;7NM(Ur?Hpr~VI~0)>{ndde-(icl}kY_e@cBJ~|+e($~Cy!Yn4nQ!Cc2H@ho{<`x^ z2H?9;QppU!`8o%m009I#z=dV#N@WQG2|NQtIsinbu%V`huJ?as9TI1Py6@4hm~5Q@~PJOjOiE=nif=5t|SUIb>c}<7nHI`WCh6*?Ud8Wg4-Dk}?pA4TSjnYC4qT z9720d?1<8YMrc4iLcOX@LnfYSJobvZ{yu%0lw)i-Jb!|jBE0%$9ryLv@B=z{zhA&P zcY@20n-8rwyeFYm;WTVLq2X@i2YlaO-e$PEySxzuR)qte)N)$^^Bc4pS%W59*FVDI z?OsDHDFt0O8(sBUAj*ba{XQe?5q?`nSArH3e=%7E2s?Z^06i7x#hxrpsqbF&44}_{ zFiy3(jy898ckyg;<{~5OMo$C!oUqS!wAsWyeO6dFTskc*bP5ZfD<_50MONWFe*RD1 zy&LlG5Az-zmre?gM?}0c%*4ma71Nw9sPCV%#q^F_rV{ILm-ApaiS`?vF#9ngPvg)lAK@s9dHQP)QC)vW@6ngOJ zt$%~m|HM;ITjuIX@DSMc(vvUQjoUfA`M$^Ze$M<_Tcd#I?}zEfhyeU181NFfaSYrPWMp*#%lp)vW8auqp8cmG9??`LLlss@o|W-Z3(zH)?W6Yu z1o(u5Z*VdszG;B4Ms1VVLjcQj^QU!c%)O{|Cbs8j_f1#BGxUlSG7_rPcL#&PBNnEW zP%IvoRW8RR!ct|LF1dD5!GsKx6oaYExkyRTc6Bk>{;Dc3YF#9|FUVAk}1C7= F{s)4vuxJ1P diff --git a/backend/myproject/members/migrations/__pycache__/0003_remove_customuser_semester_customuser_passout_year.cpython-313.pyc b/backend/myproject/members/migrations/__pycache__/0003_remove_customuser_semester_customuser_passout_year.cpython-313.pyc deleted file mode 100644 index 67b3a408adbf9eb6e97dfc06a73fed2f3454bf4c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1123 zcmZ`%%TE(Q7@vJ~yWJKk6_H4SuO94yM>HHT#)N3Ff*8|PPa7uN?obx?#W%ZEZYCPf zUic%t`A=x{U<5pr%!Pv|ZZ*}rGrKg9fSc_1o^QVS{l5Otkb(Gj`2BNxT}J4aa0XxQ z*yt~EV+WbYl$H@lT+7Syk^;(-3hFg9j&2}Rxq?j9QW|NuL4!=sDVc^`TdL)bg!8l} zGsAb=V8?D4P^S5zLp<8b3Nu+ecKTnqv4gDiW{^z@6jPp&K(%s>(&+=4EoL!QGdC~u z{DuGIHA`<)&dud5qcL_i(-=P|HgPs)=I5j=IwP6-ylfWcl^Gc>m<9~Di?tFftPEa# zl;?#UhrCbxCIQMyv$M0eu^YItYkSOSB{UBGgc4vnB|f1sffP0Y6%K5lFg2B>$fh(* zV!Taka7A0u)gfzk;>FD9*q-ayaR{`gfB+1JxL~<8mw3)cPDPpNIPHfqGce{et*dTt`A&a6j(-#~kwLlfQ(Pts$ zFYA!UK}^~NvLemdu!DBU)K&-t%A#;&#SLECUP8FY24_YXk-@55!kET(113uv?o`3sGb>xxuHm{Ot(B4bqCO zV;ZcJwX`@PcQB-H!Y6d#0UM`dr#YC8wn5{gq(ZPvH@J9@dKxNJdx|`&y?N3zP~l=% zpWN3c4=&$47@7E;Qwl~;Pooq2`a~MNdQchfR;KnVQ=go#+K=M5Vz<7!S6}VcqrG~x zyOsQ`cXl7W+N-?&omctsqEXS_F2S|Iog!7S{L*ceBj72N7P={l_gtqs?-xVB&aIoQ1#8MElfqKc96#J&HLWZy!Y+! zOK)$OgZ1-+=6XcpxZkPLS^lldR1Ggv&JsaI zs|!R}oX?6RqEsAHE?QV|Fd{u=OVt&tDsSN`2|)l=(bQc`B0JbBm^PLTMaM*>`{@ZZ zm3T3yWn9(||pm4@R=$KsN8zhWUl8AVh+wAgcz#PqKnVKPv)>v4(6CzU(CNvo@ao z1$HPX%)Wls4$sBUT!>UsosCL?z?E1DB!KX`Qqdd|q_@RLHCD1Q5|o*%ER(P-L#T>| zL5|4sc16)>cd3SO8ADY@QH8e9_lWe&u{p6RTJ%96k$2S6EKG2L7ED5O8;aEy>9{>H zyhxkw$-%XcmOQC<9wxr3>K)Lm=HRw(_+84FwzFBr?I-Ui?i^BbFTR|6kY59C*!cpa zQ}XlJ-g3+`{O;UcwUpx4-Pv+EUjPBh&+FB)Wp3i4lW%i1fBA^!fweO-owCN2+?m9M?w|RDr1aI&S(pnAe-my7GxcDm6(9U9 ze$!1&?CmsD6ZO=@v3N4(=498f8Y$b2IjwlgO=tJ}n(1skojv;ad9smSaAS|Ip8xu4 z!8OZ`^tKzbu3C=7xA(@MO?^9cARZMO ziPv9(yLCNoYA_*v{hmeteX@S9z+(|Yn~G5~@1X+YBcq@@%P2b=%AJ6lDN*tfPknZr(Ubq<>tH;Lv;6P#Ce*^aA0kJ$sXp-dpqy9?{*?PcEf;i)ei~vSnC7= z%1{q~!h#h|7&S1F2=3rU4kIdelblXEA>c`5_@|!6iYUNW>z4oRA+&Ds6x-!fY_Gj+ zBkF#BPoCKKwJh`h;a9j|e)>82&0H|QA}w~`dbzIqvwLZ0o~f#H7tFeJcGexaF*leu z7I@)a*7Gm`d7t_YjTo=2t*za#+O9{FF|ceerjga^vpDqo47Sv_UC*)uV)oSo?OYCD(NPPX2@J|JUiIsa?tkxA`C2; zMH*9%#oQm1B0^6r>M662Nr5@qsECTC0zRMU)@{>2FF^-LiKQCsdMMiu!(*$8= zD3O@A~CaEs}fQZ`9z}GxL$(_yPaT@4!BCXcF+kqCJxtN2)V!3K+{%KY{H)aEl9=4o+$4~$+|2Z% z#FEVXyyBSn_{_Y_lK6PNg34bUHo5sJr8%i~MXW$u7=gGL#Q4a}$jDg43}gWSbPF-p diff --git a/backend/myproject/members/migrations/__pycache__/__init__.cpython-313.pyc b/backend/myproject/members/migrations/__pycache__/__init__.cpython-313.pyc index 79ba7a0b12e9136e26e1e7cfd89e78e52fe93b25..b82f07564db8f9e059c6d4f1dd704f0581857a31 100644 GIT binary patch delta 19 ZcmdnSxQ&tfGcPX}0}xEQaC9Q~Y5+EK1^)m5 delta 19 ZcmdnSxQ&tfGcPX}0}zP(TQ`w=H2^dT1(*N; diff --git a/backend/myproject/members/models.py b/backend/myproject/members/models.py index cb712fc..fe044bf 100644 --- a/backend/myproject/members/models.py +++ b/backend/myproject/members/models.py @@ -40,7 +40,7 @@ class CustomUser(AbstractUser): objects = CustomUserManager() USERNAME_FIELD = 'email' - REQUIRED_FIELDS = ['username', 'first_name', 'last_name', 'phone', 'srn', 'branch', 'semester'] + REQUIRED_FIELDS = ['username', 'first_name', 'last_name', 'phone', 'srn', 'branch', 'passout_year'] def __str__(self): return self.email diff --git a/backend/myproject/projects/migrations/0001_initial.py b/backend/myproject/projects/migrations/0001_initial.py index 0792814..3ebc2fc 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-18 19:17 +# Generated by Django 5.1.6 on 2025-03-03 15:57 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 c975a1a810ad5b8e19e56fe678e187b54be33fdb..37e60b5da6b265cd097eaf4c0414b05b6ef6a5fc 100644 GIT binary patch delta 19 ZcmaE*`AU=PGcPX}0}!-a+{pDn1OP$f2220| delta 19 ZcmaE*`AU=PGcPX}0}#lZ-pKVp1OPu(1>OJv diff --git a/backend/myproject/registrations/migrations/0001_initial.py b/backend/myproject/registrations/migrations/0001_initial.py index c0177b3..844b82f 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-18 19:17 +# Generated by Django 5.1.6 on 2025-03-03 15:57 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 1ce9e4df06955176378d53e9bf7ed5fe00ee6581..b12c5b0c5033be783448cf181395b5d64304c3f1 100644 GIT binary patch delta 19 Zcmew@^jnDQGcPX}0}!-a+{jhP2>?J)1;zjX delta 19 Zcmew@^jnDQGcPX}0}#lZ-pEzR2>?C91y}$8 From 13b263a8719a19343a07340bbc1e1b62932c8fff Mon Sep 17 00:00:00 2001 From: bharathan06 Date: Mon, 3 Mar 2025 22:27:11 +0530 Subject: [PATCH 87/97] reverse the order of post retrieval --- backend/myproject/announcements/services.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/myproject/announcements/services.py b/backend/myproject/announcements/services.py index bc3d35e..b82f2da 100644 --- a/backend/myproject/announcements/services.py +++ b/backend/myproject/announcements/services.py @@ -17,7 +17,7 @@ def create_post(self, request, payload): return post def list_posts(self): - posts = PostModel.objects.all().order_by("created_at") + posts = PostModel.objects.all().order_by("-created_at") result = [ { "id": post.id, From 2074b79b9708858b740ab0baa3286ce832b9c6f0 Mon Sep 17 00:00:00 2001 From: bharathan06 Date: Mon, 3 Mar 2025 22:57:48 +0530 Subject: [PATCH 88/97] makefile configs --- backend/myproject/.env | 2 +- backend/myproject/makefile | 47 ++++++++++++++++++++++++++++++++++++++ makefile | 37 ------------------------------ 3 files changed, 48 insertions(+), 38 deletions(-) create mode 100644 backend/myproject/makefile delete mode 100644 makefile diff --git a/backend/myproject/.env b/backend/myproject/.env index 5e25a82..1b88687 100644 --- a/backend/myproject/.env +++ b/backend/myproject/.env @@ -11,4 +11,4 @@ # dbname=postgres DATABASE_URL=postgresql://postgres.amvehcfjlboxobrignky:GOMxZBnMwtF5VPYk@aws-0-ap-south-1.pooler.supabase.com:5432/postgres -DJANGO_ENV=test +DJANGO_ENV=production diff --git a/backend/myproject/makefile b/backend/myproject/makefile new file mode 100644 index 0000000..52d9e0a --- /dev/null +++ b/backend/myproject/makefile @@ -0,0 +1,47 @@ +# Variables +MODE ?= local + + +export DJANGO_ENV + +# Echo color +GREEN = \033[0;32m +BLUE = \033[0;34m +YELLOW = \033[0;33m +NC = \033[0m + +run: + @echo "Running in $(DJANGO_ENV) mode" + python manage.py runserver + +prod: + @echo "Switching to production mode..." + @powershell -Command "(Get-Content .env) -replace '^DJANGO_ENV=.*', 'DJANGO_ENV=production' | Set-Content .env" + +test: + @echo "Switching to test mode..." + @powershell -Command "(Get-Content .env) -replace '^DJANGO_ENV=.*', 'DJANGO_ENV=test' | Set-Content .env" + + +debug: + APP_MODE=$(MODE) python -m debugpy --listen 5678 --wait-for-client manage.py runserver + +mm: + python manage.py makemigrations + +migrate: + python manage.py migrate + +su: + 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 diff --git a/makefile b/makefile deleted file mode 100644 index e7d3581..0000000 --- a/makefile +++ /dev/null @@ -1,37 +0,0 @@ -# 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 c19c972eb60fcf1159a39f4616ace8df3bfcc937 Mon Sep 17 00:00:00 2001 From: Dev / Track <111211012+DevTrackClub@users.noreply.github.com> Date: Mon, 3 Mar 2025 23:00:01 +0530 Subject: [PATCH 89/97] Update .env yes --- backend/myproject/.env | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/myproject/.env b/backend/myproject/.env index 1b88687..5e25a82 100644 --- a/backend/myproject/.env +++ b/backend/myproject/.env @@ -11,4 +11,4 @@ # dbname=postgres DATABASE_URL=postgresql://postgres.amvehcfjlboxobrignky:GOMxZBnMwtF5VPYk@aws-0-ap-south-1.pooler.supabase.com:5432/postgres -DJANGO_ENV=production +DJANGO_ENV=test From 2af0644f9c0876a5071aeb53defa89460ec3488c Mon Sep 17 00:00:00 2001 From: yvaishalirao Date: Tue, 4 Mar 2025 23:27:20 +0530 Subject: [PATCH 90/97] deleted dead pages --- .../lib/To-Be-Discarded/admin_dummy_home.dart | 19 -- frontend/lib/To-Be-Discarded/api.dart | 1 - frontend/lib/To-Be-Discarded/bottomNav.dart | 70 ----- frontend/lib/To-Be-Discarded/models.dart | 0 frontend/lib/To-Be-Discarded/routes.dart | 0 .../lib/To-Be-Discarded/user_dummy_home.dart | 20 -- frontend/lib/main.dart | 11 +- frontend/lib/models/std_class.dart | 25 -- frontend/lib/models/std_details.dart | 15 - .../lib/pages/common_pages/home_page.dart | 82 ------ .../lib/pages/common_pages/register_page.dart | 266 ------------------ frontend/lib/pages/home.dart | 79 ------ .../routing/previous_projects_routing.dart | 4 +- frontend/lib/theme/splashscreen.dart | 5 - .../admin_post_view_model.dart | 0 .../admin_feed_view/admin_feed_page.dart | 4 +- .../admin_feed_view/create_post_dialog.dart | 2 +- .../admin_feed_view/edit_post_dialog.dart | 2 +- .../admin_pages/mgmg_prev_projects.dart | 0 .../admin_pages/projects_card.dart | 2 +- .../common_pages/Theme-Demo-Page/sample.dart | 0 .../common_pages/confirm_page.dart | 0 .../common_pages/domain_pages/domain.dart | 0 .../common_pages/general_feed_page.dart | 61 ++-- .../common_pages/login_page.dart | 32 +-- .../user_pages/enroll_pages/enroll_page.dart | 9 +- .../enroll_pages/enroll_sucess.dart | 0 .../enroll_pages/enrollment_select.dart | 0 .../project_display/previous_projects.dart | 0 .../project_display/specific_project.dart | 0 .../project_display/teamcard.dart | 0 .../submission_page/submission_page.dart | 0 .../widgets/drop_down_button.dart | 0 .../user_pages/studentview.dart | 0 .../{pages => views}/user_pages/tracker.dart | 0 .../user_pages/user_feed_page.dart | 0 36 files changed, 47 insertions(+), 662 deletions(-) delete mode 100644 frontend/lib/To-Be-Discarded/admin_dummy_home.dart delete mode 100644 frontend/lib/To-Be-Discarded/api.dart delete mode 100644 frontend/lib/To-Be-Discarded/bottomNav.dart delete mode 100644 frontend/lib/To-Be-Discarded/models.dart delete mode 100644 frontend/lib/To-Be-Discarded/routes.dart delete mode 100644 frontend/lib/To-Be-Discarded/user_dummy_home.dart delete mode 100644 frontend/lib/models/std_class.dart delete mode 100644 frontend/lib/models/std_details.dart delete mode 100644 frontend/lib/pages/common_pages/home_page.dart delete mode 100644 frontend/lib/pages/common_pages/register_page.dart delete mode 100644 frontend/lib/pages/home.dart rename frontend/lib/{models => view_models}/admin_post_view_model.dart (100%) rename frontend/lib/{pages => views}/admin_pages/admin_feed_view/admin_feed_page.dart (98%) rename frontend/lib/{pages => views}/admin_pages/admin_feed_view/create_post_dialog.dart (97%) rename frontend/lib/{pages => views}/admin_pages/admin_feed_view/edit_post_dialog.dart (98%) rename frontend/lib/{pages => views}/admin_pages/mgmg_prev_projects.dart (100%) rename frontend/lib/{pages => views}/admin_pages/projects_card.dart (99%) rename frontend/lib/{pages => views}/common_pages/Theme-Demo-Page/sample.dart (100%) rename frontend/lib/{pages => views}/common_pages/confirm_page.dart (100%) rename frontend/lib/{pages => views}/common_pages/domain_pages/domain.dart (100%) rename frontend/lib/{pages => views}/common_pages/general_feed_page.dart (80%) rename frontend/lib/{pages => views}/common_pages/login_page.dart (84%) rename frontend/lib/{pages => views}/user_pages/enroll_pages/enroll_page.dart (96%) rename frontend/lib/{pages => views}/user_pages/enroll_pages/enroll_sucess.dart (100%) rename frontend/lib/{pages => views}/user_pages/enroll_pages/enrollment_select.dart (100%) rename frontend/lib/{pages => views}/user_pages/project_pages/project_display/previous_projects.dart (100%) rename frontend/lib/{pages => views}/user_pages/project_pages/project_display/specific_project.dart (100%) rename frontend/lib/{pages => views}/user_pages/project_pages/project_display/teamcard.dart (100%) rename frontend/lib/{pages => views}/user_pages/project_pages/submission_page/submission_page.dart (100%) rename frontend/lib/{pages => views}/user_pages/project_pages/submission_page/widgets/drop_down_button.dart (100%) rename frontend/lib/{pages => views}/user_pages/studentview.dart (100%) rename frontend/lib/{pages => views}/user_pages/tracker.dart (100%) rename frontend/lib/{pages => views}/user_pages/user_feed_page.dart (100%) diff --git a/frontend/lib/To-Be-Discarded/admin_dummy_home.dart b/frontend/lib/To-Be-Discarded/admin_dummy_home.dart deleted file mode 100644 index 31c71f8..0000000 --- a/frontend/lib/To-Be-Discarded/admin_dummy_home.dart +++ /dev/null @@ -1,19 +0,0 @@ -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/To-Be-Discarded/api.dart b/frontend/lib/To-Be-Discarded/api.dart deleted file mode 100644 index 381e9bb..0000000 --- a/frontend/lib/To-Be-Discarded/api.dart +++ /dev/null @@ -1 +0,0 @@ -//baseUrl = "https://dev-track-app.onrender.com/ diff --git a/frontend/lib/To-Be-Discarded/bottomNav.dart b/frontend/lib/To-Be-Discarded/bottomNav.dart deleted file mode 100644 index a31884f..0000000 --- a/frontend/lib/To-Be-Discarded/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/To-Be-Discarded/models.dart b/frontend/lib/To-Be-Discarded/models.dart deleted file mode 100644 index e69de29..0000000 diff --git a/frontend/lib/To-Be-Discarded/routes.dart b/frontend/lib/To-Be-Discarded/routes.dart deleted file mode 100644 index e69de29..0000000 diff --git a/frontend/lib/To-Be-Discarded/user_dummy_home.dart b/frontend/lib/To-Be-Discarded/user_dummy_home.dart deleted file mode 100644 index 123e985..0000000 --- a/frontend/lib/To-Be-Discarded/user_dummy_home.dart +++ /dev/null @@ -1,20 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:dev_track_app/pages/user_pages/enroll_pages/enroll_page.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/lib/main.dart b/frontend/lib/main.dart index f019cfa..88512de 100644 --- a/frontend/lib/main.dart +++ b/frontend/lib/main.dart @@ -1,14 +1,13 @@ import 'package:dev_track_app/view_models/user_feed_view_model.dart'; -import 'package:dev_track_app/pages/common_pages/login_page.dart'; +import 'package:dev_track_app/views/common_pages/login_page.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; -//login cmponent -import 'view_models/login_view_model.dart'; -//specify llogin -import 'pages/user_pages/user_feed_page.dart'; -import 'models/admin_post_view_model.dart'; + +import 'view_models/admin_post_view_model.dart'; //other models import 'view_models/enrollment_view_model.dart'; +//login cmponent +import 'view_models/login_view_model.dart'; // void main() { // runApp(const MyApp()); diff --git a/frontend/lib/models/std_class.dart b/frontend/lib/models/std_class.dart deleted file mode 100644 index 44b4ae3..0000000 --- a/frontend/lib/models/std_class.dart +++ /dev/null @@ -1,25 +0,0 @@ -import 'package:flutter/material.dart'; - -class STD { - final String _id; - - final String _name; - - final String _profilepic; - - final String _linkedin; - - final String _position; - - STD(this._id, this._name, this._profilepic, this._linkedin, this._position); - - String get id => _id; - - String get name => _name; - - String get position => _position; - - String get linkedin => _linkedin; - - String get profilepic => _profilepic; -} diff --git a/frontend/lib/models/std_details.dart b/frontend/lib/models/std_details.dart deleted file mode 100644 index 4546c35..0000000 --- a/frontend/lib/models/std_details.dart +++ /dev/null @@ -1,15 +0,0 @@ -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"), - ]; -} diff --git a/frontend/lib/pages/common_pages/home_page.dart b/frontend/lib/pages/common_pages/home_page.dart deleted file mode 100644 index 929cad3..0000000 --- a/frontend/lib/pages/common_pages/home_page.dart +++ /dev/null @@ -1,82 +0,0 @@ -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'; - -class HomePage extends StatelessWidget { - const HomePage({super.key}); - - @override - Widget build(BuildContext context) { - return Scaffold( - backgroundColor: Colors.black, - body: Padding( - padding: const EdgeInsets.symmetric(horizontal: 32.0), - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - 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( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - const Text( - 'Are you an existing user?', - style: TextStyle( - color: Colors.white, - fontSize: 24, - ), - ), - const SizedBox(height: 20), - Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - CustomButton( - text: 'Login', - onPressed: () { - Navigator.push( - context, - MaterialPageRoute( - builder: (context) => LoginPage(), - ), - ); - }, - ), - CustomButton( - text: 'Register', - onPressed: () { - Navigator.push( - context, - MaterialPageRoute( - builder: (context) => const RegisterPage(), - ), - ); - }, - ), - ], - ), - ], - ), - ), - ], - ), - ), - bottomNavigationBar: const BottomNavBar(), - ); - } -} diff --git a/frontend/lib/pages/common_pages/register_page.dart b/frontend/lib/pages/common_pages/register_page.dart deleted file mode 100644 index 83608ea..0000000 --- a/frontend/lib/pages/common_pages/register_page.dart +++ /dev/null @@ -1,266 +0,0 @@ -import 'package:flutter/material.dart'; -import 'confirm_page.dart'; // Ensure this import is correct - -class RegisterPage extends StatefulWidget { - const RegisterPage({super.key}); - - @override - // ignore: library_private_types_in_public_api - _RegisterPageState createState() => _RegisterPageState(); -} - -class _RegisterPageState extends State { - bool _isChecked = false; - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - title: const Text('Register'), - backgroundColor: const Color.fromARGB(255, 53, 156, 19), - ), - backgroundColor: Colors.black, - body: Column( - children: [ - Expanded( - child: SingleChildScrollView( - padding: const EdgeInsets.all(16.0), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - 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( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - const Text( - 'Registration Form', - style: TextStyle( - color: Colors.white, - fontSize: 24, - fontWeight: FontWeight.bold, - ), - ), - const SizedBox(height: 16.0), - const Text( - 'What should we call you?', - style: TextStyle(color: Colors.white), - ), - TextField( - decoration: InputDecoration( - hintText: 'Enter your name', - filled: true, - fillColor: Colors.grey[700], - border: OutlineInputBorder( - borderRadius: BorderRadius.circular(10.0), - ), - ), - ), - const SizedBox(height: 16.0), - const Text( - 'SRN and Phone number', - style: TextStyle(color: Colors.white), - ), - TextField( - decoration: InputDecoration( - hintText: 'Enter your SRN', - filled: true, - fillColor: Colors.grey[700], - border: OutlineInputBorder( - borderRadius: BorderRadius.circular(10.0), - ), - ), - ), - const SizedBox(height: 8.0), - TextField( - decoration: InputDecoration( - hintText: 'Enter your phone number', - filled: true, - fillColor: Colors.grey[700], - border: OutlineInputBorder( - borderRadius: BorderRadius.circular(10.0), - ), - ), - ), - const SizedBox(height: 16.0), - const Text( - 'If you have worked on some projects, drop us a link', - style: TextStyle(color: Colors.white), - ), - TextField( - decoration: InputDecoration( - hintText: 'Project link', - filled: true, - fillColor: Colors.grey[700], - border: OutlineInputBorder( - borderRadius: BorderRadius.circular(10.0), - ), - ), - ), - const SizedBox(height: 16.0), - const Text( - 'Course', - style: TextStyle(color: Colors.white), - ), - TextField( - decoration: InputDecoration( - hintText: 'Enter your course', - filled: true, - fillColor: Colors.grey[700], - border: OutlineInputBorder( - borderRadius: BorderRadius.circular(10.0), - ), - ), - ), - const SizedBox(height: 16.0), - const Text( - 'Which domain do you think suits you the best?', - style: TextStyle(color: Colors.white), - ), - DropdownButtonFormField( - decoration: InputDecoration( - filled: true, - fillColor: Colors.grey[700], - border: OutlineInputBorder( - borderRadius: BorderRadius.circular(10.0), - ), - ), - items: const [ - DropdownMenuItem( - value: 'appdev', - child: Text('App Development')), - DropdownMenuItem( - value: 'webdev', - child: Text('Web Development')), - DropdownMenuItem( - value: 'gamedev', - child: Text('Game Development')), - DropdownMenuItem( - value: 'aiml', child: Text('AI/ML')), - DropdownMenuItem( - value: 'web3', child: Text('Web3')), - DropdownMenuItem( - value: 'uiux', child: Text('UI/UX')), - ], - onChanged: (value) {}, - hint: const Text('Select a domain'), - ), - const SizedBox(height: 16.0), - const Text( - 'Enter LinkedIn ID', - style: TextStyle(color: Colors.white), - ), - TextField( - decoration: InputDecoration( - hintText: 'LinkedIn URL', - filled: true, - fillColor: Colors.grey[700], - border: OutlineInputBorder( - borderRadius: BorderRadius.circular(10.0), - ), - ), - ), - const SizedBox(height: 16.0), - const Text( - 'Enter email', - style: TextStyle(color: Colors.white), - ), - TextField( - decoration: InputDecoration( - hintText: 'Email address', - filled: true, - fillColor: Colors.grey[700], - border: OutlineInputBorder( - borderRadius: BorderRadius.circular(10.0), - ), - ), - ), - const SizedBox(height: 16.0), - Row( - children: [ - Checkbox( - value: _isChecked, - onChanged: (bool? value) { - setState(() { - _isChecked = value ?? false; - }); - }, - fillColor: MaterialStateProperty.all( - const Color.fromARGB(255, 53, 156, 19)), - ), - const Expanded( - child: Text( - 'I agree to the terms and conditions', - style: TextStyle(color: Colors.white), - ), - ), - ], - ), - const SizedBox(height: 16.0), - Center( - child: ElevatedButton( - onPressed: () { - // Navigate to confirmation page - Navigator.push( - context, - MaterialPageRoute( - builder: (context) => const ConfirmPage()), - ); - }, - style: ElevatedButton.styleFrom( - backgroundColor: - const Color.fromARGB(255, 53, 156, 19), - fixedSize: const Size(120, 50), - ), - child: const Text( - 'Submit', - style: TextStyle( - color: Colors.white, - fontWeight: FontWeight.bold, - ), - ), - ), - ), - ], - ), - ), - ], - ), - ), - ), - ], - ), - 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', - ), - ], - ), - ); - } -} diff --git a/frontend/lib/pages/home.dart b/frontend/lib/pages/home.dart deleted file mode 100644 index cfe632f..0000000 --- a/frontend/lib/pages/home.dart +++ /dev/null @@ -1,79 +0,0 @@ -import 'package:dev_track_app/pages/admin_pages/admin_feed_view/admin_feed_page.dart'; -import 'package:dev_track_app/pages/admin_pages/mgmg_prev_projects.dart'; -import 'package:dev_track_app/pages/common_pages/Theme-Demo-Page/sample.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/common_pages/home_page.dart'; -import 'package:dev_track_app/pages/user_pages/project_pages/project_display/previous_projects.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/submission_page/submission_page.dart'; -import 'package:dev_track_app/pages/user_pages/studentview.dart'; -import 'package:dev_track_app/pages/user_pages/tracker.dart'; -import 'package:dev_track_app/pages/user_pages/user_feed_page.dart'; -import 'package:dev_track_app/theme/splashscreen.dart'; -import 'package:flutter/material.dart'; - -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) { - return Scaffold( - body: Center( - child: Column( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - 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()), - 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()), - ], - ), - ), - ); - } -} diff --git a/frontend/lib/routing/previous_projects_routing.dart b/frontend/lib/routing/previous_projects_routing.dart index 190c05d..f709af7 100644 --- a/frontend/lib/routing/previous_projects_routing.dart +++ b/frontend/lib/routing/previous_projects_routing.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; -// import '../To-Be-Discarded/specific_project.dart'; -import 'package:dev_track_app/pages/user_pages/project_pages/project_display/specific_project.dart'; + +import '../views/user_pages/project_pages/project_display/specific_project.dart'; class PreviousProjectsRouting { static void pop(BuildContext context) { diff --git a/frontend/lib/theme/splashscreen.dart b/frontend/lib/theme/splashscreen.dart index 0d3ceaa..08e5c74 100644 --- a/frontend/lib/theme/splashscreen.dart +++ b/frontend/lib/theme/splashscreen.dart @@ -1,4 +1,3 @@ -import 'package:dev_track_app/pages/home.dart'; import 'package:flutter/material.dart'; class Splash extends StatefulWidget { @@ -30,10 +29,6 @@ class _SplashState extends State with SingleTickerProviderStateMixin { Future _navigateToHome() async { await Future.delayed(Duration(milliseconds: 2000)); - Navigator.pushReplacement( - context, - MaterialPageRoute(builder: (context) => HomePag()), - ); } @override diff --git a/frontend/lib/models/admin_post_view_model.dart b/frontend/lib/view_models/admin_post_view_model.dart similarity index 100% rename from frontend/lib/models/admin_post_view_model.dart rename to frontend/lib/view_models/admin_post_view_model.dart diff --git a/frontend/lib/pages/admin_pages/admin_feed_view/admin_feed_page.dart b/frontend/lib/views/admin_pages/admin_feed_view/admin_feed_page.dart similarity index 98% rename from frontend/lib/pages/admin_pages/admin_feed_view/admin_feed_page.dart rename to frontend/lib/views/admin_pages/admin_feed_view/admin_feed_page.dart index 8d43beb..c6d05c5 100644 --- a/frontend/lib/pages/admin_pages/admin_feed_view/admin_feed_page.dart +++ b/frontend/lib/views/admin_pages/admin_feed_view/admin_feed_page.dart @@ -1,10 +1,10 @@ -import 'package:dev_track_app/pages/admin_pages/admin_feed_view/edit_post_dialog.dart'; +import 'package:dev_track_app/views/admin_pages/admin_feed_view/edit_post_dialog.dart'; import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; import 'package:provider/provider.dart'; import '../../../models/admin_post_model.dart'; -import '../../../models/admin_post_view_model.dart'; +import '../../../view_models/admin_post_view_model.dart'; import '../admin_feed_view/create_post_dialog.dart'; class AdminFeedPage extends StatefulWidget { diff --git a/frontend/lib/pages/admin_pages/admin_feed_view/create_post_dialog.dart b/frontend/lib/views/admin_pages/admin_feed_view/create_post_dialog.dart similarity index 97% rename from frontend/lib/pages/admin_pages/admin_feed_view/create_post_dialog.dart rename to frontend/lib/views/admin_pages/admin_feed_view/create_post_dialog.dart index f25ee55..37b785c 100644 --- a/frontend/lib/pages/admin_pages/admin_feed_view/create_post_dialog.dart +++ b/frontend/lib/views/admin_pages/admin_feed_view/create_post_dialog.dart @@ -2,7 +2,7 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import '../../../models/admin_post_model.dart'; -import '../../../models/admin_post_view_model.dart'; +import '../../../view_models/admin_post_view_model.dart'; class CreatePostDialog extends StatefulWidget { const CreatePostDialog({Key? key}) : super(key: key); diff --git a/frontend/lib/pages/admin_pages/admin_feed_view/edit_post_dialog.dart b/frontend/lib/views/admin_pages/admin_feed_view/edit_post_dialog.dart similarity index 98% rename from frontend/lib/pages/admin_pages/admin_feed_view/edit_post_dialog.dart rename to frontend/lib/views/admin_pages/admin_feed_view/edit_post_dialog.dart index 10b22b6..58ef32f 100644 --- a/frontend/lib/pages/admin_pages/admin_feed_view/edit_post_dialog.dart +++ b/frontend/lib/views/admin_pages/admin_feed_view/edit_post_dialog.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; -import '../../../models/admin_post_view_model.dart'; +import '../../../view_models/admin_post_view_model.dart'; class EditPostDialog extends StatefulWidget { final int index; diff --git a/frontend/lib/pages/admin_pages/mgmg_prev_projects.dart b/frontend/lib/views/admin_pages/mgmg_prev_projects.dart similarity index 100% rename from frontend/lib/pages/admin_pages/mgmg_prev_projects.dart rename to frontend/lib/views/admin_pages/mgmg_prev_projects.dart diff --git a/frontend/lib/pages/admin_pages/projects_card.dart b/frontend/lib/views/admin_pages/projects_card.dart similarity index 99% rename from frontend/lib/pages/admin_pages/projects_card.dart rename to frontend/lib/views/admin_pages/projects_card.dart index 42949c0..c79a165 100644 --- a/frontend/lib/pages/admin_pages/projects_card.dart +++ b/frontend/lib/views/admin_pages/projects_card.dart @@ -1,5 +1,5 @@ +import 'package:dev_track_app/views/user_pages/project_pages/project_display/specific_project.dart'; import 'package:flutter/material.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/common_pages/Theme-Demo-Page/sample.dart b/frontend/lib/views/common_pages/Theme-Demo-Page/sample.dart similarity index 100% rename from frontend/lib/pages/common_pages/Theme-Demo-Page/sample.dart rename to frontend/lib/views/common_pages/Theme-Demo-Page/sample.dart diff --git a/frontend/lib/pages/common_pages/confirm_page.dart b/frontend/lib/views/common_pages/confirm_page.dart similarity index 100% rename from frontend/lib/pages/common_pages/confirm_page.dart rename to frontend/lib/views/common_pages/confirm_page.dart diff --git a/frontend/lib/pages/common_pages/domain_pages/domain.dart b/frontend/lib/views/common_pages/domain_pages/domain.dart similarity index 100% rename from frontend/lib/pages/common_pages/domain_pages/domain.dart rename to frontend/lib/views/common_pages/domain_pages/domain.dart diff --git a/frontend/lib/pages/common_pages/general_feed_page.dart b/frontend/lib/views/common_pages/general_feed_page.dart similarity index 80% rename from frontend/lib/pages/common_pages/general_feed_page.dart rename to frontend/lib/views/common_pages/general_feed_page.dart index 2be75c3..c9b1a0d 100644 --- a/frontend/lib/pages/common_pages/general_feed_page.dart +++ b/frontend/lib/views/common_pages/general_feed_page.dart @@ -1,8 +1,6 @@ -import 'package:dev_track_app/pages/common_pages/login_page.dart'; +import 'package:dev_track_app/views/common_pages/login_page.dart'; import 'package:flutter/material.dart'; - - class GeneralFeedPage extends StatefulWidget { const GeneralFeedPage({super.key}); @@ -16,15 +14,12 @@ class Post { 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) { @@ -65,33 +60,32 @@ class _GeneralFeedPageState extends State { IconButton( icon: const Icon(Icons.arrow_back, color: Colors.black), onPressed: () { - Navigator.pop(context); }, + 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)), - ), - ), + 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)), + ), + ), + ), ], ); } @@ -105,7 +99,7 @@ class _GeneralFeedPageState extends State { content: Text(post.details), // fetchhh post details..... actions: [ TextButton( - onPressed: () => Navigator.of(context).pop(), + onPressed: () => Navigator.of(context).pop(), child: const Text("Close"), ), ], @@ -159,8 +153,6 @@ class _GeneralFeedPageState extends State { } } - - class PostCard extends StatelessWidget { final Post post; final VoidCallback onViewMore; @@ -226,7 +218,8 @@ class PostCard extends StatelessWidget { onPressed: onViewMore, backgroundColor: Colors.purple, mini: true, - child: const Icon(Icons.arrow_forward, color: Colors.white, size: 18), + 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/views/common_pages/login_page.dart similarity index 84% rename from frontend/lib/pages/common_pages/login_page.dart rename to frontend/lib/views/common_pages/login_page.dart index 35376c3..410bbba 100644 --- a/frontend/lib/pages/common_pages/login_page.dart +++ b/frontend/lib/views/common_pages/login_page.dart @@ -1,10 +1,9 @@ -import 'package:dev_track_app/pages/admin_pages/admin_feed_view/admin_feed_page.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_feed_page.dart'; -import 'package:flutter/gestures.dart'; +import 'package:dev_track_app/views/admin_pages/admin_feed_view/admin_feed_page.dart'; +import 'package:dev_track_app/views/common_pages/general_feed_page.dart'; +import 'package:dev_track_app/views/user_pages/user_feed_page.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; + import '../../view_models/login_view_model.dart'; class LoginPage extends StatelessWidget { @@ -128,29 +127,6 @@ class LoginPage extends StatelessWidget { ), ), const SizedBox(height: 15), - Text.rich( - TextSpan( - text: "Don't have an account? ", - children: [ - TextSpan( - text: 'Create', - style: const TextStyle( - color: Color(0xFF5e00b0), - decoration: TextDecoration.underline, - ), - recognizer: TapGestureRecognizer() - ..onTap = () { - Navigator.push( - context, - MaterialPageRoute( - builder: (context) => const RegisterPage()), - ); - }, - ), - ], - ), - ), - const SizedBox(height: 20), const Text('OR', style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold)), Padding( diff --git a/frontend/lib/pages/user_pages/enroll_pages/enroll_page.dart b/frontend/lib/views/user_pages/enroll_pages/enroll_page.dart similarity index 96% rename from frontend/lib/pages/user_pages/enroll_pages/enroll_page.dart rename to frontend/lib/views/user_pages/enroll_pages/enroll_page.dart index c179907..f3af7e4 100644 --- a/frontend/lib/pages/user_pages/enroll_pages/enroll_page.dart +++ b/frontend/lib/views/user_pages/enroll_pages/enroll_page.dart @@ -1,10 +1,9 @@ -import 'package:flutter/material.dart'; -import 'package:dev_track_app/utils/topnavbar.dart'; import 'package:dev_track_app/theme/colors.dart'; -import 'package:dev_track_app/pages/user_pages/enroll_pages/enrollment_select.dart'; -import 'package:provider/provider.dart'; -import 'package:dev_track_app/models/enrollment_model.dart'; +import 'package:dev_track_app/utils/topnavbar.dart'; import 'package:dev_track_app/view_models/enrollment_view_model.dart'; +import 'package:dev_track_app/views/user_pages/enroll_pages/enrollment_select.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; class EnrollPage extends StatelessWidget { const EnrollPage({Key? key}) : super(key: key); diff --git a/frontend/lib/pages/user_pages/enroll_pages/enroll_sucess.dart b/frontend/lib/views/user_pages/enroll_pages/enroll_sucess.dart similarity index 100% rename from frontend/lib/pages/user_pages/enroll_pages/enroll_sucess.dart rename to frontend/lib/views/user_pages/enroll_pages/enroll_sucess.dart diff --git a/frontend/lib/pages/user_pages/enroll_pages/enrollment_select.dart b/frontend/lib/views/user_pages/enroll_pages/enrollment_select.dart similarity index 100% rename from frontend/lib/pages/user_pages/enroll_pages/enrollment_select.dart rename to frontend/lib/views/user_pages/enroll_pages/enrollment_select.dart diff --git a/frontend/lib/pages/user_pages/project_pages/project_display/previous_projects.dart b/frontend/lib/views/user_pages/project_pages/project_display/previous_projects.dart similarity index 100% rename from frontend/lib/pages/user_pages/project_pages/project_display/previous_projects.dart rename to frontend/lib/views/user_pages/project_pages/project_display/previous_projects.dart diff --git a/frontend/lib/pages/user_pages/project_pages/project_display/specific_project.dart b/frontend/lib/views/user_pages/project_pages/project_display/specific_project.dart similarity index 100% rename from frontend/lib/pages/user_pages/project_pages/project_display/specific_project.dart rename to frontend/lib/views/user_pages/project_pages/project_display/specific_project.dart diff --git a/frontend/lib/pages/user_pages/project_pages/project_display/teamcard.dart b/frontend/lib/views/user_pages/project_pages/project_display/teamcard.dart similarity index 100% rename from frontend/lib/pages/user_pages/project_pages/project_display/teamcard.dart rename to frontend/lib/views/user_pages/project_pages/project_display/teamcard.dart diff --git a/frontend/lib/pages/user_pages/project_pages/submission_page/submission_page.dart b/frontend/lib/views/user_pages/project_pages/submission_page/submission_page.dart similarity index 100% rename from frontend/lib/pages/user_pages/project_pages/submission_page/submission_page.dart rename to frontend/lib/views/user_pages/project_pages/submission_page/submission_page.dart diff --git a/frontend/lib/pages/user_pages/project_pages/submission_page/widgets/drop_down_button.dart b/frontend/lib/views/user_pages/project_pages/submission_page/widgets/drop_down_button.dart similarity index 100% rename from frontend/lib/pages/user_pages/project_pages/submission_page/widgets/drop_down_button.dart rename to frontend/lib/views/user_pages/project_pages/submission_page/widgets/drop_down_button.dart diff --git a/frontend/lib/pages/user_pages/studentview.dart b/frontend/lib/views/user_pages/studentview.dart similarity index 100% rename from frontend/lib/pages/user_pages/studentview.dart rename to frontend/lib/views/user_pages/studentview.dart diff --git a/frontend/lib/pages/user_pages/tracker.dart b/frontend/lib/views/user_pages/tracker.dart similarity index 100% rename from frontend/lib/pages/user_pages/tracker.dart rename to frontend/lib/views/user_pages/tracker.dart diff --git a/frontend/lib/pages/user_pages/user_feed_page.dart b/frontend/lib/views/user_pages/user_feed_page.dart similarity index 100% rename from frontend/lib/pages/user_pages/user_feed_page.dart rename to frontend/lib/views/user_pages/user_feed_page.dart From 7b6f819dddb02461163101a301df97ddd33f3448 Mon Sep 17 00:00:00 2001 From: ghamani <138302691+Ghamani121@users.noreply.github.com> Date: Tue, 11 Mar 2025 05:33:19 +0530 Subject: [PATCH 91/97] Implemented bottomnavbar into all pages 1. Have updated all user ,general and admin feed page to include the nav bar 2. Have updated user project pages to include naavbar (admin project pages doesnt exist yet) 3. Profile icon of navbar isnt routed 4. Have added few pages to to be discarded --- .../bottom_nav_bar.dart | 0 .../home_page.dart | 4 +- .../register_page.dart | 2 +- frontend/lib/main.dart | 8 ++ .../admin_feed_view/admin_feed_page.dart | 36 ++++++- .../common_pages/domain_pages/domain.dart | 36 +++++++ .../pages/common_pages/general_feed_page.dart | 36 +++++++ .../lib/pages/common_pages/login_page.dart | 2 +- frontend/lib/pages/home.dart | 2 +- .../project_display/previous_projects.dart | 35 +++++++ .../project_display/specific_project.dart | 43 +++++++- .../lib/pages/user_pages/user_feed_page.dart | 97 +++++++------------ frontend/lib/utils/bottomnavbar.dart | 86 ++++++++++++++++ 13 files changed, 320 insertions(+), 67 deletions(-) rename frontend/lib/{utils => To-Be-Discarded}/bottom_nav_bar.dart (100%) rename frontend/lib/{pages/common_pages => To-Be-Discarded}/home_page.dart (95%) rename frontend/lib/{pages/common_pages => To-Be-Discarded}/register_page.dart (99%) create mode 100644 frontend/lib/utils/bottomnavbar.dart diff --git a/frontend/lib/utils/bottom_nav_bar.dart b/frontend/lib/To-Be-Discarded/bottom_nav_bar.dart similarity index 100% rename from frontend/lib/utils/bottom_nav_bar.dart rename to frontend/lib/To-Be-Discarded/bottom_nav_bar.dart diff --git a/frontend/lib/pages/common_pages/home_page.dart b/frontend/lib/To-Be-Discarded/home_page.dart similarity index 95% rename from frontend/lib/pages/common_pages/home_page.dart rename to frontend/lib/To-Be-Discarded/home_page.dart index 929cad3..39fdd49 100644 --- a/frontend/lib/pages/common_pages/home_page.dart +++ b/frontend/lib/To-Be-Discarded/home_page.dart @@ -1,6 +1,6 @@ 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/To-Be-Discarded/register_page.dart'; +import 'package:dev_track_app/To-Be-Discarded/bottom_nav_bar.dart'; import 'package:dev_track_app/utils/custom_button.dart'; import 'package:flutter/material.dart'; diff --git a/frontend/lib/pages/common_pages/register_page.dart b/frontend/lib/To-Be-Discarded/register_page.dart similarity index 99% rename from frontend/lib/pages/common_pages/register_page.dart rename to frontend/lib/To-Be-Discarded/register_page.dart index 83608ea..f932ba5 100644 --- a/frontend/lib/pages/common_pages/register_page.dart +++ b/frontend/lib/To-Be-Discarded/register_page.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'confirm_page.dart'; // Ensure this import is correct +import '../pages/common_pages/confirm_page.dart'; // Ensure this import is correct class RegisterPage extends StatefulWidget { const RegisterPage({super.key}); diff --git a/frontend/lib/main.dart b/frontend/lib/main.dart index f019cfa..595f2cd 100644 --- a/frontend/lib/main.dart +++ b/frontend/lib/main.dart @@ -1,3 +1,10 @@ +import 'package:dev_track_app/models/enrollment_model.dart'; +import 'package:dev_track_app/pages/common_pages/domain_pages/domain.dart'; +import 'package:dev_track_app/pages/common_pages/general_feed_page.dart'; +import 'package:dev_track_app/To-Be-Discarded/home_page.dart'; +import 'package:dev_track_app/pages/home.dart'; +import 'package:dev_track_app/pages/user_pages/project_pages/project_display/previous_projects.dart'; +import 'package:dev_track_app/pages/user_pages/project_pages/project_display/specific_project.dart'; import 'package:dev_track_app/view_models/user_feed_view_model.dart'; import 'package:dev_track_app/pages/common_pages/login_page.dart'; import 'package:flutter/material.dart'; @@ -9,6 +16,7 @@ import 'pages/user_pages/user_feed_page.dart'; import 'models/admin_post_view_model.dart'; //other models import 'view_models/enrollment_view_model.dart'; +import 'pages/admin_pages/admin_feed_view/admin_feed_page.dart'; // void main() { // runApp(const MyApp()); diff --git a/frontend/lib/pages/admin_pages/admin_feed_view/admin_feed_page.dart b/frontend/lib/pages/admin_pages/admin_feed_view/admin_feed_page.dart index 8d43beb..16beb36 100644 --- a/frontend/lib/pages/admin_pages/admin_feed_view/admin_feed_page.dart +++ b/frontend/lib/pages/admin_pages/admin_feed_view/admin_feed_page.dart @@ -1,8 +1,10 @@ import 'package:dev_track_app/pages/admin_pages/admin_feed_view/edit_post_dialog.dart'; +import 'package:dev_track_app/pages/admin_pages/mgmg_prev_projects.dart'; +import 'package:dev_track_app/pages/common_pages/domain_pages/domain.dart'; import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; import 'package:provider/provider.dart'; - +import 'package:dev_track_app/utils/bottomnavbar.dart'; import '../../../models/admin_post_model.dart'; import '../../../models/admin_post_view_model.dart'; import '../admin_feed_view/create_post_dialog.dart'; @@ -15,6 +17,34 @@ class AdminFeedPage extends StatefulWidget { } class _FeedScreenState extends State { + + //bottomnavbar index + int _selectedIndex = 0; + +void _onNavBarTapped(int index) { + + print("Tapped index: $index"); // Debugging print statement + + setState(() { + _selectedIndex = index; + }); + + switch (index) { + case 0: + Navigator.pushReplacement( + context, + MaterialPageRoute(builder: (context) => const AdminFeedPage()), + ); + break; + case 1: + Navigator.pushReplacement( + context, + MaterialPageRoute(builder: (context) => const DomainPage()), + ); + break; + } +} + String formatDate(String createdAt) { DateTime postDate = DateTime.parse(createdAt).toLocal(); DateTime now = DateTime.now(); @@ -66,6 +96,10 @@ class _FeedScreenState extends State { ], ), ), + bottomNavigationBar: BottomNavBar( + currentIndex: _selectedIndex, + onTap: _onNavBarTapped, + ), ), ); } diff --git a/frontend/lib/pages/common_pages/domain_pages/domain.dart b/frontend/lib/pages/common_pages/domain_pages/domain.dart index 3341309..8d44612 100644 --- a/frontend/lib/pages/common_pages/domain_pages/domain.dart +++ b/frontend/lib/pages/common_pages/domain_pages/domain.dart @@ -1,3 +1,5 @@ +import 'package:dev_track_app/pages/user_pages/user_feed_page.dart'; +import 'package:dev_track_app/utils/bottomnavbar.dart'; import 'package:flutter/material.dart'; class DomainPage extends StatefulWidget { @@ -8,6 +10,36 @@ class DomainPage extends StatefulWidget { } class _DomainPageState extends State { + + //bottomnavbar index + int _selectedIndex = 1; + + +void _onNavBarTapped(int index) { + + print("Tapped index: $index"); // Debugging print statement + + setState(() { + _selectedIndex = index; + }); + + switch (index) { + case 0: + Navigator.pushReplacement( + context, + MaterialPageRoute(builder: (context) => const UserFeedPage()), + ); + break; + case 1: + Navigator.pushReplacement( + context, + MaterialPageRoute(builder: (context) => const DomainPage()), + ); + break; + } +} + + final List> projects = List.generate( 6, (index) => { @@ -38,6 +70,10 @@ class _DomainPageState extends State { ), ], ), + bottomNavigationBar: BottomNavBar( + currentIndex: _selectedIndex, + onTap: _onNavBarTapped, + ), ), ); } diff --git a/frontend/lib/pages/common_pages/general_feed_page.dart b/frontend/lib/pages/common_pages/general_feed_page.dart index 2be75c3..d29b98a 100644 --- a/frontend/lib/pages/common_pages/general_feed_page.dart +++ b/frontend/lib/pages/common_pages/general_feed_page.dart @@ -1,4 +1,5 @@ import 'package:dev_track_app/pages/common_pages/login_page.dart'; +import 'package:dev_track_app/utils/bottomnavbar.dart'; import 'package:flutter/material.dart'; @@ -19,6 +20,37 @@ class Post { class _GeneralFeedPageState extends State { + + + //bottomnavbar index + int _selectedIndex = 0; + + +void _onNavBarTapped(int index) { + + print("Tapped index: $index"); // Debugging print statement + + setState(() { + _selectedIndex = index; + }); + + switch (index) { + case 0: + Navigator.pushReplacement( + context, + MaterialPageRoute(builder: (context) => const GeneralFeedPage()), + ); + break; + // case 1: + // Navigator.pushReplacement( + // context, + // MaterialPageRoute(builder: (context) => const PreviousProjects()), + // ); + // break; + } +} + + final List posts = [ Post(details: "Post 1 details"), Post(details: 'Post 2 details'), @@ -53,6 +85,10 @@ class _GeneralFeedPageState extends State { ), ], ), + ), + bottomNavigationBar: BottomNavBar( + currentIndex: _selectedIndex, + onTap: _onNavBarTapped, ), ), ); diff --git a/frontend/lib/pages/common_pages/login_page.dart b/frontend/lib/pages/common_pages/login_page.dart index 35376c3..528f9c3 100644 --- a/frontend/lib/pages/common_pages/login_page.dart +++ b/frontend/lib/pages/common_pages/login_page.dart @@ -1,6 +1,6 @@ import 'package:dev_track_app/pages/admin_pages/admin_feed_view/admin_feed_page.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/To-Be-Discarded/register_page.dart'; import 'package:dev_track_app/pages/user_pages/user_feed_page.dart'; import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; diff --git a/frontend/lib/pages/home.dart b/frontend/lib/pages/home.dart index cfe632f..55b7705 100644 --- a/frontend/lib/pages/home.dart +++ b/frontend/lib/pages/home.dart @@ -3,7 +3,7 @@ import 'package:dev_track_app/pages/admin_pages/mgmg_prev_projects.dart'; import 'package:dev_track_app/pages/common_pages/Theme-Demo-Page/sample.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/common_pages/home_page.dart'; +import 'package:dev_track_app/To-Be-Discarded/home_page.dart'; import 'package:dev_track_app/pages/user_pages/project_pages/project_display/previous_projects.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/submission_page/submission_page.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 e474abb..2fd82d3 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,3 +1,5 @@ +import 'package:dev_track_app/pages/user_pages/user_feed_page.dart'; +import 'package:dev_track_app/utils/bottomnavbar.dart'; import 'package:flutter/material.dart'; import 'package:dev_track_app/utils/topnavbar.dart'; import 'package:dev_track_app/routing/previous_projects_routing.dart'; @@ -12,6 +14,35 @@ class PreviousProjects extends StatefulWidget { } class _PreviousProjectsState extends State { + + //bottomnavbarindex index + int _selectedIndex = 1; + + +void _onNavBarTapped(int index) { + + print("Tapped index: $index"); // Debugging print statement + + setState(() { + _selectedIndex = index; + }); + + switch (index) { + case 0: + Navigator.pushReplacement( + context, + MaterialPageRoute(builder: (context) => const UserFeedPage()), + ); + break; + case 1: + Navigator.pushReplacement( + context, + MaterialPageRoute(builder: (context) => const PreviousProjects()), + ); + break; + } +} + @override Widget build(BuildContext context) { return SafeArea( @@ -42,6 +73,10 @@ class _PreviousProjectsState extends State { ), ], ), + bottomNavigationBar: BottomNavBar( + currentIndex: _selectedIndex, + onTap: _onNavBarTapped, + ), ), ); } 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 d8ef7a4..51231b8 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,3 +1,5 @@ +import 'package:dev_track_app/pages/user_pages/user_feed_page.dart'; +import 'package:dev_track_app/utils/bottomnavbar.dart'; import 'package:flutter/material.dart'; import 'package:url_launcher/url_launcher.dart'; import 'package:dev_track_app/theme/colors.dart'; @@ -67,9 +69,44 @@ class TeamMemberCard extends StatelessWidget { } } -class ProjectDetailPage extends StatelessWidget { +class ProjectDetailPage extends StatefulWidget { const ProjectDetailPage({Key? key}) : super(key: key); + @override + State createState() => _ProjectDetailPageState(); +} + +class _ProjectDetailPageState extends State { + + //bottomnavbarindex index + int _selectedIndex = 1; + + +void _onNavBarTapped(int index) { + + print("Tapped index: $index"); // Debugging print statement + + setState(() { + _selectedIndex = index; + }); + + switch (index) { + case 0: + Navigator.pushReplacement( + context, + MaterialPageRoute(builder: (context) => const UserFeedPage()), + ); + break; + case 1: + Navigator.pushReplacement( + context, + MaterialPageRoute(builder: (context) => const ProjectDetailPage()), + ); + break; + } +} + + @override Widget build(BuildContext context) { // Use the dummy data from models @@ -214,6 +251,10 @@ class ProjectDetailPage extends StatelessWidget { ], ), ), + bottomNavigationBar: BottomNavBar( + currentIndex: _selectedIndex, + onTap: _onNavBarTapped, + ), ); } } diff --git a/frontend/lib/pages/user_pages/user_feed_page.dart b/frontend/lib/pages/user_pages/user_feed_page.dart index da303f0..5607dbd 100644 --- a/frontend/lib/pages/user_pages/user_feed_page.dart +++ b/frontend/lib/pages/user_pages/user_feed_page.dart @@ -1,7 +1,9 @@ +import 'package:dev_track_app/pages/user_pages/project_pages/project_display/previous_projects.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:dev_track_app/models/user_feed_model.dart'; import 'package:dev_track_app/view_models/user_feed_view_model.dart'; +import 'package:dev_track_app/utils/bottomnavbar.dart'; class UserFeedPage extends StatefulWidget { const UserFeedPage({super.key}); @@ -10,28 +12,37 @@ class UserFeedPage extends StatefulWidget { State createState() => _UserFeedPageState(); } -// class Post { -// final String details; +class _UserFeedPageState extends State { + int _selectedIndex = 0; -// Post({required this.details}); -// } -class _UserFeedPageState extends State { - - // final List posts = [ - // Post(details: "Post 1 details"), - // Post(details: 'Post 2 details'), - // Post(details: 'Post 3 details'), - // ]; +void _onNavBarTapped(int index) { + + print("Tapped index: $index"); // Debugging print statement + + setState(() { + _selectedIndex = index; + }); + + switch (index) { + case 0: + Navigator.pushReplacement( + context, + MaterialPageRoute(builder: (context) => const UserFeedPage()), + ); + break; + case 1: + Navigator.pushReplacement( + context, + MaterialPageRoute(builder: (context) => const PreviousProjects()), + ); + break; + } +} - @override - // void initState() { - // super.initState(); - // // Fetch feed data as soon as the screen is initialized - // Provider.of(context, listen: false).fetchUserFeed(); - // } - void initState() { + @override + void initState() { super.initState(); Future.microtask(() { context.read().fetchUserFeed(); @@ -52,10 +63,6 @@ class _UserFeedPageState extends State { const SizedBox(height: 10), _buildHeader(), const SizedBox(height: 10), - // _buildTabBar(), - // const SizedBox(height: 10), - - // Main Feed Area Expanded( child: Consumer( builder: (context, feedVM, child) { @@ -81,6 +88,10 @@ class _UserFeedPageState extends State { ], ), ), + bottomNavigationBar: BottomNavBar( + currentIndex: _selectedIndex, + onTap: _onNavBarTapped, + ), ), ); } @@ -107,7 +118,7 @@ class _UserFeedPageState extends State { builder: (BuildContext context) { return AlertDialog( title: Text(post.title), - content: Text(post.description), // fetchhh post details..... + content: Text(post.description), actions: [ TextButton( onPressed: () => Navigator.of(context).pop(), @@ -131,44 +142,13 @@ class _UserFeedPageState extends State { ], ); } - - // 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 UserFeedCard extends StatelessWidget { final UserFeedModel post; final VoidCallback onViewMore; - const UserFeedCard({Key? key, required this.post, required this.onViewMore,}):super(key: key); + const UserFeedCard({Key? key, required this.post, required this.onViewMore}) : super(key: key); @override Widget build(BuildContext context) { @@ -192,12 +172,10 @@ class UserFeedCard extends StatelessWidget { Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - // Name or "created_by_id" can be used if your API returns it const Text( "Name", style: TextStyle(fontWeight: FontWeight.bold, fontSize: 16), ), - // Example: format from post.createdAt Text( "Posted on ${post.createdAt}", style: const TextStyle(fontSize: 12, color: Colors.grey), @@ -212,7 +190,6 @@ class UserFeedCard extends StatelessWidget { style: const TextStyle(fontSize: 14), ), const SizedBox(height: 10), - Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ @@ -232,8 +209,7 @@ class UserFeedCard extends StatelessWidget { onPressed: onViewMore, backgroundColor: Colors.purple, mini: true, - child: const Icon(Icons.arrow_forward, - color: Colors.white, size: 18), + child: const Icon(Icons.arrow_forward, color: Colors.white, size: 18), ), ], ), @@ -242,3 +218,4 @@ class UserFeedCard extends StatelessWidget { ); } } + diff --git a/frontend/lib/utils/bottomnavbar.dart b/frontend/lib/utils/bottomnavbar.dart new file mode 100644 index 0000000..8c214f0 --- /dev/null +++ b/frontend/lib/utils/bottomnavbar.dart @@ -0,0 +1,86 @@ +import 'package:flutter/material.dart'; + +class BottomNavBar extends StatelessWidget { + final int currentIndex; + final Function(int) onTap; + + const BottomNavBar({Key? key, required this.currentIndex, required this.onTap}) + : super(key: key); + + @override + Widget build(BuildContext context) { + return Container( + padding: const EdgeInsets.only(top: 10), // Adjust spacing + decoration: const BoxDecoration( + color: Colors.white, + boxShadow: [ + BoxShadow( + color: Colors.black12, + blurRadius: 12, // Increased for stronger shadow + spreadRadius: 2, // Slightly wider shadow + ), + ], + ), + child: Stack( + clipBehavior: Clip.none, // Allows elements to overflow + children: [ + BottomNavigationBar( + currentIndex: currentIndex, + onTap: onTap, + backgroundColor: Colors.transparent, + elevation: 0, + showSelectedLabels: true, + showUnselectedLabels: true, + items: [ + _buildNavItem(Icons.article, "Feed", 0), // Updated icon + _buildNavItem(Icons.image, "Projects", 1), // Updated icon + _buildNavItem(Icons.person_outline, "Profile", 2), // Updated icon + ], + ), + Positioned( + top: -22, // Adjusted slightly for better alignment + left: (MediaQuery.of(context).size.width / 3) * currentIndex + + (MediaQuery.of(context).size.width / 6) - + 26, // Center it on the selected tab + child: AnimatedContainer( + duration: const Duration(milliseconds: 300), + child: Material( + elevation: 10, // Increased shadow depth + shadowColor: Colors.black54, // Darker shadow + shape: const CircleBorder(), + child: CircleAvatar( + backgroundColor: Colors.purple, + radius: 28, // Slightly bigger for emphasis + child: Icon( + _getIcon(currentIndex), + color: Colors.white, + ), + ), + ), + ), + ), + ], + ), + ); + } + + BottomNavigationBarItem _buildNavItem(IconData icon, String label, int index) { + return BottomNavigationBarItem( + icon: Icon(icon, color: index == currentIndex ? Colors.transparent : Colors.black54), + label: label, + ); + } + + IconData _getIcon(int index) { + switch (index) { + case 0: + return Icons.article; // Matches Feed icon + case 1: + return Icons.image; // Matches Projects icon + case 2: + return Icons.person_outline; // Matches Profile icon + default: + return Icons.article; + } + } +} From 07e64880a1b7d3ef9261c329768ad604964ddc83 Mon Sep 17 00:00:00 2001 From: bharathan06 Date: Tue, 25 Mar 2025 20:48:12 +0530 Subject: [PATCH 92/97] user add option in admin panel --- backend/myproject/members/admin.py | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/backend/myproject/members/admin.py b/backend/myproject/members/admin.py index a75af42..dcac437 100644 --- a/backend/myproject/members/admin.py +++ b/backend/myproject/members/admin.py @@ -1,9 +1,26 @@ from django.contrib import admin +from django.contrib.auth.admin import UserAdmin +from .models import CustomUser, FileModel +class CustomUserAdmin(UserAdmin): + model = CustomUser + list_display = ('email', 'first_name', 'last_name', 'role', 'is_active', 'is_staff', 'is_superuser') + list_filter = ('role', 'is_active', 'is_staff', 'is_superuser') + fieldsets = ( + (None, {'fields': ('email', 'password')}), + ('Personal Info', {'fields': ('first_name', 'last_name', 'phone', 'srn', 'branch', 'passout_year', 'github', 'linkedin')}), + ('Permissions', {'fields': ('is_active', 'is_staff', 'is_superuser', 'groups', 'user_permissions')}), + ('OTP Details', {'fields': ('otp_token', 'otp_expiration')}), + ) + add_fieldsets = ( + (None, { + 'classes': ('wide',), + 'fields': ('email', 'password1', 'password2', 'role', 'is_staff', 'is_superuser')} + ), + ) + search_fields = ('email', 'first_name', 'last_name', 'srn') + ordering = ('email',) + filter_horizontal = ('groups', 'user_permissions',) -from .models import CustomUser +admin.site.register(CustomUser, CustomUserAdmin) -@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 From 3ba2f5339ade8e3923a2e8396085a5afd629382e Mon Sep 17 00:00:00 2001 From: ghamani <138302691+Ghamani121@users.noreply.github.com> Date: Thu, 3 Apr 2025 14:05:00 +0530 Subject: [PATCH 93/97] Progress Bar working --- frontend/lib/main.dart | 13 +- frontend/lib/utils/progress_bar.dart | 116 ++++++++++++++++++ frontend/lib/utils/scrum_meet_indicator.dart | 85 +++++++++++++ .../common_pages/domain_pages/domain.dart | 2 +- .../project_display/previous_projects.dart | 2 +- .../project_display/specific_project.dart | 2 +- .../lib/views/user_pages/user_feed_page.dart | 7 +- 7 files changed, 216 insertions(+), 11 deletions(-) create mode 100644 frontend/lib/utils/progress_bar.dart create mode 100644 frontend/lib/utils/scrum_meet_indicator.dart diff --git a/frontend/lib/main.dart b/frontend/lib/main.dart index b9bc4cc..5edb6c1 100644 --- a/frontend/lib/main.dart +++ b/frontend/lib/main.dart @@ -1,10 +1,9 @@ import 'package:dev_track_app/models/enrollment_model.dart'; -import 'package:dev_track_app/pages/common_pages/domain_pages/domain.dart'; -import 'package:dev_track_app/pages/common_pages/general_feed_page.dart'; -import 'package:dev_track_app/To-Be-Discarded/home_page.dart'; -import 'package:dev_track_app/pages/home.dart'; -import 'package:dev_track_app/pages/user_pages/project_pages/project_display/previous_projects.dart'; -import 'package:dev_track_app/pages/user_pages/project_pages/project_display/specific_project.dart'; +import 'package:dev_track_app/views/common_pages/domain_pages/domain.dart'; +import 'package:dev_track_app/views/common_pages/general_feed_page.dart'; +import 'package:dev_track_app/views/user_pages/user_feed_page.dart'; +import 'package:dev_track_app/views/user_pages/project_pages/project_display/previous_projects.dart'; +import 'package:dev_track_app/views/user_pages/project_pages/project_display/specific_project.dart'; import 'package:dev_track_app/view_models/user_feed_view_model.dart'; import 'package:dev_track_app/views/common_pages/login_page.dart'; import 'package:flutter/material.dart'; @@ -45,6 +44,6 @@ class MyApp extends StatelessWidget { primarySwatch: Colors.green, ), debugShowCheckedModeBanner: false, - home: LoginPage()); + home: UserFeedPage()); } } diff --git a/frontend/lib/utils/progress_bar.dart b/frontend/lib/utils/progress_bar.dart new file mode 100644 index 0000000..e73d10d --- /dev/null +++ b/frontend/lib/utils/progress_bar.dart @@ -0,0 +1,116 @@ +import 'package:dev_track_app/views/user_pages/timeline_page.dart'; +import 'package:flutter/material.dart'; +import 'dart:async'; + +class ProgressBar extends StatefulWidget { + const ProgressBar({Key? key}) : super(key: key); + + @override + _ProgressBarState createState() => _ProgressBarState(); +} + +class _ProgressBarState extends State { + DateTime startDate = DateTime(2025, 4, 1); // Start Date + DateTime endDate = DateTime(2025, 5, 1); // End Date + double progress = 0.0; // Progress in percentage (0.0 - 1.0) + double barWidth = 350; // Width of progress bar + double barHeight = 20; // Height of progress bar + Timer? timer; + double knobSize = 22; // Diameter of the knob + + @override + void initState() { + super.initState(); + _updateProgress(); // Initial progress update + timer = Timer.periodic(const Duration(seconds: 5), (timer) { + _updateProgress(); // Periodic progress update + }); + } + + void _updateProgress() { + DateTime currentDate = DateTime.now(); + int totalDays = endDate.difference(startDate).inDays + 1; + int elapsedDays = currentDate.difference(startDate).inDays; + + setState(() { + progress = (elapsedDays / totalDays).clamp(0.0, 1.0); + + print("Total Days: $totalDays"); + print("Elapsed Days: $elapsedDays"); + print("Progress: $progress"); + print("Knob Position: ${(barWidth - knobSize) * progress}"); + }); + } + + @override + void dispose() { + timer?.cancel(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + // Ensure knob is centered and does not exceed bar width + double knobPosition = ((barWidth - knobSize) * progress).clamp(0, barWidth - knobSize); + double progressFillWidth = ((barWidth - knobSize) * progress) + (knobSize / 2); + + return Center( + child: Stack( + alignment: Alignment.centerLeft, + children: [ + // Background of the progress bar + Container( + height: barHeight, + width: barWidth, + decoration: BoxDecoration( + color: Colors.grey[300], + borderRadius: BorderRadius.circular(10), + ), + ), + // Filled portion of the progress bar + Positioned( + left: 0, + child: Container( + height: 20, + width: progressFillWidth, // ✅ Updates dynamically + decoration: BoxDecoration( + color: Colors.purple, + borderRadius: BorderRadius.circular(10), + ), + ), + ), + // Knob (Circle) moving with progress + Positioned( + left: knobPosition, // Align knob correctly + child: GestureDetector( + onTap: () { + print("Knob Clicked - Open Timeline Page"); + Navigator.push( + context, + MaterialPageRoute(builder: (context) => const TimelinePage()), + ); + }, + child: Container( + width: knobSize, + height: knobSize, + decoration: BoxDecoration( + shape: BoxShape.circle, + color: Colors.white, + border: Border.all(color: Colors.grey, width: 2), + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.2), + blurRadius: 4, + spreadRadius: 1, + offset: const Offset(0, 2), + ), + ], + ), + ), + ), + ), + ], + ), + ); + } +} diff --git a/frontend/lib/utils/scrum_meet_indicator.dart b/frontend/lib/utils/scrum_meet_indicator.dart new file mode 100644 index 0000000..ded78d6 --- /dev/null +++ b/frontend/lib/utils/scrum_meet_indicator.dart @@ -0,0 +1,85 @@ +import 'package:flutter/material.dart'; +import 'dart:async'; + +class ScrumMeetIndicator extends StatefulWidget { + const ScrumMeetIndicator({Key? key}) : super(key: key); + + @override + _ScrumMeetIndicatorState createState() => _ScrumMeetIndicatorState(); +} + +class _ScrumMeetIndicatorState extends State { + DateTime startDate = DateTime(2024, 4, 1); + DateTime endDate = DateTime(2024, 4, 30); + double barWidth = 340; + List scrumMeetDates = []; + DateTime? nextScrumMeet; + Timer? timer; + + @override + void initState() { + super.initState(); + _calculateScrumMeetDates(); + _updateNextScrumMeet(); + timer = Timer.periodic(const Duration(minutes: 1), (timer) { + _updateNextScrumMeet(); + }); + } + + void _calculateScrumMeetDates() { + DateTime current = startDate; + while (current.isBefore(endDate) || current.isAtSameMomentAs(endDate)) { + if (current.weekday == DateTime.saturday) { + scrumMeetDates.add(current); + } + current = current.add(const Duration(days: 1)); + } + } + + void _updateNextScrumMeet() { + DateTime today = DateTime.now(); + nextScrumMeet = scrumMeetDates.firstWhere((date) => date.isAfter(today), orElse: () => scrumMeetDates.last); + setState(() {}); + } + + @override + void dispose() { + timer?.cancel(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Center( + child: Column( + children: [ + // Scrum Indicators + Stack( + children: scrumMeetDates.map((date) { + double position = ((date.difference(startDate).inDays) / (endDate.difference(startDate).inDays)) * barWidth; + bool isNext = date == nextScrumMeet; + return Positioned( + left: position.clamp(0, barWidth - 10), + child: Icon( + Icons.arrow_drop_up, + size: 20, + color: isNext ? Colors.grey : Colors.grey[300], + ), + ); + }).toList(), + ), + const SizedBox(height: 5), + // Progress Bar + Container( + height: 20, + width: barWidth, + decoration: BoxDecoration( + color: Colors.grey[300], + borderRadius: BorderRadius.circular(10), + ), + ), + ], + ), + ); + } +} diff --git a/frontend/lib/views/common_pages/domain_pages/domain.dart b/frontend/lib/views/common_pages/domain_pages/domain.dart index 8d44612..f27bda2 100644 --- a/frontend/lib/views/common_pages/domain_pages/domain.dart +++ b/frontend/lib/views/common_pages/domain_pages/domain.dart @@ -1,4 +1,4 @@ -import 'package:dev_track_app/pages/user_pages/user_feed_page.dart'; +import 'package:dev_track_app/views/user_pages/user_feed_page.dart'; import 'package:dev_track_app/utils/bottomnavbar.dart'; import 'package:flutter/material.dart'; diff --git a/frontend/lib/views/user_pages/project_pages/project_display/previous_projects.dart b/frontend/lib/views/user_pages/project_pages/project_display/previous_projects.dart index 2fd82d3..588a9bc 100644 --- a/frontend/lib/views/user_pages/project_pages/project_display/previous_projects.dart +++ b/frontend/lib/views/user_pages/project_pages/project_display/previous_projects.dart @@ -1,4 +1,4 @@ -import 'package:dev_track_app/pages/user_pages/user_feed_page.dart'; +import 'package:dev_track_app/views/user_pages/user_feed_page.dart'; import 'package:dev_track_app/utils/bottomnavbar.dart'; import 'package:flutter/material.dart'; import 'package:dev_track_app/utils/topnavbar.dart'; diff --git a/frontend/lib/views/user_pages/project_pages/project_display/specific_project.dart b/frontend/lib/views/user_pages/project_pages/project_display/specific_project.dart index 51231b8..9255af0 100644 --- a/frontend/lib/views/user_pages/project_pages/project_display/specific_project.dart +++ b/frontend/lib/views/user_pages/project_pages/project_display/specific_project.dart @@ -1,4 +1,4 @@ -import 'package:dev_track_app/pages/user_pages/user_feed_page.dart'; +import 'package:dev_track_app/views/user_pages/user_feed_page.dart'; import 'package:dev_track_app/utils/bottomnavbar.dart'; import 'package:flutter/material.dart'; import 'package:url_launcher/url_launcher.dart'; diff --git a/frontend/lib/views/user_pages/user_feed_page.dart b/frontend/lib/views/user_pages/user_feed_page.dart index 5607dbd..9e8bd89 100644 --- a/frontend/lib/views/user_pages/user_feed_page.dart +++ b/frontend/lib/views/user_pages/user_feed_page.dart @@ -1,9 +1,12 @@ -import 'package:dev_track_app/pages/user_pages/project_pages/project_display/previous_projects.dart'; +import 'package:dev_track_app/views/user_pages/project_pages/project_display/previous_projects.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:dev_track_app/models/user_feed_model.dart'; import 'package:dev_track_app/view_models/user_feed_view_model.dart'; import 'package:dev_track_app/utils/bottomnavbar.dart'; +import 'package:dev_track_app/utils/progress_bar.dart'; +import 'package:dev_track_app/utils/scrum_meet_indicator.dart'; + class UserFeedPage extends StatefulWidget { const UserFeedPage({super.key}); @@ -61,6 +64,8 @@ void _onNavBarTapped(int index) { children: [ _buildTopBar(), const SizedBox(height: 10), + const ProgressBar(), + const SizedBox(height: 20), _buildHeader(), const SizedBox(height: 10), Expanded( From aeeb8d280909707f42b9a941405c0e300fb32829 Mon Sep 17 00:00:00 2001 From: ghamani <138302691+Ghamani121@users.noreply.github.com> Date: Thu, 3 Apr 2025 15:06:37 +0530 Subject: [PATCH 94/97] scrum indicator working --- frontend/lib/api/user_feed_api.dart | 16 +- frontend/lib/main.dart | 1 + frontend/lib/utils/progress_bar.dart | 183 ++++++++++++------ frontend/lib/utils/scrum_meet_indicator.dart | 50 +++-- .../lib/views/user_pages/user_feed_page.dart | 1 - 5 files changed, 162 insertions(+), 89 deletions(-) diff --git a/frontend/lib/api/user_feed_api.dart b/frontend/lib/api/user_feed_api.dart index 6187b64..0852f14 100644 --- a/frontend/lib/api/user_feed_api.dart +++ b/frontend/lib/api/user_feed_api.dart @@ -10,12 +10,12 @@ class UserFeedApi { Future> getUserFeed() async { - print('--- UserFeedService: getUserFeed() called ---'); + // print('--- UserFeedService: getUserFeed() called ---'); // Retrieve the stored CSRF token final prefs = await SharedPreferences.getInstance(); final csrfToken = prefs.getString('csrf_token'); - print('CSRF token from prefs: $csrfToken'); + // print('CSRF token from prefs: $csrfToken'); // 2. Prepare the headers final headers = { @@ -24,20 +24,20 @@ class UserFeedApi { 'X-CSRFToken': csrfToken ?? '', }; - print('Making GET request to $feedUrl'); - print('Request headers: $headers'); + // print('Making GET request to $feedUrl'); + // print('Request headers: $headers'); try { // 3. Make the GET request final response = await http.get(Uri.parse(feedUrl), headers: headers); - print('Response status: ${response.statusCode}'); - print('Response body: ${response.body}'); + // print('Response status: ${response.statusCode}'); + // print('Response body: ${response.body}'); // 4. Check if the call was successful if (response.statusCode == 200) { final List data = json.decode(response.body); - print('Parsed data length: ${data.length}'); + // print('Parsed data length: ${data.length}'); // Convert each item in the list to UserFeedModel return data.map((item) => UserFeedModel.fromJson(item)).toList(); } else { @@ -47,7 +47,7 @@ class UserFeedApi { } } catch (e) { // Catch any network or parsing exceptions - print('Exception in getUserFeed: $e'); + // print('Exception in getUserFeed: $e'); rethrow; // rethrow so the ViewModel can handle it } } diff --git a/frontend/lib/main.dart b/frontend/lib/main.dart index 5edb6c1..87f62d9 100644 --- a/frontend/lib/main.dart +++ b/frontend/lib/main.dart @@ -1,4 +1,5 @@ import 'package:dev_track_app/models/enrollment_model.dart'; +import 'package:dev_track_app/utils/progress_bar.dart'; import 'package:dev_track_app/views/common_pages/domain_pages/domain.dart'; import 'package:dev_track_app/views/common_pages/general_feed_page.dart'; import 'package:dev_track_app/views/user_pages/user_feed_page.dart'; diff --git a/frontend/lib/utils/progress_bar.dart b/frontend/lib/utils/progress_bar.dart index e73d10d..22cd13f 100644 --- a/frontend/lib/utils/progress_bar.dart +++ b/frontend/lib/utils/progress_bar.dart @@ -1,4 +1,3 @@ -import 'package:dev_track_app/views/user_pages/timeline_page.dart'; import 'package:flutter/material.dart'; import 'dart:async'; @@ -17,13 +16,15 @@ class _ProgressBarState extends State { double barHeight = 20; // Height of progress bar Timer? timer; double knobSize = 22; // Diameter of the knob + List scrumMeetDates = []; @override void initState() { super.initState(); - _updateProgress(); // Initial progress update + _updateProgress(); + _calculateScrumMeetDates(); timer = Timer.periodic(const Duration(seconds: 5), (timer) { - _updateProgress(); // Periodic progress update + _updateProgress(); }); } @@ -34,14 +35,20 @@ class _ProgressBarState extends State { setState(() { progress = (elapsedDays / totalDays).clamp(0.0, 1.0); - - print("Total Days: $totalDays"); - print("Elapsed Days: $elapsedDays"); - print("Progress: $progress"); - print("Knob Position: ${(barWidth - knobSize) * progress}"); }); } + void _calculateScrumMeetDates() { + DateTime current = startDate; + while (current.isBefore(endDate) || current.isAtSameMomentAs(endDate)) { + if (current.weekday == DateTime.saturday) { + scrumMeetDates.add(current); + } + current = current.add(const Duration(days: 1)); + } + } + + @override void dispose() { timer?.cancel(); @@ -50,66 +57,122 @@ class _ProgressBarState extends State { @override Widget build(BuildContext context) { - // Ensure knob is centered and does not exceed bar width double knobPosition = ((barWidth - knobSize) * progress).clamp(0, barWidth - knobSize); double progressFillWidth = ((barWidth - knobSize) * progress) + (knobSize / 2); - return Center( - child: Stack( - alignment: Alignment.centerLeft, - children: [ - // Background of the progress bar - Container( - height: barHeight, - width: barWidth, - decoration: BoxDecoration( - color: Colors.grey[300], - borderRadius: BorderRadius.circular(10), - ), - ), - // Filled portion of the progress bar - Positioned( - left: 0, - child: Container( - height: 20, - width: progressFillWidth, // ✅ Updates dynamically - decoration: BoxDecoration( - color: Colors.purple, - borderRadius: BorderRadius.circular(10), - ), - ), - ), - // Knob (Circle) moving with progress - Positioned( - left: knobPosition, // Align knob correctly - child: GestureDetector( - onTap: () { - print("Knob Clicked - Open Timeline Page"); - Navigator.push( - context, - MaterialPageRoute(builder: (context) => const TimelinePage()), - ); - }, - child: Container( - width: knobSize, - height: knobSize, + return Column( + children: [ + // ScrumMeetIndicator Above Progress Bar + ScrumMeetIndicator( + startDate: startDate, + endDate: endDate, + barWidth: barWidth, + knobSize: knobSize, + scrumMeetDates: scrumMeetDates, + ), + // Progress Bar + Center( + child: Stack( + alignment: Alignment.centerLeft, + children: [ + // Background of the progress bar + Container( + height: barHeight, + width: barWidth, decoration: BoxDecoration( - shape: BoxShape.circle, - color: Colors.white, - border: Border.all(color: Colors.grey, width: 2), - boxShadow: [ - BoxShadow( - color: Colors.black.withOpacity(0.2), - blurRadius: 4, - spreadRadius: 1, - offset: const Offset(0, 2), + color: Colors.grey[300], + borderRadius: BorderRadius.circular(10), + ), + ), + // Filled portion of the progress bar + Positioned( + left: 0, + child: Container( + height: 20, + width: progressFillWidth, // ✅ Updates dynamically + decoration: BoxDecoration( + color: Colors.purple, + borderRadius: BorderRadius.circular(10), + ), + ), + ), + // Knob (Circle) moving with progress + Positioned( + left: knobPosition, // Align knob correctly + child: GestureDetector( + onTap: () { + print("Knob Clicked - Open Timeline Page"); + }, + child: Container( + width: knobSize, + height: knobSize, + decoration: BoxDecoration( + shape: BoxShape.circle, + color: Colors.white, + border: Border.all(color: Colors.grey, width: 2), + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.2), + blurRadius: 4, + spreadRadius: 1, + offset: const Offset(0, 2), + ), + ], ), - ], + ), ), ), - ), + ], ), - ], + ), + ], + ); + } +} + +/// Scrum Meet Indicator Widget +class ScrumMeetIndicator extends StatelessWidget { + final DateTime startDate; + final DateTime endDate; + final double barWidth; + final double knobSize; + final List scrumMeetDates; + + const ScrumMeetIndicator({ + Key? key, + required this.startDate, + required this.endDate, + required this.barWidth, + required this.knobSize, + required this.scrumMeetDates, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + DateTime today = DateTime.now(); + DateTime? nextScrumMeet = scrumMeetDates.firstWhere( + (date) => date.isAfter(today), + orElse: () => scrumMeetDates.last, + ); + + return SizedBox( + width: barWidth, + height:20, // Space for indicators + child: Stack( + children: scrumMeetDates.map((date) { + double position = ((date.difference(startDate).inDays) / + (endDate.difference(startDate).inDays)) * (barWidth - knobSize); + bool isNext = date == nextScrumMeet; + + return Positioned( + left: position.clamp(0, barWidth - knobSize), + child: Icon( + Icons.arrow_drop_down, + size: 20, + color: isNext ? Colors.grey : Colors.white, + ), + ); + }).toList(), ), ); } diff --git a/frontend/lib/utils/scrum_meet_indicator.dart b/frontend/lib/utils/scrum_meet_indicator.dart index ded78d6..c3b8037 100644 --- a/frontend/lib/utils/scrum_meet_indicator.dart +++ b/frontend/lib/utils/scrum_meet_indicator.dart @@ -12,10 +12,11 @@ class _ScrumMeetIndicatorState extends State { DateTime startDate = DateTime(2024, 4, 1); DateTime endDate = DateTime(2024, 4, 30); double barWidth = 340; + double knobSize = 25; // Match knob size from progress bar List scrumMeetDates = []; DateTime? nextScrumMeet; Timer? timer; - + @override void initState() { super.initState(); @@ -38,7 +39,10 @@ class _ScrumMeetIndicatorState extends State { void _updateNextScrumMeet() { DateTime today = DateTime.now(); - nextScrumMeet = scrumMeetDates.firstWhere((date) => date.isAfter(today), orElse: () => scrumMeetDates.last); + nextScrumMeet = scrumMeetDates.firstWhere( + (date) => date.isAfter(today), + orElse: () => scrumMeetDates.last, + ); setState(() {}); } @@ -50,16 +54,20 @@ class _ScrumMeetIndicatorState extends State { @override Widget build(BuildContext context) { - return Center( - child: Column( - children: [ - // Scrum Indicators - Stack( + return Column( + children: [ + // Scrum Meet Indicators + SizedBox( + width: barWidth + knobSize, // Extend width to match progress bar logic + height: 30, // Space for indicators + child: Stack( children: scrumMeetDates.map((date) { - double position = ((date.difference(startDate).inDays) / (endDate.difference(startDate).inDays)) * barWidth; + double position = ((date.difference(startDate).inDays) / + (endDate.difference(startDate).inDays)) * (barWidth - knobSize); bool isNext = date == nextScrumMeet; + return Positioned( - left: position.clamp(0, barWidth - 10), + left: position.clamp(0, barWidth - knobSize), child: Icon( Icons.arrow_drop_up, size: 20, @@ -68,18 +76,20 @@ class _ScrumMeetIndicatorState extends State { ); }).toList(), ), - const SizedBox(height: 5), - // Progress Bar - Container( - height: 20, - width: barWidth, - decoration: BoxDecoration( - color: Colors.grey[300], - borderRadius: BorderRadius.circular(10), - ), + ), + + const SizedBox(height: 5), + + // Progress Bar + Container( + height: 20, + width: barWidth, + decoration: BoxDecoration( + color: Colors.grey[300], + borderRadius: BorderRadius.circular(10), ), - ], - ), + ), + ], ); } } diff --git a/frontend/lib/views/user_pages/user_feed_page.dart b/frontend/lib/views/user_pages/user_feed_page.dart index 9e8bd89..b877432 100644 --- a/frontend/lib/views/user_pages/user_feed_page.dart +++ b/frontend/lib/views/user_pages/user_feed_page.dart @@ -63,7 +63,6 @@ void _onNavBarTapped(int index) { crossAxisAlignment: CrossAxisAlignment.start, children: [ _buildTopBar(), - const SizedBox(height: 10), const ProgressBar(), const SizedBox(height: 20), _buildHeader(), From 79f75ca792f317f6cc1cc8a0c3ca1a63ec5c47b9 Mon Sep 17 00:00:00 2001 From: ghamani <138302691+Ghamani121@users.noreply.github.com> Date: Thu, 3 Apr 2025 15:30:51 +0530 Subject: [PATCH 95/97] Time Indicator working --- frontend/lib/utils/progress_bar.dart | 133 +++++++++++------- frontend/lib/utils/scrum_meet_indicator.dart | 95 ------------- .../lib/views/user_pages/user_feed_page.dart | 2 - 3 files changed, 79 insertions(+), 151 deletions(-) delete mode 100644 frontend/lib/utils/scrum_meet_indicator.dart diff --git a/frontend/lib/utils/progress_bar.dart b/frontend/lib/utils/progress_bar.dart index 22cd13f..0b636c2 100644 --- a/frontend/lib/utils/progress_bar.dart +++ b/frontend/lib/utils/progress_bar.dart @@ -12,19 +12,22 @@ class _ProgressBarState extends State { DateTime startDate = DateTime(2025, 4, 1); // Start Date DateTime endDate = DateTime(2025, 5, 1); // End Date double progress = 0.0; // Progress in percentage (0.0 - 1.0) - double barWidth = 350; // Width of progress bar - double barHeight = 20; // Height of progress bar + double barWidth = 375; // Width of progress bar + double barHeight = 25; // Height of progress bar Timer? timer; - double knobSize = 22; // Diameter of the knob + double knobSize = 24; // Diameter of the knob List scrumMeetDates = []; + Duration timeLeft = Duration.zero; @override void initState() { super.initState(); _updateProgress(); _calculateScrumMeetDates(); + _updateTimeLeft(); timer = Timer.periodic(const Duration(seconds: 5), (timer) { _updateProgress(); + _updateTimeLeft(); }); } @@ -38,6 +41,12 @@ class _ProgressBarState extends State { }); } + void _updateTimeLeft() { + setState(() { + timeLeft = endDate.difference(DateTime.now()); + }); + } + void _calculateScrumMeetDates() { DateTime current = startDate; while (current.isBefore(endDate) || current.isAtSameMomentAs(endDate)) { @@ -47,7 +56,6 @@ class _ProgressBarState extends State { current = current.add(const Duration(days: 1)); } } - @override void dispose() { @@ -62,7 +70,6 @@ class _ProgressBarState extends State { return Column( children: [ - // ScrumMeetIndicator Above Progress Bar ScrumMeetIndicator( startDate: startDate, endDate: endDate, @@ -70,67 +77,84 @@ class _ProgressBarState extends State { knobSize: knobSize, scrumMeetDates: scrumMeetDates, ), - // Progress Bar - Center( - child: Stack( - alignment: Alignment.centerLeft, - children: [ - // Background of the progress bar - Container( - height: barHeight, - width: barWidth, + Stack( + alignment: Alignment.centerLeft, + children: [ + Container( + height: barHeight, + width: barWidth, + decoration: BoxDecoration( + color: Colors.grey[300], + borderRadius: BorderRadius.circular(10), + ), + ), + Positioned( + left: 0, + child: Container( + height: 25, + width: progressFillWidth, decoration: BoxDecoration( - color: Colors.grey[300], + color: Colors.purple, borderRadius: BorderRadius.circular(10), ), ), - // Filled portion of the progress bar - Positioned( - left: 0, + ), + Positioned( + left: knobPosition, + child: GestureDetector( + onTap: () { + print("Knob Clicked - Open Timeline Page"); + }, child: Container( - height: 20, - width: progressFillWidth, // ✅ Updates dynamically + width: knobSize, + height: knobSize, decoration: BoxDecoration( - color: Colors.purple, - borderRadius: BorderRadius.circular(10), + shape: BoxShape.circle, + color: Colors.white, + border: Border.all(color: Colors.grey, width: 2), + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.2), + blurRadius: 4, + spreadRadius: 1, + offset: const Offset(0, 2), + ), + ], ), ), ), - // Knob (Circle) moving with progress - Positioned( - left: knobPosition, // Align knob correctly - child: GestureDetector( - onTap: () { - print("Knob Clicked - Open Timeline Page"); - }, - child: Container( - width: knobSize, - height: knobSize, - decoration: BoxDecoration( - shape: BoxShape.circle, - color: Colors.white, - border: Border.all(color: Colors.grey, width: 2), - boxShadow: [ - BoxShadow( - color: Colors.black.withOpacity(0.2), - blurRadius: 4, - spreadRadius: 1, - offset: const Offset(0, 2), - ), - ], - ), - ), + ), + ], + ), + const SizedBox(height: 5), + // Time Left Indicator - Positioned at Right Edge + Align( + alignment: Alignment.centerRight, + child: Container( + padding: const EdgeInsets.symmetric(horizontal: 6, vertical: 3), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8), + ), + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + const Icon(Icons.hourglass_bottom, size: 12, color: Colors.black54), + const SizedBox(width: 3), + Text( + " ${timeLeft.inDays}d ${timeLeft.inHours % 24}h", + style: const TextStyle(fontSize: 11, fontWeight: FontWeight.bold, color: Colors.black54), ), - ), - ], + ], + ), ), ), + ], ); } } -/// Scrum Meet Indicator Widget class ScrumMeetIndicator extends StatelessWidget { final DateTime startDate; final DateTime endDate; @@ -157,19 +181,20 @@ class ScrumMeetIndicator extends StatelessWidget { return SizedBox( width: barWidth, - height:20, // Space for indicators + height: 20, child: Stack( children: scrumMeetDates.map((date) { - double position = ((date.difference(startDate).inDays) / - (endDate.difference(startDate).inDays)) * (barWidth - knobSize); + double position = ((date.difference(startDate).inDays) / + (endDate.difference(startDate).inDays)) * + (barWidth - knobSize); bool isNext = date == nextScrumMeet; return Positioned( left: position.clamp(0, barWidth - knobSize), child: Icon( Icons.arrow_drop_down, - size: 20, - color: isNext ? Colors.grey : Colors.white, + size: 24, + color: isNext ? Colors.purple : Colors.white, ), ); }).toList(), diff --git a/frontend/lib/utils/scrum_meet_indicator.dart b/frontend/lib/utils/scrum_meet_indicator.dart deleted file mode 100644 index c3b8037..0000000 --- a/frontend/lib/utils/scrum_meet_indicator.dart +++ /dev/null @@ -1,95 +0,0 @@ -import 'package:flutter/material.dart'; -import 'dart:async'; - -class ScrumMeetIndicator extends StatefulWidget { - const ScrumMeetIndicator({Key? key}) : super(key: key); - - @override - _ScrumMeetIndicatorState createState() => _ScrumMeetIndicatorState(); -} - -class _ScrumMeetIndicatorState extends State { - DateTime startDate = DateTime(2024, 4, 1); - DateTime endDate = DateTime(2024, 4, 30); - double barWidth = 340; - double knobSize = 25; // Match knob size from progress bar - List scrumMeetDates = []; - DateTime? nextScrumMeet; - Timer? timer; - - @override - void initState() { - super.initState(); - _calculateScrumMeetDates(); - _updateNextScrumMeet(); - timer = Timer.periodic(const Duration(minutes: 1), (timer) { - _updateNextScrumMeet(); - }); - } - - void _calculateScrumMeetDates() { - DateTime current = startDate; - while (current.isBefore(endDate) || current.isAtSameMomentAs(endDate)) { - if (current.weekday == DateTime.saturday) { - scrumMeetDates.add(current); - } - current = current.add(const Duration(days: 1)); - } - } - - void _updateNextScrumMeet() { - DateTime today = DateTime.now(); - nextScrumMeet = scrumMeetDates.firstWhere( - (date) => date.isAfter(today), - orElse: () => scrumMeetDates.last, - ); - setState(() {}); - } - - @override - void dispose() { - timer?.cancel(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - return Column( - children: [ - // Scrum Meet Indicators - SizedBox( - width: barWidth + knobSize, // Extend width to match progress bar logic - height: 30, // Space for indicators - child: Stack( - children: scrumMeetDates.map((date) { - double position = ((date.difference(startDate).inDays) / - (endDate.difference(startDate).inDays)) * (barWidth - knobSize); - bool isNext = date == nextScrumMeet; - - return Positioned( - left: position.clamp(0, barWidth - knobSize), - child: Icon( - Icons.arrow_drop_up, - size: 20, - color: isNext ? Colors.grey : Colors.grey[300], - ), - ); - }).toList(), - ), - ), - - const SizedBox(height: 5), - - // Progress Bar - Container( - height: 20, - width: barWidth, - decoration: BoxDecoration( - color: Colors.grey[300], - borderRadius: BorderRadius.circular(10), - ), - ), - ], - ); - } -} diff --git a/frontend/lib/views/user_pages/user_feed_page.dart b/frontend/lib/views/user_pages/user_feed_page.dart index b877432..1e30874 100644 --- a/frontend/lib/views/user_pages/user_feed_page.dart +++ b/frontend/lib/views/user_pages/user_feed_page.dart @@ -5,7 +5,6 @@ import 'package:dev_track_app/models/user_feed_model.dart'; import 'package:dev_track_app/view_models/user_feed_view_model.dart'; import 'package:dev_track_app/utils/bottomnavbar.dart'; import 'package:dev_track_app/utils/progress_bar.dart'; -import 'package:dev_track_app/utils/scrum_meet_indicator.dart'; class UserFeedPage extends StatefulWidget { @@ -64,7 +63,6 @@ void _onNavBarTapped(int index) { children: [ _buildTopBar(), const ProgressBar(), - const SizedBox(height: 20), _buildHeader(), const SizedBox(height: 10), Expanded( From 3add6727eb0ed26799508f6d89aa02bafd4f5714 Mon Sep 17 00:00:00 2001 From: ghamani <138302691+Ghamani121@users.noreply.github.com> Date: Thu, 3 Apr 2025 15:34:05 +0530 Subject: [PATCH 96/97] upateeddd --- frontend/lib/main.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/lib/main.dart b/frontend/lib/main.dart index 87f62d9..23e50a9 100644 --- a/frontend/lib/main.dart +++ b/frontend/lib/main.dart @@ -45,6 +45,6 @@ class MyApp extends StatelessWidget { primarySwatch: Colors.green, ), debugShowCheckedModeBanner: false, - home: UserFeedPage()); + home: LoginPage()); } } From 745c42a802bd717435e5038efacd738e3e8c0b18 Mon Sep 17 00:00:00 2001 From: ghamani <138302691+Ghamani121@users.noreply.github.com> Date: Tue, 8 Apr 2025 19:15:31 +0530 Subject: [PATCH 97/97] changed primary color code --- frontend/lib/main.dart | 2 +- frontend/lib/theme/colors.dart | 2 +- frontend/lib/utils/bottomnavbar.dart | 3 ++- frontend/lib/utils/progress_bar.dart | 3 ++- frontend/lib/views/user_pages/user_feed_page.dart | 3 ++- 5 files changed, 8 insertions(+), 5 deletions(-) diff --git a/frontend/lib/main.dart b/frontend/lib/main.dart index 23e50a9..87f62d9 100644 --- a/frontend/lib/main.dart +++ b/frontend/lib/main.dart @@ -45,6 +45,6 @@ class MyApp extends StatelessWidget { primarySwatch: Colors.green, ), debugShowCheckedModeBanner: false, - home: LoginPage()); + home: UserFeedPage()); } } diff --git a/frontend/lib/theme/colors.dart b/frontend/lib/theme/colors.dart index 8b3ad29..ba67273 100644 --- a/frontend/lib/theme/colors.dart +++ b/frontend/lib/theme/colors.dart @@ -2,7 +2,7 @@ import 'package:flutter/material.dart'; class AppColors { // Light Theme Colors - static const Color primaryLight = Color(0xFF6200EA); + static const Color primaryLight = Color(0xFF6901AE); static const Color secondaryLight = Color(0xFF03DAC6); static const Color backgroundLight = Color.fromARGB(255, 255, 255, 255); static const Color textPrimaryLight = Color.fromARGB(255, 255, 255, 255); diff --git a/frontend/lib/utils/bottomnavbar.dart b/frontend/lib/utils/bottomnavbar.dart index 8c214f0..d9d45c4 100644 --- a/frontend/lib/utils/bottomnavbar.dart +++ b/frontend/lib/utils/bottomnavbar.dart @@ -1,3 +1,4 @@ +import 'package:dev_track_app/theme/colors.dart'; import 'package:flutter/material.dart'; class BottomNavBar extends StatelessWidget { @@ -49,7 +50,7 @@ class BottomNavBar extends StatelessWidget { shadowColor: Colors.black54, // Darker shadow shape: const CircleBorder(), child: CircleAvatar( - backgroundColor: Colors.purple, + backgroundColor: AppColors.primaryLight, radius: 28, // Slightly bigger for emphasis child: Icon( _getIcon(currentIndex), diff --git a/frontend/lib/utils/progress_bar.dart b/frontend/lib/utils/progress_bar.dart index 0b636c2..6f6cd33 100644 --- a/frontend/lib/utils/progress_bar.dart +++ b/frontend/lib/utils/progress_bar.dart @@ -1,3 +1,4 @@ +import 'package:dev_track_app/theme/colors.dart'; import 'package:flutter/material.dart'; import 'dart:async'; @@ -94,7 +95,7 @@ class _ProgressBarState extends State { height: 25, width: progressFillWidth, decoration: BoxDecoration( - color: Colors.purple, + color: AppColors.primaryLight, borderRadius: BorderRadius.circular(10), ), ), diff --git a/frontend/lib/views/user_pages/user_feed_page.dart b/frontend/lib/views/user_pages/user_feed_page.dart index 1e30874..9be0974 100644 --- a/frontend/lib/views/user_pages/user_feed_page.dart +++ b/frontend/lib/views/user_pages/user_feed_page.dart @@ -1,3 +1,4 @@ +import 'package:dev_track_app/theme/colors.dart'; import 'package:dev_track_app/views/user_pages/project_pages/project_display/previous_projects.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; @@ -209,7 +210,7 @@ class UserFeedCard extends StatelessWidget { FloatingActionButton( tooltip: 'View More', onPressed: onViewMore, - backgroundColor: Colors.purple, + backgroundColor: AppColors.primaryLight, mini: true, child: const Icon(Icons.arrow_forward, color: Colors.white, size: 18), ),