├── .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 | Student_login
25 | Dashboard
26 | Mark
27 | Profile
28 | Notes
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 | Staff_login
43 | Attendance
44 | Admin
45 | Upload_notes
46 | Upload_Profile
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
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 |
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 |
--------------------------------------------------------------------------------