Commit cf96db5f authored by Ali's avatar Ali

upload front end

parent 761747bf
# Miscellaneous
*.class
*.log
*.pyc
*.swp
.DS_Store
.atom/
.buildlog/
.history
.svn/
migrate_working_dir/
# IntelliJ related
*.iml
*.ipr
*.iws
.idea/
# The .vscode folder contains launch configuration and tasks you configure in
# VS Code which you may wish to be included in version control, so this line
# is commented out by default.
#.vscode/
# Flutter/Dart/Pub related
**/doc/api/
**/ios/Flutter/.last_build_id
.dart_tool/
.flutter-plugins
.flutter-plugins-dependencies
.pub-cache/
.pub/
/build/
# Symbolication related
app.*.symbols
# Obfuscation related
app.*.map.json
# Android Studio will place build artifacts here
/android/app/debug
/android/app/profile
/android/app/release
# This file tracks properties of this Flutter project.
# Used by Flutter tool to assess capabilities and perform upgrades etc.
#
# This file should be version controlled and should not be manually edited.
version:
revision: "761747bfc538b5af34aa0d3fac380f1bc331ec49"
channel: "stable"
project_type: app
# Tracks metadata for the flutter migrate command
migration:
platforms:
- platform: root
create_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49
base_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49
- platform: android
create_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49
base_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49
- platform: ios
create_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49
base_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49
- platform: linux
create_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49
base_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49
- platform: macos
create_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49
base_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49
- platform: web
create_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49
base_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49
- platform: windows
create_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49
base_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49
# User provided section
# List of Local paths (relative to this file) that should be
# ignored by the migrate tool.
#
# Files that are not part of the templates will be ignored by default.
unmanaged_files:
- 'lib/main.dart'
- 'ios/Runner.xcodeproj/project.pbxproj'
# jobportal
A new Flutter project.
## Getting Started
This project is a starting point for a Flutter application.
A few resources to get you started if this is your first Flutter project:
- [Lab: Write your first Flutter app](https://docs.flutter.dev/get-started/codelab)
- [Cookbook: Useful Flutter samples](https://docs.flutter.dev/cookbook)
For help getting started with Flutter development, view the
[online documentation](https://docs.flutter.dev/), which offers tutorials,
samples, guidance on mobile development, and a full API reference.
# This file configures the analyzer, which statically analyzes Dart code to
# check for errors, warnings, and lints.
#
# The issues identified by the analyzer are surfaced in the UI of Dart-enabled
# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be
# invoked from the command line by running `flutter analyze`.
# The following line activates a set of recommended lints for Flutter apps,
# packages, and plugins designed to encourage good coding practices.
include: package:flutter_lints/flutter.yaml
linter:
# The lint rules applied to this project can be customized in the
# section below to disable rules from the `package:flutter_lints/flutter.yaml`
# included above or to enable additional rules. A list of all available lints
# and their documentation is published at https://dart.dev/lints.
#
# Instead of disabling a lint rule for the entire project in the
# section below, it can also be suppressed for a single line of code
# or a specific dart file by using the `// ignore: name_of_lint` and
# `// ignore_for_file: name_of_lint` syntax on the line or in the file
# producing the lint.
rules:
# avoid_print: false # Uncomment to disable the `avoid_print` rule
# prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule
# Additional information about this file can be found at
# https://dart.dev/guides/language/analysis-options
gradle-wrapper.jar
/.gradle
/captures/
/gradlew
/gradlew.bat
/local.properties
GeneratedPluginRegistrant.java
# Remember to never publicly share your keystore.
# See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app
key.properties
**/*.keystore
**/*.jks
plugins {
id "com.android.application"
id "kotlin-android"
// The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins.
id "dev.flutter.flutter-gradle-plugin"
}
def localProperties = new Properties()
def localPropertiesFile = rootProject.file("local.properties")
if (localPropertiesFile.exists()) {
localPropertiesFile.withReader("UTF-8") { reader ->
localProperties.load(reader)
}
}
def flutterVersionCode = localProperties.getProperty("flutter.versionCode")
if (flutterVersionCode == null) {
flutterVersionCode = "1"
}
def flutterVersionName = localProperties.getProperty("flutter.versionName")
if (flutterVersionName == null) {
flutterVersionName = "1.0"
}
android {
namespace = "com.example.jobportal"
compileSdk = flutter.compileSdkVersion
ndkVersion = flutter.ndkVersion
compileOptions {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
defaultConfig {
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
applicationId = "com.example.jobportal"
// You can update the following values to match your application needs.
// For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration.
minSdk = flutter.minSdkVersion
targetSdk = flutter.targetSdkVersion
versionCode = flutterVersionCode.toInteger()
versionName = flutterVersionName
}
buildTypes {
release {
// TODO: Add your own signing config for the release build.
// Signing with the debug keys for now, so `flutter run --release` works.
signingConfig = signingConfigs.debug
}
}
}
flutter {
source = "../.."
}
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<!-- The INTERNET permission is required for development. Specifically,
the Flutter tool needs it to communicate with the running application
to allow setting breakpoints, to provide hot reload, etc.
-->
<uses-permission android:name="android.permission.INTERNET"/>
</manifest>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<application
android:label="jobportal"
android:name="${applicationName}"
android:icon="@mipmap/ic_launcher">
<activity
android:name=".MainActivity"
android:exported="true"
android:launchMode="singleTop"
android:taskAffinity=""
android:theme="@style/LaunchTheme"
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
android:hardwareAccelerated="true"
android:windowSoftInputMode="adjustResize">
<!-- Specifies an Android theme to apply to this Activity as soon as
the Android process has started. This theme is visible to the user
while the Flutter UI initializes. After that, this theme continues
to determine the Window background behind the Flutter UI. -->
<meta-data
android:name="io.flutter.embedding.android.NormalTheme"
android:resource="@style/NormalTheme"
/>
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<!-- Don't delete the meta-data below.
This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->
<meta-data
android:name="flutterEmbedding"
android:value="2" />
</application>
<!-- Required to query activities that can process text, see:
https://developer.android.com/training/package-visibility and
https://developer.android.com/reference/android/content/Intent#ACTION_PROCESS_TEXT.
In particular, this is used by the Flutter engine in io.flutter.plugin.text.ProcessTextPlugin. -->
<queries>
<intent>
<action android:name="android.intent.action.PROCESS_TEXT"/>
<data android:mimeType="text/plain"/>
</intent>
</queries>
</manifest>
package com.example.jobportal
import io.flutter.embedding.android.FlutterActivity
class MainActivity: FlutterActivity()
<?xml version="1.0" encoding="utf-8"?>
<!-- Modify this file to customize your launch splash screen -->
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="?android:colorBackground" />
<!-- You can insert your own image assets here -->
<!-- <item>
<bitmap
android:gravity="center"
android:src="@mipmap/launch_image" />
</item> -->
</layer-list>
<?xml version="1.0" encoding="utf-8"?>
<!-- Modify this file to customize your launch splash screen -->
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@android:color/white" />
<!-- You can insert your own image assets here -->
<!-- <item>
<bitmap
android:gravity="center"
android:src="@mipmap/launch_image" />
</item> -->
</layer-list>
This diff was suppressed by a .gitattributes entry.
This diff was suppressed by a .gitattributes entry.
This diff was suppressed by a .gitattributes entry.
This diff was suppressed by a .gitattributes entry.
This diff was suppressed by a .gitattributes entry.
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is on -->
<style name="LaunchTheme" parent="@android:style/Theme.Black.NoTitleBar">
<!-- Show a splash screen on the activity. Automatically removed when
the Flutter engine draws its first frame -->
<item name="android:windowBackground">@drawable/launch_background</item>
</style>
<!-- Theme applied to the Android Window as soon as the process has started.
This theme determines the color of the Android Window while your
Flutter UI initializes, as well as behind your Flutter UI while its
running.
This Theme is only used starting with V2 of Flutter's Android embedding. -->
<style name="NormalTheme" parent="@android:style/Theme.Black.NoTitleBar">
<item name="android:windowBackground">?android:colorBackground</item>
</style>
</resources>
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is off -->
<style name="LaunchTheme" parent="@android:style/Theme.Light.NoTitleBar">
<!-- Show a splash screen on the activity. Automatically removed when
the Flutter engine draws its first frame -->
<item name="android:windowBackground">@drawable/launch_background</item>
</style>
<!-- Theme applied to the Android Window as soon as the process has started.
This theme determines the color of the Android Window while your
Flutter UI initializes, as well as behind your Flutter UI while its
running.
This Theme is only used starting with V2 of Flutter's Android embedding. -->
<style name="NormalTheme" parent="@android:style/Theme.Light.NoTitleBar">
<item name="android:windowBackground">?android:colorBackground</item>
</style>
</resources>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<!-- The INTERNET permission is required for development. Specifically,
the Flutter tool needs it to communicate with the running application
to allow setting breakpoints, to provide hot reload, etc.
-->
<uses-permission android:name="android.permission.INTERNET"/>
</manifest>
allprojects {
repositories {
google()
mavenCentral()
}
}
rootProject.buildDir = "../build"
subprojects {
project.buildDir = "${rootProject.buildDir}/${project.name}"
}
subprojects {
project.evaluationDependsOn(":app")
}
tasks.register("clean", Delete) {
delete rootProject.buildDir
}
org.gradle.jvmargs=-Xmx4G -XX:+HeapDumpOnOutOfMemoryError
android.useAndroidX=true
android.enableJetifier=true
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.3-all.zip
pluginManagement {
def flutterSdkPath = {
def properties = new Properties()
file("local.properties").withInputStream { properties.load(it) }
def flutterSdkPath = properties.getProperty("flutter.sdk")
assert flutterSdkPath != null, "flutter.sdk not set in local.properties"
return flutterSdkPath
}()
includeBuild("$flutterSdkPath/packages/flutter_tools/gradle")
repositories {
google()
mavenCentral()
gradlePluginPortal()
}
}
plugins {
id "dev.flutter.flutter-plugin-loader" version "1.0.0"
id "com.android.application" version "7.3.0" apply false
id "org.jetbrains.kotlin.android" version "1.7.10" apply false
}
include ":app"
This diff was suppressed by a .gitattributes entry.
**/dgph
*.mode1v3
*.mode2v3
*.moved-aside
*.pbxuser
*.perspectivev3
**/*sync/
.sconsign.dblite
.tags*
**/.vagrant/
**/DerivedData/
Icon?
**/Pods/
**/.symlinks/
profile
xcuserdata
**/.generated/
Flutter/App.framework
Flutter/Flutter.framework
Flutter/Flutter.podspec
Flutter/Generated.xcconfig
Flutter/ephemeral/
Flutter/app.flx
Flutter/app.zip
Flutter/flutter_assets/
Flutter/flutter_export_environment.sh
ServiceDefinitions.json
Runner/GeneratedPluginRegistrant.*
# Exceptions to above rules.
!default.mode1v3
!default.mode2v3
!default.pbxuser
!default.perspectivev3
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleExecutable</key>
<string>App</string>
<key>CFBundleIdentifier</key>
<string>io.flutter.flutter.app</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>App</string>
<key>CFBundlePackageType</key>
<string>FMWK</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>1.0</string>
<key>MinimumOSVersion</key>
<string>12.0</string>
</dict>
</plist>
#include "Generated.xcconfig"
#include "Generated.xcconfig"
This diff is collapsed.
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "self:">
</FileRef>
</Workspace>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>IDEDidComputeMac32BitWarning</key>
<true/>
</dict>
</plist>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>PreviewsEnabled</key>
<false/>
</dict>
</plist>
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1510"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "97C146ED1CF9000F007C117D"
BuildableName = "Runner.app"
BlueprintName = "Runner"
ReferencedContainer = "container:Runner.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES">
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "97C146ED1CF9000F007C117D"
BuildableName = "Runner.app"
BlueprintName = "Runner"
ReferencedContainer = "container:Runner.xcodeproj">
</BuildableReference>
</MacroExpansion>
<Testables>
<TestableReference
skipped = "NO"
parallelizable = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "331C8080294A63A400263BE5"
BuildableName = "RunnerTests.xctest"
BlueprintName = "RunnerTests"
ReferencedContainer = "container:Runner.xcodeproj">
</BuildableReference>
</TestableReference>
</Testables>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "97C146ED1CF9000F007C117D"
BuildableName = "Runner.app"
BlueprintName = "Runner"
ReferencedContainer = "container:Runner.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</LaunchAction>
<ProfileAction
buildConfiguration = "Profile"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "97C146ED1CF9000F007C117D"
BuildableName = "Runner.app"
BlueprintName = "Runner"
ReferencedContainer = "container:Runner.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "group:Runner.xcodeproj">
</FileRef>
</Workspace>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>IDEDidComputeMac32BitWarning</key>
<true/>
</dict>
</plist>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>PreviewsEnabled</key>
<false/>
</dict>
</plist>
import Flutter
import UIKit
@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
override func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
GeneratedPluginRegistrant.register(with: self)
return super.application(application, didFinishLaunchingWithOptions: launchOptions)
}
}
{
"images" : [
{
"size" : "20x20",
"idiom" : "iphone",
"filename" : "Icon-App-20x20@2x.png",
"scale" : "2x"
},
{
"size" : "20x20",
"idiom" : "iphone",
"filename" : "Icon-App-20x20@3x.png",
"scale" : "3x"
},
{
"size" : "29x29",
"idiom" : "iphone",
"filename" : "Icon-App-29x29@1x.png",
"scale" : "1x"
},
{
"size" : "29x29",
"idiom" : "iphone",
"filename" : "Icon-App-29x29@2x.png",
"scale" : "2x"
},
{
"size" : "29x29",
"idiom" : "iphone",
"filename" : "Icon-App-29x29@3x.png",
"scale" : "3x"
},
{
"size" : "40x40",
"idiom" : "iphone",
"filename" : "Icon-App-40x40@2x.png",
"scale" : "2x"
},
{
"size" : "40x40",
"idiom" : "iphone",
"filename" : "Icon-App-40x40@3x.png",
"scale" : "3x"
},
{
"size" : "60x60",
"idiom" : "iphone",
"filename" : "Icon-App-60x60@2x.png",
"scale" : "2x"
},
{
"size" : "60x60",
"idiom" : "iphone",
"filename" : "Icon-App-60x60@3x.png",
"scale" : "3x"
},
{
"size" : "20x20",
"idiom" : "ipad",
"filename" : "Icon-App-20x20@1x.png",
"scale" : "1x"
},
{
"size" : "20x20",
"idiom" : "ipad",
"filename" : "Icon-App-20x20@2x.png",
"scale" : "2x"
},
{
"size" : "29x29",
"idiom" : "ipad",
"filename" : "Icon-App-29x29@1x.png",
"scale" : "1x"
},
{
"size" : "29x29",
"idiom" : "ipad",
"filename" : "Icon-App-29x29@2x.png",
"scale" : "2x"
},
{
"size" : "40x40",
"idiom" : "ipad",
"filename" : "Icon-App-40x40@1x.png",
"scale" : "1x"
},
{
"size" : "40x40",
"idiom" : "ipad",
"filename" : "Icon-App-40x40@2x.png",
"scale" : "2x"
},
{
"size" : "76x76",
"idiom" : "ipad",
"filename" : "Icon-App-76x76@1x.png",
"scale" : "1x"
},
{
"size" : "76x76",
"idiom" : "ipad",
"filename" : "Icon-App-76x76@2x.png",
"scale" : "2x"
},
{
"size" : "83.5x83.5",
"idiom" : "ipad",
"filename" : "Icon-App-83.5x83.5@2x.png",
"scale" : "2x"
},
{
"size" : "1024x1024",
"idiom" : "ios-marketing",
"filename" : "Icon-App-1024x1024@1x.png",
"scale" : "1x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
This diff was suppressed by a .gitattributes entry.
This diff was suppressed by a .gitattributes entry.
This diff was suppressed by a .gitattributes entry.
This diff was suppressed by a .gitattributes entry.
This diff was suppressed by a .gitattributes entry.
This diff was suppressed by a .gitattributes entry.
This diff was suppressed by a .gitattributes entry.
This diff was suppressed by a .gitattributes entry.
This diff was suppressed by a .gitattributes entry.
This diff was suppressed by a .gitattributes entry.
This diff was suppressed by a .gitattributes entry.
This diff was suppressed by a .gitattributes entry.
This diff was suppressed by a .gitattributes entry.
{
"images" : [
{
"idiom" : "universal",
"filename" : "LaunchImage.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "LaunchImage@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "LaunchImage@3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
This diff was suppressed by a .gitattributes entry.
This diff was suppressed by a .gitattributes entry.
This diff was suppressed by a .gitattributes entry.
# Launch Screen Assets
You can customize the launch screen with your own desired assets by replacing the image files in this directory.
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.
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="12121" systemVersion="16G29" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" colorMatched="YES" initialViewController="01J-lp-oVM">
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="12089"/>
</dependencies>
<scenes>
<!--View Controller-->
<scene sceneID="EHf-IW-A2E">
<objects>
<viewController id="01J-lp-oVM" sceneMemberID="viewController">
<layoutGuides>
<viewControllerLayoutGuide type="top" id="Ydg-fD-yQy"/>
<viewControllerLayoutGuide type="bottom" id="xbc-2k-c8Z"/>
</layoutGuides>
<view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3">
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<imageView opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" image="LaunchImage" translatesAutoresizingMaskIntoConstraints="NO" id="YRO-k0-Ey4">
</imageView>
</subviews>
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<constraints>
<constraint firstItem="YRO-k0-Ey4" firstAttribute="centerX" secondItem="Ze5-6b-2t3" secondAttribute="centerX" id="1a2-6s-vTC"/>
<constraint firstItem="YRO-k0-Ey4" firstAttribute="centerY" secondItem="Ze5-6b-2t3" secondAttribute="centerY" id="4X2-HB-R7a"/>
</constraints>
</view>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="53" y="375"/>
</scene>
</scenes>
<resources>
<image name="LaunchImage" width="168" height="185"/>
</resources>
</document>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="10117" systemVersion="15F34" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" initialViewController="BYZ-38-t0r">
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="10085"/>
</dependencies>
<scenes>
<!--Flutter View Controller-->
<scene sceneID="tne-QT-ifu">
<objects>
<viewController id="BYZ-38-t0r" customClass="FlutterViewController" sceneMemberID="viewController">
<layoutGuides>
<viewControllerLayoutGuide type="top" id="y3c-jy-aDJ"/>
<viewControllerLayoutGuide type="bottom" id="wfy-db-euE"/>
</layoutGuides>
<view key="view" contentMode="scaleToFill" id="8bC-Xf-vdC">
<rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
</view>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/>
</objects>
</scene>
</scenes>
</document>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleDisplayName</key>
<string>Jobportal</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>jobportal</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>$(FLUTTER_BUILD_NAME)</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>$(FLUTTER_BUILD_NUMBER)</string>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>UILaunchStoryboardName</key>
<string>LaunchScreen</string>
<key>UIMainStoryboardFile</key>
<string>Main</string>
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>UISupportedInterfaceOrientations~ipad</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationPortraitUpsideDown</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>CADisableMinimumFrameDurationOnPhone</key>
<true/>
<key>UIApplicationSupportsIndirectInputEvents</key>
<true/>
</dict>
</plist>
#import "GeneratedPluginRegistrant.h"
import Flutter
import UIKit
import XCTest
class RunnerTests: XCTestCase {
func testExample() {
// If you add code to the Runner application, consider adding tests here.
// See https://developer.apple.com/documentation/xctest for more information about using XCTest.
}
}
// ignore: depend_on_referenced_packages
import 'package:curved_navigation_bar/curved_navigation_bar.dart';
import 'package:flutter/material.dart';
import 'package:jobportal/UI/company/all_jobs_screen.dart';
import 'package:jobportal/UI/company/company_profile_screen.dart';
import 'package:jobportal/UI/company/create_job_screen.dart';
import '../../services/global_methods.dart';
import '../company/company_setting_screen.dart';
import '../home_screen/home_screen.dart';
// ignore: must_be_immutable
class MyBottomNavigationBar extends StatelessWidget {
int indexNum = 0;
MyBottomNavigationBar({super.key, required this.indexNum});
@override
Widget build(BuildContext context) {
return CurvedNavigationBar(
index: indexNum,
height: 50,
animationDuration: const Duration(milliseconds: 300),
animationCurve: Curves.bounceInOut,
onTap: (index) {
if (index == 0) {
Navigator.pushReplacement(context,
MaterialPageRoute(builder: (context) => const HomeScreen()));
} else if (index == 1) {
Navigator.pushReplacement(context,
MaterialPageRoute(builder: (context) => const AllJobsScreen()));
} else if (index == 2) {
Navigator.pushReplacement(
context,
MaterialPageRoute(
builder: (context) => const CompanyProfileScreen()));
} else if (index == 3) {
Navigator.pushReplacement(
context,
MaterialPageRoute(
builder: (context) => const CompanySettingScreen()));
} else if (index == 4) {
Navigator.pushReplacement(context,
MaterialPageRoute(builder: (context) => const CreateJobScreen()));
} else if (index == 5) {
GlobalMethods.logout(context);
}
},
items: const [
Icon(
Icons.home,
size: 19,
color: Colors.black87,
),
Icon(
Icons.search,
size: 19,
color: Colors.black87,
),
Icon(
Icons.person_pin,
size: 19,
color: Colors.black87,
),
Icon(
Icons.settings,
size: 19,
color: Colors.black87,
),
Icon(
Icons.add,
size: 19,
color: Colors.black87,
),
Icon(
Icons.logout,
size: 19,
color: Colors.black87,
),
],
backgroundColor: Colors.grey.shade400,
buttonBackgroundColor: Colors.blueAccent.shade400,
color: Colors.orange,
);
}
}
import 'package:curved_navigation_bar/curved_navigation_bar.dart';
import 'package:flutter/material.dart';
import 'package:jobportal/UI/jobseeker/jobseeker_profile_screen.dart';
import '../../services/global_methods.dart';
import '../home_screen/home_screen.dart';
import '../jobseeker/favourites_screen.dart';
// ignore: must_be_immutable
class JobseekerBottomNavigationBar extends StatelessWidget {
int indexNum = 0;
JobseekerBottomNavigationBar({super.key, required this.indexNum});
@override
Widget build(BuildContext context) {
return CurvedNavigationBar(
index: indexNum,
height: 50,
animationDuration: const Duration(milliseconds: 300),
animationCurve: Curves.bounceInOut,
onTap: (index) {
if (index == 0) {
Navigator.pushReplacement(context,
MaterialPageRoute(builder: (context) => const HomeScreen()));
} else if (index == 1) {
} else if (index == 2) {
Navigator.pushReplacement(
context,
MaterialPageRoute(
builder: (context) => JobseekerProfileScreen()));
} else if (index == 3) {
// Navigator.pushReplacement(
// context,
// MaterialPageRoute(
// builder: (context) => const ManageAccountScreen()));
} else if (index == 4) {
Navigator.pushReplacement(context,
MaterialPageRoute(builder: (context) => const FavoritesScreen()));
} else if (index == 5) {
GlobalMethods.logout(context);
}
},
items: const [
Icon(
Icons.home,
size: 19,
color: Colors.black87,
),
Icon(
Icons.search,
size: 19,
color: Colors.black87,
),
Icon(
Icons.person_pin,
size: 19,
color: Colors.black87,
),
Icon(
Icons.settings,
size: 19,
color: Colors.black87,
),
Icon(
Icons.star,
size: 19,
color: Colors.black87,
),
Icon(
Icons.logout,
size: 19,
color: Colors.black87,
),
],
backgroundColor: Colors.grey.shade400,
buttonBackgroundColor: Colors.blueAccent.shade400,
color: Colors.orange,
);
}
}
import 'package:flutter/material.dart';
import 'package:jobportal/services/global_variables.dart';
import 'package:jobportal/UI/bottom_navigation_bar/jobseeker_bottom_navigation_bar.dart';
import 'package:jobportal/data/job.dart';
import 'package:jobportal/logic/fetch.dart';
import '../../widgets/jobwidget.dart';
import '../bottom_navigation_bar/company_bottom_navigation_bar.dart';
class AllJobsScreen extends StatefulWidget {
// Add the job to the list
const AllJobsScreen({super.key});
@override
State<AllJobsScreen> createState() => _AllJobsScreenState();
}
class _AllJobsScreenState extends State<AllJobsScreen> {
int x = 0;
late int pageNumber;
List<Job> jobs = [];
@override
void initState() {
super.initState();
pageNumber = 0;
fetchAllJobs();
}
void fetchAllJobs() async {
jobs = await Fetch.getAllJobsByPage(pageNumber);
setState(() {});
}
void _incrementPage() {
setState(() {
pageNumber++;
fetchAllJobs();
});
}
void _decrementPage() {
setState(() {
if (pageNumber >= 1) {
pageNumber--;
fetchAllJobs();
}
});
}
@override
Widget build(BuildContext context) {
return SafeArea(
child: Scaffold(
bottomNavigationBar: identifier.iscompany == true
? MyBottomNavigationBar(
indexNum: 1,
)
: JobseekerBottomNavigationBar(
indexNum: 0,
),
backgroundColor: Colors.grey.shade300,
drawer: const Drawer(),
appBar: AppBar(
iconTheme: const IconThemeData(color: Colors.black),
title: const Center(
child: Text("jobportal"),
),
// flexibleSpace: Container(
// decoration: const BoxDecoration(
// gradient: LinearGradient(
// colors: [Colors.cyan, Colors.greenAccent],
// begin: Alignment.centerLeft,
// end: Alignment.centerRight,
// stops: [0.2, 0.9])),
// ),
backgroundColor: Colors.orange,
),
body: Stack(
children: [
ListView.builder(
itemCount: jobs.length,
itemBuilder: (context, index) {
return ShowJobWidget(job: jobs[index]);
},
),
Positioned(
bottom: 16,
left: 0,
right: 0,
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
IconButton(
onPressed: _decrementPage,
icon: const Icon(
Icons.arrow_left,
color: Colors.red,
size: 40,
),
),
Padding(
padding: const EdgeInsets.symmetric(horizontal: 16.0),
child: Text(
'Page ${pageNumber + 1} ',
style: const TextStyle(fontWeight: FontWeight.bold),
),
),
IconButton(
onPressed: _incrementPage,
icon: const Icon(
Icons.arrow_right,
color: Colors.green,
size: 40,
),
),
],
),
)
],
)));
}
}
This diff is collapsed.
import 'package:flutter/material.dart';
import 'package:jobportal/UI/bottom_navigation_bar/company_bottom_navigation_bar.dart';
import '../../Services/global_methods.dart';
import '../interview/all_interviews_company_screen.dart';
class CompanySettingScreen extends StatefulWidget {
const CompanySettingScreen({super.key});
@override
State<CompanySettingScreen> createState() => _CompanySettingScreenState();
}
class _CompanySettingScreenState extends State<CompanySettingScreen> {
@override
Widget build(BuildContext context) {
return SafeArea(
child: Scaffold(
bottomNavigationBar: MyBottomNavigationBar(
indexNum: 3,
),
backgroundColor: Colors.grey.shade300,
appBar: AppBar(
// flexibleSpace: Container(
// decoration: const BoxDecoration(
// gradient: LinearGradient(
// colors: [Colors.cyan, Colors.greenAccent],
// begin: Alignment.centerLeft,
// end: Alignment.centerRight,
// stops: [0.2, 0.9])),
// ),
backgroundColor: Colors.orange,
title: const Text("Setting"),
centerTitle: true,
),
body: Column(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
GestureDetector(
onTap: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => CompanyAllInterviews()));
},
child: GlobalMethods.userInfo(
myIcon: Icons.settings, content: "My Interviews Setting")),
GestureDetector(
onTap: () {
// Navigator.push(
// context,
// MaterialPageRoute(
// builder: (context) => CompanyAllInterviews()));
},
child: GlobalMethods.userInfo(
myIcon: Icons.settings, content: "My Profile Setting")),
],
),
),
);
}
}
This diff is collapsed.
import 'package:flutter/material.dart';
import 'package:jobportal/data/jobseeker.dart';
import 'package:jobportal/logic/fetch.dart';
import '../../widgets/applicants_widget.dart';
// ignore: must_be_immutable
class ShowApplicantsScreen extends StatefulWidget {
String id;
String jobName;
ShowApplicantsScreen({super.key, required this.id, required this.jobName});
@override
State<ShowApplicantsScreen> createState() => _ShowApplicantsScreenState();
}
class _ShowApplicantsScreenState extends State<ShowApplicantsScreen> {
Future<List<Jobseeker>>? _futureJobseekers;
@override
void initState() {
print("1");
_futureJobseekers = Fetch.getAllApplicants(widget.id);
super.initState();
}
@override
Widget build(BuildContext context) {
print("2");
return SafeArea(
child: Scaffold(
backgroundColor: Colors.grey.shade300,
appBar: AppBar(
actions: [
Padding(
padding: const EdgeInsets.only(right: 8.0),
child: Row(
mainAxisAlignment: MainAxisAlignment.end,
children: [
IconButton(
icon: const Icon(
Icons.search,
size: 25,
color: Colors.black,
),
onPressed: () {
// Navigator.push(
// context,
// MaterialPageRoute(
// builder: (context) =>
// SearchForApplicantScreen(
// id: widget.id,
// companyId: widget.companyId)));
},
),
],
),
),
],
leading: IconButton(
icon: const Icon(
Icons.close,
size: 25,
color: Colors.black,
),
onPressed: () {
Navigator.pop(context);
},
),
backgroundColor: Colors.orange,
title: const Text("Job Applicants"),
centerTitle: true,
),
body: FutureBuilder(
future: _futureJobseekers,
builder: (context, snapshot) {
if (snapshot.hasData) {
print(snapshot.data);
List<Jobseeker>? jobseekers = snapshot.data;
return ListView.builder(
itemCount: jobseekers!.length,
itemBuilder: (context, index) {
Jobseeker jobseeker = jobseekers[index];
return ApplicantsWidget(
jobseeker: jobseeker,
jobId: widget.id,
jobName: widget.jobName,
);
},
);
} else {
return const Center(child: CircularProgressIndicator());
}
},
)));
}
}
import 'package:flutter/material.dart';
import '../login/company_login.dart';
import '../login/jobseeker_login.dart';
// ignore: camel_case_types
class MainScreen extends StatefulWidget {
const MainScreen({super.key});
@override
State<MainScreen> createState() => _mainScreenState();
}
// ignore: camel_case_types
class _mainScreenState extends State<MainScreen> with TickerProviderStateMixin {
late Animation<double> _animation;
late AnimationController _animationController;
@override
void dispose() {
_animationController.dispose();
super.dispose();
}
@override
void initState() {
_animationController =
AnimationController(vsync: this, duration: const Duration(seconds: 20));
_animation =
CurvedAnimation(parent: _animationController, curve: Curves.linear)
..addListener(() {
setState(() {});
})
..addStatusListener((animationStatus) {
if (animationStatus == AnimationStatus.completed) {
_animationController.reset();
_animationController.forward();
}
});
_animationController.forward();
super.initState();
}
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Colors.transparent,
body: SafeArea(
child: Stack(
children: [
Image.asset(
'images/logincompany.jpg',
width: double.infinity,
height: double.infinity,
fit: BoxFit.cover,
alignment: FractionalOffset(_animation.value, 0),
),
Padding(
padding: const EdgeInsets.only(
top: 300, bottom: 0, left: 50, right: 50),
child: MaterialButton(
onPressed: () async {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => const JobSeekerLogIn(),
));
},
color: Colors.black54,
elevation: 8,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(13),
),
child: const Padding(
padding: EdgeInsets.symmetric(vertical: 14.0),
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(
"Enter as jobseeker",
style: TextStyle(
color: Colors.white,
fontWeight: FontWeight.bold,
fontSize: 20,
),
)
],
),
),
),
),
const SizedBox(
height: 40,
),
Padding(
padding: const EdgeInsets.only(
top: 375, bottom: 0, left: 50, right: 50),
child: MaterialButton(
onPressed: () async {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => const CompanyLogIn(),
));
},
color: Colors.black54,
elevation: 8,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(13),
),
child: const Padding(
padding: EdgeInsets.symmetric(vertical: 14.0),
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(
"Enter as company",
style: TextStyle(
color: Colors.white,
fontWeight: FontWeight.bold,
fontSize: 20,
),
)
],
),
),
),
),
],
),
),
);
}
}
This diff is collapsed.
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:jobportal/logic/fetch.dart';
import 'package:intl/intl.dart';
import 'package:jobportal/services/global_variables.dart';
import '../../data/job_interview.dart';
import 'company_interview_details.dart';
class CompanyAllInterviews extends StatefulWidget {
CompanyAllInterviews({super.key});
@override
State<CompanyAllInterviews> createState() => _CompanyAllInterviewsState();
}
class _CompanyAllInterviewsState extends State<CompanyAllInterviews> {
List<JobInterview>? _interviews;
List<JobInterview>? _allInterviews;
DateTime? _selectedDate;
bool _isSortAsc = true;
@override
void initState() {
super.initState();
_fetchJobInterviews();
}
Future<void> _fetchJobInterviews() async {
_interviews = await Fetch.getAllInterviewsByCompanyId(identifier.id);
_allInterviews = _interviews;
setState(() {});
}
Future<void> _updatedJobInterviews() async {
if (_selectedDate == null) {
_interviews = _allInterviews;
} else {
_interviews = await Fetch.getAllInterviewsByCompanyIdAndDate(
identifier.id, _selectedDate!);
}
setState(() {});
}
@override
Widget build(BuildContext context) {
return SafeArea(
child: Scaffold(
backgroundColor: Colors.grey.shade300,
body: Scaffold(
backgroundColor: Colors.transparent,
appBar: AppBar(
backgroundColor: Colors.orange,
title: const Center(child: Text("job interviews")),
),
body: _buildUI(context),
),
),
);
}
Future<void> _selectDate(BuildContext context) async {
final DateTime? picked = await showDatePicker(
context: context,
initialDate: _selectedDate ?? DateTime.now(),
firstDate: DateTime(2010),
lastDate: DateTime(2025),
);
if (picked != null && picked != _selectedDate) {
setState(() {
_selectedDate = picked;
_updatedJobInterviews();
});
} else {
setState(() {
_selectedDate = null;
_updatedJobInterviews();
});
}
}
Widget _buildUI(BuildContext context) {
return Column(
children: [
Padding(
padding: const EdgeInsets.all(16.0),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
ElevatedButton.icon(
onPressed: () {
_selectDate(context);
},
icon: Icon(_selectedDate == null
? Icons.calendar_today
: Icons.calendar_today_outlined),
label: Text(_selectedDate == null
? 'Select Date'
: DateFormat('yyyy-MM-dd').format(_selectedDate!)),
),
const Spacer(),
],
),
),
if (_interviews != null)
Expanded(
child: SafeArea(
child: SizedBox(
child: SingleChildScrollView(
scrollDirection: Axis.horizontal,
child: SingleChildScrollView(
scrollDirection: Axis.horizontal,
child: DataTable(
headingRowColor: WidgetStateProperty.all(Colors.black12),
dataRowColor: WidgetStateProperty.all(Colors.white),
columnSpacing: 10.0,
dividerThickness: 2.0,
columns: _createColumns(),
rows: _createRows(),
),
),
),
),
),
)
else
const Center(child: CircularProgressIndicator()),
],
);
}
List<DataColumn> _createColumns() {
return [
DataColumn(
label: const Text("Applicant"),
onSort: (columnIndex, _) {
setState(() {
if (_isSortAsc) {
_interviews!
.sort((a, b) => a.jobseekerName.compareTo(b.jobseekerName));
} else {
_interviews!
.sort((a, b) => b.jobseekerName.compareTo(a.jobseekerName));
}
_isSortAsc = !_isSortAsc;
});
}),
DataColumn(
label: const Text("Specification"),
onSort: (columnIndex, _) {
setState(() {
if (_isSortAsc) {
_interviews!.sort((a, b) => a.jobseekerSpecificationName
.compareTo(b.jobseekerSpecificationName));
} else {
_interviews!.sort((a, b) => b.jobseekerSpecificationName
.compareTo(a.jobseekerSpecificationName));
}
_isSortAsc = !_isSortAsc;
});
}),
DataColumn(
label: const Text("Date"),
onSort: (columnIndex, _) {
setState(() {
if (_isSortAsc) {
_interviews!.sort((a, b) => a.date.compareTo(b.date));
} else {
_interviews!.sort((a, b) => b.date.compareTo(a.date));
}
_isSortAsc = !_isSortAsc;
});
}),
DataColumn(
label: Text("Time"),
onSort: (columnIndex, _) {
setState(() {
if (_isSortAsc) {
_interviews!.sort((a, b) => a.address.compareTo(b.address));
} else {
_interviews!.sort((a, b) => b.address.compareTo(a.address));
}
});
_isSortAsc = !_isSortAsc;
}),
];
}
List<DataRow> _createRows() {
return _interviews!.map((e) {
DateTime interviewDateTime = DateTime.parse(e.date.toString());
String formattedDate = DateFormat('yyyy-MM-dd').format(interviewDateTime);
String formattedTime = DateFormat('HH:mm').format(interviewDateTime);
return DataRow(
onLongPress: () {
_showInterviewDetails(e);
},
cells: [
DataCell(Text(e.jobseekerName)),
DataCell(Text(e.jobseekerSpecificationName)),
DataCell(Center(child: Text(formattedDate))),
DataCell(Center(child: Text(formattedTime))),
]);
}).toList();
}
void _showInterviewDetails(JobInterview jobInterview) {
showDialog(
context: context,
builder: (context) => AlertDialog(
backgroundColor: Colors.black54,
title: const Row(
children: [
Padding(
padding: EdgeInsets.all(8.0),
child: Icon(
Icons.move_to_inbox_outlined,
size: 36,
color: Colors.white,
),
),
Padding(
padding: EdgeInsets.all(8.0),
child: Text(
"Move",
style: TextStyle(color: Colors.white, fontSize: 36),
),
),
],
),
content: const Text(
"Do you want to show interview details?",
style: TextStyle(color: Colors.white, fontSize: 20),
),
actions: [
TextButton(
onPressed: () {
Navigator.canPop(context) ? Navigator.pop(context) : Null;
},
child: const Text(
"No",
style: TextStyle(color: Colors.green, fontSize: 16),
)),
TextButton(
onPressed: () {
Navigator.canPop(context) ? Navigator.pop(context) : Null;
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => JobInterviewDetails(
jobInterview: jobInterview,
),
),
);
},
child: const Text(
"Yes",
style: TextStyle(color: Colors.green, fontSize: 16),
)),
],
),
);
}
}
import 'dart:convert';
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'package:intl/intl.dart';
import '../../services/global_methods.dart';
import '../../services/global_variables.dart';
// ignore: must_be_immutable
class BookInterviewScreen extends StatefulWidget {
int jobseekerId;
String jobId;
String jobName;
BookInterviewScreen(
{super.key,
required this.jobId,
required this.jobseekerId,
required this.jobName});
@override
State<BookInterviewScreen> createState() => _BookInterviewScreenState();
}
class _BookInterviewScreenState extends State<BookInterviewScreen> {
DateTime? picked;
final _globalKey = GlobalKey<FormState>();
final TextEditingController _address = TextEditingController();
final TextEditingController _dateTime = TextEditingController();
@override
void initState() {
_dateTime.text = "";
super.initState();
}
@override
Widget build(BuildContext context) {
return SafeArea(
child: Scaffold(
backgroundColor: Colors.grey.shade300,
appBar: AppBar(
backgroundColor: Colors.orange,
),
body: Center(
child: Padding(
padding: const EdgeInsets.all(7.0),
child: Card(
color: Colors.white10,
child: SingleChildScrollView(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
const SizedBox(
height: 10,
),
const Align(
alignment: Alignment.center,
child: Padding(
padding: EdgeInsets.all(8.0),
child: Text(
"Book Interview Now",
style: TextStyle(
color: Colors.black,
fontSize: 30,
fontWeight: FontWeight.bold,
fontStyle: FontStyle.italic),
),
),
),
const SizedBox(
height: 10,
),
const Divider(
thickness: 1,
color: Colors.grey,
),
Padding(
padding: const EdgeInsets.all(0),
child: Form(
key: _globalKey,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
GlobalMethods.textTitle(label: 'Address :'),
GlobalMethods.textFormFields(
valuekey: "Address",
controller: _address,
enabled: true,
fct: () {},
maxlength: 50,
),
GlobalMethods.textTitle(label: 'Date :'),
GlobalMethods.textFormFields(
valuekey: "Date",
controller: _dateTime,
enabled: false,
fct: () {
_selectDateTime();
},
maxlength: 50,
),
const SizedBox(height: 20),
InkWell(
onTap: () async {
if (_globalKey.currentState!.validate()) {
await _submitForm();
}
},
child: Center(
child: Container(
width: 200,
height: 50,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(10),
color: Colors.black),
child: const Center(
child: Text(
"Send",
style: TextStyle(
fontWeight: FontWeight.bold,
color: Colors.white,
fontSize: 18),
),
),
)),
),
const SizedBox(height: 20),
],
),
),
)
],
),
),
),
)),
),
);
}
Future<void> _submitForm() async {
try {
final url = Uri.parse('$myUrl/api/company/publishInterview');
final requestBody = {
"jobseekerId": widget.jobseekerId,
"companyId": identifier.id,
"jobId": widget.jobId,
"date": _dateTime.text,
"address": _address.text,
"status": "false",
"jobName": widget.jobName,
"companyName": identifier.name,
};
ScaffoldMessenger.of(context).showSnackBar(const SnackBar(
content: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Padding(
padding: EdgeInsets.all(5.0),
child: Text("Booking..."),
),
CircularProgressIndicator()
],
),
duration: Duration(minutes: 1),
));
final response = await http.post(
url,
headers: <String, String>{
'Content-Type': 'application/json; charset=UTF-8',
HttpHeaders.authorizationHeader: "Bearer ${identifier.token}"
},
body: jsonEncode(requestBody),
);
if (response.statusCode == 200 || response.statusCode == 201) {
_showAndPop();
} else {
_showFail();
}
} catch (error) {
print(error);
GlobalMethods.showErrorDialog(error: error.toString(), ctx: context);
}
}
void _showAndPop() {
Navigator.pop(context);
ScaffoldMessenger.of(context).hideCurrentSnackBar();
ScaffoldMessenger.of(context).showSnackBar(const SnackBar(
content: Text('Interview booked successfully'),
duration: Duration(seconds: 3),
));
}
void _showFail() {
ScaffoldMessenger.of(context).hideCurrentSnackBar();
ScaffoldMessenger.of(context).showSnackBar(const SnackBar(
content: Text('There was an error occurred'),
duration: Duration(seconds: 3),
));
}
void _selectDateTime() async {
final selectedDate = await showDatePicker(
context: context,
initialDate: DateTime.now(),
firstDate: DateTime(1900),
lastDate: DateTime(2100),
);
if (selectedDate != null) {
// ignore: use_build_context_synchronously
final selectedTime = await showTimePicker(
context: context,
initialTime: TimeOfDay.now(),
);
if (selectedTime != null) {
final dateTime = DateTime(
selectedDate.year,
selectedDate.month,
selectedDate.day,
selectedTime.hour,
selectedTime.minute,
);
final formattedDateTime =
DateFormat('yyyy-MM-dd\'T\'HH:mm:ss').format(dateTime);
setState(() {
_dateTime.text = formattedDateTime;
});
}
}
}
}
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:jobportal/data/job_interview.dart';
import 'package:intl/intl.dart';
import 'package:jobportal/services/global_variables.dart';
class JobInterviewDetails extends StatefulWidget {
JobInterview jobInterview;
JobInterviewDetails({super.key, required this.jobInterview});
@override
State<JobInterviewDetails> createState() => _JobInterviewDetailsState();
}
class _JobInterviewDetailsState extends State<JobInterviewDetails> {
@override
void initState() {
super.initState();
}
@override
Widget build(BuildContext context) {
// Define your color scheme
const primaryColor = Colors.orange;
const secondaryColor = Color(0xFF9B9B9B);
const backgroundColor = Colors.white;
return SafeArea(
child: Scaffold(
appBar: AppBar(
title: const Text('Interview Details'),
backgroundColor: primaryColor,
),
body: SingleChildScrollView(
child: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
_buildSectionTitle('Interview Details', primaryColor),
const SizedBox(height: 16.0),
_buildDetailRow('Date',
DateFormat('yyyy-MM-dd').format(widget.jobInterview.date)),
_buildDetailRow('Time',
DateFormat('HH:mm').format(widget.jobInterview.date)),
_buildDetailRow('Address', widget.jobInterview.address),
_buildDetailRow('Status',
widget.jobInterview.status ? 'Scheduled' : 'Cancelled'),
const SizedBox(height: 32.0),
_buildSectionTitle('Jobseeker Details', primaryColor),
const SizedBox(height: 16.0),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
if (widget.jobInterview.jobseekerImage.isNotEmpty)
Padding(
padding: const EdgeInsets.only(top: 16.0),
child: Center(
child: ClipRRect(
borderRadius: BorderRadius.circular(8.0),
child: Image.network(
'$myUrl/api/jobseekers/getImage/${widget.jobInterview.jobseekerImage}',
headers: {
HttpHeaders.authorizationHeader:
"Bearer ${identifier.token}"
},
width: 150,
height: 150,
fit: BoxFit.cover,
),
),
),
),
// Column(
// children: [
// Text(widget.jobInterview.jobseekerName),
// Text(widget.jobInterview.jobseekerEmail)
// ],
// )
],
),
const SizedBox(
height: 15,
),
_buildDetailRow('Name', widget.jobInterview.jobseekerName),
_buildDetailRow(
'Phone', widget.jobInterview.jobseekerPhoneNumber),
_buildDetailRow('Email', widget.jobInterview.jobseekerEmail),
_buildDetailRow('Specification',
widget.jobInterview.jobseekerSpecificationName),
_buildDetailRow('Gender', widget.jobInterview.jobseekerGender),
_buildDetailRow(
'Birthdate',
DateFormat('yyyy-MM-dd')
.format(widget.jobInterview.jobseekerBirthdate)),
_buildDetailRow(
'Address', widget.jobInterview.jobseekerAddress),
],
),
),
),
),
);
}
Widget _buildSectionTitle(String title, Color color) {
return Text(
title,
style: TextStyle(
fontSize: 18.0,
fontWeight: FontWeight.bold,
color: color,
),
);
}
Widget _buildDetailRow(String label, String value) {
return Padding(
padding: const EdgeInsets.symmetric(vertical: 8.0),
child: Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Expanded(
flex: 2,
child: Text(
label,
style: const TextStyle(
color: Colors.grey,
fontWeight: FontWeight.bold,
),
),
),
const SizedBox(width: 16.0),
Expanded(
flex: 3,
child: Text(
value,
style: const TextStyle(
color: Colors.black,
),
),
),
],
),
);
}
}
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:jobportal/logic/fetch.dart';
import 'package:intl/intl.dart';
import '../../data/job_interview.dart';
import 'company_interview_details.dart';
class CompanyInterviews extends StatefulWidget {
int jobId;
CompanyInterviews({super.key, required this.jobId});
@override
State<CompanyInterviews> createState() => _CompanyInterviewsState();
}
class _CompanyInterviewsState extends State<CompanyInterviews> {
List<JobInterview>? _jobInterviews;
DateTime? _selectedDate;
bool _isSortAsc = true;
List<JobInterview>? _allInterviews;
@override
void initState() {
super.initState();
_fetchJobInterviews();
}
Future<void> _fetchJobInterviews() async {
_jobInterviews = await Fetch.getAllInterviewsByJobId(widget.jobId);
_allInterviews = _jobInterviews;
setState(() {});
}
Future<void> _updatedJobInterviews() async {
if (_selectedDate == null) {
_jobInterviews = _allInterviews;
} else {
_jobInterviews = await Fetch.getAllInterviewsByJobIdAndDate(
widget.jobId, _selectedDate!);
}
setState(() {});
}
@override
Widget build(BuildContext context) {
return SafeArea(
child: Scaffold(
backgroundColor: Colors.grey.shade300,
appBar: AppBar(
backgroundColor: Colors.orange,
title: const Center(child: Text("job interviews")),
),
body: _buildUI(context),
),
);
}
Future<void> _selectDate(BuildContext context) async {
final DateTime? picked = await showDatePicker(
context: context,
initialDate: _selectedDate ?? DateTime.now(),
firstDate: DateTime(2010),
lastDate: DateTime(2025),
);
if (picked != null && picked != _selectedDate) {
setState(() {
_selectedDate = picked;
_updatedJobInterviews();
});
} else {
setState(() {
_selectedDate = null;
_updatedJobInterviews();
});
}
}
Widget _buildUI(BuildContext context) {
return Column(
children: [
Padding(
padding: const EdgeInsets.all(16.0),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
ElevatedButton.icon(
onPressed: () {
_selectDate(context);
},
icon: Icon(_selectedDate == null
? Icons.calendar_today
: Icons.calendar_today_outlined),
label: Text(_selectedDate == null
? 'Select Date'
: DateFormat('yyyy-MM-dd').format(_selectedDate!)),
),
const Spacer(),
],
),
),
if (_jobInterviews != null)
Expanded(
child: SafeArea(
child: SizedBox(
child: SingleChildScrollView(
scrollDirection: Axis.horizontal,
child: SingleChildScrollView(
scrollDirection: Axis.horizontal,
child: DataTable(
headingRowColor: WidgetStateProperty.all(Colors.black12),
dataRowColor: WidgetStateProperty.all(Colors.white),
columnSpacing: 10.0,
dividerThickness: 2.0,
columns: _createColumns(),
rows: _createRows(),
),
),
),
),
),
)
else
const Center(child: CircularProgressIndicator()),
],
);
}
List<DataColumn> _createColumns() {
return [
DataColumn(
label: const Text("Applicant"),
onSort: (columnIndex, _) {
setState(() {
if (_isSortAsc) {
_jobInterviews!
.sort((a, b) => a.jobseekerName.compareTo(b.jobseekerName));
} else {
_jobInterviews!
.sort((a, b) => b.jobseekerName.compareTo(a.jobseekerName));
}
_isSortAsc = !_isSortAsc;
});
}),
DataColumn(
label: const Text("Specification"),
onSort: (columnIndex, _) {
setState(() {
if (_isSortAsc) {
_jobInterviews!.sort((a, b) => a.jobseekerSpecificationName
.compareTo(b.jobseekerSpecificationName));
} else {
_jobInterviews!.sort((a, b) => b.jobseekerSpecificationName
.compareTo(a.jobseekerSpecificationName));
}
_isSortAsc = !_isSortAsc;
});
}),
DataColumn(
label: const Text("Date"),
onSort: (columnIndex, _) {
setState(() {
if (_isSortAsc) {
_jobInterviews!.sort((a, b) => a.date.compareTo(b.date));
} else {
_jobInterviews!.sort((a, b) => b.date.compareTo(a.date));
}
_isSortAsc = !_isSortAsc;
});
}),
DataColumn(
label: Text("Time"),
onSort: (columnIndex, _) {
setState(() {
if (_isSortAsc) {
_jobInterviews!.sort((a, b) => a.address.compareTo(b.address));
} else {
_jobInterviews!.sort((a, b) => b.address.compareTo(a.address));
}
});
_isSortAsc = !_isSortAsc;
}),
];
}
List<DataRow> _createRows() {
return _jobInterviews!.map((e) {
DateTime interviewDateTime = DateTime.parse(e.date.toString());
String formattedDate = DateFormat('yyyy-MM-dd').format(interviewDateTime);
String formattedTime = DateFormat('HH:mm').format(interviewDateTime);
return DataRow(
onLongPress: () {
_showInterviewDetails(e);
},
cells: [
DataCell(Text(e.jobseekerName)),
DataCell(Text(e.jobseekerSpecificationName)),
DataCell(Center(child: Text(formattedDate))),
DataCell(Center(child: Text(formattedTime))),
]);
}).toList();
}
void _showInterviewDetails(JobInterview jobInterview) {
showDialog(
context: context,
builder: (context) => AlertDialog(
backgroundColor: Colors.black54,
title: const Row(
children: [
Padding(
padding: EdgeInsets.all(8.0),
child: Icon(
Icons.move_to_inbox_outlined,
size: 36,
color: Colors.white,
),
),
Padding(
padding: EdgeInsets.all(8.0),
child: Text(
"Move",
style: TextStyle(color: Colors.white, fontSize: 36),
),
),
],
),
content: const Text(
"Do you want to show interview details?",
style: TextStyle(color: Colors.white, fontSize: 20),
),
actions: [
TextButton(
onPressed: () {
Navigator.canPop(context) ? Navigator.pop(context) : Null;
},
child: const Text(
"No",
style: TextStyle(color: Colors.green, fontSize: 16),
)),
TextButton(
onPressed: () {
Navigator.canPop(context) ? Navigator.pop(context) : Null;
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => JobInterviewDetails(
jobInterview: jobInterview,
),
),
);
},
child: const Text(
"Yes",
style: TextStyle(color: Colors.green, fontSize: 16),
)),
],
),
);
}
}
This diff is collapsed.
This diff is collapsed.
import 'package:flutter/material.dart';
import 'package:jobportal/UI/bottom_navigation_bar/jobseeker_bottom_navigation_bar.dart';
import '../../services/global_methods.dart';
import 'jobseeker_jobs_screen.dart';
import 'my_interviews_screen.dart';
class FavoritesScreen extends StatefulWidget {
const FavoritesScreen({super.key});
@override
State<FavoritesScreen> createState() => _FavoritesScreenState();
}
class _FavoritesScreenState extends State<FavoritesScreen> {
@override
Widget build(BuildContext context) {
return SafeArea(
child: Scaffold(
bottomNavigationBar: JobseekerBottomNavigationBar(
indexNum: 4,
),
backgroundColor: Colors.grey.shade300,
appBar: AppBar(
// flexibleSpace: Container(
// decoration: const BoxDecoration(
// gradient: LinearGradient(
// colors: [Colors.cyan, Colors.greenAccent],
// begin: Alignment.centerLeft,
// end: Alignment.centerRight,
// stops: [0.2, 0.9])),
// ),
backgroundColor: Colors.orange,
title: const Text("Favorites"),
centerTitle: true,
),
body: Container(
// decoration: const BoxDecoration(
// gradient: LinearGradient(
// colors: [Colors.cyan, Colors.greenAccent],
// begin: Alignment.centerLeft,
// end: Alignment.centerRight,
// stops: [0.2, 0.9])),
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
GestureDetector(
onTap: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => MyInterviewsScreen()));
},
child: GlobalMethods.userInfo(
myIcon: Icons.star, content: "My Interviews")),
GestureDetector(
onTap: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => const JobseekerJobsScreen()));
},
child: GlobalMethods.userInfo(
myIcon: Icons.star, content: "My Jobs")),
],
),
),
),
);
}
}
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
import 'package:flutter/material.dart';
class ForgetPassword extends StatefulWidget {
const ForgetPassword({super.key});
@override
State<ForgetPassword> createState() => _ForgetPasswordState();
}
class _ForgetPasswordState extends State<ForgetPassword> {
@override
Widget build(BuildContext context) {
return const Placeholder();
}
}
This diff is collapsed.
import 'package:flutter/material.dart';
import '../first_screen/main_screen.dart';
import '../jobseeker/create_cv.dart';
class Mainscreen extends StatefulWidget {
const Mainscreen({super.key});
@override
State<Mainscreen> createState() => _MainScreenState();
}
class _MainScreenState extends State<Mainscreen> {
@override
void initState() {
super.initState();
}
@override
void dispose() {
super.dispose();
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(body: MainScreen()),
);
}
}
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
class Company {
String id;
String name;
String phone;
String email;
String image;
String address;
String description;
Company(
{required this.id,
required this.name,
required this.phone,
required this.email,
required this.image,
required this.address,
required this.description});
}
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment