├── .github ├── pull_request_template.md └── workflows │ ├── flutter-ci.yml │ └── label-checker.yml ├── .gitignore ├── .metadata ├── .vscode └── launch.json ├── LICENSE ├── README.md ├── android ├── .gitignore ├── app │ ├── build.gradle │ ├── google-services.json │ └── src │ │ ├── debug │ │ └── AndroidManifest.xml │ │ ├── main │ │ ├── AndroidManifest.xml │ │ ├── kotlin │ │ │ └── com │ │ │ │ └── csekings │ │ │ │ └── student_app │ │ │ │ └── MainActivity.kt │ │ └── res │ │ │ ├── drawable-v21 │ │ │ └── launch_background.xml │ │ │ ├── drawable │ │ │ └── launch_background.xml │ │ │ ├── mipmap-hdpi │ │ │ └── ic_launcher.png │ │ │ ├── mipmap-mdpi │ │ │ └── ic_launcher.png │ │ │ ├── mipmap-xhdpi │ │ │ └── ic_launcher.png │ │ │ ├── mipmap-xxhdpi │ │ │ └── ic_launcher.png │ │ │ ├── mipmap-xxxhdpi │ │ │ └── ic_launcher.png │ │ │ ├── values-night │ │ │ └── styles.xml │ │ │ └── values │ │ │ └── styles.xml │ │ └── profile │ │ └── AndroidManifest.xml ├── build.gradle ├── gradle.properties ├── gradle │ └── wrapper │ │ └── gradle-wrapper.properties └── settings.gradle ├── assets ├── Add class.png ├── Add dep.png ├── Add students.jpg ├── Add year.png ├── Delete class.png ├── Delete department.png ├── Delete students.png ├── Delete year.png ├── announce.png ├── candidate.png ├── grade.png ├── graduates.png ├── image_01.png ├── noimage.png ├── notes.png └── timetable.png ├── gradle.properties ├── ios ├── .gitignore ├── Flutter │ ├── AppFrameworkInfo.plist │ ├── Debug.xcconfig │ └── Release.xcconfig ├── Podfile ├── Podfile.lock ├── Runner.xcodeproj │ ├── project.pbxproj │ ├── project.xcworkspace │ │ ├── contents.xcworkspacedata │ │ └── xcshareddata │ │ │ ├── IDEWorkspaceChecks.plist │ │ │ └── WorkspaceSettings.xcsettings │ └── xcshareddata │ │ └── xcschemes │ │ └── Runner.xcscheme ├── Runner.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ ├── IDEWorkspaceChecks.plist │ │ └── WorkspaceSettings.xcsettings └── Runner │ ├── AppDelegate.swift │ ├── Assets.xcassets │ ├── AppIcon.appiconset │ │ ├── Contents.json │ │ ├── Icon-App-1024x1024@1x.png │ │ ├── Icon-App-20x20@1x.png │ │ ├── Icon-App-20x20@2x.png │ │ ├── Icon-App-20x20@3x.png │ │ ├── Icon-App-29x29@1x.png │ │ ├── Icon-App-29x29@2x.png │ │ ├── Icon-App-29x29@3x.png │ │ ├── Icon-App-40x40@1x.png │ │ ├── Icon-App-40x40@2x.png │ │ ├── Icon-App-40x40@3x.png │ │ ├── Icon-App-60x60@2x.png │ │ ├── Icon-App-60x60@3x.png │ │ ├── Icon-App-76x76@1x.png │ │ ├── Icon-App-76x76@2x.png │ │ └── Icon-App-83.5x83.5@2x.png │ └── LaunchImage.imageset │ │ ├── Contents.json │ │ ├── LaunchImage.png │ │ ├── LaunchImage@2x.png │ │ ├── LaunchImage@3x.png │ │ └── README.md │ ├── Base.lproj │ ├── LaunchScreen.storyboard │ └── Main.storyboard │ ├── GoogleService-Info.plist │ ├── Info.plist │ └── Runner-Bridging-Header.h ├── lib ├── controllers.dart ├── controllers │ ├── add_details.dart │ ├── attendance.dart │ ├── get_details.dart │ └── process_data.dart ├── generated_plugin_registrant.dart ├── main.dart ├── models.dart ├── models │ └── db_model.dart └── views │ ├── admin │ ├── admin_screens.dart │ ├── admin_widgets.dart │ ├── screens │ │ ├── add_batch.dart │ │ ├── upload_notes.dart │ │ └── upload_profile.dart │ └── widgets │ │ ├── admin_bottomnavbar.dart │ │ ├── designs.dart │ │ └── dialog.dart │ ├── common │ ├── common_screens.dart │ ├── login.dart │ ├── onboarding_screen.dart │ └── settings.dart │ ├── student │ ├── screens │ │ ├── dashboard.dart │ │ ├── grade.dart │ │ ├── notes_viewer.dart │ │ ├── pdf_api.dart │ │ ├── photo_viewer.dart │ │ ├── profile.dart │ │ └── view_notes.dart │ ├── student_screens.dart │ ├── student_widgets.dart │ └── widgets │ │ └── student_bottomnavbar.dart │ └── utils │ └── theme │ ├── theme.dart │ ├── theme_notifier.dart │ └── theme_shared_pref.dart ├── pubspec.yaml ├── screenshots ├── Admin.jpg ├── Attendance.jpg ├── Dashboard.jpg ├── Mark.jpg ├── Notes.jpg ├── Profile_view.jpg ├── Staff_login.jpg ├── Student_login.jpg ├── Upload_Profile.jpg └── Upload_notes.jpg ├── test └── widget_test.dart └── web ├── favicon.png ├── icons ├── Icon-192.png └── Icon-512.png ├── index.html └── manifest.json /.github/pull_request_template.md: -------------------------------------------------------------------------------- 1 | ## Impact Documentation 2 | 3 | 4 | 5 | ## Please Mention How Has This Been Tested? 6 | 7 | 8 | 9 | 10 | ## Does this have any Post Deploy Steps? 11 | 12 | 13 | 14 | ## Checklist: 15 | 16 | 17 | 18 | - [ ] My code follows the style guidelines of this project. 19 | - [ ] I have added tests to cover my changes. 20 | - [ ] I have assigned reviewers to this PR. 21 | - [ ] I added a picture of a cute animal because it's fun 22 | 23 | -------------------------------------------------------------------------------- /.github/workflows/flutter-ci.yml: -------------------------------------------------------------------------------- 1 | on: 2 | push: 3 | branches: 4 | - main 5 | 6 | name: Build and Release Apps 7 | jobs: 8 | build: 9 | name: Build Apps 10 | runs-on: macos-latest 11 | steps: 12 | - name: Export Release Timestamp 13 | run: echo "APP_VERSION=release_$(date +'%Y-%m-%d_%H-%m-%S')" >> $GITHUB_ENV 14 | - name: Checkout repository 15 | uses: actions/checkout@v2.3.4 16 | - name: Set up Java 17 | uses: actions/setup-java@v2.0.0 18 | with: 19 | distribution: 'adopt' 20 | java-version: "12.x" 21 | - name: Set up Flutter 22 | uses: subosito/flutter-action@v1.5.3 23 | with: 24 | channel: "stable" 25 | - name: Upgrade Flutter 26 | run: flutter upgrade 27 | - name: Install pub Dependencies 28 | run: flutter pub get 29 | - name: Build Android App 30 | run: flutter build apk --split-per-abi 31 | - name: Release Apps 32 | uses: ncipollo/release-action@v1 33 | with: 34 | tag: ${{ env.APP_VERSION }} 35 | name: ${{ env.APP_VERSION }} 36 | token: ${{ secrets.GITHUB_TOKEN }} 37 | artifacts: "build/app/outputs/apk/release/*.apk" 38 | -------------------------------------------------------------------------------- /.github/workflows/label-checker.yml: -------------------------------------------------------------------------------- 1 | name: Student App Label Checker 2 | on: 3 | pull_request: 4 | types: 5 | - opened 6 | - synchronize 7 | - reopened 8 | - labeled 9 | - unlabeled 10 | - ready_for_review 11 | branches: 12 | - master 13 | 14 | jobs: 15 | check_pull_request_type: 16 | name: Check labels on PR 17 | runs-on: ubuntu-latest 18 | steps: 19 | - uses: docker://agilepathway/pull-request-label-checker:latest 20 | with: 21 | one_of: category:new-feature,category:bug-fix,category:changes,dev:new-feature,dev:bug-fix,dev:refactoring,dev:changes 22 | none_of: WIP,Old,wontfix 23 | repo_token: ${{ secrets.GITHUB_TOKEN }} -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Files and directories created by pub 2 | .dart_tool/ 3 | .packages 4 | build/ 5 | # If you're building an application, you may want to check-in your pubspec.lock 6 | pubspec.lock 7 | 8 | # Directory created by dartdoc 9 | # If you don't generate documentation locally you can remove this line. 10 | doc/api/ 11 | 12 | # Avoid committing generated Javascript files: 13 | *.dart.js 14 | *.info.json # Produced by the --dump-info flag. 15 | *.js # When generated by dart2js. Don't specify *.js if your 16 | # project includes source files written in JavaScript. 17 | *.js_ 18 | *.js.deps 19 | *.js.map 20 | 21 | ### Flutter ### 22 | # Flutter/Dart/Pub related 23 | **/doc/api/ 24 | .flutter-plugins 25 | .flutter-plugins-dependencies 26 | .pub-cache/ 27 | .pub/ 28 | 29 | # Android related 30 | **/android/**/gradle-wrapper.jar 31 | **/android/.gradle 32 | **/android/captures/ 33 | **/android/gradlew 34 | **/android/gradlew.bat 35 | **/android/local.properties 36 | **/android/**/GeneratedPluginRegistrant.java 37 | 38 | # iOS/XCode related 39 | **/ios/**/*.mode1v3 40 | **/ios/**/*.mode2v3 41 | **/ios/**/*.moved-aside 42 | **/ios/**/*.pbxuser 43 | **/ios/**/*.perspectivev3 44 | **/ios/**/*sync/ 45 | **/ios/**/.sconsign.dblite 46 | **/ios/**/.tags* 47 | **/ios/**/.vagrant/ 48 | **/ios/**/DerivedData/ 49 | **/ios/**/Icon? 50 | **/ios/**/Pods/ 51 | **/ios/**/.symlinks/ 52 | **/ios/**/profile 53 | **/ios/**/xcuserdata 54 | **/ios/.generated/ 55 | **/ios/Flutter/App.framework 56 | **/ios/Flutter/Flutter.framework 57 | **/ios/Flutter/Flutter.podspec 58 | **/ios/Flutter/Generated.xcconfig 59 | **/ios/Flutter/app.flx 60 | **/ios/Flutter/app.zip 61 | **/ios/Flutter/flutter_assets/ 62 | **/ios/Flutter/flutter_export_environment.sh 63 | **/ios/ServiceDefinitions.json 64 | **/ios/Runner/GeneratedPluginRegistrant.* 65 | 66 | # Exceptions to above rules. 67 | !**/ios/**/default.mode1v3 68 | !**/ios/**/default.mode2v3 69 | !**/ios/**/default.pbxuser 70 | !**/ios/**/default.perspectivev3 71 | !/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages 72 | 73 | ### VisualStudioCode ### 74 | .vscode/* 75 | !.vscode/settings.json 76 | !.vscode/tasks.json 77 | !.vscode/launch.json 78 | !.vscode/extensions.json 79 | *.code-workspace 80 | 81 | ### VisualStudioCode Patch ### 82 | # Ignore all local history of files 83 | .history 84 | 85 | ### AndroidStudio ### 86 | # Covers files to be ignored for android development using Android Studio. 87 | 88 | # Built application files 89 | *.apk 90 | *.ap_ 91 | 92 | # Files for the ART/Dalvik VM 93 | *.dex 94 | 95 | # Java class files 96 | *.class 97 | 98 | # Generated files 99 | bin/ 100 | gen/ 101 | out/ 102 | 103 | # Gradle files 104 | .gradle 105 | .gradle/ 106 | 107 | # Signing files 108 | .signing/ 109 | 110 | # Local configuration file (sdk path, etc) 111 | local.properties 112 | 113 | # Proguard folder generated by Eclipse 114 | proguard/ 115 | 116 | # Log Files 117 | *.log 118 | 119 | # Android Studio 120 | /*/build/ 121 | /*/local.properties 122 | /*/out 123 | /*/*/build 124 | /*/*/production 125 | captures/ 126 | .navigation/ 127 | *.ipr 128 | *~ 129 | *.swp 130 | 131 | # Android Patch 132 | gen-external-apklibs 133 | 134 | # External native build folder generated in Android Studio 2.2 and later 135 | .externalNativeBuild 136 | 137 | # NDK 138 | obj/ 139 | 140 | # IntelliJ IDEA 141 | *.iml 142 | *.iws 143 | /out/ 144 | .idea 145 | 146 | 147 | 148 | # OS-specific files 149 | .DS_Store 150 | .DS_Store? 151 | ._* 152 | .Spotlight-V100 153 | .Trashes 154 | ehthumbs.db 155 | Thumbs.db 156 | 157 | # Legacy Eclipse project files 158 | .classpath 159 | .project 160 | .cproject 161 | .settings/ 162 | 163 | # Mobile Tools for Java (J2ME) 164 | .mtj.tmp/ 165 | 166 | # Package Files # 167 | *.war 168 | *.ear 169 | 170 | # virtual machine crash logs (Reference: http://www.java.com/en/download/help/error_hotspot.xml) 171 | hs_err_pid* 172 | 173 | ## Plugin-specific files: 174 | 175 | # mpeltonen/sbt-idea plugin 176 | .idea_modules/ 177 | 178 | # JIRA plugin 179 | atlassian-ide-plugin.xml 180 | 181 | 182 | 183 | # Crashlytics plugin (for Android Studio and IntelliJ) 184 | com_crashlytics_export_strings.xml 185 | crashlytics.properties 186 | crashlytics-build.properties 187 | fabric.properties 188 | 189 | ### AndroidStudio Patch ### 190 | 191 | !/gradle/wrapper/gradle-wrapper.jar 192 | 193 | 194 | 195 | -------------------------------------------------------------------------------- /.metadata: -------------------------------------------------------------------------------- 1 | # This file tracks properties of this Flutter project. 2 | # Used by Flutter tool to assess capabilities and perform upgrades etc. 3 | # 4 | # This file should be version controlled and should not be manually edited. 5 | 6 | version: 7 | revision: 1ad9baa8b99a2897c20f9e6e54d3b9b359ade314 8 | channel: stable 9 | 10 | project_type: app 11 | -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | // Use IntelliSense to learn about possible attributes. 3 | // Hover to view descriptions of existing attributes. 4 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 5 | "version": "0.2.0", 6 | "configurations": [ 7 | { 8 | "name": "Flutter", 9 | "request": "launch", 10 | "type": "dart" 11 | } 12 | ] 13 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Student app 2 | 3 | ## Make changes to branch(dev), not (main). 4 | 5 | An app to digitalize the counselling class in a cross-platform application tested in android and web. 6 | 7 | Check the live demo here: https://csekings.github.io/student_app_web/#/ 8 | 9 | ## Credentials 10 | Admin Credentials 11 | 12 | key: ``csekings`` 13 | email: ``test@gmail.com`` 14 | password: ``test123`` 15 | 16 | Student credentials 17 | 18 | register no: ``820617104017`` 19 | password: ``13-11-1999`` 20 | 21 | ## Screenshots 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 |
Student_loginDashboardMarkProfileNotes
39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 |
Staff_loginAttendanceAdminUpload_notesUpload_Profile
58 | 59 | 60 | ## TODO 61 | - [ ] Refactoring 62 | - [ ] Redesign 63 | 64 | ## How to contribute 65 | 1. Fork the repository. 66 | 2. Make changes that you feel would not conflict with other modules. 67 | 3. Create a pull request mentioning what you did. 68 | 4. All requests will be accepted within 12 hrs. 69 | 70 | ## Submitting a issues 71 | 1. Make sure to test various devices before creating a ticket. 72 | 2. Specify the log and device descriptions. Otherwise, issue will be closed. 73 | 74 | **Note: Android, iOS, Web is supported right now.** 75 | 76 |
Icons made by Freepik from www.flaticon.com
77 | 78 | 79 | -------------------------------------------------------------------------------- /android/.gitignore: -------------------------------------------------------------------------------- 1 | gradle-wrapper.jar 2 | /.gradle 3 | /captures/ 4 | /gradlew 5 | /gradlew.bat 6 | /local.properties 7 | GeneratedPluginRegistrant.java 8 | -------------------------------------------------------------------------------- /android/app/build.gradle: -------------------------------------------------------------------------------- 1 | def localProperties = new Properties() 2 | def localPropertiesFile = rootProject.file('local.properties') 3 | if (localPropertiesFile.exists()) { 4 | localPropertiesFile.withReader('UTF-8') { reader -> 5 | localProperties.load(reader) 6 | } 7 | } 8 | 9 | def flutterRoot = localProperties.getProperty('flutter.sdk') 10 | if (flutterRoot == null) { 11 | throw new FileNotFoundException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.") 12 | } 13 | 14 | def flutterVersionCode = localProperties.getProperty('flutter.versionCode') 15 | if (flutterVersionCode == null) { 16 | flutterVersionCode = '1' 17 | } 18 | 19 | def flutterVersionName = localProperties.getProperty('flutter.versionName') 20 | if (flutterVersionName == null) { 21 | flutterVersionName = '1.0' 22 | } 23 | 24 | apply plugin: 'com.android.application' 25 | apply plugin: 'kotlin-android' 26 | apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" 27 | 28 | android { 29 | compileSdkVersion 30 30 | 31 | sourceSets { 32 | main.java.srcDirs += 'src/main/kotlin' 33 | } 34 | 35 | lintOptions { 36 | disable 'InvalidPackage' 37 | checkReleaseBuilds false 38 | } 39 | 40 | defaultConfig { 41 | // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). 42 | applicationId "com.csekings.student_app" 43 | minSdkVersion 21 44 | targetSdkVersion 30 45 | resConfigs "en" 46 | versionCode flutterVersionCode.toInteger() 47 | versionName flutterVersionName 48 | } 49 | 50 | buildTypes { 51 | debug { 52 | ext.alwaysUpdateBuildId = false 53 | } 54 | release { 55 | minifyEnabled true 56 | shrinkResources true 57 | // TODO: Add your own signing config for the release build. 58 | // Signing with the debug keys for now, so `flutter run --release` works. 59 | signingConfig signingConfigs.debug 60 | } 61 | } 62 | } 63 | 64 | flutter { 65 | source '../..' 66 | } 67 | 68 | dependencies { 69 | implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" 70 | } 71 | 72 | 73 | apply plugin: 'com.google.gms.google-services' -------------------------------------------------------------------------------- /android/app/google-services.json: -------------------------------------------------------------------------------- 1 | { 2 | "project_info": { 3 | "project_number": "152519400604", 4 | "firebase_url": "https://student-app-5f69d.firebaseio.com", 5 | "project_id": "student-app-5f69d", 6 | "storage_bucket": "student-app-5f69d.appspot.com" 7 | }, 8 | "client": [ 9 | { 10 | "client_info": { 11 | "mobilesdk_app_id": "1:152519400604:android:7f8dcf53a51b064ef5e159", 12 | "android_client_info": { 13 | "package_name": "com.csekings.student_app" 14 | } 15 | }, 16 | "oauth_client": [ 17 | { 18 | "client_id": "152519400604-3u1jra5j3q7egvoq92oblqr8sbibb751.apps.googleusercontent.com", 19 | "client_type": 3 20 | } 21 | ], 22 | "api_key": [ 23 | { 24 | "current_key": "AIzaSyCDCat-Hp0FURTBv4ZkEUiW7Aik_fufh-g" 25 | } 26 | ], 27 | "services": { 28 | "appinvite_service": { 29 | "other_platform_oauth_client": [ 30 | { 31 | "client_id": "152519400604-3u1jra5j3q7egvoq92oblqr8sbibb751.apps.googleusercontent.com", 32 | "client_type": 3 33 | } 34 | ] 35 | } 36 | } 37 | } 38 | ], 39 | "configuration_version": "1" 40 | } -------------------------------------------------------------------------------- /android/app/src/debug/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /android/app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 14 | 19 | 20 | 28 | 32 | 35 | 40 | 43 | 44 | 45 | 46 | 47 | 48 | 52 | 54 | 57 | 58 | 59 | -------------------------------------------------------------------------------- /android/app/src/main/kotlin/com/csekings/student_app/MainActivity.kt: -------------------------------------------------------------------------------- 1 | package com.csekings.student_app 2 | 3 | import io.flutter.embedding.android.FlutterActivity 4 | 5 | class MainActivity : FlutterActivity() { 6 | } 7 | -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-v21/launch_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 12 | 13 | -------------------------------------------------------------------------------- /android/app/src/main/res/drawable/launch_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 11 | 12 | -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CSEKINGS/student_app/2b6058aa4e631d8677ad5d6c36662cb0c879e060/android/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CSEKINGS/student_app/2b6058aa4e631d8677ad5d6c36662cb0c879e060/android/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CSEKINGS/student_app/2b6058aa4e631d8677ad5d6c36662cb0c879e060/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CSEKINGS/student_app/2b6058aa4e631d8677ad5d6c36662cb0c879e060/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CSEKINGS/student_app/2b6058aa4e631d8677ad5d6c36662cb0c879e060/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/values-night/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 15 | 18 | 19 | -------------------------------------------------------------------------------- /android/app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 15 | 18 | 19 | -------------------------------------------------------------------------------- /android/app/src/profile/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /android/build.gradle: -------------------------------------------------------------------------------- 1 | buildscript { 2 | ext.kotlin_version = '1.5.10' 3 | repositories { 4 | google() 5 | mavenCentral() 6 | } 7 | 8 | dependencies { 9 | classpath 'com.android.tools.build:gradle:4.2.1' 10 | classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" 11 | classpath 'com.google.gms:google-services:4.3.8' 12 | } 13 | } 14 | 15 | allprojects { 16 | repositories { 17 | google() 18 | mavenCentral() 19 | } 20 | } 21 | 22 | rootProject.buildDir = '../build' 23 | subprojects { 24 | project.buildDir = "${rootProject.buildDir}/${project.name}" 25 | } 26 | subprojects { 27 | project.evaluationDependsOn(':app') 28 | } 29 | 30 | task clean(type: Delete) { 31 | delete rootProject.buildDir 32 | } 33 | -------------------------------------------------------------------------------- /android/gradle.properties: -------------------------------------------------------------------------------- 1 | org.gradle.jvmargs=-Xmx1536M 2 | android.useAndroidX=true 3 | android.enableJetifier=true 4 | extra-gen-snapshot-options=--obfuscate 5 | android.enableR8.fullMode=true 6 | 7 | -------------------------------------------------------------------------------- /android/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Fri Jun 23 08:50:38 CEST 2017 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-6.7.1-all.zip 7 | -------------------------------------------------------------------------------- /android/settings.gradle: -------------------------------------------------------------------------------- 1 | // Copyright 2014 The Flutter Authors. All rights reserved. 2 | // Use of this source code is governed by a BSD-style license that can be 3 | // found in the LICENSE file. 4 | 5 | 6 | include ':app' 7 | 8 | def flutterProjectRoot = rootProject.projectDir.parentFile.toPath() 9 | 10 | def plugins = new Properties() 11 | def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins') 12 | if (pluginsFile.exists()) { 13 | pluginsFile.withReader('UTF-8') { reader -> plugins.load(reader) } 14 | } 15 | 16 | plugins.each { name, path -> 17 | def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile() 18 | include ":$name" 19 | project(":$name").projectDir = pluginDirectory 20 | } -------------------------------------------------------------------------------- /assets/Add class.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CSEKINGS/student_app/2b6058aa4e631d8677ad5d6c36662cb0c879e060/assets/Add class.png -------------------------------------------------------------------------------- /assets/Add dep.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CSEKINGS/student_app/2b6058aa4e631d8677ad5d6c36662cb0c879e060/assets/Add dep.png -------------------------------------------------------------------------------- /assets/Add students.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CSEKINGS/student_app/2b6058aa4e631d8677ad5d6c36662cb0c879e060/assets/Add students.jpg -------------------------------------------------------------------------------- /assets/Add year.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CSEKINGS/student_app/2b6058aa4e631d8677ad5d6c36662cb0c879e060/assets/Add year.png -------------------------------------------------------------------------------- /assets/Delete class.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CSEKINGS/student_app/2b6058aa4e631d8677ad5d6c36662cb0c879e060/assets/Delete class.png -------------------------------------------------------------------------------- /assets/Delete department.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CSEKINGS/student_app/2b6058aa4e631d8677ad5d6c36662cb0c879e060/assets/Delete department.png -------------------------------------------------------------------------------- /assets/Delete students.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CSEKINGS/student_app/2b6058aa4e631d8677ad5d6c36662cb0c879e060/assets/Delete students.png -------------------------------------------------------------------------------- /assets/Delete year.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CSEKINGS/student_app/2b6058aa4e631d8677ad5d6c36662cb0c879e060/assets/Delete year.png -------------------------------------------------------------------------------- /assets/announce.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CSEKINGS/student_app/2b6058aa4e631d8677ad5d6c36662cb0c879e060/assets/announce.png -------------------------------------------------------------------------------- /assets/candidate.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CSEKINGS/student_app/2b6058aa4e631d8677ad5d6c36662cb0c879e060/assets/candidate.png -------------------------------------------------------------------------------- /assets/grade.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CSEKINGS/student_app/2b6058aa4e631d8677ad5d6c36662cb0c879e060/assets/grade.png -------------------------------------------------------------------------------- /assets/graduates.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CSEKINGS/student_app/2b6058aa4e631d8677ad5d6c36662cb0c879e060/assets/graduates.png -------------------------------------------------------------------------------- /assets/image_01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CSEKINGS/student_app/2b6058aa4e631d8677ad5d6c36662cb0c879e060/assets/image_01.png -------------------------------------------------------------------------------- /assets/noimage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CSEKINGS/student_app/2b6058aa4e631d8677ad5d6c36662cb0c879e060/assets/noimage.png -------------------------------------------------------------------------------- /assets/notes.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CSEKINGS/student_app/2b6058aa4e631d8677ad5d6c36662cb0c879e060/assets/notes.png -------------------------------------------------------------------------------- /assets/timetable.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CSEKINGS/student_app/2b6058aa4e631d8677ad5d6c36662cb0c879e060/assets/timetable.png -------------------------------------------------------------------------------- /gradle.properties: -------------------------------------------------------------------------------- 1 | ## For more details on how to configure your build environment visit 2 | # http://www.gradle.org/docs/current/userguide/build_environment.html 3 | # 4 | # Specifies the JVM arguments used for the daemon process. 5 | # The setting is particularly useful for tweaking memory settings. 6 | # Default value: -Xmx1024m -XX:MaxPermSize=256m 7 | # org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 8 | # 9 | # When configured, Gradle will run in incubating parallel mode. 10 | # This option should only be used with decoupled projects. More details, visit 11 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects 12 | # org.gradle.parallel=true 13 | #Mon Jun 14 20:08:56 IST 2021 14 | org.gradle.jvmargs=-Xmx2048M -Dkotlin.daemon.jvm.options\="-Xmx2048M" 15 | -------------------------------------------------------------------------------- /ios/.gitignore: -------------------------------------------------------------------------------- 1 | *.mode1v3 2 | *.mode2v3 3 | *.moved-aside 4 | *.pbxuser 5 | *.perspectivev3 6 | **/*sync/ 7 | .sconsign.dblite 8 | .tags* 9 | **/.vagrant/ 10 | **/DerivedData/ 11 | Icon? 12 | **/Pods/ 13 | **/.symlinks/ 14 | profile 15 | xcuserdata 16 | **/.generated/ 17 | Flutter/App.framework 18 | Flutter/Flutter.framework 19 | Flutter/Flutter.podspec 20 | Flutter/Generated.xcconfig 21 | Flutter/app.flx 22 | Flutter/app.zip 23 | Flutter/flutter_assets/ 24 | Flutter/flutter_export_environment.sh 25 | ServiceDefinitions.json 26 | Runner/GeneratedPluginRegistrant.* 27 | 28 | # Exceptions to above rules. 29 | !default.mode1v3 30 | !default.mode2v3 31 | !default.pbxuser 32 | !default.perspectivev3 33 | -------------------------------------------------------------------------------- /ios/Flutter/AppFrameworkInfo.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | App 9 | CFBundleIdentifier 10 | io.flutter.flutter.app 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | App 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1.0 23 | MinimumOSVersion 24 | 9.0 25 | 26 | 27 | -------------------------------------------------------------------------------- /ios/Flutter/Debug.xcconfig: -------------------------------------------------------------------------------- 1 | #include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" 2 | #include "Generated.xcconfig" 3 | -------------------------------------------------------------------------------- /ios/Flutter/Release.xcconfig: -------------------------------------------------------------------------------- 1 | #include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" 2 | #include "Generated.xcconfig" 3 | -------------------------------------------------------------------------------- /ios/Podfile: -------------------------------------------------------------------------------- 1 | # Uncomment this line to define a global platform for your project 2 | platform :ios, '10.0' 3 | 4 | # CocoaPods analytics sends network stats synchronously affecting flutter build latency. 5 | ENV['COCOAPODS_DISABLE _STATS'] = 'true' 6 | 7 | project 'Runner', { 8 | 'Debug' => :debug, 9 | 'Profile' => :release, 10 | 'Release' => :release, 11 | } 12 | 13 | def flutter_root 14 | generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__) 15 | unless File.exist?(generated_xcode_build_settings_path) 16 | raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first" 17 | end 18 | 19 | File.foreach(generated_xcode_build_settings_path) do |line| 20 | matches = line.match(/FLUTTER_ROOT\=(.*)/) 21 | return matches[1].strip if matches 22 | end 23 | raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get" 24 | end 25 | 26 | require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) 27 | 28 | flutter_ios_podfile_setup 29 | 30 | target 'Runner' do 31 | use_frameworks! 32 | use_modular_headers! 33 | 34 | flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) 35 | end 36 | 37 | post_install do |installer| 38 | installer.pods_project.targets.each do |target| 39 | flutter_additional_ios_build_settings(target) 40 | end 41 | end 42 | -------------------------------------------------------------------------------- /ios/Podfile.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - abseil/algorithm (0.20200225.0): 3 | - abseil/algorithm/algorithm (= 0.20200225.0) 4 | - abseil/algorithm/container (= 0.20200225.0) 5 | - abseil/algorithm/algorithm (0.20200225.0): 6 | - abseil/base/config 7 | - abseil/algorithm/container (0.20200225.0): 8 | - abseil/algorithm/algorithm 9 | - abseil/base/core_headers 10 | - abseil/meta/type_traits 11 | - abseil/base (0.20200225.0): 12 | - abseil/base/atomic_hook (= 0.20200225.0) 13 | - abseil/base/base (= 0.20200225.0) 14 | - abseil/base/base_internal (= 0.20200225.0) 15 | - abseil/base/bits (= 0.20200225.0) 16 | - abseil/base/config (= 0.20200225.0) 17 | - abseil/base/core_headers (= 0.20200225.0) 18 | - abseil/base/dynamic_annotations (= 0.20200225.0) 19 | - abseil/base/endian (= 0.20200225.0) 20 | - abseil/base/errno_saver (= 0.20200225.0) 21 | - abseil/base/exponential_biased (= 0.20200225.0) 22 | - abseil/base/log_severity (= 0.20200225.0) 23 | - abseil/base/malloc_internal (= 0.20200225.0) 24 | - abseil/base/periodic_sampler (= 0.20200225.0) 25 | - abseil/base/pretty_function (= 0.20200225.0) 26 | - abseil/base/raw_logging_internal (= 0.20200225.0) 27 | - abseil/base/spinlock_wait (= 0.20200225.0) 28 | - abseil/base/throw_delegate (= 0.20200225.0) 29 | - abseil/base/atomic_hook (0.20200225.0): 30 | - abseil/base/config 31 | - abseil/base/core_headers 32 | - abseil/base/base (0.20200225.0): 33 | - abseil/base/atomic_hook 34 | - abseil/base/base_internal 35 | - abseil/base/config 36 | - abseil/base/core_headers 37 | - abseil/base/dynamic_annotations 38 | - abseil/base/log_severity 39 | - abseil/base/raw_logging_internal 40 | - abseil/base/spinlock_wait 41 | - abseil/meta/type_traits 42 | - abseil/base/base_internal (0.20200225.0): 43 | - abseil/base/config 44 | - abseil/meta/type_traits 45 | - abseil/base/bits (0.20200225.0): 46 | - abseil/base/config 47 | - abseil/base/core_headers 48 | - abseil/base/config (0.20200225.0) 49 | - abseil/base/core_headers (0.20200225.0): 50 | - abseil/base/config 51 | - abseil/base/dynamic_annotations (0.20200225.0) 52 | - abseil/base/endian (0.20200225.0): 53 | - abseil/base/config 54 | - abseil/base/core_headers 55 | - abseil/base/errno_saver (0.20200225.0): 56 | - abseil/base/config 57 | - abseil/base/exponential_biased (0.20200225.0): 58 | - abseil/base/config 59 | - abseil/base/core_headers 60 | - abseil/base/log_severity (0.20200225.0): 61 | - abseil/base/config 62 | - abseil/base/core_headers 63 | - abseil/base/malloc_internal (0.20200225.0): 64 | - abseil/base/base 65 | - abseil/base/base_internal 66 | - abseil/base/config 67 | - abseil/base/core_headers 68 | - abseil/base/dynamic_annotations 69 | - abseil/base/raw_logging_internal 70 | - abseil/base/periodic_sampler (0.20200225.0): 71 | - abseil/base/core_headers 72 | - abseil/base/exponential_biased 73 | - abseil/base/pretty_function (0.20200225.0) 74 | - abseil/base/raw_logging_internal (0.20200225.0): 75 | - abseil/base/atomic_hook 76 | - abseil/base/config 77 | - abseil/base/core_headers 78 | - abseil/base/log_severity 79 | - abseil/base/spinlock_wait (0.20200225.0): 80 | - abseil/base/base_internal 81 | - abseil/base/core_headers 82 | - abseil/base/errno_saver 83 | - abseil/base/throw_delegate (0.20200225.0): 84 | - abseil/base/config 85 | - abseil/base/raw_logging_internal 86 | - abseil/container/common (0.20200225.0): 87 | - abseil/meta/type_traits 88 | - abseil/types/optional 89 | - abseil/container/compressed_tuple (0.20200225.0): 90 | - abseil/utility/utility 91 | - abseil/container/container_memory (0.20200225.0): 92 | - abseil/memory/memory 93 | - abseil/utility/utility 94 | - abseil/container/fixed_array (0.20200225.0): 95 | - abseil/algorithm/algorithm 96 | - abseil/base/core_headers 97 | - abseil/base/dynamic_annotations 98 | - abseil/base/throw_delegate 99 | - abseil/container/compressed_tuple 100 | - abseil/memory/memory 101 | - abseil/container/flat_hash_map (0.20200225.0): 102 | - abseil/algorithm/container 103 | - abseil/container/container_memory 104 | - abseil/container/hash_function_defaults 105 | - abseil/container/raw_hash_map 106 | - abseil/memory/memory 107 | - abseil/container/hash_function_defaults (0.20200225.0): 108 | - abseil/base/config 109 | - abseil/hash/hash 110 | - abseil/strings/strings 111 | - abseil/container/hash_policy_traits (0.20200225.0): 112 | - abseil/meta/type_traits 113 | - abseil/container/hashtable_debug_hooks (0.20200225.0): 114 | - abseil/base/config 115 | - abseil/container/hashtablez_sampler (0.20200225.0): 116 | - abseil/base/base 117 | - abseil/base/core_headers 118 | - abseil/base/exponential_biased 119 | - abseil/container/have_sse 120 | - abseil/debugging/stacktrace 121 | - abseil/memory/memory 122 | - abseil/synchronization/synchronization 123 | - abseil/utility/utility 124 | - abseil/container/have_sse (0.20200225.0) 125 | - abseil/container/inlined_vector (0.20200225.0): 126 | - abseil/algorithm/algorithm 127 | - abseil/base/core_headers 128 | - abseil/base/throw_delegate 129 | - abseil/container/inlined_vector_internal 130 | - abseil/memory/memory 131 | - abseil/container/inlined_vector_internal (0.20200225.0): 132 | - abseil/base/core_headers 133 | - abseil/container/compressed_tuple 134 | - abseil/memory/memory 135 | - abseil/meta/type_traits 136 | - abseil/types/span 137 | - abseil/container/layout (0.20200225.0): 138 | - abseil/base/core_headers 139 | - abseil/meta/type_traits 140 | - abseil/strings/strings 141 | - abseil/types/span 142 | - abseil/utility/utility 143 | - abseil/container/raw_hash_map (0.20200225.0): 144 | - abseil/base/throw_delegate 145 | - abseil/container/container_memory 146 | - abseil/container/raw_hash_set 147 | - abseil/container/raw_hash_set (0.20200225.0): 148 | - abseil/base/bits 149 | - abseil/base/config 150 | - abseil/base/core_headers 151 | - abseil/base/endian 152 | - abseil/container/common 153 | - abseil/container/compressed_tuple 154 | - abseil/container/container_memory 155 | - abseil/container/hash_policy_traits 156 | - abseil/container/hashtable_debug_hooks 157 | - abseil/container/hashtablez_sampler 158 | - abseil/container/have_sse 159 | - abseil/container/layout 160 | - abseil/memory/memory 161 | - abseil/meta/type_traits 162 | - abseil/utility/utility 163 | - abseil/debugging/debugging_internal (0.20200225.0): 164 | - abseil/base/config 165 | - abseil/base/core_headers 166 | - abseil/base/dynamic_annotations 167 | - abseil/base/errno_saver 168 | - abseil/base/raw_logging_internal 169 | - abseil/debugging/demangle_internal (0.20200225.0): 170 | - abseil/base/base 171 | - abseil/base/config 172 | - abseil/base/core_headers 173 | - abseil/debugging/stacktrace (0.20200225.0): 174 | - abseil/base/config 175 | - abseil/base/core_headers 176 | - abseil/debugging/debugging_internal 177 | - abseil/debugging/symbolize (0.20200225.0): 178 | - abseil/base/base 179 | - abseil/base/config 180 | - abseil/base/core_headers 181 | - abseil/base/dynamic_annotations 182 | - abseil/base/malloc_internal 183 | - abseil/base/raw_logging_internal 184 | - abseil/debugging/debugging_internal 185 | - abseil/debugging/demangle_internal 186 | - abseil/hash/city (0.20200225.0): 187 | - abseil/base/config 188 | - abseil/base/core_headers 189 | - abseil/base/endian 190 | - abseil/hash/hash (0.20200225.0): 191 | - abseil/base/core_headers 192 | - abseil/base/endian 193 | - abseil/container/fixed_array 194 | - abseil/hash/city 195 | - abseil/meta/type_traits 196 | - abseil/numeric/int128 197 | - abseil/strings/strings 198 | - abseil/types/optional 199 | - abseil/types/variant 200 | - abseil/utility/utility 201 | - abseil/memory (0.20200225.0): 202 | - abseil/memory/memory (= 0.20200225.0) 203 | - abseil/memory/memory (0.20200225.0): 204 | - abseil/base/core_headers 205 | - abseil/meta/type_traits 206 | - abseil/meta (0.20200225.0): 207 | - abseil/meta/type_traits (= 0.20200225.0) 208 | - abseil/meta/type_traits (0.20200225.0): 209 | - abseil/base/config 210 | - abseil/numeric/int128 (0.20200225.0): 211 | - abseil/base/config 212 | - abseil/base/core_headers 213 | - abseil/strings/internal (0.20200225.0): 214 | - abseil/base/config 215 | - abseil/base/core_headers 216 | - abseil/base/endian 217 | - abseil/base/raw_logging_internal 218 | - abseil/meta/type_traits 219 | - abseil/strings/str_format (0.20200225.0): 220 | - abseil/strings/str_format_internal 221 | - abseil/strings/str_format_internal (0.20200225.0): 222 | - abseil/base/config 223 | - abseil/base/core_headers 224 | - abseil/meta/type_traits 225 | - abseil/numeric/int128 226 | - abseil/strings/strings 227 | - abseil/types/span 228 | - abseil/strings/strings (0.20200225.0): 229 | - abseil/base/base 230 | - abseil/base/bits 231 | - abseil/base/config 232 | - abseil/base/core_headers 233 | - abseil/base/endian 234 | - abseil/base/raw_logging_internal 235 | - abseil/base/throw_delegate 236 | - abseil/memory/memory 237 | - abseil/meta/type_traits 238 | - abseil/numeric/int128 239 | - abseil/strings/internal 240 | - abseil/synchronization/graphcycles_internal (0.20200225.0): 241 | - abseil/base/base 242 | - abseil/base/base_internal 243 | - abseil/base/config 244 | - abseil/base/core_headers 245 | - abseil/base/malloc_internal 246 | - abseil/base/raw_logging_internal 247 | - abseil/synchronization/kernel_timeout_internal (0.20200225.0): 248 | - abseil/base/core_headers 249 | - abseil/base/raw_logging_internal 250 | - abseil/time/time 251 | - abseil/synchronization/synchronization (0.20200225.0): 252 | - abseil/base/atomic_hook 253 | - abseil/base/base 254 | - abseil/base/base_internal 255 | - abseil/base/config 256 | - abseil/base/core_headers 257 | - abseil/base/dynamic_annotations 258 | - abseil/base/malloc_internal 259 | - abseil/base/raw_logging_internal 260 | - abseil/debugging/stacktrace 261 | - abseil/debugging/symbolize 262 | - abseil/synchronization/graphcycles_internal 263 | - abseil/synchronization/kernel_timeout_internal 264 | - abseil/time/time 265 | - abseil/time (0.20200225.0): 266 | - abseil/time/internal (= 0.20200225.0) 267 | - abseil/time/time (= 0.20200225.0) 268 | - abseil/time/internal (0.20200225.0): 269 | - abseil/time/internal/cctz (= 0.20200225.0) 270 | - abseil/time/internal/cctz (0.20200225.0): 271 | - abseil/time/internal/cctz/civil_time (= 0.20200225.0) 272 | - abseil/time/internal/cctz/time_zone (= 0.20200225.0) 273 | - abseil/time/internal/cctz/civil_time (0.20200225.0): 274 | - abseil/base/config 275 | - abseil/time/internal/cctz/time_zone (0.20200225.0): 276 | - abseil/base/config 277 | - abseil/time/internal/cctz/civil_time 278 | - abseil/time/time (0.20200225.0): 279 | - abseil/base/base 280 | - abseil/base/core_headers 281 | - abseil/base/raw_logging_internal 282 | - abseil/numeric/int128 283 | - abseil/strings/strings 284 | - abseil/time/internal/cctz/civil_time 285 | - abseil/time/internal/cctz/time_zone 286 | - abseil/types (0.20200225.0): 287 | - abseil/types/any (= 0.20200225.0) 288 | - abseil/types/bad_any_cast (= 0.20200225.0) 289 | - abseil/types/bad_any_cast_impl (= 0.20200225.0) 290 | - abseil/types/bad_optional_access (= 0.20200225.0) 291 | - abseil/types/bad_variant_access (= 0.20200225.0) 292 | - abseil/types/compare (= 0.20200225.0) 293 | - abseil/types/optional (= 0.20200225.0) 294 | - abseil/types/span (= 0.20200225.0) 295 | - abseil/types/variant (= 0.20200225.0) 296 | - abseil/types/any (0.20200225.0): 297 | - abseil/base/config 298 | - abseil/base/core_headers 299 | - abseil/meta/type_traits 300 | - abseil/types/bad_any_cast 301 | - abseil/utility/utility 302 | - abseil/types/bad_any_cast (0.20200225.0): 303 | - abseil/base/config 304 | - abseil/types/bad_any_cast_impl 305 | - abseil/types/bad_any_cast_impl (0.20200225.0): 306 | - abseil/base/config 307 | - abseil/base/raw_logging_internal 308 | - abseil/types/bad_optional_access (0.20200225.0): 309 | - abseil/base/config 310 | - abseil/base/raw_logging_internal 311 | - abseil/types/bad_variant_access (0.20200225.0): 312 | - abseil/base/config 313 | - abseil/base/raw_logging_internal 314 | - abseil/types/compare (0.20200225.0): 315 | - abseil/base/core_headers 316 | - abseil/meta/type_traits 317 | - abseil/types/optional (0.20200225.0): 318 | - abseil/base/base_internal 319 | - abseil/base/config 320 | - abseil/base/core_headers 321 | - abseil/memory/memory 322 | - abseil/meta/type_traits 323 | - abseil/types/bad_optional_access 324 | - abseil/utility/utility 325 | - abseil/types/span (0.20200225.0): 326 | - abseil/algorithm/algorithm 327 | - abseil/base/core_headers 328 | - abseil/base/throw_delegate 329 | - abseil/meta/type_traits 330 | - abseil/types/variant (0.20200225.0): 331 | - abseil/base/base_internal 332 | - abseil/base/config 333 | - abseil/base/core_headers 334 | - abseil/meta/type_traits 335 | - abseil/types/bad_variant_access 336 | - abseil/utility/utility 337 | - abseil/utility/utility (0.20200225.0): 338 | - abseil/base/base_internal 339 | - abseil/base/config 340 | - abseil/meta/type_traits 341 | - BoringSSL-GRPC (0.0.7): 342 | - BoringSSL-GRPC/Implementation (= 0.0.7) 343 | - BoringSSL-GRPC/Interface (= 0.0.7) 344 | - BoringSSL-GRPC/Implementation (0.0.7): 345 | - BoringSSL-GRPC/Interface (= 0.0.7) 346 | - BoringSSL-GRPC/Interface (0.0.7) 347 | - cloud_firestore (2.5.3): 348 | - Firebase/Firestore (= 8.7.0) 349 | - firebase_core 350 | - Flutter 351 | - DKImagePickerController/Core (4.3.2): 352 | - DKImagePickerController/ImageDataManager 353 | - DKImagePickerController/Resource 354 | - DKImagePickerController/ImageDataManager (4.3.2) 355 | - DKImagePickerController/PhotoGallery (4.3.2): 356 | - DKImagePickerController/Core 357 | - DKPhotoGallery 358 | - DKImagePickerController/Resource (4.3.2) 359 | - DKPhotoGallery (0.0.17): 360 | - DKPhotoGallery/Core (= 0.0.17) 361 | - DKPhotoGallery/Model (= 0.0.17) 362 | - DKPhotoGallery/Preview (= 0.0.17) 363 | - DKPhotoGallery/Resource (= 0.0.17) 364 | - SDWebImage 365 | - SwiftyGif 366 | - DKPhotoGallery/Core (0.0.17): 367 | - DKPhotoGallery/Model 368 | - DKPhotoGallery/Preview 369 | - SDWebImage 370 | - SwiftyGif 371 | - DKPhotoGallery/Model (0.0.17): 372 | - SDWebImage 373 | - SwiftyGif 374 | - DKPhotoGallery/Preview (0.0.17): 375 | - DKPhotoGallery/Model 376 | - DKPhotoGallery/Resource 377 | - SDWebImage 378 | - SwiftyGif 379 | - DKPhotoGallery/Resource (0.0.17): 380 | - SDWebImage 381 | - SwiftyGif 382 | - file_picker (0.0.1): 383 | - DKImagePickerController/PhotoGallery 384 | - Flutter 385 | - Firebase/Auth (8.7.0): 386 | - Firebase/CoreOnly 387 | - FirebaseAuth (~> 8.7.0) 388 | - Firebase/CoreOnly (8.7.0): 389 | - FirebaseCore (= 8.7.0) 390 | - Firebase/Firestore (8.7.0): 391 | - Firebase/CoreOnly 392 | - FirebaseFirestore (~> 8.7.0) 393 | - Firebase/Storage (8.7.0): 394 | - Firebase/CoreOnly 395 | - FirebaseStorage (~> 8.7.0) 396 | - firebase_auth (3.1.2): 397 | - Firebase/Auth (= 8.7.0) 398 | - firebase_core 399 | - Flutter 400 | - firebase_core (1.7.0): 401 | - Firebase/CoreOnly (= 8.7.0) 402 | - Flutter 403 | - firebase_storage (10.0.4): 404 | - Firebase/Storage (= 8.7.0) 405 | - firebase_core 406 | - Flutter 407 | - FirebaseAuth (8.7.0): 408 | - FirebaseCore (~> 8.0) 409 | - GoogleUtilities/AppDelegateSwizzler (~> 7.4) 410 | - GoogleUtilities/Environment (~> 7.4) 411 | - GTMSessionFetcher/Core (~> 1.5) 412 | - FirebaseCore (8.7.0): 413 | - FirebaseCoreDiagnostics (~> 8.0) 414 | - GoogleUtilities/Environment (~> 7.4) 415 | - GoogleUtilities/Logger (~> 7.4) 416 | - FirebaseCoreDiagnostics (8.8.0): 417 | - GoogleDataTransport (~> 9.0) 418 | - GoogleUtilities/Environment (~> 7.4) 419 | - GoogleUtilities/Logger (~> 7.4) 420 | - nanopb (~> 2.30908.0) 421 | - FirebaseFirestore (8.7.0): 422 | - abseil/algorithm (= 0.20200225.0) 423 | - abseil/base (= 0.20200225.0) 424 | - abseil/container/flat_hash_map (= 0.20200225.0) 425 | - abseil/memory (= 0.20200225.0) 426 | - abseil/meta (= 0.20200225.0) 427 | - abseil/strings/strings (= 0.20200225.0) 428 | - abseil/time (= 0.20200225.0) 429 | - abseil/types (= 0.20200225.0) 430 | - FirebaseCore (~> 8.0) 431 | - "gRPC-C++ (~> 1.28.0)" 432 | - leveldb-library (~> 1.22) 433 | - nanopb (~> 2.30908.0) 434 | - FirebaseStorage (8.7.0): 435 | - FirebaseCore (~> 8.0) 436 | - GTMSessionFetcher/Core (~> 1.5) 437 | - Flutter (1.0.0) 438 | - FMDB (2.7.5): 439 | - FMDB/standard (= 2.7.5) 440 | - FMDB/standard (2.7.5) 441 | - GoogleDataTransport (9.1.0): 442 | - GoogleUtilities/Environment (~> 7.2) 443 | - nanopb (~> 2.30908.0) 444 | - PromisesObjC (< 3.0, >= 1.2) 445 | - GoogleUtilities/AppDelegateSwizzler (7.5.2): 446 | - GoogleUtilities/Environment 447 | - GoogleUtilities/Logger 448 | - GoogleUtilities/Network 449 | - GoogleUtilities/Environment (7.5.2): 450 | - PromisesObjC (< 3.0, >= 1.2) 451 | - GoogleUtilities/Logger (7.5.2): 452 | - GoogleUtilities/Environment 453 | - GoogleUtilities/Network (7.5.2): 454 | - GoogleUtilities/Logger 455 | - "GoogleUtilities/NSData+zlib" 456 | - GoogleUtilities/Reachability 457 | - "GoogleUtilities/NSData+zlib (7.5.2)" 458 | - GoogleUtilities/Reachability (7.5.2): 459 | - GoogleUtilities/Logger 460 | - "gRPC-C++ (1.28.2)": 461 | - "gRPC-C++/Implementation (= 1.28.2)" 462 | - "gRPC-C++/Interface (= 1.28.2)" 463 | - "gRPC-C++/Implementation (1.28.2)": 464 | - abseil/container/inlined_vector (= 0.20200225.0) 465 | - abseil/memory/memory (= 0.20200225.0) 466 | - abseil/strings/str_format (= 0.20200225.0) 467 | - abseil/strings/strings (= 0.20200225.0) 468 | - abseil/types/optional (= 0.20200225.0) 469 | - "gRPC-C++/Interface (= 1.28.2)" 470 | - gRPC-Core (= 1.28.2) 471 | - "gRPC-C++/Interface (1.28.2)" 472 | - gRPC-Core (1.28.2): 473 | - gRPC-Core/Implementation (= 1.28.2) 474 | - gRPC-Core/Interface (= 1.28.2) 475 | - gRPC-Core/Implementation (1.28.2): 476 | - abseil/container/inlined_vector (= 0.20200225.0) 477 | - abseil/memory/memory (= 0.20200225.0) 478 | - abseil/strings/str_format (= 0.20200225.0) 479 | - abseil/strings/strings (= 0.20200225.0) 480 | - abseil/types/optional (= 0.20200225.0) 481 | - BoringSSL-GRPC (= 0.0.7) 482 | - gRPC-Core/Interface (= 1.28.2) 483 | - gRPC-Core/Interface (1.28.2) 484 | - GTMSessionFetcher/Core (1.7.0) 485 | - image_picker (0.0.1): 486 | - Flutter 487 | - leveldb-library (1.22.1) 488 | - nanopb (2.30908.0): 489 | - nanopb/decode (= 2.30908.0) 490 | - nanopb/encode (= 2.30908.0) 491 | - nanopb/decode (2.30908.0) 492 | - nanopb/encode (2.30908.0) 493 | - path_provider (0.0.1): 494 | - Flutter 495 | - PromisesObjC (2.0.0) 496 | - SDWebImage (5.12.0): 497 | - SDWebImage/Core (= 5.12.0) 498 | - SDWebImage/Core (5.12.0) 499 | - shared_preferences (0.0.1): 500 | - Flutter 501 | - sqflite (0.0.2): 502 | - Flutter 503 | - FMDB (>= 2.7.5) 504 | - SwiftyGif (5.4.0) 505 | - url_launcher (0.0.1): 506 | - Flutter 507 | - webview_flutter_wkwebview (0.0.1): 508 | - Flutter 509 | 510 | DEPENDENCIES: 511 | - cloud_firestore (from `.symlinks/plugins/cloud_firestore/ios`) 512 | - file_picker (from `.symlinks/plugins/file_picker/ios`) 513 | - firebase_auth (from `.symlinks/plugins/firebase_auth/ios`) 514 | - firebase_core (from `.symlinks/plugins/firebase_core/ios`) 515 | - firebase_storage (from `.symlinks/plugins/firebase_storage/ios`) 516 | - Flutter (from `Flutter`) 517 | - image_picker (from `.symlinks/plugins/image_picker/ios`) 518 | - path_provider (from `.symlinks/plugins/path_provider/ios`) 519 | - shared_preferences (from `.symlinks/plugins/shared_preferences/ios`) 520 | - sqflite (from `.symlinks/plugins/sqflite/ios`) 521 | - url_launcher (from `.symlinks/plugins/url_launcher/ios`) 522 | - webview_flutter_wkwebview (from `.symlinks/plugins/webview_flutter_wkwebview/ios`) 523 | 524 | SPEC REPOS: 525 | trunk: 526 | - abseil 527 | - BoringSSL-GRPC 528 | - DKImagePickerController 529 | - DKPhotoGallery 530 | - Firebase 531 | - FirebaseAuth 532 | - FirebaseCore 533 | - FirebaseCoreDiagnostics 534 | - FirebaseFirestore 535 | - FirebaseStorage 536 | - FMDB 537 | - GoogleDataTransport 538 | - GoogleUtilities 539 | - "gRPC-C++" 540 | - gRPC-Core 541 | - GTMSessionFetcher 542 | - leveldb-library 543 | - nanopb 544 | - PromisesObjC 545 | - SDWebImage 546 | - SwiftyGif 547 | 548 | EXTERNAL SOURCES: 549 | cloud_firestore: 550 | :path: ".symlinks/plugins/cloud_firestore/ios" 551 | file_picker: 552 | :path: ".symlinks/plugins/file_picker/ios" 553 | firebase_auth: 554 | :path: ".symlinks/plugins/firebase_auth/ios" 555 | firebase_core: 556 | :path: ".symlinks/plugins/firebase_core/ios" 557 | firebase_storage: 558 | :path: ".symlinks/plugins/firebase_storage/ios" 559 | Flutter: 560 | :path: Flutter 561 | image_picker: 562 | :path: ".symlinks/plugins/image_picker/ios" 563 | path_provider: 564 | :path: ".symlinks/plugins/path_provider/ios" 565 | shared_preferences: 566 | :path: ".symlinks/plugins/shared_preferences/ios" 567 | sqflite: 568 | :path: ".symlinks/plugins/sqflite/ios" 569 | url_launcher: 570 | :path: ".symlinks/plugins/url_launcher/ios" 571 | webview_flutter_wkwebview: 572 | :path: ".symlinks/plugins/webview_flutter_wkwebview/ios" 573 | 574 | SPEC CHECKSUMS: 575 | abseil: 6c8eb7892aefa08d929b39f9bb108e5367e3228f 576 | BoringSSL-GRPC: 8edf627ee524575e2f8d19d56f068b448eea3879 577 | cloud_firestore: a09fdd53707eadea99f93ca5ad8e95e4c1ab1108 578 | DKImagePickerController: b5eb7f7a388e4643264105d648d01f727110fc3d 579 | DKPhotoGallery: fdfad5125a9fdda9cc57df834d49df790dbb4179 580 | file_picker: 3e6c3790de664ccf9b882732d9db5eaf6b8d4eb1 581 | Firebase: bc9325d5ee2041524bac78a5213d0e530c651309 582 | firebase_auth: 3193124aa14a62b8abec3fd069df73ef378d2c5b 583 | firebase_core: f5ac1f2726a2bd0468cea0161eddeea3d83d7e3e 584 | firebase_storage: 04a381404ffddf5d3d39bf4bdfc517e4a354dfe9 585 | FirebaseAuth: 2e7d029977648c67a5d51a263d4cbab76d34cf12 586 | FirebaseCore: f4804c1d3f4bbbefc88904d15653038f2c99ddf7 587 | FirebaseCoreDiagnostics: fe77f42da6329d6d83d21fd9d621a6b704413bfc 588 | FirebaseFirestore: e722ba956610c45d368d9787689e2aa41b809e68 589 | FirebaseStorage: 2e6e58fe31fb0061fdce3f156d0ebc964e9de6ba 590 | Flutter: 50d75fe2f02b26cc09d224853bb45737f8b3214a 591 | FMDB: 2ce00b547f966261cd18927a3ddb07cb6f3db82a 592 | GoogleDataTransport: 85fd18ff3019bb85d3f2c551d04c481dedf71fc9 593 | GoogleUtilities: 8de2a97a17e15b6b98e38e8770e2d129a57c0040 594 | "gRPC-C++": 13d8ccef97d5c3c441b7e3c529ef28ebee86fad2 595 | gRPC-Core: 4afa11bfbedf7cdecd04de535a9e046893404ed5 596 | GTMSessionFetcher: 43748f93435c2aa068b1cbe39655aaf600652e91 597 | image_picker: 9aa50e1d8cdacdbed739e925b7eea16d014367e6 598 | leveldb-library: 50c7b45cbd7bf543c81a468fe557a16ae3db8729 599 | nanopb: a0ba3315591a9ae0a16a309ee504766e90db0c96 600 | path_provider: d1e9807085df1f9cc9318206cd649dc0b76be3de 601 | PromisesObjC: 68159ce6952d93e17b2dfe273b8c40907db5ba58 602 | SDWebImage: 4ea20cca2986adc5aacde07aa686742fd4c67a37 603 | shared_preferences: 5033afbb22d372e15aff8ff766df9021b845f273 604 | sqflite: 6d358c025f5b867b29ed92fc697fd34924e11904 605 | SwiftyGif: 5d4af95df24caf1c570dbbcb32a3b8a0763bc6d7 606 | url_launcher: b6e016d912f04be9f5bf6e8e82dc599b7ba59649 607 | webview_flutter_wkwebview: 44aa025fbcf6730d808f1e0d86a5af5ac25fa8de 608 | 609 | PODFILE CHECKSUM: dad46998bc2de80925d7d70bb61faab87f56b67d 610 | 611 | COCOAPODS: 1.11.2 612 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 51; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; 11 | 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; 12 | 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 13 | 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 14 | 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 15 | 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; 16 | A2A67B8BECF2C57E58BF20FA /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2F1E27E4E074318E79E5D00C /* Pods_Runner.framework */; }; 17 | C46098DE270B7CED00A708BD /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = C46098DD270B7CED00A708BD /* GoogleService-Info.plist */; }; 18 | /* End PBXBuildFile section */ 19 | 20 | /* Begin PBXCopyFilesBuildPhase section */ 21 | 9705A1C41CF9048500538489 /* Embed Frameworks */ = { 22 | isa = PBXCopyFilesBuildPhase; 23 | buildActionMask = 2147483647; 24 | dstPath = ""; 25 | dstSubfolderSpec = 10; 26 | files = ( 27 | ); 28 | name = "Embed Frameworks"; 29 | runOnlyForDeploymentPostprocessing = 0; 30 | }; 31 | /* End PBXCopyFilesBuildPhase section */ 32 | 33 | /* Begin PBXFileReference section */ 34 | 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 35 | 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; 36 | 2F1E27E4E074318E79E5D00C /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 37 | 386D1C2A025A00352D203CD3 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; 38 | 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; 39 | 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 40 | 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 41 | 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; 42 | 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 43 | 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; 44 | 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; 45 | 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 46 | 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 47 | 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 48 | 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 49 | A9F8BDFADBC3A7AA0A5F373E /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; 50 | AAFDC8CE9A497C58B6533923 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; 51 | C46098DD270B7CED00A708BD /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = ""; }; 52 | /* End PBXFileReference section */ 53 | 54 | /* Begin PBXFrameworksBuildPhase section */ 55 | 97C146EB1CF9000F007C117D /* Frameworks */ = { 56 | isa = PBXFrameworksBuildPhase; 57 | buildActionMask = 2147483647; 58 | files = ( 59 | A2A67B8BECF2C57E58BF20FA /* Pods_Runner.framework in Frameworks */, 60 | ); 61 | runOnlyForDeploymentPostprocessing = 0; 62 | }; 63 | /* End PBXFrameworksBuildPhase section */ 64 | 65 | /* Begin PBXGroup section */ 66 | 44F0D3BD4D3E3F988BFE26B5 /* Pods */ = { 67 | isa = PBXGroup; 68 | children = ( 69 | A9F8BDFADBC3A7AA0A5F373E /* Pods-Runner.debug.xcconfig */, 70 | 386D1C2A025A00352D203CD3 /* Pods-Runner.release.xcconfig */, 71 | AAFDC8CE9A497C58B6533923 /* Pods-Runner.profile.xcconfig */, 72 | ); 73 | path = Pods; 74 | sourceTree = ""; 75 | }; 76 | 9740EEB11CF90186004384FC /* Flutter */ = { 77 | isa = PBXGroup; 78 | children = ( 79 | 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, 80 | 9740EEB21CF90195004384FC /* Debug.xcconfig */, 81 | 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, 82 | 9740EEB31CF90195004384FC /* Generated.xcconfig */, 83 | ); 84 | name = Flutter; 85 | sourceTree = ""; 86 | }; 87 | 97C146E51CF9000F007C117D = { 88 | isa = PBXGroup; 89 | children = ( 90 | 9740EEB11CF90186004384FC /* Flutter */, 91 | 97C146F01CF9000F007C117D /* Runner */, 92 | 97C146EF1CF9000F007C117D /* Products */, 93 | 44F0D3BD4D3E3F988BFE26B5 /* Pods */, 94 | E34B06E1C7F27469C7D04FD4 /* Frameworks */, 95 | ); 96 | sourceTree = ""; 97 | }; 98 | 97C146EF1CF9000F007C117D /* Products */ = { 99 | isa = PBXGroup; 100 | children = ( 101 | 97C146EE1CF9000F007C117D /* Runner.app */, 102 | ); 103 | name = Products; 104 | sourceTree = ""; 105 | }; 106 | 97C146F01CF9000F007C117D /* Runner */ = { 107 | isa = PBXGroup; 108 | children = ( 109 | 97C146FA1CF9000F007C117D /* Main.storyboard */, 110 | 97C146FD1CF9000F007C117D /* Assets.xcassets */, 111 | 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, 112 | 97C147021CF9000F007C117D /* Info.plist */, 113 | C46098DD270B7CED00A708BD /* GoogleService-Info.plist */, 114 | 97C146F11CF9000F007C117D /* Supporting Files */, 115 | 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, 116 | 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, 117 | 74858FAE1ED2DC5600515810 /* AppDelegate.swift */, 118 | 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */, 119 | ); 120 | path = Runner; 121 | sourceTree = ""; 122 | }; 123 | 97C146F11CF9000F007C117D /* Supporting Files */ = { 124 | isa = PBXGroup; 125 | children = ( 126 | ); 127 | name = "Supporting Files"; 128 | sourceTree = ""; 129 | }; 130 | E34B06E1C7F27469C7D04FD4 /* Frameworks */ = { 131 | isa = PBXGroup; 132 | children = ( 133 | 2F1E27E4E074318E79E5D00C /* Pods_Runner.framework */, 134 | ); 135 | name = Frameworks; 136 | sourceTree = ""; 137 | }; 138 | /* End PBXGroup section */ 139 | 140 | /* Begin PBXNativeTarget section */ 141 | 97C146ED1CF9000F007C117D /* Runner */ = { 142 | isa = PBXNativeTarget; 143 | buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; 144 | buildPhases = ( 145 | 7B7F2E09B65828E1CB271325 /* [CP] Check Pods Manifest.lock */, 146 | 9740EEB61CF901F6004384FC /* Run Script */, 147 | 97C146EA1CF9000F007C117D /* Sources */, 148 | 97C146EB1CF9000F007C117D /* Frameworks */, 149 | 97C146EC1CF9000F007C117D /* Resources */, 150 | 9705A1C41CF9048500538489 /* Embed Frameworks */, 151 | 3B06AD1E1E4923F5004D2608 /* Thin Binary */, 152 | 8D3E0CE91487CEB927B26F0A /* [CP] Embed Pods Frameworks */, 153 | ); 154 | buildRules = ( 155 | ); 156 | dependencies = ( 157 | ); 158 | name = Runner; 159 | productName = Runner; 160 | productReference = 97C146EE1CF9000F007C117D /* Runner.app */; 161 | productType = "com.apple.product-type.application"; 162 | }; 163 | /* End PBXNativeTarget section */ 164 | 165 | /* Begin PBXProject section */ 166 | 97C146E61CF9000F007C117D /* Project object */ = { 167 | isa = PBXProject; 168 | attributes = { 169 | LastUpgradeCheck = 1020; 170 | ORGANIZATIONNAME = ""; 171 | TargetAttributes = { 172 | 97C146ED1CF9000F007C117D = { 173 | CreatedOnToolsVersion = 7.3.1; 174 | LastSwiftMigration = 1100; 175 | }; 176 | }; 177 | }; 178 | buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; 179 | compatibilityVersion = "Xcode 9.3"; 180 | developmentRegion = en; 181 | hasScannedForEncodings = 0; 182 | knownRegions = ( 183 | en, 184 | Base, 185 | ); 186 | mainGroup = 97C146E51CF9000F007C117D; 187 | productRefGroup = 97C146EF1CF9000F007C117D /* Products */; 188 | projectDirPath = ""; 189 | projectRoot = ""; 190 | targets = ( 191 | 97C146ED1CF9000F007C117D /* Runner */, 192 | ); 193 | }; 194 | /* End PBXProject section */ 195 | 196 | /* Begin PBXResourcesBuildPhase section */ 197 | 97C146EC1CF9000F007C117D /* Resources */ = { 198 | isa = PBXResourcesBuildPhase; 199 | buildActionMask = 2147483647; 200 | files = ( 201 | 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, 202 | 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, 203 | 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, 204 | C46098DE270B7CED00A708BD /* GoogleService-Info.plist in Resources */, 205 | 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, 206 | ); 207 | runOnlyForDeploymentPostprocessing = 0; 208 | }; 209 | /* End PBXResourcesBuildPhase section */ 210 | 211 | /* Begin PBXShellScriptBuildPhase section */ 212 | 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { 213 | isa = PBXShellScriptBuildPhase; 214 | buildActionMask = 2147483647; 215 | files = ( 216 | ); 217 | inputPaths = ( 218 | ); 219 | name = "Thin Binary"; 220 | outputPaths = ( 221 | ); 222 | runOnlyForDeploymentPostprocessing = 0; 223 | shellPath = /bin/sh; 224 | shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; 225 | }; 226 | 7B7F2E09B65828E1CB271325 /* [CP] Check Pods Manifest.lock */ = { 227 | isa = PBXShellScriptBuildPhase; 228 | buildActionMask = 2147483647; 229 | files = ( 230 | ); 231 | inputFileListPaths = ( 232 | ); 233 | inputPaths = ( 234 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock", 235 | "${PODS_ROOT}/Manifest.lock", 236 | ); 237 | name = "[CP] Check Pods Manifest.lock"; 238 | outputFileListPaths = ( 239 | ); 240 | outputPaths = ( 241 | "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", 242 | ); 243 | runOnlyForDeploymentPostprocessing = 0; 244 | shellPath = /bin/sh; 245 | shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; 246 | showEnvVarsInLog = 0; 247 | }; 248 | 8D3E0CE91487CEB927B26F0A /* [CP] Embed Pods Frameworks */ = { 249 | isa = PBXShellScriptBuildPhase; 250 | buildActionMask = 2147483647; 251 | files = ( 252 | ); 253 | inputFileListPaths = ( 254 | "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", 255 | ); 256 | name = "[CP] Embed Pods Frameworks"; 257 | outputFileListPaths = ( 258 | "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", 259 | ); 260 | runOnlyForDeploymentPostprocessing = 0; 261 | shellPath = /bin/sh; 262 | shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; 263 | showEnvVarsInLog = 0; 264 | }; 265 | 9740EEB61CF901F6004384FC /* Run Script */ = { 266 | isa = PBXShellScriptBuildPhase; 267 | buildActionMask = 2147483647; 268 | files = ( 269 | ); 270 | inputPaths = ( 271 | ); 272 | name = "Run Script"; 273 | outputPaths = ( 274 | ); 275 | runOnlyForDeploymentPostprocessing = 0; 276 | shellPath = /bin/sh; 277 | shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; 278 | }; 279 | /* End PBXShellScriptBuildPhase section */ 280 | 281 | /* Begin PBXSourcesBuildPhase section */ 282 | 97C146EA1CF9000F007C117D /* Sources */ = { 283 | isa = PBXSourcesBuildPhase; 284 | buildActionMask = 2147483647; 285 | files = ( 286 | 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, 287 | 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, 288 | ); 289 | runOnlyForDeploymentPostprocessing = 0; 290 | }; 291 | /* End PBXSourcesBuildPhase section */ 292 | 293 | /* Begin PBXVariantGroup section */ 294 | 97C146FA1CF9000F007C117D /* Main.storyboard */ = { 295 | isa = PBXVariantGroup; 296 | children = ( 297 | 97C146FB1CF9000F007C117D /* Base */, 298 | ); 299 | name = Main.storyboard; 300 | sourceTree = ""; 301 | }; 302 | 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = { 303 | isa = PBXVariantGroup; 304 | children = ( 305 | 97C147001CF9000F007C117D /* Base */, 306 | ); 307 | name = LaunchScreen.storyboard; 308 | sourceTree = ""; 309 | }; 310 | /* End PBXVariantGroup section */ 311 | 312 | /* Begin XCBuildConfiguration section */ 313 | 249021D3217E4FDB00AE95B9 /* Profile */ = { 314 | isa = XCBuildConfiguration; 315 | buildSettings = { 316 | ALWAYS_SEARCH_USER_PATHS = NO; 317 | CLANG_ANALYZER_NONNULL = YES; 318 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 319 | CLANG_CXX_LIBRARY = "libc++"; 320 | CLANG_ENABLE_MODULES = YES; 321 | CLANG_ENABLE_OBJC_ARC = YES; 322 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 323 | CLANG_WARN_BOOL_CONVERSION = YES; 324 | CLANG_WARN_COMMA = YES; 325 | CLANG_WARN_CONSTANT_CONVERSION = YES; 326 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 327 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 328 | CLANG_WARN_EMPTY_BODY = YES; 329 | CLANG_WARN_ENUM_CONVERSION = YES; 330 | CLANG_WARN_INFINITE_RECURSION = YES; 331 | CLANG_WARN_INT_CONVERSION = YES; 332 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 333 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 334 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 335 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 336 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 337 | CLANG_WARN_STRICT_PROTOTYPES = YES; 338 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 339 | CLANG_WARN_UNREACHABLE_CODE = YES; 340 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 341 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 342 | COPY_PHASE_STRIP = NO; 343 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 344 | ENABLE_NS_ASSERTIONS = NO; 345 | ENABLE_STRICT_OBJC_MSGSEND = YES; 346 | GCC_C_LANGUAGE_STANDARD = gnu99; 347 | GCC_NO_COMMON_BLOCKS = YES; 348 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 349 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 350 | GCC_WARN_UNDECLARED_SELECTOR = YES; 351 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 352 | GCC_WARN_UNUSED_FUNCTION = YES; 353 | GCC_WARN_UNUSED_VARIABLE = YES; 354 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 355 | MTL_ENABLE_DEBUG_INFO = NO; 356 | SDKROOT = iphoneos; 357 | SUPPORTED_PLATFORMS = iphoneos; 358 | TARGETED_DEVICE_FAMILY = "1,2"; 359 | VALIDATE_PRODUCT = YES; 360 | }; 361 | name = Profile; 362 | }; 363 | 249021D4217E4FDB00AE95B9 /* Profile */ = { 364 | isa = XCBuildConfiguration; 365 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; 366 | buildSettings = { 367 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 368 | CLANG_ENABLE_MODULES = YES; 369 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; 370 | DEVELOPMENT_TEAM = 7M965DWLR3; 371 | ENABLE_BITCODE = NO; 372 | FRAMEWORK_SEARCH_PATHS = ( 373 | "$(inherited)", 374 | "$(PROJECT_DIR)/Flutter", 375 | ); 376 | INFOPLIST_FILE = Runner/Info.plist; 377 | LD_RUNPATH_SEARCH_PATHS = ( 378 | "$(inherited)", 379 | "@executable_path/Frameworks", 380 | ); 381 | LIBRARY_SEARCH_PATHS = ( 382 | "$(inherited)", 383 | "$(PROJECT_DIR)/Flutter", 384 | ); 385 | PRODUCT_BUNDLE_IDENTIFIER = com.csekings.studentApp; 386 | PRODUCT_NAME = "$(TARGET_NAME)"; 387 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; 388 | SWIFT_VERSION = 5.0; 389 | VERSIONING_SYSTEM = "apple-generic"; 390 | }; 391 | name = Profile; 392 | }; 393 | 97C147031CF9000F007C117D /* Debug */ = { 394 | isa = XCBuildConfiguration; 395 | buildSettings = { 396 | ALWAYS_SEARCH_USER_PATHS = NO; 397 | CLANG_ANALYZER_NONNULL = YES; 398 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 399 | CLANG_CXX_LIBRARY = "libc++"; 400 | CLANG_ENABLE_MODULES = YES; 401 | CLANG_ENABLE_OBJC_ARC = YES; 402 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 403 | CLANG_WARN_BOOL_CONVERSION = YES; 404 | CLANG_WARN_COMMA = YES; 405 | CLANG_WARN_CONSTANT_CONVERSION = YES; 406 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 407 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 408 | CLANG_WARN_EMPTY_BODY = YES; 409 | CLANG_WARN_ENUM_CONVERSION = YES; 410 | CLANG_WARN_INFINITE_RECURSION = YES; 411 | CLANG_WARN_INT_CONVERSION = YES; 412 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 413 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 414 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 415 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 416 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 417 | CLANG_WARN_STRICT_PROTOTYPES = YES; 418 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 419 | CLANG_WARN_UNREACHABLE_CODE = YES; 420 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 421 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 422 | COPY_PHASE_STRIP = NO; 423 | DEBUG_INFORMATION_FORMAT = dwarf; 424 | ENABLE_STRICT_OBJC_MSGSEND = YES; 425 | ENABLE_TESTABILITY = YES; 426 | GCC_C_LANGUAGE_STANDARD = gnu99; 427 | GCC_DYNAMIC_NO_PIC = NO; 428 | GCC_NO_COMMON_BLOCKS = YES; 429 | GCC_OPTIMIZATION_LEVEL = 0; 430 | GCC_PREPROCESSOR_DEFINITIONS = ( 431 | "DEBUG=1", 432 | "$(inherited)", 433 | ); 434 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 435 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 436 | GCC_WARN_UNDECLARED_SELECTOR = YES; 437 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 438 | GCC_WARN_UNUSED_FUNCTION = YES; 439 | GCC_WARN_UNUSED_VARIABLE = YES; 440 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 441 | MTL_ENABLE_DEBUG_INFO = YES; 442 | ONLY_ACTIVE_ARCH = YES; 443 | SDKROOT = iphoneos; 444 | TARGETED_DEVICE_FAMILY = "1,2"; 445 | }; 446 | name = Debug; 447 | }; 448 | 97C147041CF9000F007C117D /* Release */ = { 449 | isa = XCBuildConfiguration; 450 | buildSettings = { 451 | ALWAYS_SEARCH_USER_PATHS = NO; 452 | CLANG_ANALYZER_NONNULL = YES; 453 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 454 | CLANG_CXX_LIBRARY = "libc++"; 455 | CLANG_ENABLE_MODULES = YES; 456 | CLANG_ENABLE_OBJC_ARC = YES; 457 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 458 | CLANG_WARN_BOOL_CONVERSION = YES; 459 | CLANG_WARN_COMMA = YES; 460 | CLANG_WARN_CONSTANT_CONVERSION = YES; 461 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 462 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 463 | CLANG_WARN_EMPTY_BODY = YES; 464 | CLANG_WARN_ENUM_CONVERSION = YES; 465 | CLANG_WARN_INFINITE_RECURSION = YES; 466 | CLANG_WARN_INT_CONVERSION = YES; 467 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 468 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 469 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 470 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 471 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 472 | CLANG_WARN_STRICT_PROTOTYPES = YES; 473 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 474 | CLANG_WARN_UNREACHABLE_CODE = YES; 475 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 476 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 477 | COPY_PHASE_STRIP = NO; 478 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 479 | ENABLE_NS_ASSERTIONS = NO; 480 | ENABLE_STRICT_OBJC_MSGSEND = YES; 481 | GCC_C_LANGUAGE_STANDARD = gnu99; 482 | GCC_NO_COMMON_BLOCKS = YES; 483 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 484 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 485 | GCC_WARN_UNDECLARED_SELECTOR = YES; 486 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 487 | GCC_WARN_UNUSED_FUNCTION = YES; 488 | GCC_WARN_UNUSED_VARIABLE = YES; 489 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 490 | MTL_ENABLE_DEBUG_INFO = NO; 491 | SDKROOT = iphoneos; 492 | SUPPORTED_PLATFORMS = iphoneos; 493 | SWIFT_COMPILATION_MODE = wholemodule; 494 | SWIFT_OPTIMIZATION_LEVEL = "-O"; 495 | TARGETED_DEVICE_FAMILY = "1,2"; 496 | VALIDATE_PRODUCT = YES; 497 | }; 498 | name = Release; 499 | }; 500 | 97C147061CF9000F007C117D /* Debug */ = { 501 | isa = XCBuildConfiguration; 502 | baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; 503 | buildSettings = { 504 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 505 | CLANG_ENABLE_MODULES = YES; 506 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; 507 | DEVELOPMENT_TEAM = 7M965DWLR3; 508 | ENABLE_BITCODE = NO; 509 | FRAMEWORK_SEARCH_PATHS = ( 510 | "$(inherited)", 511 | "$(PROJECT_DIR)/Flutter", 512 | ); 513 | INFOPLIST_FILE = Runner/Info.plist; 514 | LD_RUNPATH_SEARCH_PATHS = ( 515 | "$(inherited)", 516 | "@executable_path/Frameworks", 517 | ); 518 | LIBRARY_SEARCH_PATHS = ( 519 | "$(inherited)", 520 | "$(PROJECT_DIR)/Flutter", 521 | ); 522 | PRODUCT_BUNDLE_IDENTIFIER = com.csekings.studentApp; 523 | PRODUCT_NAME = "$(TARGET_NAME)"; 524 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; 525 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 526 | SWIFT_VERSION = 5.0; 527 | VERSIONING_SYSTEM = "apple-generic"; 528 | }; 529 | name = Debug; 530 | }; 531 | 97C147071CF9000F007C117D /* Release */ = { 532 | isa = XCBuildConfiguration; 533 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; 534 | buildSettings = { 535 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 536 | CLANG_ENABLE_MODULES = YES; 537 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; 538 | DEVELOPMENT_TEAM = 7M965DWLR3; 539 | ENABLE_BITCODE = NO; 540 | FRAMEWORK_SEARCH_PATHS = ( 541 | "$(inherited)", 542 | "$(PROJECT_DIR)/Flutter", 543 | ); 544 | INFOPLIST_FILE = Runner/Info.plist; 545 | LD_RUNPATH_SEARCH_PATHS = ( 546 | "$(inherited)", 547 | "@executable_path/Frameworks", 548 | ); 549 | LIBRARY_SEARCH_PATHS = ( 550 | "$(inherited)", 551 | "$(PROJECT_DIR)/Flutter", 552 | ); 553 | PRODUCT_BUNDLE_IDENTIFIER = com.csekings.studentApp; 554 | PRODUCT_NAME = "$(TARGET_NAME)"; 555 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; 556 | SWIFT_VERSION = 5.0; 557 | VERSIONING_SYSTEM = "apple-generic"; 558 | }; 559 | name = Release; 560 | }; 561 | /* End XCBuildConfiguration section */ 562 | 563 | /* Begin XCConfigurationList section */ 564 | 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { 565 | isa = XCConfigurationList; 566 | buildConfigurations = ( 567 | 97C147031CF9000F007C117D /* Debug */, 568 | 97C147041CF9000F007C117D /* Release */, 569 | 249021D3217E4FDB00AE95B9 /* Profile */, 570 | ); 571 | defaultConfigurationIsVisible = 0; 572 | defaultConfigurationName = Release; 573 | }; 574 | 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { 575 | isa = XCConfigurationList; 576 | buildConfigurations = ( 577 | 97C147061CF9000F007C117D /* Debug */, 578 | 97C147071CF9000F007C117D /* Release */, 579 | 249021D4217E4FDB00AE95B9 /* Profile */, 580 | ); 581 | defaultConfigurationIsVisible = 0; 582 | defaultConfigurationName = Release; 583 | }; 584 | /* End XCConfigurationList section */ 585 | }; 586 | rootObject = 97C146E61CF9000F007C117D /* Project object */; 587 | } 588 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreviewsEnabled 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 39 | 40 | 41 | 42 | 43 | 44 | 54 | 56 | 62 | 63 | 64 | 65 | 66 | 67 | 73 | 75 | 81 | 82 | 83 | 84 | 86 | 87 | 90 | 91 | 92 | -------------------------------------------------------------------------------- /ios/Runner.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreviewsEnabled 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /ios/Runner/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | import UIKit 2 | import Flutter 3 | 4 | @UIApplicationMain 5 | @objc class AppDelegate: FlutterAppDelegate { 6 | override func application( 7 | _ application: UIApplication, 8 | didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? 9 | ) -> Bool { 10 | GeneratedPluginRegistrant.register(with: self) 11 | return super.application(application, didFinishLaunchingWithOptions: launchOptions) 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images": [ 3 | { 4 | "size": "20x20", 5 | "idiom": "iphone", 6 | "filename": "Icon-App-20x20@2x.png", 7 | "scale": "2x" 8 | }, 9 | { 10 | "size": "20x20", 11 | "idiom": "iphone", 12 | "filename": "Icon-App-20x20@3x.png", 13 | "scale": "3x" 14 | }, 15 | { 16 | "size": "29x29", 17 | "idiom": "iphone", 18 | "filename": "Icon-App-29x29@1x.png", 19 | "scale": "1x" 20 | }, 21 | { 22 | "size": "29x29", 23 | "idiom": "iphone", 24 | "filename": "Icon-App-29x29@2x.png", 25 | "scale": "2x" 26 | }, 27 | { 28 | "size": "29x29", 29 | "idiom": "iphone", 30 | "filename": "Icon-App-29x29@3x.png", 31 | "scale": "3x" 32 | }, 33 | { 34 | "size": "40x40", 35 | "idiom": "iphone", 36 | "filename": "Icon-App-40x40@2x.png", 37 | "scale": "2x" 38 | }, 39 | { 40 | "size": "40x40", 41 | "idiom": "iphone", 42 | "filename": "Icon-App-40x40@3x.png", 43 | "scale": "3x" 44 | }, 45 | { 46 | "size": "60x60", 47 | "idiom": "iphone", 48 | "filename": "Icon-App-60x60@2x.png", 49 | "scale": "2x" 50 | }, 51 | { 52 | "size": "60x60", 53 | "idiom": "iphone", 54 | "filename": "Icon-App-60x60@3x.png", 55 | "scale": "3x" 56 | }, 57 | { 58 | "size": "20x20", 59 | "idiom": "ipad", 60 | "filename": "Icon-App-20x20@1x.png", 61 | "scale": "1x" 62 | }, 63 | { 64 | "size": "20x20", 65 | "idiom": "ipad", 66 | "filename": "Icon-App-20x20@2x.png", 67 | "scale": "2x" 68 | }, 69 | { 70 | "size": "29x29", 71 | "idiom": "ipad", 72 | "filename": "Icon-App-29x29@1x.png", 73 | "scale": "1x" 74 | }, 75 | { 76 | "size": "29x29", 77 | "idiom": "ipad", 78 | "filename": "Icon-App-29x29@2x.png", 79 | "scale": "2x" 80 | }, 81 | { 82 | "size": "40x40", 83 | "idiom": "ipad", 84 | "filename": "Icon-App-40x40@1x.png", 85 | "scale": "1x" 86 | }, 87 | { 88 | "size": "40x40", 89 | "idiom": "ipad", 90 | "filename": "Icon-App-40x40@2x.png", 91 | "scale": "2x" 92 | }, 93 | { 94 | "size": "76x76", 95 | "idiom": "ipad", 96 | "filename": "Icon-App-76x76@1x.png", 97 | "scale": "1x" 98 | }, 99 | { 100 | "size": "76x76", 101 | "idiom": "ipad", 102 | "filename": "Icon-App-76x76@2x.png", 103 | "scale": "2x" 104 | }, 105 | { 106 | "size": "83.5x83.5", 107 | "idiom": "ipad", 108 | "filename": "Icon-App-83.5x83.5@2x.png", 109 | "scale": "2x" 110 | }, 111 | { 112 | "size": "1024x1024", 113 | "idiom": "ios-marketing", 114 | "filename": "Icon-App-1024x1024@1x.png", 115 | "scale": "1x" 116 | } 117 | ], 118 | "info": { 119 | "version": 1, 120 | "author": "xcode" 121 | } 122 | } 123 | -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CSEKINGS/student_app/2b6058aa4e631d8677ad5d6c36662cb0c879e060/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CSEKINGS/student_app/2b6058aa4e631d8677ad5d6c36662cb0c879e060/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CSEKINGS/student_app/2b6058aa4e631d8677ad5d6c36662cb0c879e060/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CSEKINGS/student_app/2b6058aa4e631d8677ad5d6c36662cb0c879e060/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CSEKINGS/student_app/2b6058aa4e631d8677ad5d6c36662cb0c879e060/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CSEKINGS/student_app/2b6058aa4e631d8677ad5d6c36662cb0c879e060/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CSEKINGS/student_app/2b6058aa4e631d8677ad5d6c36662cb0c879e060/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CSEKINGS/student_app/2b6058aa4e631d8677ad5d6c36662cb0c879e060/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CSEKINGS/student_app/2b6058aa4e631d8677ad5d6c36662cb0c879e060/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CSEKINGS/student_app/2b6058aa4e631d8677ad5d6c36662cb0c879e060/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CSEKINGS/student_app/2b6058aa4e631d8677ad5d6c36662cb0c879e060/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CSEKINGS/student_app/2b6058aa4e631d8677ad5d6c36662cb0c879e060/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CSEKINGS/student_app/2b6058aa4e631d8677ad5d6c36662cb0c879e060/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CSEKINGS/student_app/2b6058aa4e631d8677ad5d6c36662cb0c879e060/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CSEKINGS/student_app/2b6058aa4e631d8677ad5d6c36662cb0c879e060/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images": [ 3 | { 4 | "idiom": "universal", 5 | "filename": "LaunchImage.png", 6 | "scale": "1x" 7 | }, 8 | { 9 | "idiom": "universal", 10 | "filename": "LaunchImage@2x.png", 11 | "scale": "2x" 12 | }, 13 | { 14 | "idiom": "universal", 15 | "filename": "LaunchImage@3x.png", 16 | "scale": "3x" 17 | } 18 | ], 19 | "info": { 20 | "version": 1, 21 | "author": "xcode" 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CSEKINGS/student_app/2b6058aa4e631d8677ad5d6c36662cb0c879e060/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CSEKINGS/student_app/2b6058aa4e631d8677ad5d6c36662cb0c879e060/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CSEKINGS/student_app/2b6058aa4e631d8677ad5d6c36662cb0c879e060/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md: -------------------------------------------------------------------------------- 1 | # Launch Screen Assets 2 | 3 | You can customize the launch screen with your own desired assets by replacing the image files in this directory. 4 | 5 | You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images. -------------------------------------------------------------------------------- /ios/Runner/Base.lproj/LaunchScreen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /ios/Runner/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /ios/Runner/GoogleService-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CLIENT_ID 6 | 152519400604-r04kl7k62t0fmkeqja4ochjl20phs2mm.apps.googleusercontent.com 7 | REVERSED_CLIENT_ID 8 | com.googleusercontent.apps.152519400604-r04kl7k62t0fmkeqja4ochjl20phs2mm 9 | API_KEY 10 | AIzaSyAc2e6Atq622jVbyQgcIq1hPjMP_xE-KVM 11 | GCM_SENDER_ID 12 | 152519400604 13 | PLIST_VERSION 14 | 1 15 | BUNDLE_ID 16 | com.csekings.studentapp 17 | PROJECT_ID 18 | student-app-5f69d 19 | STORAGE_BUCKET 20 | student-app-5f69d.appspot.com 21 | IS_ADS_ENABLED 22 | 23 | IS_ANALYTICS_ENABLED 24 | 25 | IS_APPINVITE_ENABLED 26 | 27 | IS_GCM_ENABLED 28 | 29 | IS_SIGNIN_ENABLED 30 | 31 | GOOGLE_APP_ID 32 | 1:152519400604:ios:1962322f2d47edbcf5e159 33 | DATABASE_URL 34 | https://student-app-5f69d.firebaseio.com 35 | 36 | -------------------------------------------------------------------------------- /ios/Runner/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | student_app 15 | CFBundlePackageType 16 | APPL 17 | CFBundleShortVersionString 18 | $(FLUTTER_BUILD_NAME) 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | $(FLUTTER_BUILD_NUMBER) 23 | LSRequiresIPhoneOS 24 | 25 | UILaunchStoryboardName 26 | LaunchScreen 27 | UIMainStoryboardFile 28 | Main 29 | UISupportedInterfaceOrientations 30 | 31 | UIInterfaceOrientationPortrait 32 | UIInterfaceOrientationLandscapeLeft 33 | UIInterfaceOrientationLandscapeRight 34 | 35 | UISupportedInterfaceOrientations~ipad 36 | 37 | UIInterfaceOrientationPortrait 38 | UIInterfaceOrientationPortraitUpsideDown 39 | UIInterfaceOrientationLandscapeLeft 40 | UIInterfaceOrientationLandscapeRight 41 | 42 | UIViewControllerBasedStatusBarAppearance 43 | 44 | 45 | 46 | -------------------------------------------------------------------------------- /ios/Runner/Runner-Bridging-Header.h: -------------------------------------------------------------------------------- 1 | #import "GeneratedPluginRegistrant.h" 2 | -------------------------------------------------------------------------------- /lib/controllers.dart: -------------------------------------------------------------------------------- 1 | export 'controllers/add_details.dart'; 2 | export 'controllers/get_details.dart'; 3 | export 'controllers/attendance.dart'; 4 | export 'controllers/process_data.dart'; 5 | -------------------------------------------------------------------------------- /lib/controllers/add_details.dart: -------------------------------------------------------------------------------- 1 | import 'package:cloud_firestore/cloud_firestore.dart'; 2 | import 'package:flutter/material.dart'; 3 | import 'package:student_app/models.dart'; 4 | 5 | class AddDetails extends StatefulWidget { 6 | final String? year, dept; 7 | 8 | const AddDetails(this.year, this.dept); 9 | 10 | @override 11 | _AddDetailsState createState() => _AddDetailsState(); 12 | } 13 | 14 | class _AddDetailsState extends State { 15 | List classes = []; 16 | TextEditingController eCtrl = TextEditingController(); 17 | String? name; 18 | DatabaseReference obj = DatabaseReference(); 19 | 20 | @override 21 | void initState() { 22 | super.initState(); 23 | getClass(); 24 | } 25 | 26 | void getClass() { 27 | clearData(); 28 | var yer = widget.year; 29 | var dep = widget.dept; 30 | late CollectionReference getRef; 31 | if (yer != null && dep != null) { 32 | getRef = obj.getDetailRef2(yer, dep); 33 | } else if (yer == null && dep != null) { 34 | getRef = obj.getDetailRef(dep); 35 | } else if (dep == null && yer != null) { 36 | getRef = obj.getDetailRef(yer); 37 | } 38 | getRef.snapshots().listen((event) { 39 | if (mounted) { 40 | setState(() { 41 | for (var i = 0; i < event.docs.length; i++) { 42 | classes.add(Contents.fromSnapshot(event.docs[i])); 43 | } 44 | }); 45 | } 46 | }); 47 | } 48 | 49 | void clearData() { 50 | setState(() { 51 | classes.clear(); 52 | }); 53 | } 54 | 55 | void addClassname(String name) { 56 | var year = widget.year; 57 | var dep = widget.dept; 58 | late CollectionReference addRef; 59 | if (year != null && dep != null) { 60 | addRef = obj.getDetailRef2(year, dep); 61 | } else if (year == null && dep != null) { 62 | addRef = obj.getDetailRef(dep); 63 | } else if (dep == null && year != null) { 64 | addRef = obj.getDetailRef(year); 65 | } 66 | addRef.add({ 67 | 'name': name.toUpperCase(), 68 | }); 69 | } 70 | 71 | @override 72 | Widget build(BuildContext context) { 73 | return Scaffold( 74 | appBar: AppBar( 75 | title: const Text('add class'), 76 | ), 77 | body: SingleChildScrollView( 78 | child: Column( 79 | children: [ 80 | TextField( 81 | controller: eCtrl, 82 | onSubmitted: (text) { 83 | addClassname(text.toString()); 84 | eCtrl.clear(); 85 | clearData(); 86 | setState(() {}); 87 | }, 88 | ), 89 | ListView.builder( 90 | physics: const BouncingScrollPhysics(), 91 | scrollDirection: Axis.vertical, 92 | shrinkWrap: true, 93 | padding: const EdgeInsets.all(10), 94 | itemCount: classes.length, 95 | itemBuilder: (context, int index) => ListTile( 96 | title: Text(classes[index].name.toString()), 97 | ), 98 | ), 99 | ], 100 | ), 101 | ), 102 | ); 103 | } 104 | } 105 | -------------------------------------------------------------------------------- /lib/controllers/attendance.dart: -------------------------------------------------------------------------------- 1 | import 'package:cloud_firestore/cloud_firestore.dart'; 2 | import 'package:flutter/material.dart'; 3 | 4 | import '../models/db_model.dart'; 5 | 6 | /// attendance page logic 7 | class Attendance extends StatefulWidget { 8 | final String? year, dept, text; 9 | 10 | const Attendance(this.year, this.dept, this.text); 11 | 12 | @override 13 | _AttendanceState createState() => _AttendanceState(); 14 | } 15 | 16 | class _AttendanceState extends State { 17 | String? cls; 18 | String? hasDate; 19 | List classes = []; 20 | List item = []; 21 | DatabaseReference obj = DatabaseReference(); 22 | 23 | @override 24 | void initState() { 25 | super.initState(); 26 | CollectionReference reference; 27 | if (widget.text == 'Delete students' || 28 | widget.text == 'Attendance' || 29 | widget.text == 'Delete class') { 30 | reference = obj.getDetailRef2(widget.year, widget.dept); 31 | reference.snapshots().listen((event) { 32 | setState(() { 33 | for (var i = 0; i < event.docs.length; i++) { 34 | classes.add(Contents.fromSnapshot(event.docs[i])); 35 | } 36 | }); 37 | }); 38 | } else if (widget.text == 'Delete department') { 39 | setState(() { 40 | reference = obj.getDetailRef('department'); 41 | reference.snapshots().listen((event) { 42 | setState(() { 43 | for (var i = 0; i < event.docs.length; i++) { 44 | classes.add(Contents.fromSnapshot(event.docs[i])); 45 | } 46 | }); 47 | }); 48 | }); 49 | } else if (widget.text == 'Delete year') { 50 | setState(() { 51 | reference = obj.getDetailRef('year'); 52 | reference.snapshots().listen((event) { 53 | setState(() { 54 | for (var i = 0; i < event.docs.length; i++) { 55 | classes.add(Contents.fromSnapshot(event.docs[i])); 56 | } 57 | }); 58 | }); 59 | }); 60 | } 61 | } 62 | 63 | void _clearItem() { 64 | setState(() { 65 | item.clear(); 66 | }); 67 | } 68 | 69 | void _clearClasses() { 70 | setState(() { 71 | classes.clear(); 72 | }); 73 | } 74 | 75 | void _getStudent() { 76 | _clearItem(); 77 | var ref = obj.getProfile(cls, widget.year, widget.dept); 78 | ref.snapshots().listen((event) { 79 | setState(() { 80 | for (var i = 0; i < event.docs.length; i++) { 81 | item.add(Item.fromSnapshot(event.docs[i])); 82 | } 83 | }); 84 | }); 85 | } 86 | 87 | void _addAttendance(String date, String data) { 88 | var ref1 = obj.placeAttendance(cls, widget.year, widget.dept); 89 | for (var i = 0; i < item.length; i++) { 90 | ref1.doc(item[i].key).get().then((value) { 91 | if (!value.exists) { 92 | ref1.doc(item[i].key).set({ 93 | 'Roll-no': item[i].rollNo, 94 | 'name': item[i].name, 95 | 'attendance': item[i].isSelected ? 'present' : 'absent', 96 | 'date': date, 97 | 'total': item[i].isSelected ? 1 : 0 98 | }); 99 | } else if (item[i].isSelected && data == 'new') { 100 | ref1.doc(item[i].key).update({ 101 | 'attendance': 'present', 102 | 'date': date, 103 | 'total': value.get('total') + 1 104 | }); 105 | } else if (!item[i].isSelected && data == 'new') { 106 | ref1.doc(item[i].key).update({'attendance': 'absent', 'date': date}); 107 | } else if (item[i].isSelected && data == 'exist') { 108 | ref1.doc(item[i].key).update({ 109 | 'attendance': 'present', 110 | 'total': (value.get('attendance') == 'absent') 111 | ? value.get('total') + 1 112 | : value.get('total') 113 | }); 114 | } else if (!item[i].isSelected && data == 'exist') { 115 | ref1.doc(item[i].key).update({ 116 | 'attendance': 'absent', 117 | 'total': (value.get('attendance') == 'present') 118 | ? value.get('total') - 1 119 | : value.get('total') 120 | }); 121 | } 122 | }); 123 | } 124 | } 125 | 126 | void addDate(String date) { 127 | obj.getDates().add({'name': date}); 128 | _addAttendance(date, 'new'); 129 | } 130 | 131 | void checker() { 132 | var dateParse = DateTime.parse(DateTime.now().toString()); 133 | var date = '${dateParse.day}-${dateParse.month}-${dateParse.year}'; 134 | var ref = obj.getDates(); 135 | ref.get().then((value) { 136 | for (var i = 0; i < value.docs.length; i++) { 137 | if (value.docs[i].get('name') == date) { 138 | _addAttendance(date, 'exist'); 139 | hasDate = 'yes'; 140 | } 141 | } 142 | if (hasDate != 'yes') { 143 | addDate(date); 144 | } 145 | }); 146 | } 147 | 148 | void _delete() { 149 | var ref1 = obj.getProfile(cls, widget.year, widget.dept); 150 | for (var i = 0; i < item.length; i++) { 151 | if (item[i].isSelected) { 152 | ref1.doc(item[i].key).delete(); 153 | } 154 | } 155 | } 156 | 157 | void _deleteDep() { 158 | var ref1 = obj.getDetailRef('department'); 159 | for (var i = 0; i < classes.length; i++) { 160 | if (classes[i].isSelected) { 161 | ref1.doc(classes[i].key).delete(); 162 | } 163 | } 164 | } 165 | 166 | void _deleteYear() { 167 | var ref1 = obj.getDetailRef('year'); 168 | for (var i = 0; i < classes.length; i++) { 169 | if (classes[i].isSelected) { 170 | ref1.doc(classes[i].key).delete(); 171 | } 172 | } 173 | } 174 | 175 | void _deleteClass() { 176 | var ref1 = obj.getDetailRef2(widget.year, widget.dept); 177 | for (var i = 0; i < classes.length; i++) { 178 | if (classes[i].isSelected) { 179 | ref1.doc(classes[i].key).delete(); 180 | } 181 | } 182 | } 183 | 184 | @override 185 | Widget build(BuildContext context) { 186 | return Scaffold( 187 | resizeToAvoidBottomInset: false, 188 | appBar: AppBar( 189 | title: const Text('Selections'), 190 | ), 191 | body: SingleChildScrollView( 192 | child: Column( 193 | children: [ 194 | (widget.text == 'Delete students' || widget.text == 'Attendance') 195 | ? DropdownButton( 196 | hint: const Text('select class'), 197 | onChanged: (dynamic name) { 198 | setState(() { 199 | cls = name; 200 | _getStudent(); 201 | }); 202 | }, 203 | value: cls, 204 | items: classes 205 | .map((e) => DropdownMenuItem( 206 | value: e.name, 207 | child: Text(e.name!), 208 | )) 209 | .toList(), 210 | ) 211 | : Container(), 212 | (widget.text == 'Delete students' || widget.text == 'Attendance') 213 | ? ListView.builder( 214 | physics: const BouncingScrollPhysics(), 215 | scrollDirection: Axis.vertical, 216 | shrinkWrap: true, 217 | padding: const EdgeInsets.all(10), 218 | itemCount: item.length, 219 | itemBuilder: (context, int index) => Container( 220 | color: item[index].isSelected 221 | ? Colors.lightBlueAccent 222 | : Colors.white, 223 | child: ListTile( 224 | title: Text(item[index].name!), 225 | subtitle: Text(item[index].rollNo), 226 | onTap: () { 227 | setState(() { 228 | item[index].isSelected = false; 229 | }); 230 | }, 231 | onLongPress: () { 232 | setState(() { 233 | item[index].isSelected = true; 234 | }); 235 | }, 236 | ))) 237 | : ListView.builder( 238 | physics: const BouncingScrollPhysics(), 239 | scrollDirection: Axis.vertical, 240 | shrinkWrap: true, 241 | padding: const EdgeInsets.all(10), 242 | itemCount: classes.length, 243 | itemBuilder: (context, int index) => Container( 244 | color: classes[index].isSelected 245 | ? Colors.lightBlueAccent 246 | : Colors.white, 247 | child: ListTile( 248 | title: Text(classes[index].name!), 249 | onTap: () { 250 | setState(() { 251 | classes[index].isSelected = false; 252 | }); 253 | }, 254 | onLongPress: () { 255 | setState(() { 256 | classes[index].isSelected = true; 257 | }); 258 | }, 259 | ))), 260 | ElevatedButton( 261 | style: ButtonStyle( 262 | backgroundColor: 263 | MaterialStateProperty.all(Colors.lightBlueAccent), 264 | ), 265 | onPressed: () { 266 | if (widget.text == 'Delete students') { 267 | _delete(); 268 | _clearItem(); 269 | } else if (widget.text == 'Attendance') { 270 | checker(); 271 | } else if (widget.text == 'Delete department') { 272 | _deleteDep(); 273 | _clearClasses(); 274 | } else if (widget.text == 'Delete year') { 275 | _deleteYear(); 276 | _clearClasses(); 277 | } else if (widget.text == 'Delete class') { 278 | _deleteClass(); 279 | _clearClasses(); 280 | } 281 | }, 282 | child: const Text('Submit'), 283 | ) 284 | ], 285 | ), 286 | ), 287 | ); 288 | } 289 | } 290 | -------------------------------------------------------------------------------- /lib/controllers/get_details.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | import '../Models/db_model.dart'; 4 | import 'add_details.dart'; 5 | import 'attendance.dart'; 6 | 7 | class GetDetails extends StatefulWidget { 8 | final String text; 9 | 10 | const GetDetails(this.text); 11 | 12 | @override 13 | _GetDetailsState createState() => _GetDetailsState(); 14 | } 15 | 16 | class _GetDetailsState extends State { 17 | List year = []; 18 | List department = []; 19 | String? yer, dep, cls; 20 | DatabaseReference obj = DatabaseReference(); 21 | 22 | @override 23 | void initState() { 24 | super.initState(); 25 | var yearRef = obj.getDetailRef('year'); 26 | var depRef = obj.getDetailRef('department'); 27 | yearRef.snapshots().listen((event) { 28 | if (mounted) { 29 | setState(() { 30 | for (var i = 0; i < event.docs.length; i++) { 31 | year.add(Contents.fromSnapshot(event.docs[i])); 32 | } 33 | }); 34 | } 35 | }); 36 | depRef.snapshots().listen((event) { 37 | if (mounted) { 38 | setState(() { 39 | for (var i = 0; i < event.docs.length; i++) { 40 | department.add(Contents.fromSnapshot(event.docs[i])); 41 | } 42 | }); 43 | } 44 | }); 45 | } 46 | 47 | @override 48 | void dispose() { 49 | super.dispose(); 50 | } 51 | 52 | @override 53 | Widget build(BuildContext context) { 54 | return Column( 55 | mainAxisSize: MainAxisSize.min, 56 | children: [ 57 | DropdownButton( 58 | hint: const Text('select year'), 59 | onChanged: (dynamic name) { 60 | setState(() { 61 | yer = name; 62 | }); 63 | }, 64 | value: yer, 65 | items: year 66 | .map((e) => DropdownMenuItem( 67 | value: e.name, 68 | child: Text(e.name ?? "unknown"), 69 | )) 70 | .toList(), 71 | ), 72 | DropdownButton( 73 | hint: const Text('select department'), 74 | onChanged: (String? name) { 75 | setState(() { 76 | dep = name; 77 | }); 78 | }, 79 | value: dep, 80 | items: department 81 | .map((e) => DropdownMenuItem( 82 | value: e.name, 83 | child: Text(e.name ?? "unknown"), 84 | )) 85 | .toList(), 86 | ), 87 | TextButton( 88 | style: const ButtonStyle(), 89 | onPressed: () { 90 | if (widget.text == 'Attendance') { 91 | Navigator.push( 92 | context, 93 | MaterialPageRoute( 94 | builder: (context) => Attendance(yer, dep, widget.text))); 95 | } else if (widget.text == 'Add class') { 96 | Navigator.push( 97 | context, 98 | MaterialPageRoute( 99 | builder: (context) => AddDetails(yer, dep))); 100 | } else if (widget.text == 'Delete students') { 101 | Navigator.push( 102 | context, 103 | MaterialPageRoute( 104 | builder: (context) => Attendance(yer, dep, widget.text))); 105 | } else if (widget.text == 'Delete class') { 106 | Navigator.push( 107 | context, 108 | MaterialPageRoute( 109 | builder: (context) => Attendance(yer, dep, widget.text))); 110 | } 111 | }, 112 | child: const Text( 113 | 'Enter', 114 | style: TextStyle(fontSize: 20.0), 115 | ), 116 | ) 117 | ], 118 | ); 119 | } 120 | } 121 | -------------------------------------------------------------------------------- /lib/controllers/process_data.dart: -------------------------------------------------------------------------------- 1 | import 'package:cloud_firestore/cloud_firestore.dart'; 2 | import 'package:flutter/material.dart'; 3 | import 'package:shared_preferences/shared_preferences.dart'; 4 | import 'package:student_app/views/student/student_widgets.dart'; 5 | 6 | /// this is the initial state which fetches info related to starting the app 7 | class ProcessData extends StatefulWidget { 8 | final String? _regno, foundclass; 9 | 10 | const ProcessData(this._regno, this.foundclass); 11 | 12 | @override 13 | _ProcessDataState createState() => _ProcessDataState(); 14 | } 15 | 16 | class _ProcessDataState extends State { 17 | final reference = FirebaseFirestore.instance; 18 | String? _batch, _dept; 19 | List details = []; 20 | final Future _preference = SharedPreferences.getInstance(); 21 | 22 | Future stream() async { 23 | final preference = await _preference; 24 | await preference.setString('username', widget._regno!); 25 | await preference.setString('foundedclass', widget.foundclass!); 26 | 27 | _batch = '20${widget._regno!.substring(4, 6)}'; 28 | _dept = widget._regno!.substring(6, 9); 29 | switch (_dept) { 30 | case '101': 31 | { 32 | _dept = 'AE'; 33 | } 34 | break; 35 | case '102': 36 | { 37 | _dept = 'AUTOMOBILE'; 38 | } 39 | break; 40 | case '103': 41 | { 42 | _dept = 'CIVIL'; 43 | } 44 | break; 45 | case '104': 46 | { 47 | _dept = 'CSE'; 48 | } 49 | break; 50 | case '105': 51 | { 52 | _dept = 'EEE'; 53 | } 54 | break; 55 | case '106': 56 | { 57 | _dept = 'ECE'; 58 | } 59 | break; 60 | case '114': 61 | { 62 | _dept = 'MECH'; 63 | } 64 | break; 65 | case '121': 66 | { 67 | _dept = 'BIOMEDICAL'; 68 | } 69 | break; 70 | } 71 | 72 | reference 73 | .collection('collage') 74 | .doc('student') 75 | .collection(_dept!) 76 | .doc(_batch) 77 | .collection(widget.foundclass!) 78 | .doc(widget._regno) 79 | .snapshots() 80 | .listen((event) async { 81 | details 82 | ..add(event.data()!['Name']) 83 | ..add(event.data()!['Rollno']) 84 | ..add(event.data()!['Regno']) 85 | ..add(event.data()!['PhoneNo']) 86 | ..add(event.data()!['DOB']) 87 | ..add(event.data()!['Batch']) 88 | ..add(event.data()!['Email']) 89 | ..add(event.data()!['BloodGroup']) 90 | ..add(event.data()!['Department']) 91 | ..add(event.data()!['Address']) 92 | ..add(event.data()!['ProfileUrl']) 93 | ..add(event.data()!['Class']); 94 | 95 | reference 96 | .collection('collage') 97 | .doc('date') 98 | .collection('working') 99 | .snapshots() 100 | .listen((event) { 101 | var days = 0; 102 | for (var i = 0; i < event.docs.length; i++) { 103 | days = days + 1; 104 | // setState(() { 105 | // workingdays.add(Contents.fromSnapshot(event.documents[i])); 106 | // }); 107 | // print('$days' + '********'); 108 | } 109 | Navigator.of(context).push( 110 | MaterialPageRoute(builder: (_) => StudentBottomNav(details:details, days:days)), 111 | ); 112 | }); 113 | }); 114 | return details; 115 | } 116 | 117 | void getTotalDays() {} 118 | 119 | @override 120 | void initState() { 121 | super.initState(); 122 | getTotalDays(); 123 | stream(); 124 | } 125 | 126 | @override 127 | Widget build(BuildContext context) { 128 | return const Scaffold( 129 | body: Center( 130 | child: CircularProgressIndicator(), 131 | ), 132 | ); 133 | } 134 | } 135 | -------------------------------------------------------------------------------- /lib/generated_plugin_registrant.dart: -------------------------------------------------------------------------------- 1 | // 2 | // Generated file. Do not edit. 3 | // 4 | 5 | // ignore_for_file: directives_ordering 6 | // ignore_for_file: lines_longer_than_80_chars 7 | 8 | import 'package:cloud_firestore_web/cloud_firestore_web.dart'; 9 | import 'package:file_picker/_internal/file_picker_web.dart'; 10 | import 'package:firebase_auth_web/firebase_auth_web.dart'; 11 | import 'package:firebase_core_web/firebase_core_web.dart'; 12 | import 'package:firebase_storage_web/firebase_storage_web.dart'; 13 | import 'package:image_picker_for_web/image_picker_for_web.dart'; 14 | import 'package:shared_preferences_web/shared_preferences_web.dart'; 15 | import 'package:url_launcher_web/url_launcher_web.dart'; 16 | 17 | import 'package:flutter_web_plugins/flutter_web_plugins.dart'; 18 | 19 | // ignore: public_member_api_docs 20 | void registerPlugins(Registrar registrar) { 21 | FirebaseFirestoreWeb.registerWith(registrar); 22 | FilePickerWeb.registerWith(registrar); 23 | FirebaseAuthWeb.registerWith(registrar); 24 | FirebaseCoreWeb.registerWith(registrar); 25 | FirebaseStorageWeb.registerWith(registrar); 26 | ImagePickerPlugin.registerWith(registrar); 27 | SharedPreferencesPlugin.registerWith(registrar); 28 | UrlLauncherPlugin.registerWith(registrar); 29 | registrar.registerMessageHandler(); 30 | } 31 | -------------------------------------------------------------------------------- /lib/main.dart: -------------------------------------------------------------------------------- 1 | import 'package:firebase_core/firebase_core.dart'; 2 | import 'package:flutter/material.dart'; 3 | import 'package:provider/provider.dart'; 4 | import 'package:shared_preferences/shared_preferences.dart'; 5 | import 'package:student_app/controllers/process_data.dart'; 6 | import 'package:student_app/views/utils/theme/theme.dart'; 7 | import 'package:student_app/views/utils/theme/theme_notifier.dart'; 8 | import 'package:student_app/views/common/common_screens.dart'; 9 | 10 | String? initScreen, classFound; 11 | int? onBoard; 12 | 13 | void main() async { 14 | WidgetsFlutterBinding.ensureInitialized(); 15 | await Firebase.initializeApp(); 16 | 17 | await SharedPreferences.getInstance().then((prefs) { 18 | var darkModeOn = prefs.getBool('darkMode') ?? true; 19 | runApp( 20 | ChangeNotifierProvider( 21 | create: (context) => ThemeNotifier(darkModeOn ? darkTheme : lightTheme), 22 | child: MyApp(), 23 | ), 24 | ); 25 | }); 26 | } 27 | 28 | class MyApp extends StatefulWidget { 29 | @override 30 | _MyAppState createState() => _MyAppState(); 31 | } 32 | 33 | class _MyAppState extends State { 34 | @override 35 | void initState() { 36 | super.initState(); 37 | } 38 | 39 | @override 40 | Widget build(BuildContext context) { 41 | final themeNotifier = Provider.of(context); 42 | return MaterialApp( 43 | debugShowCheckedModeBanner: false, 44 | theme: themeNotifier.getTheme(), 45 | home: FutureBuilder( 46 | future: getSharedVal(), 47 | builder: (buildContext, snapshot) { 48 | if (snapshot.hasData) { 49 | return route(); 50 | } else { 51 | return SizedBox( 52 | height: 100.0, 53 | width: 100.0, 54 | child: Center( 55 | child: Image.asset("assets/graduates.png"), 56 | ), 57 | ); 58 | } 59 | }, 60 | ), 61 | ); 62 | } 63 | 64 | Widget route() { 65 | if (onBoard == 0 || onBoard == null) { 66 | return OnBoardingPage(); 67 | } else if (initScreen == '' || initScreen == null) { 68 | return LoginPage(); 69 | } else { 70 | return ProcessData(initScreen, classFound); 71 | } 72 | } 73 | 74 | Future getSharedVal() async { 75 | var prefs = await SharedPreferences.getInstance(); 76 | onBoard = prefs.getInt('onBoard'); 77 | await prefs.setInt('onBoard', 1); 78 | 79 | initScreen = prefs.getString('username'); 80 | classFound = prefs.getString('foundedclass'); 81 | return true; 82 | } 83 | } 84 | -------------------------------------------------------------------------------- /lib/models.dart: -------------------------------------------------------------------------------- 1 | export 'models/db_model.dart'; 2 | -------------------------------------------------------------------------------- /lib/models/db_model.dart: -------------------------------------------------------------------------------- 1 | import 'package:cloud_firestore/cloud_firestore.dart'; 2 | 3 | class Contents { 4 | String? name; 5 | String? key; 6 | bool isSelected = false; 7 | 8 | Contents(this.name); 9 | 10 | Contents.fromSnapshot(DocumentSnapshot snapshot) 11 | : name = snapshot.get('name'), 12 | key = snapshot.id; 13 | } 14 | 15 | class Item { 16 | String? name; 17 | String rollNo; 18 | bool isSelected = false; 19 | String? key; 20 | 21 | Item(this.name, this.rollNo); 22 | 23 | Item.fromSnapshot(DocumentSnapshot snapshot) 24 | : name = snapshot.get('Name'), 25 | rollNo = snapshot.get('Rollno').toString(), 26 | key = snapshot.id; 27 | } 28 | 29 | /// helper functions 30 | class DatabaseReference { 31 | /// get profile when passing class, year and department as arguments 32 | CollectionReference getProfile(String? cls, String? yer, String? dep) { 33 | return (FirebaseFirestore.instance 34 | .collection('collage/student/$dep/$yer/$cls')); 35 | } 36 | 37 | CollectionReference placeAttendance(String? cls, String? yer, String? dep) { 38 | return (FirebaseFirestore.instance 39 | .collection('collage/attendance/$dep/$yer/$cls')); 40 | } 41 | 42 | CollectionReference getDetailRef(String val) { 43 | return (FirebaseFirestore.instance.collection('collage/entity/$val')); 44 | } 45 | 46 | CollectionReference getDetailRef2(String? year, String? department) { 47 | return (FirebaseFirestore.instance 48 | .collection('collage/entity/class/$department/$year')); 49 | } 50 | 51 | CollectionReference getDates() { 52 | return (FirebaseFirestore.instance.collection('collage/date/working')); 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /lib/views/admin/admin_screens.dart: -------------------------------------------------------------------------------- 1 | export 'screens/upload_notes.dart'; 2 | export 'screens/add_batch.dart'; 3 | export 'screens/upload_profile.dart'; 4 | -------------------------------------------------------------------------------- /lib/views/admin/admin_widgets.dart: -------------------------------------------------------------------------------- 1 | export 'widgets/designs.dart'; 2 | export 'widgets/dialog.dart'; 3 | export 'widgets/admin_bottomnavbar.dart'; 4 | -------------------------------------------------------------------------------- /lib/views/admin/screens/add_batch.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | import '../widgets/designs.dart'; 4 | 5 | class AddBatch extends StatefulWidget { 6 | @override 7 | _AddBatchState createState() => _AddBatchState(); 8 | } 9 | 10 | class _AddBatchState extends State { 11 | @override 12 | Widget build(BuildContext context) { 13 | return SafeArea( 14 | child: Scaffold( 15 | body: GridView.count( 16 | crossAxisCount: 2, 17 | childAspectRatio: 4 / 3, 18 | padding: const EdgeInsets.all(8), 19 | mainAxisSpacing: 8, 20 | crossAxisSpacing: 8, 21 | children: const [ 22 | Designs('Add class'), 23 | Designs('Add year'), 24 | Designs('Add dep'), 25 | Designs('Delete students'), 26 | Designs('Delete class'), 27 | Designs('Delete department'), 28 | Designs('Delete year'), 29 | ], 30 | ), 31 | ), 32 | ); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /lib/views/admin/screens/upload_notes.dart: -------------------------------------------------------------------------------- 1 | import 'dart:io'; 2 | 3 | import 'package:file_picker/file_picker.dart'; 4 | import 'package:firebase_auth/firebase_auth.dart'; 5 | import 'package:firebase_storage/firebase_storage.dart'; 6 | import 'package:flutter/material.dart'; 7 | 8 | class UploadNotes extends StatefulWidget { 9 | const UploadNotes() : super(); 10 | 11 | final String title = 'Firebase Storage'; 12 | 13 | @override 14 | UploadNotesState createState() => UploadNotesState(); 15 | } 16 | 17 | class UploadNotesState extends State { 18 | late File _file; 19 | final GlobalKey _scaffoldKey = GlobalKey(); 20 | final List _tasks = []; 21 | String fileName = ""; 22 | bool uploading = false; 23 | 24 | void _openFileExplorer() async { 25 | var result = await FilePicker.platform.pickFiles(); 26 | 27 | if (result != null) { 28 | _file = File(result.files.single.path!); 29 | } else { 30 | ScaffoldMessenger.of(context).showSnackBar( 31 | const SnackBar( 32 | content: Text('No file selected'), 33 | ), 34 | ); 35 | } 36 | try { 37 | var fileName = _file.path.split('/').last; 38 | var filePath = _file.toString(); 39 | var extension = _file.toString().split('.').last; 40 | setState(() { 41 | fileName = fileName; 42 | }); 43 | _upload(fileName, filePath, extension); 44 | } catch (e) { 45 | ScaffoldMessenger.of(context).showSnackBar( 46 | SnackBar( 47 | content: Text(e.toString()), 48 | ), 49 | ); 50 | } 51 | } 52 | 53 | void _upload(fileName, filePath, extension) async { 54 | setState(() { 55 | uploading = true; 56 | }); 57 | var metadata = SettableMetadata( 58 | contentType: '$extension', 59 | ); 60 | try { 61 | await FirebaseStorage.instance 62 | .ref('notes/$fileName') 63 | .putFile(_file, metadata) 64 | .whenComplete(() { 65 | setState(() { 66 | uploading = false; 67 | }); 68 | ScaffoldMessenger.of(context).showSnackBar(SnackBar( 69 | content: Text("Note Uploaded Successfully"), 70 | )); 71 | }); 72 | } on FirebaseException catch (e) { 73 | ScaffoldMessenger.of(context).showSnackBar( 74 | SnackBar( 75 | content: Text(e.toString()), 76 | ), 77 | ); 78 | } 79 | } 80 | 81 | @override 82 | Widget build(BuildContext context) { 83 | final children = []; 84 | for (var task in _tasks) { 85 | final Widget tile = UploadTaskListTile( 86 | task: task, 87 | ); 88 | children.add(tile); 89 | } 90 | 91 | return SafeArea( 92 | child: Scaffold( 93 | key: _scaffoldKey, 94 | body: Container( 95 | padding: const EdgeInsets.all(20.0), 96 | child: Column( 97 | crossAxisAlignment: CrossAxisAlignment.start, 98 | mainAxisAlignment: MainAxisAlignment.start, 99 | children: [ 100 | Center( 101 | child: OutlinedButton( 102 | onPressed: _openFileExplorer, 103 | child: const Text('Upload notes'), 104 | ), 105 | ), 106 | const SizedBox( 107 | height: 40.0, 108 | ), 109 | Column( 110 | children: [ 111 | Container( 112 | child: Column( 113 | mainAxisSize: MainAxisSize.max, 114 | children: [ 115 | uploading 116 | ? Padding( 117 | padding: 118 | const EdgeInsets.only(left: 4.0, right: 4), 119 | child: LinearProgressIndicator(), 120 | ) 121 | : SizedBox(), 122 | Spacer(), 123 | Center( 124 | child: Row( 125 | mainAxisAlignment: MainAxisAlignment.spaceBetween, 126 | children: [ 127 | Flexible( 128 | child: Padding( 129 | padding: const EdgeInsets.all(8.0), 130 | child: Text( 131 | fileName == "" 132 | ? "No Notes Selected" 133 | : fileName, 134 | overflow: TextOverflow.ellipsis, 135 | maxLines: 1, 136 | style: TextStyle(fontSize: 18), 137 | ), 138 | ), 139 | ), 140 | fileName == "" 141 | ? SizedBox() 142 | : Padding( 143 | padding: 144 | const EdgeInsets.only(right: 10.0), 145 | child: CircleAvatar( 146 | backgroundColor: uploading 147 | ? Colors.white 148 | : Colors.green, 149 | radius: 5, 150 | ), 151 | ) 152 | ], 153 | ), 154 | ), 155 | Spacer() 156 | ], 157 | ), 158 | height: 60, 159 | width: MediaQuery.of(context).size.width - 20, 160 | decoration: BoxDecoration( 161 | color: Colors.grey[800], 162 | borderRadius: 163 | BorderRadius.vertical(bottom: Radius.circular(5))), 164 | ), 165 | SizedBox( 166 | height: 10, 167 | ), 168 | Row( 169 | mainAxisAlignment: MainAxisAlignment.end, 170 | children: [ 171 | GestureDetector( 172 | onTap: () { 173 | setState(() { 174 | fileName = ""; 175 | }); 176 | }, 177 | child: Text( 178 | "clear", 179 | style: TextStyle(fontSize: 18), 180 | ), 181 | ), 182 | ], 183 | ), 184 | ], 185 | ), 186 | 187 | // Flexible( 188 | // child: ListView( 189 | // children: children, 190 | // ), 191 | // ), 192 | ], 193 | ), 194 | ), 195 | ), 196 | ); 197 | } 198 | } 199 | 200 | class UploadTaskListTile extends StatelessWidget { 201 | final UploadTask? task; 202 | 203 | UploadTaskListTile({Key? key, this.task}) : super(key: key); 204 | 205 | String _bytesTransferred(TaskSnapshot snapshot) { 206 | return '${snapshot.bytesTransferred}/${snapshot.totalBytes}'; 207 | } 208 | 209 | @override 210 | Widget build(BuildContext context) { 211 | return FutureBuilder( 212 | builder: (BuildContext context, AsyncSnapshot asyncSnapshot) { 213 | Widget subtitle; 214 | if (asyncSnapshot.hasData) { 215 | final snapshot = task!.snapshot; 216 | subtitle = Text(' ${_bytesTransferred(snapshot)} bytes sent', 217 | style: TextStyle( 218 | color: Colors.white, 219 | )); 220 | } else { 221 | subtitle = const Text( 222 | 'Starting...', 223 | style: TextStyle(color: Colors.white), 224 | ); 225 | } 226 | return ListTile( 227 | title: Text( 228 | 'Upload Task #${task.hashCode}', 229 | style: TextStyle(color: Colors.white), 230 | ), 231 | subtitle: subtitle, 232 | ); 233 | }, 234 | ); 235 | } 236 | } 237 | -------------------------------------------------------------------------------- /lib/views/admin/screens/upload_profile.dart: -------------------------------------------------------------------------------- 1 | import 'dart:io'; 2 | 3 | import 'package:cloud_firestore/cloud_firestore.dart'; 4 | import 'package:firebase_storage/firebase_storage.dart'; 5 | import 'package:flutter/cupertino.dart'; 6 | import 'package:flutter/material.dart'; 7 | import 'package:image_cropper/image_cropper.dart'; 8 | import 'package:image_picker/image_picker.dart'; 9 | import 'package:intl/intl.dart'; 10 | import 'package:student_app/models.dart'; 11 | 12 | class UploadProfile extends StatefulWidget { 13 | @override 14 | _UploadProfile createState() => _UploadProfile(); 15 | } 16 | 17 | class _UploadProfile extends State { 18 | String? id, 19 | name, 20 | rollNo, 21 | regNo, 22 | email, 23 | phoneNo, 24 | blood, 25 | batch, 26 | dept, 27 | address, 28 | dob; 29 | File? _image; 30 | String? cls; 31 | 32 | String? profileUrl; 33 | final picker = ImagePicker(); 34 | final reference = FirebaseFirestore.instance; 35 | String? dep, yer; 36 | List year = []; 37 | List department = []; 38 | List classes = []; 39 | TextEditingController dobController = TextEditingController(); 40 | DatabaseReference obj = DatabaseReference(); 41 | 42 | @override 43 | void initState() { 44 | super.initState(); 45 | var yearRef = obj.getDetailRef('year'); 46 | var depRef = obj.getDetailRef('department'); 47 | yearRef.snapshots().listen((event) { 48 | if (mounted) { 49 | setState(() { 50 | for (var i = 0; i < event.docs.length; i++) { 51 | year.add(Contents.fromSnapshot(event.docs[i])); 52 | } 53 | }); 54 | } 55 | }); 56 | depRef.snapshots().listen((event) { 57 | if (mounted) { 58 | setState(() { 59 | for (var i = 0; i < event.docs.length; i++) { 60 | department.add(Contents.fromSnapshot(event.docs[i])); 61 | } 62 | }); 63 | } 64 | }); 65 | } 66 | 67 | Future getImage() async { 68 | try { 69 | var image = await picker.pickImage( 70 | source: ImageSource.gallery, maxWidth: 200.0, maxHeight: 200.0); 71 | 72 | if (image != null) { 73 | ImageCropper.cropImage(sourcePath: image.path) 74 | .then((result) => { 75 | setState(() { 76 | _image = File(result!.path); 77 | }) 78 | } 79 | ); 80 | } 81 | 82 | 83 | } catch (e) { 84 | ScaffoldMessenger.of(context).showSnackBar(const SnackBar( 85 | behavior: SnackBarBehavior.floating, 86 | content: Text('No image selected. Please select a image.'), 87 | )); 88 | } 89 | } 90 | 91 | Future upload(BuildContext context) async { 92 | if (formKey.currentState!.validate()) { 93 | try { 94 | var firebaseStorageRef = 95 | FirebaseStorage.instance.ref().child('profile/$batch/$dept/$regNo'); 96 | var uploadTask = firebaseStorageRef.putFile(_image!); 97 | var url = await (await uploadTask).ref.getDownloadURL(); 98 | 99 | setState(() { 100 | profileUrl = url.toString(); 101 | print("Hello World"); 102 | print(url); 103 | print(profileUrl); 104 | update(); 105 | }); 106 | 107 | ScaffoldMessenger.of(context).showSnackBar(const SnackBar( 108 | duration: Duration(seconds: 1), 109 | content: Text('Profile Picture Uploaded'), 110 | )); 111 | 112 | ScaffoldMessenger.of(context).showSnackBar(const SnackBar( 113 | content: Text('Submitted Successfully'), 114 | )); 115 | formKey.currentState!.reset(); 116 | setState(() { 117 | _image = null; 118 | }); 119 | } catch (e) { 120 | ScaffoldMessenger.of(context).showSnackBar(const SnackBar( 121 | content: Text('Select a profile picture'), 122 | )); 123 | } 124 | } else { 125 | ScaffoldMessenger.of(context).showSnackBar(const SnackBar( 126 | content: Text('Invalid Details'), 127 | )); 128 | } 129 | } 130 | 131 | Future update() async { 132 | FirebaseFirestore.instance 133 | .collection('collage') 134 | .doc('student') 135 | .collection(dept!) 136 | .doc(batch) 137 | .collection(cls!) 138 | .doc(regNo) 139 | .set({ 140 | 'Name': name.toString(), 141 | 'Rollno': rollNo, 142 | 'Regno': regNo, 143 | 'Email': email, 144 | 'PhoneNo': phoneNo, 145 | 'BloodGroup': blood, 146 | 'Batch': batch, 147 | 'Department': dept, 148 | 'Address': address, 149 | 'ProfileUrl': profileUrl, 150 | 'DOB': dob, 151 | 'Class': cls 152 | }); 153 | } 154 | 155 | final GlobalKey formKey = GlobalKey(); 156 | 157 | Widget buildNameField() { 158 | return TextFormField( 159 | decoration: const InputDecoration( 160 | border: OutlineInputBorder( 161 | borderRadius: BorderRadius.all( 162 | Radius.circular(5.0), 163 | ), 164 | ), 165 | labelText: 'Name', 166 | hintText: 'Ex: Ramesh M', 167 | contentPadding: EdgeInsets.all(15.0), 168 | filled: true, 169 | ), 170 | maxLength: 20, 171 | validator: (String? value) { 172 | if (value!.isEmpty) { 173 | return 'Name required'; 174 | } 175 | return null; 176 | }, 177 | onSaved: (String? value) { 178 | name = value!; 179 | }, 180 | textInputAction: TextInputAction.next, 181 | ); 182 | } 183 | 184 | Widget buildRollNoField() { 185 | return TextFormField( 186 | decoration: const InputDecoration( 187 | border: OutlineInputBorder( 188 | borderRadius: BorderRadius.all( 189 | Radius.circular(5.0), 190 | ), 191 | ), 192 | labelText: 'Roll Number', 193 | hintText: 'Ex: B16cs058', 194 | contentPadding: EdgeInsets.all(15.0), 195 | filled: true, 196 | ), 197 | maxLength: 8, 198 | validator: (String? value) { 199 | if (value!.isEmpty) { 200 | return 'Roll Number Required'; 201 | } 202 | return null; 203 | }, 204 | onSaved: (String? value) { 205 | rollNo = value!; 206 | }, 207 | textInputAction: TextInputAction.next, 208 | ); 209 | } 210 | 211 | Widget buildRegNoField() { 212 | return TextFormField( 213 | keyboardType: TextInputType.phone, 214 | decoration: const InputDecoration( 215 | border: OutlineInputBorder( 216 | borderRadius: BorderRadius.all( 217 | Radius.circular(5.0), 218 | ), 219 | ), 220 | labelText: 'Register Number', 221 | hintText: 'Ex: 820617104035', 222 | contentPadding: EdgeInsets.all(15.0), 223 | filled: true, 224 | ), 225 | maxLength: 12, 226 | validator: (String? value) { 227 | if (value!.isEmpty) { 228 | return 'Register Number Required'; 229 | } 230 | return null; 231 | }, 232 | onSaved: (String? value) { 233 | regNo = value!; 234 | }, 235 | textInputAction: TextInputAction.next, 236 | ); 237 | } 238 | 239 | Widget buildEmailField() { 240 | return TextFormField( 241 | decoration: const InputDecoration( 242 | border: OutlineInputBorder( 243 | borderRadius: BorderRadius.all( 244 | Radius.circular(5.0), 245 | ), 246 | ), 247 | labelText: 'Email', 248 | hintText: 'Ex: example@gmail.com', 249 | contentPadding: EdgeInsets.all(15.0), 250 | filled: true, 251 | ), 252 | keyboardType: TextInputType.emailAddress, 253 | validator: (String? value) { 254 | if (value!.isEmpty) { 255 | return 'Email Required'; 256 | } 257 | if (!RegExp( 258 | r"[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?") 259 | .hasMatch(value)) { 260 | return 'Valid Email Required'; 261 | } 262 | return null; 263 | }, 264 | onSaved: (String? value) { 265 | email = value!; 266 | }, 267 | textInputAction: TextInputAction.next, 268 | ); 269 | } 270 | 271 | Widget buildPhoneField() { 272 | return TextFormField( 273 | keyboardType: TextInputType.phone, 274 | decoration: const InputDecoration( 275 | border: OutlineInputBorder( 276 | borderRadius: BorderRadius.all( 277 | Radius.circular(5.0), 278 | ), 279 | ), 280 | labelText: 'Phone Number', 281 | hintText: 'Ex: 9849342931', 282 | contentPadding: EdgeInsets.all(15.0), 283 | filled: true, 284 | ), 285 | maxLength: 10, 286 | validator: (String? value) { 287 | if (value!.isEmpty) { 288 | return 'Phone Number Required'; 289 | } 290 | return null; 291 | }, 292 | onSaved: (String? value) { 293 | phoneNo = value!; 294 | }, 295 | ); 296 | } 297 | 298 | Widget buildBloodGroupField() { 299 | return TextFormField( 300 | decoration: const InputDecoration( 301 | border: OutlineInputBorder( 302 | borderRadius: BorderRadius.all( 303 | Radius.circular(5.0), 304 | ), 305 | ), 306 | labelText: 'Blood Group', 307 | hintText: 'Ex: O Positive', 308 | contentPadding: EdgeInsets.all(15.0), 309 | filled: true, 310 | ), 311 | validator: (String? value) { 312 | if (value!.isEmpty) { 313 | return 'Blood Group Required'; 314 | } 315 | return null; 316 | }, 317 | onSaved: (String? value) { 318 | blood = value!.toUpperCase(); 319 | }, 320 | ); 321 | } 322 | 323 | Widget buildBatchDropDown() { 324 | return DropdownButton( 325 | hint: const Text('select year'), 326 | onChanged: (String? name) { 327 | setState(() { 328 | batch = name!; 329 | }); 330 | }, 331 | value: batch, 332 | items: year 333 | .map((e) => DropdownMenuItem( 334 | value: e.name, 335 | child: Text(e.name!), 336 | )) 337 | .toList(), 338 | ); 339 | } 340 | 341 | Widget buildDeptDropDown() { 342 | return DropdownButton( 343 | hint: const Text('select department'), 344 | onChanged: (name) { 345 | setState(() { 346 | dept = name.toString(); 347 | }); 348 | }, 349 | value: dept, 350 | items: department 351 | .map((e) => DropdownMenuItem( 352 | value: e.name, 353 | child: Text(e.name!), 354 | )) 355 | .toList(), 356 | ); 357 | } 358 | 359 | Widget buildAddressField() { 360 | return TextFormField( 361 | decoration: const InputDecoration( 362 | border: OutlineInputBorder( 363 | borderRadius: BorderRadius.all( 364 | Radius.circular(5.0), 365 | ), 366 | ), 367 | labelText: 'Address', 368 | hintText: 'Ex: 23,Dubai kuruku santhu, dubai', 369 | contentPadding: EdgeInsets.all(15.0), 370 | filled: true, 371 | ), 372 | maxLines: 8, 373 | validator: (String? value) { 374 | if (value!.isEmpty) { 375 | return 'Address Required'; 376 | } 377 | return null; 378 | }, 379 | onSaved: (String? value) { 380 | address = value!; 381 | }, 382 | ); 383 | } 384 | 385 | Widget buildDOBField() { 386 | DateTime currentDateTime = DateTime.now(), 387 | initialDateTime = currentDateTime.add(Duration(days: -(10 * 365))), 388 | firstDateTime = currentDateTime.add(Duration(days: -(60 * 365))), 389 | lastDateTime = currentDateTime.add(Duration(days: -(5 * 365))); 390 | return TextFormField( 391 | keyboardType: TextInputType.phone, 392 | controller: dobController, 393 | readOnly: true, 394 | onTap: () { 395 | showDatePicker( 396 | context: context, 397 | initialDate: initialDateTime, 398 | firstDate: firstDateTime, 399 | lastDate: lastDateTime, 400 | ).then((newDateTime) { 401 | if (newDateTime != null) { 402 | dobController.text = DateFormat('dd-MM-yyyy').format(newDateTime); 403 | dob = DateFormat('dd-MM-yyyy').format(newDateTime); 404 | } 405 | }); 406 | }, 407 | decoration: const InputDecoration( 408 | border: OutlineInputBorder( 409 | borderRadius: BorderRadius.all( 410 | Radius.circular(5.0), 411 | ), 412 | ), 413 | labelText: 'DOB', 414 | hintText: 'EX: 30-12-1999', 415 | contentPadding: EdgeInsets.all(15.0), 416 | filled: true, 417 | ), 418 | validator: (String? value) { 419 | if (value!.isEmpty) { 420 | return 'Date of Birth Required'; 421 | } 422 | return null; 423 | }, 424 | ); 425 | } 426 | 427 | void initiateClass() { 428 | CollectionReference reference; 429 | reference = obj.getDetailRef2(batch, dept); 430 | reference.snapshots().listen((event) { 431 | classes.clear(); 432 | setState(() { 433 | for (var i = 0; i < event.docs.length; i++) { 434 | classes.add(Contents.fromSnapshot(event.docs[i])); 435 | } 436 | }); 437 | }); 438 | } 439 | 440 | Widget retrieveClasses(batch, dept) { 441 | initiateClass(); 442 | return Row( 443 | mainAxisAlignment: MainAxisAlignment.spaceBetween, 444 | children: [ 445 | const Text( 446 | 'CLASS', 447 | style: TextStyle(), 448 | ), 449 | DropdownButton( 450 | hint: const Text('select class'), 451 | onChanged: (name) { 452 | setState(() { 453 | cls = name.toString(); 454 | }); 455 | }, 456 | value: cls, 457 | items: classes 458 | .map((e) => DropdownMenuItem( 459 | value: e.name, 460 | child: Text(e.name!), 461 | )) 462 | .toList(), 463 | ), 464 | ], 465 | ); 466 | } 467 | 468 | Widget uploadProfilePic() { 469 | return Row( 470 | mainAxisAlignment: MainAxisAlignment.center, 471 | children: [ 472 | Align( 473 | alignment: Alignment.center, 474 | child: InkWell( 475 | onTap: () { 476 | getImage(); 477 | }, 478 | child: CircleAvatar( 479 | radius: 70, 480 | backgroundColor: const Color(0xff476cfb), 481 | child: ClipOval( 482 | child: SizedBox( 483 | width: 137.0, 484 | height: 137.0, 485 | child: (_image != null) 486 | ? Image.file( 487 | _image!, 488 | fit: BoxFit.fill, 489 | ) 490 | : Image.asset( 491 | 'assets/noimage.png', 492 | fit: BoxFit.fill, 493 | ), 494 | ), 495 | ), 496 | ), 497 | ), 498 | ), 499 | ], 500 | ); 501 | } 502 | 503 | @override 504 | Widget build(BuildContext context) { 505 | return SafeArea( 506 | child: Scaffold( 507 | body: SingleChildScrollView( 508 | child: Container( 509 | margin: const EdgeInsets.all(20), 510 | child: Form( 511 | key: formKey, 512 | child: Column( 513 | mainAxisAlignment: MainAxisAlignment.center, 514 | children: [ 515 | uploadProfilePic(), 516 | const SizedBox(height: 10), 517 | buildNameField(), 518 | const SizedBox(height: 10), 519 | buildRollNoField(), 520 | const SizedBox(height: 10), 521 | buildRegNoField(), 522 | const SizedBox(height: 10), 523 | buildPhoneField(), 524 | const SizedBox(height: 10), 525 | buildDOBField(), 526 | const SizedBox(height: 10), 527 | Row( 528 | mainAxisAlignment: MainAxisAlignment.spaceBetween, 529 | children: [ 530 | const Text( 531 | 'BATCH', 532 | style: TextStyle(), 533 | ), 534 | buildBatchDropDown() 535 | ]), 536 | const SizedBox(height: 10), 537 | buildEmailField(), 538 | const SizedBox(height: 10), 539 | buildBloodGroupField(), 540 | const SizedBox(height: 10), 541 | Row( 542 | mainAxisAlignment: MainAxisAlignment.spaceBetween, 543 | children: [ 544 | const Text( 545 | 'DEPARTMENT', 546 | style: TextStyle(), 547 | ), 548 | Container(child: buildDeptDropDown()), 549 | ], 550 | ), 551 | (dept != null && batch != null) 552 | ? retrieveClasses(batch, dept) 553 | : Container(), 554 | const SizedBox(height: 10), 555 | buildAddressField(), 556 | const SizedBox(height: 10), 557 | OutlinedButton( 558 | onPressed: () { 559 | formKey.currentState!.save(); 560 | upload(context); 561 | }, 562 | child: const Text('Submit', 563 | style: TextStyle( 564 | fontSize: 16, 565 | )), //onPressed 566 | ), 567 | ], 568 | ), 569 | ), 570 | ), 571 | ), 572 | ), 573 | ); 574 | } 575 | } 576 | -------------------------------------------------------------------------------- /lib/views/admin/widgets/admin_bottomnavbar.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:flutter/services.dart'; 3 | import 'package:student_app/views/admin/admin_screens.dart'; 4 | import 'package:student_app/views/common/common_screens.dart'; 5 | 6 | import 'dialog.dart'; 7 | 8 | class AdminBottomNav extends StatefulWidget { 9 | @override 10 | _AdminBottomNavState createState() => _AdminBottomNavState(); 11 | } 12 | 13 | class _AdminBottomNavState extends State { 14 | int _currentIndex = 0; 15 | final List _children = [ 16 | const DialogBox('Attendance'), 17 | AddBatch(), 18 | const UploadNotes(), 19 | UploadProfile(), 20 | const SettingsPage(), 21 | ]; 22 | 23 | void onTappedBar(int index) { 24 | setState(() { 25 | _currentIndex = index; 26 | }); 27 | } 28 | 29 | Future _onBackPressed() { 30 | return showDialog( 31 | context: context, 32 | builder: (context) => AlertDialog( 33 | shape: const RoundedRectangleBorder( 34 | borderRadius: BorderRadius.all(Radius.circular(8.0))), 35 | title: const Text( 36 | 'Do you want to exit..?', 37 | style: TextStyle(fontWeight: FontWeight.w300), 38 | ), 39 | actions: [ 40 | CloseButton( 41 | onPressed: () => Navigator.of(context).pop(false), 42 | color: Colors.red, 43 | ), 44 | const SizedBox(height: 16), 45 | IconButton( 46 | onPressed: () async { 47 | await SystemNavigator.pop(); 48 | }, 49 | icon: const Icon( 50 | Icons.check, 51 | color: Colors.green, 52 | ), 53 | ), 54 | const SizedBox(width: 16), 55 | ], 56 | ), 57 | ).then((value) => value); 58 | } 59 | 60 | @override 61 | void didChangeDependencies() { 62 | ScaffoldMessenger.of(context).hideCurrentSnackBar(); 63 | super.didChangeDependencies(); 64 | } 65 | 66 | @override 67 | Widget build(BuildContext context) { 68 | return WillPopScope( 69 | onWillPop: _onBackPressed, 70 | child: Scaffold( 71 | body: _children[_currentIndex], 72 | bottomNavigationBar: BottomNavigationBar( 73 | type: BottomNavigationBarType.fixed, 74 | onTap: onTappedBar, 75 | currentIndex: _currentIndex, 76 | items: const [ 77 | BottomNavigationBarItem( 78 | icon: Icon(Icons.check_box), 79 | label: 'Attendance', 80 | ), 81 | BottomNavigationBarItem( 82 | icon: Icon(Icons.person_add_alt_1_outlined), 83 | label: 'Admin', 84 | ), 85 | BottomNavigationBarItem( 86 | icon: Icon(Icons.upload_outlined), 87 | label: 'Notes', 88 | ), 89 | BottomNavigationBarItem( 90 | icon: Icon(Icons.cloud_upload_outlined), 91 | label: 'Profile', 92 | ), 93 | BottomNavigationBarItem( 94 | icon: Icon(Icons.extension_outlined), 95 | label: 'More', 96 | ), 97 | ], 98 | ), 99 | ), 100 | ); 101 | } 102 | } 103 | -------------------------------------------------------------------------------- /lib/views/admin/widgets/designs.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:student_app/controllers.dart'; 3 | 4 | import 'dialog.dart'; 5 | 6 | class Designs extends StatefulWidget { 7 | final String text; 8 | 9 | const Designs(this.text); 10 | 11 | @override 12 | _DesignsState createState() => _DesignsState(); 13 | } 14 | 15 | class _DesignsState extends State { 16 | @override 17 | Widget build(BuildContext context) { 18 | return InkWell( 19 | splashColor: Colors.black54, 20 | onTap: () { 21 | if (widget.text == 'Add class') { 22 | showDialog( 23 | context: context, 24 | builder: (BuildContext con) { 25 | return const DialogBox('Add class'); 26 | }); 27 | } else if (widget.text == 'Add year') { 28 | Navigator.push( 29 | context, 30 | MaterialPageRoute( 31 | builder: (context) => const AddDetails('year', null))); 32 | } else if (widget.text == 'Add dep') { 33 | Navigator.push( 34 | context, 35 | MaterialPageRoute( 36 | builder: (context) => const AddDetails(null, 'department'))); 37 | } else if (widget.text == 'Delete students') { 38 | showDialog( 39 | context: context, 40 | builder: (BuildContext con) { 41 | return const DialogBox('Delete students'); 42 | }); 43 | } else if (widget.text == 'Delete class') { 44 | showDialog( 45 | context: context, 46 | builder: (BuildContext con) { 47 | return const DialogBox('Delete class'); 48 | }); 49 | } else if (widget.text == 'Delete department') { 50 | Navigator.push( 51 | context, 52 | MaterialPageRoute( 53 | builder: (context) => Attendance(null, null, widget.text))); 54 | } else if (widget.text == 'Delete year') { 55 | Navigator.push( 56 | context, 57 | MaterialPageRoute( 58 | builder: (context) => Attendance(null, null, widget.text))); 59 | } 60 | }, 61 | child: Card( 62 | margin: const EdgeInsets.all(10.0), 63 | child: Column( 64 | mainAxisAlignment: MainAxisAlignment.spaceEvenly, 65 | children: [ 66 | Image( 67 | color: Colors.black54, 68 | height: 60, 69 | width: 60, 70 | fit: BoxFit.fill, 71 | alignment: Alignment.center, 72 | image: AssetImage('assets/${widget.text}.png'), 73 | ), 74 | Text( 75 | widget.text, 76 | style: const TextStyle(fontWeight: FontWeight.w400), 77 | ), 78 | ], 79 | ), 80 | ), 81 | ); 82 | } 83 | } 84 | -------------------------------------------------------------------------------- /lib/views/admin/widgets/dialog.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:student_app/controllers.dart'; 3 | 4 | class DialogBox extends StatefulWidget { 5 | final String text; 6 | 7 | const DialogBox(this.text); 8 | 9 | @override 10 | _DialogBoxState createState() => _DialogBoxState(); 11 | } 12 | 13 | class _DialogBoxState extends State { 14 | @override 15 | Widget build(BuildContext context) { 16 | return AlertDialog( 17 | shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(15)), 18 | title: const Text('Details'), 19 | content: GetDetails(widget.text), 20 | ); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /lib/views/common/common_screens.dart: -------------------------------------------------------------------------------- 1 | export 'login.dart'; 2 | export 'onboarding_screen.dart'; 3 | export 'settings.dart'; 4 | -------------------------------------------------------------------------------- /lib/views/common/onboarding_screen.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:introduction_screen/introduction_screen.dart'; 3 | import 'package:student_app/views/common/common_screens.dart'; 4 | 5 | /// onBoarding page UI 6 | class OnBoardingPage extends StatefulWidget { 7 | /// default constructor 8 | const OnBoardingPage({Key? key}) : super(key: key); 9 | @override 10 | _OnBoardingPageState createState() => _OnBoardingPageState(); 11 | } 12 | 13 | class _OnBoardingPageState extends State { 14 | final introKey = GlobalKey(); 15 | 16 | void _onIntroEnd(context) { 17 | Navigator.pushReplacement( 18 | context, MaterialPageRoute(builder: (context) => const LoginPage())); 19 | } 20 | 21 | Widget _buildImage(String assetName) { 22 | return Align( 23 | alignment: Alignment.bottomCenter, 24 | child: Image.asset('assets/$assetName.png', width: 350.0), 25 | ); 26 | } 27 | 28 | @override 29 | Widget build(BuildContext context) { 30 | const bodyStyle = TextStyle(fontSize: 19.0); 31 | const pageDecoration = PageDecoration( 32 | titleTextStyle: TextStyle(fontSize: 28.0, fontWeight: FontWeight.w700), 33 | bodyTextStyle: bodyStyle, 34 | descriptionPadding: EdgeInsets.fromLTRB(16.0, 0.0, 16.0, 16.0), 35 | // pageColor: Colors.white, 36 | imagePadding: EdgeInsets.zero, 37 | ); 38 | 39 | return SafeArea( 40 | child: IntroductionScreen( 41 | key: introKey, 42 | pages: [ 43 | PageViewModel( 44 | title: 'Timetables', 45 | body: 'Get up-to-date timetables in single click.', 46 | image: _buildImage('timetable'), 47 | decoration: pageDecoration, 48 | ), 49 | PageViewModel( 50 | title: 'Events', 51 | body: 'Learn about events and fest.', 52 | image: _buildImage('candidate'), 53 | decoration: pageDecoration, 54 | ), 55 | PageViewModel( 56 | title: 'Grades', 57 | body: 'Check your grades and assessment exams scores.', 58 | image: _buildImage('grade'), 59 | decoration: pageDecoration, 60 | ), 61 | PageViewModel( 62 | title: 'Announcements', 63 | body: 'Get latest news via push notification.', 64 | image: _buildImage('announce'), 65 | decoration: pageDecoration, 66 | ), 67 | PageViewModel( 68 | title: 'Notes and Question banks', 69 | body: 'View and download notes on the go', 70 | image: _buildImage('notes'), 71 | decoration: pageDecoration, 72 | ), 73 | PageViewModel( 74 | title: 'Q/A', 75 | body: 'Submit your question in global chat', 76 | image: _buildImage('announce'), 77 | decoration: pageDecoration, 78 | ), 79 | ], 80 | onDone: () => _onIntroEnd(context), 81 | //onSkip: () => _onIntroEnd(context), // You can override onSkip callback 82 | showSkipButton: true, 83 | skipFlex: 0, 84 | nextFlex: 0, 85 | skip: const Text('Skip'), 86 | next: const Icon(Icons.arrow_forward), 87 | done: const Text('Done', style: TextStyle(fontWeight: FontWeight.w600)), 88 | dotsDecorator: const DotsDecorator( 89 | size: Size(10.0, 10.0), 90 | activeSize: Size(22.0, 10.0), 91 | activeShape: RoundedRectangleBorder( 92 | borderRadius: BorderRadius.all(Radius.circular(25.0)), 93 | ), 94 | ), 95 | ), 96 | ); 97 | } 98 | } 99 | -------------------------------------------------------------------------------- /lib/views/common/settings.dart: -------------------------------------------------------------------------------- 1 | import 'package:day_night_switcher/day_night_switcher.dart'; 2 | import 'package:firebase_auth/firebase_auth.dart'; 3 | import 'package:flutter/material.dart'; 4 | import 'package:flutter/services.dart'; 5 | 6 | import 'package:provider/provider.dart'; 7 | import 'package:shared_preferences/shared_preferences.dart'; 8 | import 'package:student_app/views/utils/theme/theme.dart'; 9 | import 'package:student_app/views/utils/theme/theme_notifier.dart'; 10 | import 'package:student_app/views/utils/theme/theme_shared_pref.dart'; 11 | 12 | /// settings UI 13 | class SettingsPage extends StatefulWidget { 14 | /// default constructor 15 | const SettingsPage({Key? key}) : super(key: key); 16 | 17 | @override 18 | _SettingsPageState createState() => _SettingsPageState(); 19 | } 20 | 21 | class _SettingsPageState extends State { 22 | var _darkTheme = true; 23 | final Future _preference = SharedPreferences.getInstance(); 24 | 25 | @override 26 | Widget build(BuildContext context) { 27 | final themeNotifier = Provider.of(context); 28 | _darkTheme = (themeNotifier.getTheme() == darkTheme); 29 | return SafeArea( 30 | child: Scaffold( 31 | body: Column( 32 | children: [ 33 | ListTile( 34 | leading: const Icon(Icons.brush_outlined), 35 | title: const Text('Theme'), 36 | contentPadding: 37 | const EdgeInsets.symmetric(vertical: 8.0, horizontal: 16.0), 38 | trailing: DayNightSwitcher( 39 | isDarkModeEnabled: _darkTheme, 40 | onStateChanged: (val) { 41 | setState(() { 42 | _darkTheme = val; 43 | }); 44 | onThemeChanged(val, themeNotifier); 45 | }, 46 | ), 47 | ), 48 | ListTile( 49 | leading: const Icon(Icons.logout), 50 | title: const Text('Log out'), 51 | contentPadding: 52 | const EdgeInsets.symmetric(vertical: 8.0, horizontal: 16.0), 53 | onTap: () async { 54 | final _auth = FirebaseAuth.instance; 55 | await _auth.signOut(); 56 | try { 57 | final preference = await _preference; 58 | await preference.remove('username'); 59 | await preference.remove('foundedclass'); 60 | } catch (e) { 61 | print(e); 62 | } 63 | await SystemNavigator.pop(); 64 | }, 65 | ), 66 | const Spacer(), 67 | const Center( 68 | child: Text( 69 | 'Made with ❤ by CSEKINGS', 70 | style: TextStyle(color: Colors.grey), 71 | ), 72 | ), 73 | const SizedBox( 74 | height: 10.0, 75 | ), 76 | ], 77 | ), 78 | ), 79 | ); 80 | } 81 | } 82 | -------------------------------------------------------------------------------- /lib/views/student/screens/dashboard.dart: -------------------------------------------------------------------------------- 1 | import 'package:cloud_firestore/cloud_firestore.dart'; 2 | import 'package:flutter/material.dart'; 3 | import 'package:intl/intl.dart'; 4 | import 'package:percent_indicator/percent_indicator.dart'; 5 | import 'package:student_app/models.dart'; 6 | 7 | class Dashboard extends StatefulWidget { 8 | Dashboard({required this.details, required this.days}); 9 | 10 | final List? details; 11 | final int days; 12 | 13 | @override 14 | _DashboardState createState() => _DashboardState(); 15 | } 16 | 17 | class _DashboardState extends State { 18 | final references = FirebaseFirestore.instance; 19 | 20 | List workingDays = []; 21 | int? presentDays; 22 | double percentage = 0.0; 23 | String? displayPercent; 24 | Future? percents; 25 | 26 | Future getDays() async { 27 | var ref1 = references 28 | .collection('collage') 29 | .doc('attendance') 30 | .collection(widget.details?[8] ?? "unknown") 31 | .doc(widget.details?[5] ?? "unknown") 32 | .collection(widget.details?[11] ?? "unknown") 33 | .doc(widget.details?[2] ?? "unknown"); 34 | ref1.snapshots().listen((event) { 35 | setState(() { 36 | percentage = double.parse(event.data()?['total'].toString() ?? "1") / 37 | widget.days; 38 | displayPercent = 39 | NumberFormat('##.0#', 'en_US').format(percentage * 100); 40 | }); 41 | }); 42 | return true; 43 | } 44 | 45 | @override 46 | void initState() { 47 | super.initState(); 48 | percents = getDays(); 49 | } 50 | 51 | @override 52 | Widget build(BuildContext context) { 53 | return SafeArea( 54 | child: Scaffold( 55 | body: FutureBuilder( 56 | future: percents, 57 | builder: (BuildContext context, AsyncSnapshot snapshot) { 58 | if (snapshot.hasData) { 59 | return Column( 60 | crossAxisAlignment: CrossAxisAlignment.start, 61 | children: [ 62 | const Padding( 63 | padding: EdgeInsets.only(left: 15.0, top: 15.0), 64 | child: Text('Attendance Percentage', 65 | style: TextStyle( 66 | fontWeight: FontWeight.bold, fontSize: 20.0)), 67 | ), 68 | Card( 69 | elevation: 1.5, 70 | margin: const EdgeInsets.all(15.0), 71 | child: Row( 72 | mainAxisAlignment: MainAxisAlignment.spaceAround, 73 | children: [ 74 | Padding( 75 | padding: const EdgeInsets.all(15.0), 76 | child: CircularPercentIndicator( 77 | animation: true, 78 | animationDuration: 1200, 79 | lineWidth: 10.0, 80 | percent: percentage, 81 | backgroundColor: Colors.teal, 82 | progressColor: Colors.deepOrange, 83 | radius: 100.0, 84 | circularStrokeCap: CircularStrokeCap.butt, 85 | center: Text( 86 | '$displayPercent' '%', 87 | style: const TextStyle( 88 | fontWeight: FontWeight.bold, 89 | fontSize: 15.0), 90 | ), 91 | ), 92 | ), 93 | Text('Total number of days:${widget.days}' 94 | '\n' 95 | 'No of Present days: $presentDays'), 96 | ], 97 | ), 98 | ), 99 | ], 100 | ); 101 | } 102 | return const CircularProgressIndicator(); 103 | }), 104 | ), 105 | ); 106 | } 107 | } 108 | -------------------------------------------------------------------------------- /lib/views/student/screens/grade.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | /// grade UI 4 | class Grade extends StatefulWidget { 5 | /// default 6 | const Grade(); 7 | 8 | @override 9 | _GradeState createState() => _GradeState(); 10 | } 11 | 12 | class _GradeState extends State { 13 | @override 14 | void initState() { 15 | super.initState(); 16 | } 17 | 18 | @override 19 | Widget build(BuildContext context) { 20 | return Scaffold( 21 | body: SafeArea( 22 | child: Column( 23 | children: [ 24 | Text('TODO Grades'), 25 | ], 26 | ), 27 | ), 28 | ); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /lib/views/student/screens/notes_viewer.dart: -------------------------------------------------------------------------------- 1 | import 'dart:io'; 2 | 3 | import 'package:flutter/material.dart'; 4 | import 'package:flutter_pdfview/flutter_pdfview.dart'; 5 | 6 | class PDFViewerPage extends StatefulWidget { 7 | final File file; 8 | 9 | const PDFViewerPage({ 10 | Key? key, 11 | required this.file, 12 | }) : super(key: key); 13 | 14 | @override 15 | _PDFViewerPageState createState() => _PDFViewerPageState(); 16 | } 17 | 18 | class _PDFViewerPageState extends State { 19 | PDFViewController? controller; 20 | int pages = 0; 21 | int indexPage = 0; 22 | 23 | @override 24 | Widget build(BuildContext context) { 25 | final text = '${indexPage + 1} of $pages'; 26 | 27 | return Scaffold( 28 | appBar: AppBar( 29 | actions: pages >= 2 30 | ? [ 31 | Center(child: Text(text)), 32 | IconButton( 33 | icon: Icon(Icons.chevron_left, size: 32), 34 | onPressed: () { 35 | final page = indexPage == 0 ? pages : indexPage - 1; 36 | controller?.setPage(page); 37 | }, 38 | ), 39 | IconButton( 40 | icon: Icon(Icons.chevron_right, size: 32), 41 | onPressed: () { 42 | final page = indexPage == pages - 1 ? 0 : indexPage + 1; 43 | controller?.setPage(page); 44 | }, 45 | ), 46 | ] 47 | : null, 48 | ), 49 | body: PDFView( 50 | filePath: widget.file.path, 51 | onRender: (pages) => setState(() => this.pages = pages!), 52 | onViewCreated: (controller) => 53 | setState(() => this.controller = controller), 54 | onPageChanged: (indexPage, _) => 55 | setState(() => this.indexPage = indexPage!), 56 | ), 57 | ); 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /lib/views/student/screens/pdf_api.dart: -------------------------------------------------------------------------------- 1 | import 'dart:async'; 2 | import 'package:path/path.dart'; 3 | import 'package:path_provider/path_provider.dart'; 4 | import 'package:http/http.dart' as http; 5 | 6 | import 'dart:io'; 7 | 8 | class PDFApi { 9 | static Future loadNetwork(String url) async { 10 | final response = await http.get(Uri.parse(url)); 11 | final bytes = response.bodyBytes; 12 | 13 | return _storeFile(url, bytes); 14 | } 15 | 16 | static Future _storeFile(String url, List bytes) async { 17 | final filename = basename(url); 18 | final dir = await getApplicationDocumentsDirectory(); 19 | 20 | final file = File('${dir.path}/$filename'); 21 | await file.writeAsBytes(bytes, flush: true); 22 | return file; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /lib/views/student/screens/photo_viewer.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:photo_view/photo_view.dart'; 3 | 4 | class PhotoViewer extends StatelessWidget { 5 | final String url; 6 | const PhotoViewer({Key? key, required this.url}) : super(key: key); 7 | 8 | @override 9 | Widget build(BuildContext context) { 10 | return Container( 11 | child: PhotoView( 12 | imageProvider: NetworkImage(url), 13 | ), 14 | ); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /lib/views/student/screens/profile.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class Profile extends StatefulWidget { 4 | final List details; 5 | 6 | const Profile({required this.details}); 7 | 8 | @override 9 | _ProfileState createState() => _ProfileState(); 10 | } 11 | 12 | class _ProfileState extends State { 13 | @override 14 | Widget build(BuildContext context) { 15 | return SafeArea( 16 | child: Scaffold( 17 | body: SingleChildScrollView( 18 | child: Center( 19 | child: Column( 20 | mainAxisAlignment: MainAxisAlignment.center, 21 | children: [ 22 | CircleAvatar(foregroundImage: NetworkImage(widget.details[10]),radius: 110,backgroundColor: Colors.transparent,), 23 | 24 | Column( 25 | crossAxisAlignment: CrossAxisAlignment.stretch, 26 | children: [ 27 | profileCardView('Name : ${widget.details[0]}'), 28 | profileCardView( 29 | 'Roll no : ${widget.details[1].toString().toUpperCase()}'), 30 | profileCardView('Register no : ${widget.details[2]}'), 31 | profileCardView('Phone number : ${widget.details[3]}'), 32 | profileCardView('DOB : ${widget.details[4]}'), 33 | profileCardView('Batch : ${widget.details[5]}'), 34 | profileCardView('Email : ${widget.details[6]}'), 35 | profileCardView('Blood group : ${widget.details[7]}'), 36 | profileCardView('Department : ${widget.details[8]}'), 37 | profileCardView('Address : ${widget.details[9]}'), 38 | ], 39 | ), 40 | ], 41 | ), 42 | ), 43 | ), 44 | ), 45 | ); 46 | } 47 | 48 | Card profileCardView(String detailsText) { 49 | return Card( 50 | elevation: .8, 51 | child: Padding( 52 | padding: const EdgeInsets.all(23.0), 53 | child: Text( 54 | detailsText, 55 | style: const TextStyle(fontSize: 16.0), 56 | ), 57 | ), 58 | ); 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /lib/views/student/screens/view_notes.dart: -------------------------------------------------------------------------------- 1 | import 'dart:io'; 2 | 3 | import 'package:firebase_storage/firebase_storage.dart'; 4 | import 'package:flutter/material.dart'; 5 | import 'package:student_app/views/student/screens/notes_viewer.dart'; 6 | import 'package:student_app/views/student/screens/photo_viewer.dart'; 7 | import 'package:url_launcher/url_launcher.dart'; 8 | 9 | import 'pdf_api.dart'; 10 | 11 | class Notes extends StatefulWidget { 12 | @override 13 | _NotesState createState() => _NotesState(); 14 | } 15 | 16 | class _NotesState extends State { 17 | TextEditingController controller = TextEditingController(); 18 | final List _searchResult = []; 19 | List _notesList = []; 20 | 21 | Future retrieveNotes() async { 22 | var result = await FirebaseStorage.instance.ref().child('notes').listAll(); 23 | 24 | setState(() { 25 | _notesList = result.items.toList(); 26 | }); 27 | } 28 | 29 | Future openURL(String filename) async { 30 | var furl = 31 | await FirebaseStorage.instance.ref('notes/$filename').getDownloadURL(); 32 | 33 | if (await canLaunch(furl)) { 34 | await launch(furl); 35 | } else { 36 | Error error = ArgumentError('Could not launch $furl'); 37 | throw error; 38 | } 39 | } 40 | 41 | Future sendURL(String filename) async { 42 | var furl = 43 | await FirebaseStorage.instance.ref('notes/$filename').getDownloadURL(); 44 | if (filename.contains("pdf")) { 45 | final file = await PDFApi.loadNetwork(furl); 46 | openPDF(context, file); 47 | } else { 48 | Navigator.push( 49 | context, MaterialPageRoute(builder: (_) => PhotoViewer(url: furl))); 50 | } 51 | } 52 | 53 | void openPDF(BuildContext context, File file) => Navigator.of(context).push( 54 | MaterialPageRoute(builder: (context) => PDFViewerPage(file: file)), 55 | ); 56 | @override 57 | void initState() { 58 | super.initState(); 59 | retrieveNotes(); 60 | } 61 | 62 | @override 63 | Widget build(BuildContext context) { 64 | return SafeArea( 65 | child: Scaffold( 66 | body: Column( 67 | children: [ 68 | Padding( 69 | padding: 70 | const EdgeInsets.symmetric(vertical: 8.0, horizontal: 0.0), 71 | child: Card( 72 | shape: RoundedRectangleBorder( 73 | borderRadius: BorderRadius.circular(25.0), 74 | ), 75 | child: ListTile( 76 | leading: const Icon( 77 | Icons.search, 78 | color: Colors.blue, 79 | ), 80 | title: TextField( 81 | controller: controller, 82 | decoration: const InputDecoration( 83 | hintText: 'Search', 84 | hintStyle: TextStyle(fontSize: 18.0), 85 | border: InputBorder.none, 86 | ), 87 | textInputAction: TextInputAction.search, 88 | onChanged: onSearchTextChanged, 89 | onSubmitted: onSearchTextChanged, 90 | ), 91 | trailing: controller.text.isNotEmpty 92 | ? IconButton( 93 | icon: const Icon( 94 | Icons.close, 95 | ), 96 | onPressed: () { 97 | if (controller.text.isNotEmpty) { 98 | controller.clear(); 99 | onSearchTextChanged(''); 100 | } 101 | }, 102 | ) 103 | : null, 104 | ), 105 | ), 106 | ), 107 | Expanded( 108 | child: _searchResult.isNotEmpty && controller.text.isNotEmpty 109 | ? ListView.builder( 110 | itemCount: _searchResult.length, 111 | itemBuilder: (context, index) { 112 | return Container( 113 | decoration: const BoxDecoration( 114 | boxShadow: [ 115 | BoxShadow( 116 | color: Colors.lightBlue, 117 | blurRadius: 0.1, 118 | offset: Offset(0.0, 0.5), 119 | ), 120 | ], 121 | ), 122 | margin: EdgeInsets.all(2.0), 123 | child: GestureDetector( 124 | onTap: () async { 125 | sendURL(_notesList[index].name); 126 | }, 127 | child: Card( 128 | child: ListTile( 129 | trailing: IconButton( 130 | icon: const Icon( 131 | Icons.file_download, 132 | ), 133 | onPressed: () { 134 | openURL(_searchResult[index].toString()); 135 | }, 136 | ), 137 | leading: const Icon(Icons.note), 138 | title: Text( 139 | _searchResult[index], 140 | ), 141 | ), 142 | ), 143 | ), 144 | ); 145 | }, 146 | ) 147 | : _searchResult.isEmpty && controller.text.isNotEmpty 148 | ? Center( 149 | child: Text( 150 | 'Notes Not Available', 151 | style: TextStyle(fontSize: 20.0), 152 | ), 153 | ) 154 | : _notesList.isNotEmpty 155 | ? ListView.builder( 156 | itemCount: _notesList.length, 157 | itemBuilder: (context, index) { 158 | return GestureDetector( 159 | onTap: () async { 160 | sendURL(_notesList[index].name); 161 | }, 162 | child: Card( 163 | child: ListTile( 164 | trailing: IconButton( 165 | icon: const Icon( 166 | Icons.arrow_downward, 167 | color: Colors.green, 168 | ), 169 | onPressed: () { 170 | openURL(_notesList[index] 171 | .name 172 | .toString()); 173 | }, 174 | ), 175 | leading: const Icon( 176 | Icons.insert_drive_file, 177 | color: Colors.deepOrange, 178 | ), 179 | title: Text(_notesList[index].name), 180 | ), 181 | ), 182 | ); 183 | }, 184 | ) 185 | : Center( 186 | child: Text( 187 | 'Notes Not Available', 188 | style: TextStyle(fontSize: 20.0), 189 | ), 190 | ), 191 | ), 192 | ], 193 | ), 194 | ), 195 | ); 196 | } 197 | 198 | Future onSearchTextChanged(String text) async { 199 | _searchResult.clear(); 200 | if (text.isEmpty) { 201 | setState(() {}); 202 | } 203 | 204 | for (var notes in _notesList) { 205 | if (notes.toString().toLowerCase().contains(text.toLowerCase())) { 206 | _searchResult.add(notes.toString()); 207 | } 208 | } 209 | setState(() {}); 210 | } 211 | } 212 | -------------------------------------------------------------------------------- /lib/views/student/student_screens.dart: -------------------------------------------------------------------------------- 1 | export 'screens/dashboard.dart'; 2 | export 'screens/profile.dart'; 3 | export 'screens/view_notes.dart'; 4 | export 'screens/grade.dart'; 5 | -------------------------------------------------------------------------------- /lib/views/student/student_widgets.dart: -------------------------------------------------------------------------------- 1 | export 'widgets/student_bottomnavbar.dart'; 2 | -------------------------------------------------------------------------------- /lib/views/student/widgets/student_bottomnavbar.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:flutter/services.dart'; 3 | import 'package:student_app/views/common/common_screens.dart'; 4 | import 'package:student_app/views/student/student_screens.dart'; 5 | 6 | class StudentBottomNav extends StatefulWidget { 7 | final List details; 8 | final int days; 9 | 10 | StudentBottomNav({required this.details, required this.days}); 11 | 12 | @override 13 | _StudentBottomNavState createState() => _StudentBottomNavState(); 14 | } 15 | 16 | class _StudentBottomNavState extends State { 17 | int _currentIndex = 0; 18 | 19 | Future? getList; 20 | 21 | Future _onBackPressed() async { 22 | return showDialog( 23 | context: context, 24 | builder: (context) { 25 | return AlertDialog( 26 | shape: const RoundedRectangleBorder( 27 | borderRadius: BorderRadius.all(Radius.circular(8.0))), 28 | title: const Text( 29 | 'Do you want to exit..?', 30 | style: TextStyle(fontWeight: FontWeight.w300), 31 | ), 32 | actions: [ 33 | CloseButton( 34 | onPressed: () => Navigator.of(context).pop(false), 35 | color: Colors.red, 36 | ), 37 | const SizedBox(height: 16), 38 | IconButton( 39 | onPressed: () async { 40 | await SystemNavigator.pop(); 41 | }, 42 | icon: const Icon( 43 | Icons.check, 44 | color: Colors.green, 45 | ), 46 | ), 47 | const SizedBox(width: 16), 48 | ], 49 | ); 50 | }, 51 | ).then((value) => value ?? false); 52 | } 53 | 54 | @override 55 | void initState() { 56 | super.initState(); 57 | _children = [ 58 | Dashboard(details: widget.details, days: widget.days), 59 | Grade(), 60 | Profile(details: widget.details), 61 | Notes(), 62 | const SettingsPage(), 63 | ]; 64 | } 65 | 66 | @override 67 | void dispose() { 68 | super.dispose(); 69 | widget.details.clear(); 70 | } 71 | 72 | late List _children; 73 | 74 | void onTappedBar(int index) { 75 | setState(() { 76 | _currentIndex = index; 77 | }); 78 | } 79 | 80 | @override 81 | Widget build(BuildContext context) { 82 | return Scaffold( 83 | body: WillPopScope( 84 | onWillPop: _onBackPressed, 85 | child: _children[_currentIndex], 86 | ), 87 | bottomNavigationBar: BottomNavigationBar( 88 | type: BottomNavigationBarType.fixed, 89 | onTap: onTappedBar, 90 | currentIndex: _currentIndex, 91 | items: const [ 92 | BottomNavigationBarItem( 93 | icon: Icon(Icons.home_outlined), 94 | label: 'Dashboard', 95 | ), 96 | BottomNavigationBarItem( 97 | icon: Icon(Icons.assignment_turned_in_outlined), 98 | label: 'Grade', 99 | ), 100 | BottomNavigationBarItem( 101 | icon: Icon(Icons.person_outline_rounded), 102 | label: 'Profile', 103 | ), 104 | BottomNavigationBarItem( 105 | icon: Icon(Icons.insert_drive_file_outlined), 106 | label: 'Notes', 107 | ), 108 | BottomNavigationBarItem( 109 | icon: Icon(Icons.extension_outlined), 110 | label: 'More', 111 | ), 112 | ], 113 | ), 114 | ); 115 | } 116 | } 117 | -------------------------------------------------------------------------------- /lib/views/utils/theme/theme.dart: -------------------------------------------------------------------------------- 1 | import 'dart:ui'; 2 | 3 | import 'package:flutter/material.dart'; 4 | 5 | /// login button gradiant color 6 | class GradientColors { 7 | /// default constructor 8 | const GradientColors(); 9 | 10 | static const Color loginGradientStart = Color(0xFFfbab66); 11 | static const Color loginGradientEnd = Color(0xFFf7418c); 12 | 13 | static const primaryGradient = LinearGradient( 14 | colors: [loginGradientStart, loginGradientEnd], 15 | stops: [0.0, 1.0], 16 | begin: Alignment.topCenter, 17 | end: Alignment.bottomCenter, 18 | ); 19 | } 20 | 21 | /// dark theme 22 | final darkTheme = ThemeData( 23 | primarySwatch: Colors.orange, 24 | fontFamily: 'Product Sans', 25 | primaryColor: const Color(0xFF1F1F1F), 26 | scaffoldBackgroundColor: const Color(0xFF1F1F1F), 27 | brightness: Brightness.dark, 28 | backgroundColor: const Color(0xFF262626), 29 | floatingActionButtonTheme: 30 | const FloatingActionButtonThemeData(foregroundColor: Colors.white), 31 | dividerColor: Colors.black12, 32 | ); 33 | 34 | /// light theme 35 | final lightTheme = ThemeData( 36 | primarySwatch: Colors.orange, 37 | primaryColor: const Color(0xFFfbab66), 38 | fontFamily: 'Product Sans', 39 | brightness: Brightness.light, 40 | backgroundColor: Colors.white, 41 | floatingActionButtonTheme: 42 | const FloatingActionButtonThemeData(foregroundColor: Colors.white), 43 | dividerColor: Colors.white54, 44 | ); 45 | -------------------------------------------------------------------------------- /lib/views/utils/theme/theme_notifier.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class ThemeNotifier with ChangeNotifier { 4 | ThemeData _themeData; 5 | 6 | ThemeNotifier(this._themeData); 7 | 8 | ThemeData getTheme() => _themeData; 9 | 10 | void setTheme(ThemeData themeData) async { 11 | _themeData = themeData; 12 | notifyListeners(); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /lib/views/utils/theme/theme_shared_pref.dart: -------------------------------------------------------------------------------- 1 | import 'package:shared_preferences/shared_preferences.dart'; 2 | import 'package:student_app/views/utils/theme/theme.dart'; 3 | import 'package:student_app/views/utils/theme/theme_notifier.dart'; 4 | 5 | void onThemeChanged(bool value, ThemeNotifier themeNotifier) async { 6 | (value) 7 | ? themeNotifier.setTheme(darkTheme) 8 | : themeNotifier.setTheme(lightTheme); 9 | var prefs = await SharedPreferences.getInstance(); 10 | await prefs.setBool('darkMode', value); 11 | } 12 | -------------------------------------------------------------------------------- /pubspec.yaml: -------------------------------------------------------------------------------- 1 | name: student_app 2 | description: Student app 3 | 4 | # The following line prevents the package from being accidentally published to 5 | # pub.dev using `pub publish`. This is preferred for private packages. 6 | publish_to: 'none' # Remove this line if you wish to publish to pub.dev 7 | 8 | # The following defines the version and build number for your application. 9 | # A version number is three numbers separated by dots, like 1.2.43 10 | # followed by an optional build number separated by a +. 11 | # Both the version and the builder number may be overridden in flutter 12 | # build by specifying --build-name and --build-number, respectively. 13 | # In Android, build-name is used as versionName while build-number used as versionCode. 14 | # Read more about Android versioning at https://developer.android.com/studio/publish/versioning 15 | # In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion. 16 | # Read more about iOS versioning at 17 | # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html 18 | version: 1.0.0+1 19 | 20 | environment: 21 | sdk: '>=2.14.0 <3.0.0' 22 | 23 | dependencies: 24 | flutter: 25 | sdk: flutter 26 | 27 | cloud_firestore: ^2.5.3 28 | cupertino_icons: ^1.0.3 29 | day_night_switcher: ^0.2.0+1 30 | file_picker: ^4.1.3 31 | firebase_auth: ^3.1.2 32 | firebase_core: ^1.7.0 33 | firebase_storage: ^10.0.4 34 | flutter_pdfview: ^1.0.1 35 | flutter_screenutil: ^5.0.0+2 36 | font_awesome_flutter: ^9.1.0 37 | http: ^0.13.4 38 | image_picker: ^0.8.4+2 39 | intl: ^0.17.0 40 | introduction_screen: ^2.1.0 41 | percent_indicator: ^3.0.1 42 | photo_view: ^0.13.0 43 | provider: ^6.0.1 44 | shared_preferences: ^2.0.8 45 | url_launcher: ^6.0.12 46 | image_cropper: ^1.4.1 47 | path_provider: ^2.0.5 48 | 49 | dev_dependencies: 50 | flutter_test: 51 | sdk: flutter 52 | network_image_mock: ^2.0.1 53 | 54 | # For information on the generic Dart part of this file, see the 55 | # following page: https://dart.dev/tools/pub/pubspec 56 | # The following section is specific to Flutter. 57 | flutter: 58 | 59 | # The following line ensures that the Material Icons font is 60 | # included with your application, so that you can use the icons in 61 | # the material Icons class. 62 | uses-material-design: true 63 | 64 | # To add assets to your application, add an assets section, like this: 65 | assets: 66 | - assets/ 67 | # An image asset can refer to one or more resolution-specific "variants", see 68 | # https://flutter.dev/assets-and-images/#resolution-aware. 69 | # For details regarding adding assets from package dependencies, see 70 | # https://flutter.dev/assets-and-images/#from-packages 71 | # To add custom fonts to your application, add a fonts section here, 72 | # in this "flutter" section. Each entry in this list should have a 73 | # "family" key with the font family name, and a "fonts" key with a 74 | # list giving the asset and other descriptors for the font. For 75 | # example: 76 | ## fonts: 77 | ## - family: 78 | # fonts: 79 | ## - asset: assets/ 80 | ## 81 | ## - family: 82 | ## fonts: 83 | ## - asset: assets/ 84 | ## 85 | ## - family: 86 | ## fonts: 87 | ## - asset: assets/ 88 | # For details regarding fonts from package dependencies, 89 | # see https://flutter.dev/custom-fonts/#from-packages 90 | -------------------------------------------------------------------------------- /screenshots/Admin.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CSEKINGS/student_app/2b6058aa4e631d8677ad5d6c36662cb0c879e060/screenshots/Admin.jpg -------------------------------------------------------------------------------- /screenshots/Attendance.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CSEKINGS/student_app/2b6058aa4e631d8677ad5d6c36662cb0c879e060/screenshots/Attendance.jpg -------------------------------------------------------------------------------- /screenshots/Dashboard.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CSEKINGS/student_app/2b6058aa4e631d8677ad5d6c36662cb0c879e060/screenshots/Dashboard.jpg -------------------------------------------------------------------------------- /screenshots/Mark.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CSEKINGS/student_app/2b6058aa4e631d8677ad5d6c36662cb0c879e060/screenshots/Mark.jpg -------------------------------------------------------------------------------- /screenshots/Notes.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CSEKINGS/student_app/2b6058aa4e631d8677ad5d6c36662cb0c879e060/screenshots/Notes.jpg -------------------------------------------------------------------------------- /screenshots/Profile_view.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CSEKINGS/student_app/2b6058aa4e631d8677ad5d6c36662cb0c879e060/screenshots/Profile_view.jpg -------------------------------------------------------------------------------- /screenshots/Staff_login.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CSEKINGS/student_app/2b6058aa4e631d8677ad5d6c36662cb0c879e060/screenshots/Staff_login.jpg -------------------------------------------------------------------------------- /screenshots/Student_login.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CSEKINGS/student_app/2b6058aa4e631d8677ad5d6c36662cb0c879e060/screenshots/Student_login.jpg -------------------------------------------------------------------------------- /screenshots/Upload_Profile.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CSEKINGS/student_app/2b6058aa4e631d8677ad5d6c36662cb0c879e060/screenshots/Upload_Profile.jpg -------------------------------------------------------------------------------- /screenshots/Upload_notes.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CSEKINGS/student_app/2b6058aa4e631d8677ad5d6c36662cb0c879e060/screenshots/Upload_notes.jpg -------------------------------------------------------------------------------- /test/widget_test.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:flutter_test/flutter_test.dart'; 3 | import 'package:network_image_mock/network_image_mock.dart'; 4 | import 'package:student_app/views/student/screens/profile.dart'; 5 | 6 | void main() { 7 | List details = [ 8 | 'Harish', 9 | 'bdjdjsjs', 10 | '820617104017', 11 | '84949', 12 | '13-11-1999', 13 | '2017', 14 | 'gdhdhjs@hss.sn', 15 | 'JDJDJJENN', 16 | 'CSE', 17 | 'bdbdjdj', 18 | 'https://images.unsplash.com/photo-15645643218370', 19 | ]; 20 | 21 | testWidgets('Profile page displays text and image', (WidgetTester tester)async{ 22 | 23 | await mockNetworkImagesFor(() => tester.pumpWidget(MaterialApp(home: Profile(details: details)))); 24 | 25 | final Finder name = find.text('Name : Harish'); 26 | final Finder rollNumber = find.text('Roll no : BDJDJSJS'); 27 | final Finder registerNo = find.text('Register no : 820617104017'); 28 | final Finder phoneNo = find.text('Phone number : 84949'); 29 | final Finder dob = find.text('DOB : 13-11-1999'); 30 | final Finder batch = find.text('Batch : 2017'); 31 | final Finder email = find.text('Email : gdhdhjs@hss.sn'); 32 | final Finder bg = find.text('Blood group : JDJDJJENN'); 33 | final Finder department = find.text('Department : CSE'); 34 | final Finder address = find.text('Address : bdbdjdj'); 35 | final Finder image = find.byType(CircleAvatar); 36 | 37 | expect(name, findsOneWidget); 38 | expect(rollNumber, findsOneWidget); 39 | expect(registerNo, findsOneWidget); 40 | expect(phoneNo, findsOneWidget); 41 | expect(dob, findsOneWidget); 42 | expect(batch, findsOneWidget); 43 | expect(email, findsOneWidget); 44 | expect(bg, findsOneWidget); 45 | expect(department, findsOneWidget); 46 | expect(address, findsOneWidget); 47 | expect(image, findsOneWidget); 48 | 49 | }); 50 | } 51 | -------------------------------------------------------------------------------- /web/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CSEKINGS/student_app/2b6058aa4e631d8677ad5d6c36662cb0c879e060/web/favicon.png -------------------------------------------------------------------------------- /web/icons/Icon-192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CSEKINGS/student_app/2b6058aa4e631d8677ad5d6c36662cb0c879e060/web/icons/Icon-192.png -------------------------------------------------------------------------------- /web/icons/Icon-512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CSEKINGS/student_app/2b6058aa4e631d8677ad5d6c36662cb0c879e060/web/icons/Icon-512.png -------------------------------------------------------------------------------- /web/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | student_app 27 | 28 | 29 | 30 | 33 | 34 | 35 | 36 | 37 | 38 | 53 | 117 | 118 | 119 | -------------------------------------------------------------------------------- /web/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "student_app", 3 | "short_name": "student_app", 4 | "start_url": ".", 5 | "display": "standalone", 6 | "background_color": "#0175C2", 7 | "theme_color": "#0175C2", 8 | "description": "A new Flutter project.", 9 | "orientation": "portrait-primary", 10 | "prefer_related_applications": false, 11 | "icons": [ 12 | { 13 | "src": "icons/Icon-192.png", 14 | "sizes": "192x192", 15 | "type": "image/png" 16 | }, 17 | { 18 | "src": "icons/Icon-512.png", 19 | "sizes": "512x512", 20 | "type": "image/png" 21 | } 22 | ] 23 | } 24 | --------------------------------------------------------------------------------