From 8eda6bb8ed6d981331c26400a4d824cb6613f2bd Mon Sep 17 00:00:00 2001 From: rasz Date: Thu, 2 Sep 2021 08:35:25 -0300 Subject: [PATCH] Initial commit --- .gitignore | 46 ++ .metadata | 10 + README.md | 28 ++ android/.gitignore | 13 + android/app/build.gradle | 68 +++ android/app/src/debug/AndroidManifest.xml | 52 ++ android/app/src/main/AndroidManifest.xml | 52 ++ .../app/src/main/ic_launcher-playstore.png | Bin 0 -> 14558 bytes .../kotlin/com/esms/android/MainActivity.kt | 6 + .../res/drawable-v21/launch_background.xml | 12 + .../res/drawable/ic_launcher_foreground.xml | 23 + .../main/res/drawable/launch_background.xml | 12 + .../res/mipmap-anydpi-v26/ic_launcher.xml | 5 + .../mipmap-anydpi-v26/ic_launcher_round.xml | 5 + .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 1927 bytes .../mipmap-hdpi/ic_launcher_foreground.png | Bin 0 -> 3697 bytes .../res/mipmap-hdpi/ic_launcher_round.png | Bin 0 -> 3881 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 1265 bytes .../mipmap-mdpi/ic_launcher_foreground.png | Bin 0 -> 2115 bytes .../res/mipmap-mdpi/ic_launcher_round.png | Bin 0 -> 2344 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 2724 bytes .../mipmap-xhdpi/ic_launcher_foreground.png | Bin 0 -> 5186 bytes .../res/mipmap-xhdpi/ic_launcher_round.png | Bin 0 -> 5590 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 4362 bytes .../mipmap-xxhdpi/ic_launcher_foreground.png | Bin 0 -> 8466 bytes .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 0 -> 8933 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 5790 bytes .../mipmap-xxxhdpi/ic_launcher_foreground.png | Bin 0 -> 10873 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 0 -> 12334 bytes .../app/src/main/res/values-night/styles.xml | 18 + .../res/values/ic_launcher_background.xml | 4 + android/app/src/main/res/values/styles.xml | 18 + android/app/src/profile/AndroidManifest.xml | 7 + android/build.gradle | 29 ++ android/gradle.properties | 3 + .../gradle/wrapper/gradle-wrapper.properties | 6 + android/settings.gradle | 11 + ios/.gitignore | 33 ++ ios/Flutter/AppFrameworkInfo.plist | 26 + ios/Flutter/Debug.xcconfig | 1 + ios/Flutter/Release.xcconfig | 1 + ios/Runner.xcodeproj/project.pbxproj | 472 ++++++++++++++++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + .../xcshareddata/xcschemes/Runner.xcscheme | 91 ++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + ios/Runner/AppDelegate.h | 6 + ios/Runner/AppDelegate.m | 13 + .../AppIcon.appiconset/Contents.json | 122 +++++ .../Icon-App-1024x1024@1x.png | Bin 0 -> 10932 bytes .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 0 -> 564 bytes .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 0 -> 1283 bytes .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 0 -> 1588 bytes .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 0 -> 1025 bytes .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 0 -> 1716 bytes .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 0 -> 1920 bytes .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 0 -> 1283 bytes .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 0 -> 1895 bytes .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 0 -> 2665 bytes .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 0 -> 2665 bytes .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 0 -> 3831 bytes .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 0 -> 1888 bytes .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 0 -> 3294 bytes .../Icon-App-83.5x83.5@2x.png | Bin 0 -> 3612 bytes .../LaunchImage.imageset/Contents.json | 23 + .../LaunchImage.imageset/LaunchImage.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/LaunchImage@2x.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/LaunchImage@3x.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/README.md | 5 + ios/Runner/Base.lproj/LaunchScreen.storyboard | 37 ++ ios/Runner/Base.lproj/Main.storyboard | 26 + ios/Runner/Info.plist | 45 ++ ios/Runner/main.m | 9 + lib/client.dart | 53 ++ lib/dbhandler.dart | 147 ++++++ lib/electronic.dart | 148 ++++++ lib/listEquipmentMain.dart | 181 +++++++ lib/main.dart | 25 + lib/mainScreen.dart | 123 +++++ lib/screens/aboutESMS.dart | 144 ++++++ lib/screens/alterClient.dart | 215 ++++++++ lib/screens/alterEquipment.dart | 364 ++++++++++++++ lib/screens/clientDetail.dart | 200 ++++++++ lib/screens/createClient.dart | 103 ++++ lib/screens/createEquipment.dart | 360 +++++++++++++ lib/screens/equipmentDetail.dart | 288 +++++++++++ lib/screens/listClients.dart | 210 ++++++++ lib/screens/listEquipment.dart | 236 +++++++++ lib/screens/listEquipmentByClient.dart | 283 +++++++++++ lib/screens/listEquipmentByID.dart | 236 +++++++++ lib/screens/listEquipmentDelivered.dart | 228 +++++++++ lib/screens/listRepairs.dart | 260 ++++++++++ lib/widgets/button_styles.dart | 13 + lib/widgets/widget_button.dart | 35 ++ lib/widgets/widget_caroussel.dart | 80 +++ lib/widgets/widget_generate.dart | 9 + lib/widgets/widget_input.dart | 441 ++++++++++++++++ local.properties | 8 + pubspec.lock | 411 +++++++++++++++ pubspec.yaml | 84 ++++ web/favicon.png | Bin 0 -> 917 bytes web/icons/Icon-192.png | Bin 0 -> 5292 bytes web/icons/Icon-512.png | Bin 0 -> 8252 bytes web/index.html | 98 ++++ web/manifest.json | 23 + 108 files changed, 6390 insertions(+) create mode 100644 .gitignore create mode 100644 .metadata create mode 100644 README.md create mode 100644 android/.gitignore create mode 100644 android/app/build.gradle create mode 100644 android/app/src/debug/AndroidManifest.xml create mode 100644 android/app/src/main/AndroidManifest.xml create mode 100644 android/app/src/main/ic_launcher-playstore.png create mode 100644 android/app/src/main/kotlin/com/esms/android/MainActivity.kt create mode 100644 android/app/src/main/res/drawable-v21/launch_background.xml create mode 100644 android/app/src/main/res/drawable/ic_launcher_foreground.xml create mode 100644 android/app/src/main/res/drawable/launch_background.xml create mode 100644 android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml create mode 100644 android/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png create mode 100644 android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png create mode 100644 android/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png create mode 100644 android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png create mode 100644 android/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png create mode 100644 android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png create mode 100644 android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png create mode 100644 android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png create mode 100644 android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png create mode 100644 android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png create mode 100644 android/app/src/main/res/values-night/styles.xml create mode 100644 android/app/src/main/res/values/ic_launcher_background.xml create mode 100644 android/app/src/main/res/values/styles.xml create mode 100644 android/app/src/profile/AndroidManifest.xml create mode 100644 android/build.gradle create mode 100644 android/gradle.properties create mode 100644 android/gradle/wrapper/gradle-wrapper.properties create mode 100644 android/settings.gradle create mode 100644 ios/.gitignore create mode 100644 ios/Flutter/AppFrameworkInfo.plist create mode 100644 ios/Flutter/Debug.xcconfig create mode 100644 ios/Flutter/Release.xcconfig create mode 100644 ios/Runner.xcodeproj/project.pbxproj create mode 100644 ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 ios/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 ios/Runner/AppDelegate.h create mode 100644 ios/Runner/AppDelegate.m create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png create mode 100644 ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json create mode 100644 ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png create mode 100644 ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png create mode 100644 ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png create mode 100644 ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md create mode 100644 ios/Runner/Base.lproj/LaunchScreen.storyboard create mode 100644 ios/Runner/Base.lproj/Main.storyboard create mode 100644 ios/Runner/Info.plist create mode 100644 ios/Runner/main.m create mode 100644 lib/client.dart create mode 100644 lib/dbhandler.dart create mode 100644 lib/electronic.dart create mode 100644 lib/listEquipmentMain.dart create mode 100644 lib/main.dart create mode 100644 lib/mainScreen.dart create mode 100644 lib/screens/aboutESMS.dart create mode 100644 lib/screens/alterClient.dart create mode 100644 lib/screens/alterEquipment.dart create mode 100644 lib/screens/clientDetail.dart create mode 100644 lib/screens/createClient.dart create mode 100644 lib/screens/createEquipment.dart create mode 100644 lib/screens/equipmentDetail.dart create mode 100644 lib/screens/listClients.dart create mode 100644 lib/screens/listEquipment.dart create mode 100644 lib/screens/listEquipmentByClient.dart create mode 100644 lib/screens/listEquipmentByID.dart create mode 100644 lib/screens/listEquipmentDelivered.dart create mode 100644 lib/screens/listRepairs.dart create mode 100644 lib/widgets/button_styles.dart create mode 100644 lib/widgets/widget_button.dart create mode 100644 lib/widgets/widget_caroussel.dart create mode 100644 lib/widgets/widget_generate.dart create mode 100644 lib/widgets/widget_input.dart create mode 100644 local.properties create mode 100644 pubspec.lock create mode 100644 pubspec.yaml create mode 100644 web/favicon.png create mode 100644 web/icons/Icon-192.png create mode 100644 web/icons/Icon-512.png create mode 100644 web/index.html create mode 100644 web/manifest.json diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0fa6b67 --- /dev/null +++ b/.gitignore @@ -0,0 +1,46 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.buildlog/ +.history +.svn/ + +# 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 +.packages +.pub-cache/ +.pub/ +/build/ + +# Web related +lib/generated_plugin_registrant.dart + +# 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 diff --git a/.metadata b/.metadata new file mode 100644 index 0000000..9db89cf --- /dev/null +++ b/.metadata @@ -0,0 +1,10 @@ +# 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: 7f1d1414cc5f0b0317272ced49a9c0b44e5c3af8 + channel: master + +project_type: app diff --git a/README.md b/README.md new file mode 100644 index 0000000..9321ff4 --- /dev/null +++ b/README.md @@ -0,0 +1,28 @@ +# ESMS +## Sistema de Gerenciamento para Técnicos em Eletrônica ou Informática +### Desenvolvido por: F. Raszeja, 2021 + +![Logo ESMS](android/app/src/main/ic_launcher-playstore.png) + +O sistema inclui: +1. Cadastro de Clientes +2. Registro de Aparelhos +3. Registro de Consertos Realizados + +Desenvolvido utilizando Flutter 2.7, com objetivo Apk funcional para Android + +---------------------------------------------------------------------------- +# EN-US +# ESMS +# Electronics Service Management System +### Author: F. Raszeja, 2021 + +![ESMS Logo](android/app/src/main/ic_launcher-playstore.png) + +Features: +1. View, Edit and Create Clients +2. View, Edit and Add stuff to repair +3. Once you're done, you can optionally register how the repair was made. + +This was made using Flutter 2.7, with the idea of having a working Apk file at the end. +It's all in Portuguese, currently. \ No newline at end of file diff --git a/android/.gitignore b/android/.gitignore new file mode 100644 index 0000000..6f56801 --- /dev/null +++ b/android/.gitignore @@ -0,0 +1,13 @@ +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 diff --git a/android/app/build.gradle b/android/app/build.gradle new file mode 100644 index 0000000..ba59e68 --- /dev/null +++ b/android/app/build.gradle @@ -0,0 +1,68 @@ +def localProperties = new Properties() +def localPropertiesFile = rootProject.file('local.properties') +if (localPropertiesFile.exists()) { + localPropertiesFile.withReader('UTF-8') { reader -> + localProperties.load(reader) + } +} + +def flutterRoot = localProperties.getProperty('flutter.sdk') +if (flutterRoot == null) { + throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.") +} + +def flutterVersionCode = localProperties.getProperty('flutter.versionCode') +if (flutterVersionCode == null) { + flutterVersionCode = '1' +} + +def flutterVersionName = localProperties.getProperty('flutter.versionName') +if (flutterVersionName == null) { + flutterVersionName = '1.0' +} + +apply plugin: 'com.android.application' +apply plugin: 'kotlin-android' +apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" + +android { + compileSdkVersion 30 + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + + kotlinOptions { + jvmTarget = '1.8' + } + + sourceSets { + main.java.srcDirs += 'src/main/kotlin' + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId "com.esms.android" + minSdkVersion 21 + targetSdkVersion 30 + 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 '../..' +} + +dependencies { + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" +} diff --git a/android/app/src/debug/AndroidManifest.xml b/android/app/src/debug/AndroidManifest.xml new file mode 100644 index 0000000..ea84811 --- /dev/null +++ b/android/app/src/debug/AndroidManifest.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..14293d9 --- /dev/null +++ b/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/android/app/src/main/ic_launcher-playstore.png b/android/app/src/main/ic_launcher-playstore.png new file mode 100644 index 0000000000000000000000000000000000000000..990882b78371bad49f0d27cf08b587ed3cd37de5 GIT binary patch literal 14558 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 literal 0 HcmV?d00001 diff --git a/android/app/src/main/kotlin/com/esms/android/MainActivity.kt b/android/app/src/main/kotlin/com/esms/android/MainActivity.kt new file mode 100644 index 0000000..9d5b35c --- /dev/null +++ b/android/app/src/main/kotlin/com/esms/android/MainActivity.kt @@ -0,0 +1,6 @@ +package com.esms.android + +import io.flutter.embedding.android.FlutterActivity + +class MainActivity: FlutterActivity() { +} diff --git a/android/app/src/main/res/drawable-v21/launch_background.xml b/android/app/src/main/res/drawable-v21/launch_background.xml new file mode 100644 index 0000000..304732f --- /dev/null +++ b/android/app/src/main/res/drawable-v21/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/android/app/src/main/res/drawable/ic_launcher_foreground.xml b/android/app/src/main/res/drawable/ic_launcher_foreground.xml new file mode 100644 index 0000000..879f603 --- /dev/null +++ b/android/app/src/main/res/drawable/ic_launcher_foreground.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/android/app/src/main/res/drawable/launch_background.xml b/android/app/src/main/res/drawable/launch_background.xml new file mode 100644 index 0000000..304732f --- /dev/null +++ b/android/app/src/main/res/drawable/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 0000000..036d09b --- /dev/null +++ b/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 0000000..036d09b --- /dev/null +++ b/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..4b3201d6d21220704dbc877ec865a72f264f7123 GIT binary patch literal 1927 zcmV;22YC32P)$hoi_R%6pd#h}(|{m}G`+SVR6)oMTVu!&Wp zAFOR`n$%JgL97}pY9m6aT3bPzq7+b|RawTT|7X}u)-42frN_+9n>?9ecIRcD-#+KN zGpkZ5LmA3YhBBl*NTpI!YO0H@1Ud~5oK2gYWc$HCs&1AOP)SKH6&JsT?KW)RA%kJ7 zq=c`z@7h_1+((9FK9LFv{O}K|9~2i8i(oKFUPN7rimE%In_ZAB{qupraEvGHEh;j~ zNm!>&z5X~TC-jb+=x>MXrDZ z=+skGM2(r5J5;7DZ7U$B+j{*6JeeE;u}(&80caQNY7Zcn*1WtA?3e4;NhmFqF`(L75(L41VMt|V4g#pVn}i!T`mAE8(%9%g7IgM33G3F8uyW1&{(r0i*y@04abJK#m9K^l1{7FDGHil0l^n?L~D;3f(O% zbRa<7S2Z+{P+vc&G^5E)j*g~hrc5FJy2d=`A9_8t=jT&LK>-;pjyqhldiT~XS_KQr z4G5r4z~};)TX}i3EG&#dM~$KcUthYqV1eTTYHewuCBVJw54s zS{i+wlti}yPF{fO>PXnUnS>1+`jv+D>uKYnMO2RN{RN!w2P=6lJe*veoM>NsJk9p; zp_d~f=yFyT#o@It5)@6<7dU!_L{W>05x|eO8!Z)B&7$ z4UjejV<xZ51_#pwypLUNJYvyW0AzpxTXp)Bqy)t74eGE|S zGEYsK^ialn=(}|Yzs7PYGm|a>ayep?vsz76^XJP85G(mZMh3kKILTwj(pb2U1{U;9 za`KSp?nG8AhBc{i`J3UQY-ybSWm8FW4BCn~!=HXIT;})zPXAWg)G~@&q@pW~jb4cB`%)Ki%Ry_A<#Go@c_b}4_ zeq_39nEN2+W^24}>8?@$^j&2oMFL8on;VtDJq{rY1!G@_%w$VV!$o6JP>|?efu{30 z6TSs2y<0ifX=@C>Q(Bwc1=9iuWv#7YFwUFE2Wuo=zuFL~_7x z9n4J~<*Vm&fWm><16IQweF6$j4)|ZqnhyF;eLBNwV-Ri)7mP^P3+%mYoku= z^Kq7@%a>{I+__Yb!txF>9oIVEaIbd}=(+uP3~dVk&1x{PMpW6-y8WfRyzdqkE9r&o zLs2(#`gA(7a3Q@8#bTg*4GPH$1X?YWFGBzhM-W#dGld|a>(R_|(;9`~Y+eicH77@` zdGhfZr~N|%b@)=cfr{OLmr~g^I8}3+=hV!-ST!nZ?$H(?&Tzb$h<$fwXNpESz>v5s zsO+aDsnTl66K=O`!i4@;8l?h=mo=UU4JECgpZJOIj*FvifT%Y z4RCl3h)aPcRLKL)%bhqn~ zg1$<*%hgIa&Tx!ML~WBYZk)|M+P?wlKYvz(mneQh3jYzYsmsa*hY67V&uX;h=gam! zY4hVy7c(;Kw;*)b+vWa1-RZQnopu8{m6rCTd9q$PS&!+FOkT&{A0NMpbv+v!>uT#m zz0Q!pU$V2$8%+~3C^-o0V(e>lFF?l-*45@88u+xVi~;!+1O%iY-Cp3E12|yv#8MV^ zE3Ua}Q&a15G@5kQag#0XWjRvA!rZV4g2Zf(iFxsGQqq1@v7e*lKUl5Rer73ER{K@` zyf&2g{1bDUwg>szSqIjIbzJsg+xN4BrcIAT{O`ejfZMD ze#0YHrE*R6@$rfE^74!J^z@gqunwXw(CMG}JrK1_L>bCZhB72E{sI)n^%GFUu-E_q N002ovPDHLkV1jL^iW2|; literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..6e1ffe5b9e1d5d7fba63a91f3b8c4aaf7f04ae3f GIT binary patch literal 3697 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 literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..b43a91238acbc164aa4be2b0fc70b00da5c95f05 GIT binary patch literal 2344 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 literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..f7a3839f88ba573788f21d9ec69d93254ecda45e GIT binary patch literal 5590 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
S8mVsBGIHh@H?& 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 literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..168f53c6a6f87726dd5c906a933ec754e409b3ab GIT binary patch literal 5790 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 literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..2096fc0f16377fba7ff16baf4620460582888274 GIT binary patch literal 10873 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 literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..e39db770c134a40a407919d265262854ecf22243 GIT binary patch literal 12334 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 + + + + + + diff --git a/android/app/src/main/res/values/ic_launcher_background.xml b/android/app/src/main/res/values/ic_launcher_background.xml new file mode 100644 index 0000000..627fe62 --- /dev/null +++ b/android/app/src/main/res/values/ic_launcher_background.xml @@ -0,0 +1,4 @@ + + + #FF5252 + \ No newline at end of file diff --git a/android/app/src/main/res/values/styles.xml b/android/app/src/main/res/values/styles.xml new file mode 100644 index 0000000..d74aa35 --- /dev/null +++ b/android/app/src/main/res/values/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/android/app/src/profile/AndroidManifest.xml b/android/app/src/profile/AndroidManifest.xml new file mode 100644 index 0000000..c61326e --- /dev/null +++ b/android/app/src/profile/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/android/build.gradle b/android/build.gradle new file mode 100644 index 0000000..ed45c65 --- /dev/null +++ b/android/build.gradle @@ -0,0 +1,29 @@ +buildscript { + ext.kotlin_version = '1.3.50' + repositories { + google() + mavenCentral() + } + + dependencies { + classpath 'com.android.tools.build:gradle:4.1.0' + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + } +} + +allprojects { + repositories { + google() + mavenCentral() + } +} + +rootProject.buildDir = '../build' +subprojects { + project.buildDir = "${rootProject.buildDir}/${project.name}" + project.evaluationDependsOn(':app') +} + +task clean(type: Delete) { + delete rootProject.buildDir +} diff --git a/android/gradle.properties b/android/gradle.properties new file mode 100644 index 0000000..94adc3a --- /dev/null +++ b/android/gradle.properties @@ -0,0 +1,3 @@ +org.gradle.jvmargs=-Xmx1536M +android.useAndroidX=true +android.enableJetifier=true diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..bc6a58a --- /dev/null +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Fri Jun 23 08:50:38 CEST 2017 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-all.zip diff --git a/android/settings.gradle b/android/settings.gradle new file mode 100644 index 0000000..44e62bc --- /dev/null +++ b/android/settings.gradle @@ -0,0 +1,11 @@ +include ':app' + +def localPropertiesFile = new File(rootProject.projectDir, "local.properties") +def properties = new Properties() + +assert localPropertiesFile.exists() +localPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) } + +def flutterSdkPath = properties.getProperty("flutter.sdk") +assert flutterSdkPath != null, "flutter.sdk not set in local.properties" +apply from: "$flutterSdkPath/packages/flutter_tools/gradle/app_plugin_loader.gradle" diff --git a/ios/.gitignore b/ios/.gitignore new file mode 100644 index 0000000..151026b --- /dev/null +++ b/ios/.gitignore @@ -0,0 +1,33 @@ +*.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 diff --git a/ios/Flutter/AppFrameworkInfo.plist b/ios/Flutter/AppFrameworkInfo.plist new file mode 100644 index 0000000..9367d48 --- /dev/null +++ b/ios/Flutter/AppFrameworkInfo.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + App + CFBundleIdentifier + io.flutter.flutter.app + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + App + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1.0 + MinimumOSVersion + 8.0 + + diff --git a/ios/Flutter/Debug.xcconfig b/ios/Flutter/Debug.xcconfig new file mode 100644 index 0000000..592ceee --- /dev/null +++ b/ios/Flutter/Debug.xcconfig @@ -0,0 +1 @@ +#include "Generated.xcconfig" diff --git a/ios/Flutter/Release.xcconfig b/ios/Flutter/Release.xcconfig new file mode 100644 index 0000000..592ceee --- /dev/null +++ b/ios/Flutter/Release.xcconfig @@ -0,0 +1 @@ +#include "Generated.xcconfig" diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj new file mode 100644 index 0000000..51195e2 --- /dev/null +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,472 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 978B8F6F1D3862AE00F588F7 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */; }; + 97C146F31CF9000F007C117D /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 97C146F21CF9000F007C117D /* main.m */; }; + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; +/* End PBXBuildFile section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 9705A1C41CF9048500538489 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; + 7AFFD8ED1D35381100E5BB4D /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; + 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; + 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; + 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; + 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 97C146F21CF9000F007C117D /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; + 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 97C146EB1CF9000F007C117D /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 9740EEB11CF90186004384FC /* Flutter */ = { + isa = PBXGroup; + children = ( + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, + 9740EEB21CF90195004384FC /* Debug.xcconfig */, + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, + 9740EEB31CF90195004384FC /* Generated.xcconfig */, + ); + name = Flutter; + sourceTree = ""; + }; + 97C146E51CF9000F007C117D = { + isa = PBXGroup; + children = ( + 9740EEB11CF90186004384FC /* Flutter */, + 97C146F01CF9000F007C117D /* Runner */, + 97C146EF1CF9000F007C117D /* Products */, + CF3B75C9A7D2FA2A4C99F110 /* Frameworks */, + ); + sourceTree = ""; + }; + 97C146EF1CF9000F007C117D /* Products */ = { + isa = PBXGroup; + children = ( + 97C146EE1CF9000F007C117D /* Runner.app */, + ); + name = Products; + sourceTree = ""; + }; + 97C146F01CF9000F007C117D /* Runner */ = { + isa = PBXGroup; + children = ( + 7AFFD8ED1D35381100E5BB4D /* AppDelegate.h */, + 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */, + 97C146FA1CF9000F007C117D /* Main.storyboard */, + 97C146FD1CF9000F007C117D /* Assets.xcassets */, + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, + 97C147021CF9000F007C117D /* Info.plist */, + 97C146F11CF9000F007C117D /* Supporting Files */, + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, + ); + path = Runner; + sourceTree = ""; + }; + 97C146F11CF9000F007C117D /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 97C146F21CF9000F007C117D /* main.m */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 97C146ED1CF9000F007C117D /* Runner */ = { + isa = PBXNativeTarget; + buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; + buildPhases = ( + 9740EEB61CF901F6004384FC /* Run Script */, + 97C146EA1CF9000F007C117D /* Sources */, + 97C146EB1CF9000F007C117D /* Frameworks */, + 97C146EC1CF9000F007C117D /* Resources */, + 9705A1C41CF9048500538489 /* Embed Frameworks */, + 3B06AD1E1E4923F5004D2608 /* Thin Binary */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Runner; + productName = Runner; + productReference = 97C146EE1CF9000F007C117D /* Runner.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 97C146E61CF9000F007C117D /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 1020; + ORGANIZATIONNAME = ""; + TargetAttributes = { + 97C146ED1CF9000F007C117D = { + CreatedOnToolsVersion = 7.3.1; + }; + }; + }; + buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 97C146E51CF9000F007C117D; + productRefGroup = 97C146EF1CF9000F007C117D /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 97C146ED1CF9000F007C117D /* Runner */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 97C146EC1CF9000F007C117D /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Thin Binary"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; + }; + 9740EEB61CF901F6004384FC /* Run Script */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Run Script"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 97C146EA1CF9000F007C117D /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 978B8F6F1D3862AE00F588F7 /* AppDelegate.m in Sources */, + 97C146F31CF9000F007C117D /* main.m in Sources */, + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 97C146FA1CF9000F007C117D /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 97C146FB1CF9000F007C117D /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 97C147001CF9000F007C117D /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 249021D3217E4FDB00AE95B9 /* Profile */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Profile; + }; + 249021D4217E4FDB00AE95B9 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.esms.android; + PRODUCT_NAME = "$(TARGET_NAME)"; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Profile; + }; + 97C147031CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 97C147041CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 97C147061CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.esms.android; + PRODUCT_NAME = "$(TARGET_NAME)"; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Debug; + }; + 97C147071CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.esms.android; + PRODUCT_NAME = "$(TARGET_NAME)"; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97C147031CF9000F007C117D /* Debug */, + 97C147041CF9000F007C117D /* Release */, + 249021D3217E4FDB00AE95B9 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97C147061CF9000F007C117D /* Debug */, + 97C147071CF9000F007C117D /* Release */, + 249021D4217E4FDB00AE95B9 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 97C146E61CF9000F007C117D /* Project object */; +} diff --git a/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..919434a --- /dev/null +++ b/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 0000000..f9b0d7c --- /dev/null +++ b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 0000000..a28140c --- /dev/null +++ b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ios/Runner.xcworkspace/contents.xcworkspacedata b/ios/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..1d526a1 --- /dev/null +++ b/ios/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 0000000..f9b0d7c --- /dev/null +++ b/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/ios/Runner/AppDelegate.h b/ios/Runner/AppDelegate.h new file mode 100644 index 0000000..36e21bb --- /dev/null +++ b/ios/Runner/AppDelegate.h @@ -0,0 +1,6 @@ +#import +#import + +@interface AppDelegate : FlutterAppDelegate + +@end diff --git a/ios/Runner/AppDelegate.m b/ios/Runner/AppDelegate.m new file mode 100644 index 0000000..70e8393 --- /dev/null +++ b/ios/Runner/AppDelegate.m @@ -0,0 +1,13 @@ +#import "AppDelegate.h" +#import "GeneratedPluginRegistrant.h" + +@implementation AppDelegate + +- (BOOL)application:(UIApplication *)application + didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { + [GeneratedPluginRegistrant registerWithRegistry:self]; + // Override point for customization after application launch. + return [super application:application didFinishLaunchingWithOptions:launchOptions]; +} + +@end diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..d36b1fa --- /dev/null +++ b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,122 @@ +{ + "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" + } +} diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..dc9ada4725e9b0ddb1deab583e5b5102493aa332 GIT binary patch literal 10932 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 literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..f091b6b0bca859a3f474b03065bef75ba58a9e4c GIT binary patch literal 1588 zcmV-42Fv-0P)C1SqPt}wig>|5Crh^=oyX$BK<}M8eLU3e2hGT;=G|!_SP)7zNI6fqUMB=)y zRAZ>eDe#*r`yDAVgB_R*LB*MAc)8(b{g{9McCXW!lq7r(btRoB9!8B-#AI6JMb~YFBEvdsV)`mEQO^&#eRKx@b&x- z5lZm*!WfD8oCLzfHGz#u7sT0^VLMI1MqGxF^v+`4YYnVYgk*=kU?HsSz{v({E3lb9 z>+xILjBN)t6`=g~IBOelGQ(O990@BfXf(DRI5I$qN$0Gkz-FSc$3a+2fX$AedL4u{ z4V+5Ong(9LiGcIKW?_352sR;LtDPmPJXI{YtT=O8=76o9;*n%_m|xo!i>7$IrZ-{l z-x3`7M}qzHsPV@$v#>H-TpjDh2UE$9g6sysUREDy_R(a)>=eHw-WAyfIN z*qb!_hW>G)Tu8nSw9yn#3wFMiLcfc4pY0ek1}8(NqkBR@t4{~oC>ryc-h_ByH(Cg5 z>ao-}771+xE3um9lWAY1FeQFxowa1(!J(;Jg*wrg!=6FdRX+t_<%z&d&?|Bn){>zm zZQj(aA_HeBY&OC^jj*)N`8fa^ePOU72VpInJoI1?`ty#lvlNzs(&MZX+R%2xS~5Kh zX*|AU4QE#~SgPzOXe9>tRj>hjU@c1k5Y_mW*Jp3fI;)1&g3j|zDgC+}2Q_v%YfDax z!?umcN^n}KYQ|a$Lr+51Nf9dkkYFSjZZjkma$0KOj+;aQ&721~t7QUKx61J3(P4P1 zstI~7-wOACnWP4=8oGOwz%vNDqD8w&Q`qcNGGrbbf&0s9L0De{4{mRS?o0MU+nR_! zrvshUau0G^DeMhM_v{5BuLjb#Hh@r23lDAk8oF(C+P0rsBpv85EP>4CVMx#04MOfG z;P%vktHcXwTj~+IE(~px)3*MY77e}p#|c>TD?sMatC0Tu4iKKJ0(X8jxQY*gYtxsC z(zYC$g|@+I+kY;dg_dE>scBf&bP1Nc@Hz<3R)V`=AGkc;8CXqdi=B4l2k|g;2%#m& z*jfX^%b!A8#bI!j9-0Fi0bOXl(-c^AB9|nQaE`*)Hw+o&jS9@7&Gov#HbD~#d{twV zXd^Tr^mWLfFh$@Dr$e;PBEz4(-2q1FF0}c;~B5sA}+Q>TOoP+t>wf)V9Iy=5ruQa;z)y zI9C9*oUga6=hxw6QasLPnee@3^Rr*M{CdaL5=R41nLs(AHk_=Y+A9$2&H(B7!_pURs&8aNw7?`&Z&xY_Ye z)~D5Bog^td-^QbUtkTirdyK^mTHAOuptDflut!#^lnKqU md>ggs(5nOWAqO?umG&QVYK#ibz}*4>0000U6E9hRK9^#O7(mu>ETqrXGsduA8$)?`v2seloOCza43C{NQ$$gAOH**MCn0Q?+L7dl7qnbRdqZ8LSVp1ItDxhxD?t@5_yHg6A8yI zC*%Wgg22K|8E#!~cTNYR~@Y9KepMPrrB8cABapAFa=`H+UGhkXUZV1GnwR1*lPyZ;*K(i~2gp|@bzp8}og7e*#% zEnr|^CWdVV!-4*Y_7rFvlww2Ze+>j*!Z!pQ?2l->4q#nqRu9`ELo6RMS5=br47g_X zRw}P9a7RRYQ%2Vsd0Me{_(EggTnuN6j=-?uFS6j^u69elMypu?t>op*wBx<=Wx8?( ztpe^(fwM6jJX7M-l*k3kEpWOl_Vk3@(_w4oc}4YF4|Rt=2V^XU?#Yz`8(e?aZ@#li0n*=g^qOcVpd-Wbok=@b#Yw zqn8u9a)z>l(1kEaPYZ6hwubN6i<8QHgsu0oE) ziJ(p;Wxm>sf!K+cw>R-(^Y2_bahB+&KI9y^);#0qt}t-$C|Bo71lHi{_+lg#f%RFy z0um=e3$K3i6K{U_4K!EX?F&rExl^W|G8Z8;`5z-k}OGNZ0#WVb$WCpQu-_YsiqKP?BB# vzVHS-CTUF4Ozn5G+mq_~Qqto~ahA+K`|lyv3(-e}00000NkvXXu0mjfd`9t{ literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..d0ef06e7edb86cdfe0d15b4b0d98334a86163658 GIT binary patch literal 1716 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 literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..c8f9ed8f5cee1c98386d13b17e89f719e83555b2 GIT binary patch literal 1895 zcmV-t2blPYP)FQtfgmafE#=YDCq`qUBt#QpG%*H6QHY765~R=q zZ6iudfM}q!Pz#~9JgOi8QJ|DSu?1-*(kSi1K4#~5?#|rh?sS)(-JQqX*}ciXJ56_H zdw=^s_srbAdqxlvGyrgGet#6T7_|j;95sL%MtM;q86vOxKM$f#puR)Bjv9Zvz9-di zXOTSsZkM83)E9PYBXC<$6(|>lNLVBb&&6y{NByFCp%6+^ALR@NCTse_wqvNmSWI-m z!$%KlHFH2omF!>#%1l3LTZg(s7eof$7*xB)ZQ0h?ejh?Ta9fDv59+u#MokW+1t8Zb zgHv%K(u9G^Lv`lh#f3<6!JVTL3(dCpxHbnbA;kKqQyd1~^Xe0VIaYBSWm6nsr;dFj z4;G-RyL?cYgsN1{L4ZFFNa;8)Rv0fM0C(~Tkit94 zz#~A)59?QjD&pAPSEQ)p8gP|DS{ng)j=2ux)_EzzJ773GmQ_Cic%3JJhC0t2cx>|v zJcVusIB!%F90{+}8hG3QU4KNeKmK%T>mN57NnCZ^56=0?&3@!j>a>B43pi{!u z7JyDj7`6d)qVp^R=%j>UIY6f+3`+qzIc!Y_=+uN^3BYV|o+$vGo-j-Wm<10%A=(Yk^beI{t%ld@yhKjq0iNjqN4XMGgQtbKubPM$JWBz}YA65k%dm*awtC^+f;a-x4+ddbH^7iDWGg&N0n#MW{kA|=8iMUiFYvMoDY@sPC#t$55gn6ykUTPAr`a@!(;np824>2xJthS z*ZdmT`g5-`BuJs`0LVhz+D9NNa3<=6m;cQLaF?tCv8)zcRSh66*Z|vXhG@$I%U~2l z?`Q zykI#*+rQ=z6Jm=Bui-SfpDYLA=|vzGE(dYm=OC8XM&MDo7ux4UF1~0J1+i%aCUpRe zt3L_uNyQ*cE(38Uy03H%I*)*Bh=Lb^Xj3?I^Hnbeq72(EOK^Y93CNp*uAA{5Lc=ky zx=~RKa4{iTm{_>_vSCm?$Ej=i6@=m%@VvAITnigVg{&@!7CDgs908761meDK5azA} z4?=NOH|PdvabgJ&fW2{Mo$Q0CcD8Qc84%{JPYt5EiG{MdLIAeX%T=D7NIP4%Hw}p9 zg)==!2Lbp#j{u_}hMiao9=!VSyx0gHbeCS`;q&vzeq|fs`y&^X-lso(Ls@-706qmA z7u*T5PMo_w3{se1t2`zWeO^hOvTsohG_;>J0wVqVe+n)AbQCx)yh9;w+J6?NF5Lmo zecS@ieAKL8%bVd@+-KT{yI|S}O>pYckUFs;ry9Ow$CD@ztz5K-*D$^{i(_1llhSh^ zEkL$}tsQt5>QA^;QgjgIfBDmcOgi5YDyu?t6vSnbp=1+@6D& z5MJ}B8q;bRlVoxasyhcUF1+)o`&3r0colr}QJ3hcSdLu;9;td>kf@Tcn<@9sIx&=m z;AD;SCh95=&p;$r{Xz3iWCO^MX83AGJ(yH&eTXgv|0=34#-&WAmw{)U7OU9!Wz^!7 zZ%jZFi@JR;>Mhi7S>V7wQ176|FdW2m?&`qa(ScO^CFPR80HucLHOTy%5s*HR0^8)i h0WYBP*#0Ks^FNSabJA*5${_#%002ovPDHLkV1oKhTl@e3 literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..a6d6b8609df07bf62e5100a53a01510388bd2b22 GIT binary patch literal 2665 zcmV-v3YPVWP)oFh3q0MFesq&64WThn3$;G69TfjsAv=f2G9}p zgSx99+!YV6qME!>9MD13x)k(+XE7W?_O4LoLb5ND8 zaV{9+P@>42xDfRiYBMSgD$0!vssptcb;&?u9u(LLBKmkZ>RMD=kvD3h`sk6!QYtBa ztlZI#nu$8lJ^q2Z79UTgZe>BU73(Aospiq+?SdMt8lDZ;*?@tyWVZVS_Q7S&*tJaiRlJ z+aSMOmbg3@h5}v;A*c8SbqM3icg-`Cnwl;7Ts%A1RkNIp+Txl-Ckkvg4oxrqGA5ewEgYqwtECD<_3Egu)xGllKt&J8g&+=ac@Jq4-?w6M3b*>w5 z69N3O%=I^6&UL5gZ!}trC7bUj*12xLdkNs~Bz4QdJJ*UDZox2UGR}SNg@lmOvhCc~ z*f_UeXv(=#I#*7>VZx2ObEN~UoGUTl=-@)E;YtCRZ>SVp$p9yG5hEFZ!`wI!spd)n zSk+vK0Vin7FL{7f&6OB%f;SH22dtbcF<|9fi2Fp%q4kxL!b1#l^)8dUwJ zwEf{(wJj@8iYDVnKB`eSU+;ml-t2`@%_)0jDM`+a46xhDbBj2+&Ih>1A>6aky#(-SYyE{R3f#y57wfLs z6w1p~$bp;6!9DX$M+J~S@D6vJAaElETnsX4h9a5tvPhC3L@qB~bOzkL@^z0k_hS{T4PF*TDrgdXp+dzsE? z>V|VR035Pl9n5&-RePFdS{7KAr2vPOqR9=M$vXA1Yy5>w;EsF`;OK{2pkn-kpp9Pw z)r;5JfJKKaT$4qCb{TaXHjb$QA{y0EYy*+b1XI;6Ah- zw13P)xT`>~eFoJC!>{2XL(a_#upp3gaR1#5+L(Jmzp4TBnx{~WHedpJ1ch8JFk~Sw z>F+gN+i+VD?gMXwcIhn8rz`>e>J^TI3E-MW>f}6R-pL}>WMOa0k#jN+`RyUVUC;#D zg|~oS^$6%wpF{^Qr+}X>0PKcr3Fc&>Z>uv@C);pwDs@2bZWhYP!rvGx?_|q{d`t<*XEb#=aOb=N+L@CVBGqImZf&+a zCQEa3$~@#kC);pasdG=f6tuIi0PO-y&tvX%>Mv=oY3U$nD zJ#gMegnQ46pq+3r=;zmgcG+zRc9D~c>z+jo9&D+`E6$LmyFqlmCYw;-Zooma{sR@~ z)_^|YL1&&@|GXo*pivH7k!msl+$Sew3%XJnxajt0K%3M6Bd&YFNy9}tWG^aovK2eX z1aL1%7;KRDrA@eG-Wr6w+;*H_VD~qLiVI`{_;>o)k`{8xa3EJT1O_>#iy_?va0eR? zDV=N%;Zjb%Z2s$@O>w@iqt!I}tLjGk!=p`D23I}N4Be@$(|iSA zf3Ih7b<{zqpDB4WF_5X1(peKe+rASze%u8eKLn#KKXt;UZ+Adf$_TO+vTqshLLJ5c z52HucO=lrNVae5XWOLm!V@n-ObU11!b+DN<$RuU+YsrBq*lYT;?AwJpmNKniF0Q1< zJCo>Q$=v$@&y=sj6{r!Y&y&`0$-I}S!H_~pI&2H8Z1C|BX4VgZ^-! zje3-;x0PBD!M`v*J_)rL^+$<1VJhH*2Fi~aA7s&@_rUHYJ9zD=M%4AFQ`}k8OC$9s XsPq=LnkwKG00000NkvXXu0mjfhAk5^ literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..a6d6b8609df07bf62e5100a53a01510388bd2b22 GIT binary patch literal 2665 zcmV-v3YPVWP)oFh3q0MFesq&64WThn3$;G69TfjsAv=f2G9}p zgSx99+!YV6qME!>9MD13x)k(+XE7W?_O4LoLb5ND8 zaV{9+P@>42xDfRiYBMSgD$0!vssptcb;&?u9u(LLBKmkZ>RMD=kvD3h`sk6!QYtBa ztlZI#nu$8lJ^q2Z79UTgZe>BU73(Aospiq+?SdMt8lDZ;*?@tyWVZVS_Q7S&*tJaiRlJ z+aSMOmbg3@h5}v;A*c8SbqM3icg-`Cnwl;7Ts%A1RkNIp+Txl-Ckkvg4oxrqGA5ewEgYqwtECD<_3Egu)xGllKt&J8g&+=ac@Jq4-?w6M3b*>w5 z69N3O%=I^6&UL5gZ!}trC7bUj*12xLdkNs~Bz4QdJJ*UDZox2UGR}SNg@lmOvhCc~ z*f_UeXv(=#I#*7>VZx2ObEN~UoGUTl=-@)E;YtCRZ>SVp$p9yG5hEFZ!`wI!spd)n zSk+vK0Vin7FL{7f&6OB%f;SH22dtbcF<|9fi2Fp%q4kxL!b1#l^)8dUwJ zwEf{(wJj@8iYDVnKB`eSU+;ml-t2`@%_)0jDM`+a46xhDbBj2+&Ih>1A>6aky#(-SYyE{R3f#y57wfLs z6w1p~$bp;6!9DX$M+J~S@D6vJAaElETnsX4h9a5tvPhC3L@qB~bOzkL@^z0k_hS{T4PF*TDrgdXp+dzsE? z>V|VR035Pl9n5&-RePFdS{7KAr2vPOqR9=M$vXA1Yy5>w;EsF`;OK{2pkn-kpp9Pw z)r;5JfJKKaT$4qCb{TaXHjb$QA{y0EYy*+b1XI;6Ah- zw13P)xT`>~eFoJC!>{2XL(a_#upp3gaR1#5+L(Jmzp4TBnx{~WHedpJ1ch8JFk~Sw z>F+gN+i+VD?gMXwcIhn8rz`>e>J^TI3E-MW>f}6R-pL}>WMOa0k#jN+`RyUVUC;#D zg|~oS^$6%wpF{^Qr+}X>0PKcr3Fc&>Z>uv@C);pwDs@2bZWhYP!rvGx?_|q{d`t<*XEb#=aOb=N+L@CVBGqImZf&+a zCQEa3$~@#kC);pasdG=f6tuIi0PO-y&tvX%>Mv=oY3U$nD zJ#gMegnQ46pq+3r=;zmgcG+zRc9D~c>z+jo9&D+`E6$LmyFqlmCYw;-Zooma{sR@~ z)_^|YL1&&@|GXo*pivH7k!msl+$Sew3%XJnxajt0K%3M6Bd&YFNy9}tWG^aovK2eX z1aL1%7;KRDrA@eG-Wr6w+;*H_VD~qLiVI`{_;>o)k`{8xa3EJT1O_>#iy_?va0eR? zDV=N%;Zjb%Z2s$@O>w@iqt!I}tLjGk!=p`D23I}N4Be@$(|iSA zf3Ih7b<{zqpDB4WF_5X1(peKe+rASze%u8eKLn#KKXt;UZ+Adf$_TO+vTqshLLJ5c z52HucO=lrNVae5XWOLm!V@n-ObU11!b+DN<$RuU+YsrBq*lYT;?AwJpmNKniF0Q1< zJCo>Q$=v$@&y=sj6{r!Y&y&`0$-I}S!H_~pI&2H8Z1C|BX4VgZ^-! zje3-;x0PBD!M`v*J_)rL^+$<1VJhH*2Fi~aA7s&@_rUHYJ9zD=M%4AFQ`}k8OC$9s XsPq=LnkwKG00000NkvXXu0mjfhAk5^ literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..75b2d164a5a98e212cca15ea7bf2ab5de5108680 GIT binary patch literal 3831 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 literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..c4df70d39da7941ef3f6dcb7f06a192d8dcb308d GIT binary patch literal 1888 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 iW8Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838 GIT binary patch literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838 GIT binary patch literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md new file mode 100644 index 0000000..89c2725 --- /dev/null +++ b/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md @@ -0,0 +1,5 @@ +# 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 diff --git a/ios/Runner/Base.lproj/LaunchScreen.storyboard b/ios/Runner/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 0000000..f2e259c --- /dev/null +++ b/ios/Runner/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ios/Runner/Base.lproj/Main.storyboard b/ios/Runner/Base.lproj/Main.storyboard new file mode 100644 index 0000000..f3c2851 --- /dev/null +++ b/ios/Runner/Base.lproj/Main.storyboard @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist new file mode 100644 index 0000000..d034759 --- /dev/null +++ b/ios/Runner/Info.plist @@ -0,0 +1,45 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + esms_project + CFBundlePackageType + APPL + CFBundleShortVersionString + $(FLUTTER_BUILD_NAME) + CFBundleSignature + ???? + CFBundleVersion + $(FLUTTER_BUILD_NUMBER) + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UIViewControllerBasedStatusBarAppearance + + + diff --git a/ios/Runner/main.m b/ios/Runner/main.m new file mode 100644 index 0000000..dff6597 --- /dev/null +++ b/ios/Runner/main.m @@ -0,0 +1,9 @@ +#import +#import +#import "AppDelegate.h" + +int main(int argc, char* argv[]) { + @autoreleasepool { + return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); + } +} diff --git a/lib/client.dart b/lib/client.dart new file mode 100644 index 0000000..9318d26 --- /dev/null +++ b/lib/client.dart @@ -0,0 +1,53 @@ +import 'dbhandler.dart'; + +class Client{ + final String name, + telephone, + cellular, + observations; + int id, status, enabled; + Client(this.name, this.telephone, this.cellular, this.observations); + + final dbHandler dbh = dbHandler.instance; + + Client.fromJson(Map jsona) + :id= int.tryParse(jsona['id'].toString()), + name = jsona['name'], + cellular = jsona['cellular'], + telephone = jsona['telephone'], + observations = jsona['observations']; + + Map toJson() => + { + 'name':name, + 'cellular':cellular, + 'telephone':telephone, + 'observations':observations + }; + + void SaveToDB() async + { + Future t = dbh.insert(this.toJson(),"client"); + t.then((int value){ + this.id = value; + return value; + }); + } + + Future LoadFromDB(int num) async{ + List> eq = await dbh.queryByID("client", num); + return Client.fromJson(eq[0]); + } + UpdateDB(int num) + { + dbh.update(this.toJson(), num, "client").then((value){ + status = 1; + },onError: (object){ + status = 0; + }); + } + Future RemoveDB(int num) async + { + return await dbh.delete(num, "client"); + } +} \ No newline at end of file diff --git a/lib/dbhandler.dart b/lib/dbhandler.dart new file mode 100644 index 0000000..2c392ba --- /dev/null +++ b/lib/dbhandler.dart @@ -0,0 +1,147 @@ +import 'dart:io'; +import 'package:path/path.dart'; +import 'package:path_provider/path_provider.dart'; +import 'package:sqflite/sqflite.dart'; + +class dbHandler{ + static final _dbname = "elec.db"; + static final _dbver = 1; + + dbHandler._privateConstructor(); + static final dbHandler instance = dbHandler._privateConstructor(); + + static Database _db; + + Future get database async{ + if(_db != null) return _db; + _db = await _initDB(); + return _db; + } + + _initDB() async{ + Directory docsDirectory = await getApplicationDocumentsDirectory(); + String path = join(docsDirectory.path,_dbname); + return await openDatabase(path, + version: _dbver, + onCreate: _onCreate + ); + } + + Future _onCreate(Database db, int version) async{ + Batch batch = db.batch(); + batch.execute( + "CREATE TABLE IF NOT EXISTS client ( " + "id INTEGER PRIMARY KEY, " + "name TEXT NOT NULL, " + "cellular TEXT, " + "telephone TEXT, " + "observations TEXT);" + ); + batch.execute( + "CREATE TABLE IF NOT EXISTS equipment (" + "id INTEGER PRIMARY KEY AUTOINCREMENT," + "client_id INTEGER NOT NULL," + "name TEXT NOT NULL," + "problem TEXT NOT NULL," + "observation TEXT NOT NULL," + "images TEXT," + "dateInput TEXT NOT NULL," + "dateExit TEXT," + "isDelivered BOOLEAN NOT NULL); " + ); + batch.execute("CREATE TABLE IF NOT EXISTS repair(" + "id INTEGER PRIMARY KEY AUTOINCREMENT," + "eq_id INTEGER NOT NULL," + "repair TEXT NOT NULL);" + ); + batch.execute( + "CREATE VIEW v_repair " + "AS SELECT r.id as repair_id, " + "eq.id as id, " + "eq.name as name," + "r.repair as repair " + "FROM repair r INNER JOIN equipment eq " + "WHERE eq.id = r.eq_id" + ); + batch.execute("CREATE VIEW v_equipment " + "AS SELECT cli.id as client_id, " + "cli.name as name, " + "eq.id as id, " + "eq.name as equipment, " + "eq.problem as problem, " + "eq.observation as observation, " + "eq.images as images, " + "eq.dateInput as dateInput, " + "eq.dateExit as dateExit, " + "eq.isDelivered as isDelivered " + "FROM client cli INNER JOIN equipment eq " + "WHERE cli.id = eq.client_id"); + List res = await batch.commit(); + } + + Future insert(Map row, String table) async + { + Database db = await instance.database; + return await db.insert(table, row); + } + + Future>> queryAllRows(String table) async{ + Database db = await instance.database; + return await db.query(table); + } + + Future>> queryOrdered(String table, String order, String val) async{ + Database db = await instance.database; + return await db.query(table, orderBy: val+' '+order); + } + + Future>> queryAllEquipment() async{ + Database db = await instance.database; + return await db.query("v_equipment", orderBy: 'equipment ASC', where: 'isDelivered = 0'); + } + + Future>> queryAllEquipmentDelivered() async{ + Database db = await instance.database; + return await db.query("v_equipment", orderBy: 'equipment ASC', where: 'isDelivered = 1'); + } + + Future>> queryRepair(String name) async{ + Database db = await instance.database; + return await db.query("v_repair", where: 'name LIKE ?', whereArgs: ['%$name%'], orderBy: 'name ASC'); + } + + Future>> queryEquipment(String equipment) async{ + Database db = await instance.database; + return await db.query("v_equipment", where: 'equipment LIKE ?', whereArgs: ['%$equipment%'], orderBy: 'equipment ASC'); + } + + Future>> queryClient(String name) async{ + Database db = await instance.database; + return await db.query("client", where: 'name LIKE ?', whereArgs: ['%$name%'], orderBy: 'name ASC'); + } + + Future>> queryEquipmentClient(int client_id) async{ + Database db = await instance.database; + return await db.query("v_equipment", where: 'client_id = ?', whereArgs: [client_id]); + } + + Future>> queryByID(String table, int id) async { + Database db = await instance.database; + return await db.query(table, where: 'id = ?', whereArgs: [id]); + } + + Future>> queryByName(String table, String name) async { + Database db = await instance.database; + return await db.query(table, where: 'name LIKE ?', whereArgs: ['%$name%']); + } + + Future update(Map row, int id, String table) async{ + Database db = await instance.database; + return await db.update(table,row, where: 'id = ?', whereArgs: [id]); + } + + Future delete(int id, String table) async{ + Database db = await instance.database; + return await db.delete(table, where: 'id = ?', whereArgs: [id]); + } +} \ No newline at end of file diff --git a/lib/electronic.dart b/lib/electronic.dart new file mode 100644 index 0000000..186305d --- /dev/null +++ b/lib/electronic.dart @@ -0,0 +1,148 @@ +// Objetivo: Classe p/ guardar eletrônicos +// Nome +// Cliente (outra classe) +// Descrição do problema +// Observações +// Data da Entrada +// Data da Saída +// Foto(s) do aparelho +import 'dbhandler.dart'; + +class Repair{ + int id, status; + final int eq_id; + final repair; + Repair(this.eq_id,this.repair); + + final dbHandler dbh = dbHandler.instance; + + Map toJson() =>{ + 'eq_id': eq_id, + 'repair': repair + }; + Repair.fromView(Map jsona) + : + id = jsona['repair_id'], + eq_id = jsona['id'], + repair = jsona['repair']; + + Repair.fromJson(Map jsona) + : + eq_id = jsona['eq_id'], + repair = jsona['repair']; + + int SaveToDB() { + Future t = dbh.insert(this.toJson(), "repair"); + t.then((int value) { + this.id = value; + status = 1; + },onError: (object){ + status = 0; + }); + } + + Future LoadFromDB(int num) async { + dbh.queryByID("repair", num).then((List> value){ + return Repair.fromJson(value[0]); + } + ); + } + + UpdateDB(int num) { + dbh.update(this.toJson(), num, "repair").then((value){ + status = 1; + },onError: (object){ + status = 0; + }); + } + + RemoveDB(int num) { + dbh.delete(num, "repair").then((value){ + status = 1; + }, onError: (object){ + status = 0; + }); + } +} + +class Equipment { + int id, status; + final int client_id; + final String name, problem, observation; + final DateTime dateInput; + DateTime dateExit; + List images = []; + int isDelivered = 0; + Equipment(this.client_id, this.name, this.problem, this.observation, + this.dateInput); + + final dbHandler dbh = dbHandler.instance; + + Map toJson() => { + 'client_id': client_id, + 'name': name, + 'problem': problem, + 'observation': observation, + 'dateInput': dateInput.toString(), + 'dateExit': dateExit.toString(), + 'images': images.toString(), + 'isDelivered': isDelivered + }; + + Equipment.fromJson(Map jsona) + : id = jsona['id'], + client_id = jsona['client_id'], + name = jsona['name'], + problem = jsona['problem'], + observation = jsona['observation'], + dateInput = DateTime.tryParse(jsona['dateInput']), + dateExit = DateTime.tryParse(jsona['dateExit']), + images = jsona['images'].toString().substring(1,jsona['images'].length-1).split(',').toList(), + isDelivered = int.tryParse(jsona['isDelivered'].toString()); + + void AddImage(String image) { + images.add(image); + } + + void AddImageAsRange(List imageL) { + images.addAll(imageL); + } + + void EquipmentLeave(DateTime time) { + dateExit = time; + isDelivered = 1; + } + + int SaveToDB() { + Future t = dbh.insert(this.toJson(), "equipment"); + t.then((int value) { + this.id = value; + status = 1; + }, onError: (value) { + status = 0; + }); + } + + Future LoadFromDB(int num) async { + dbh.queryByID("equipment", num).then((List> value){ + return Equipment.fromJson(value[0]); + } + ); + } + + UpdateDB(int num) { + dbh.update(this.toJson(), num, "equipment").then((value){ + status = 1; + },onError: (object){ + status = 0; + }); + } + + RemoveDB(int num) { + dbh.delete(num, "equipment").then((value){ + status = 1; + }, onError: (object){ + status = 0; + }); + } +} diff --git a/lib/listEquipmentMain.dart b/lib/listEquipmentMain.dart new file mode 100644 index 0000000..6f18e11 --- /dev/null +++ b/lib/listEquipmentMain.dart @@ -0,0 +1,181 @@ +import 'package:esms_project/screens/listEquipment.dart'; +import 'package:esms_project/screens/listEquipmentByClient.dart'; +import 'package:esms_project/screens/listEquipmentByID.dart'; +import 'package:esms_project/screens/listEquipmentDelivered.dart'; +import 'package:esms_project/widgets/widget_button.dart'; +import 'package:esms_project/widgets/widget_input.dart'; +import 'package:flutter/material.dart'; + +class listEquipmentMain extends StatefulWidget { + @override + _listEquipmentMainState createState() => _listEquipmentMainState(); +} +// TODO: Tela pesquisar via cliente +// Polir +class _listEquipmentMainState extends State { + final _formCli = GlobalKey(); + final _formCli2 = GlobalKey(); + TextEditingController input = TextEditingController(); + TextEditingController input2 = TextEditingController(); + @override + Widget build(BuildContext context) { + return Scaffold(body: _layout()); + } + + _layout() { + return Container( + padding: EdgeInsets.all(20), + child: Center( + child: SingleChildScrollView( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + RichText( + text: TextSpan( + style: TextStyle( + fontWeight: FontWeight.w400, + color: Colors.black, + fontSize: 30), + text: "Listagem de Aparelhos")), + RichText( + text: TextSpan( + style: TextStyle( + fontWeight: FontWeight.w300, + color: Colors.black, + fontSize: 20), + text: "Selecione uma das opções abaixo.")), + Divider(color: Colors.black38,), + FractionallySizedBox( + widthFactor: 0.7, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + BotaoCustom( + "Por Cliente", + onPressed: () => _modalInput("Digite um nome.", + "Ex. José da Silva"), + ), + BotaoCustom( + "Por Número", + onPressed: () => _modalInputID("Digite um número.", + "Ex. 1123"), + ), + BotaoCustom( + "Aparelhos Entregues", + onPressed: () => _goto(context, listEquipmentDelivered()), + ), + BotaoCustom("Aparelhos em Aberto", + onPressed: () => _goto(context, listEquipment())) + ], + ), + ) + ], + ), + ) + )); + } + + _goto(context, page) { + setState(() { + Navigator.of(context) + .push(new MaterialPageRoute(builder: (context) => page)); + }); + } + + _modalInputID(String label, String hint) { + input.clear(); + return showDialog( + context: context, + builder: (_) => SimpleDialog( + contentPadding: EdgeInsets.all(20), + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Icon(Icons.search), + Text("Filtro de Pesquisa"), + ], + ), + Divider(color: Colors.black38), + Form(key: _formCli, child: InputNumber(label, hint, controller: input)), + Botoes( + "Pesquisar", + onPressed: () => _validateSearchID(), + ), + Botoes( + "Fechar", + onPressed: () { + Navigator.of(context, rootNavigator: true).pop('dialog'); + }, + ) + ], + )); + } + + _modalInput(String label, String hint) { + input2.clear(); + return showDialog( + context: context, + builder: (_) => SimpleDialog( + contentPadding: EdgeInsets.all(20), + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Icon(Icons.search), + Text("Filtro de Pesquisa"), + ], + ), + Divider(color: Colors.black38), + Form(key: _formCli2, child: InputValidado(label, hint, controller: input2)), + Botoes( + "Pesquisar", + onPressed: () => _validateSearchClient(), + ), + Botoes( + "Fechar", + onPressed: () { + Navigator.of(context, rootNavigator: true).pop('dialog'); + }, + ) + ], + )); + } + _validateSearchClient() { + FocusScopeNode currentFocus = FocusScope.of(context); + if (!currentFocus.hasPrimaryFocus) { + currentFocus.unfocus(); + } + setState(() { + if (_formCli2.currentState.validate()) { + if (input2 != null) { + String name = input2.text; + Navigator.of(context, rootNavigator: true).pop('dialog'); + Navigator.of(context).push(new MaterialPageRoute( + builder: (context) => listEquipmentClient( + clientName: name, + ))); + } + } + }); + } + + _validateSearchID() { + FocusScopeNode currentFocus = FocusScope.of(context); + if (!currentFocus.hasPrimaryFocus) { + currentFocus.unfocus(); + } + setState(() { + if (_formCli.currentState.validate()) { + if (input != null) { + int goto = int.tryParse(input.text); + input.clear(); + Navigator.of(context, rootNavigator: true).pop('dialog'); + Navigator.of(context).push(new MaterialPageRoute( + builder: (context) => listEquipmentID(goto))); + } + } + }); + } +} diff --git a/lib/main.dart b/lib/main.dart new file mode 100644 index 0000000..9df32ba --- /dev/null +++ b/lib/main.dart @@ -0,0 +1,25 @@ +import 'package:esms_project/mainScreen.dart'; +import 'package:flutter/material.dart'; + +void main() { + runApp(ESMSApp()); +} + +class ESMSApp extends StatelessWidget { + /* TODO: Consertos realizados em outros aparelhos parecidos? -- 01/06/2021, adicionado tabela + TODO: Fazer telas relacionadas a tabela + Vai pegar o nome do aparelho quando colocar data de entrega se o usuário quiser + Pode deletar ou alterar informações de reparo*/ + @override + Widget build(BuildContext context) { + return MaterialApp( + title: 'ESMS - Sistema para Técnicos em Eletrônica', + debugShowCheckedModeBanner: false, + theme: ThemeData( + primarySwatch: Colors.red, + ), + home: mainScreen(), + ); + } +} + diff --git a/lib/mainScreen.dart b/lib/mainScreen.dart new file mode 100644 index 0000000..5dd9392 --- /dev/null +++ b/lib/mainScreen.dart @@ -0,0 +1,123 @@ +import 'dart:io'; + +import 'package:esms_project/listEquipmentMain.dart'; +import 'package:esms_project/screens/aboutESMS.dart'; +import 'package:esms_project/screens/createClient.dart'; +import 'package:esms_project/screens/createEquipment.dart'; +import 'package:esms_project/screens/listClients.dart'; +import 'package:esms_project/screens/listRepairs.dart'; +import 'package:esms_project/widgets/widget_button.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:package_info_plus/package_info_plus.dart'; +import 'package:path_provider/path_provider.dart'; + +class mainScreen extends StatefulWidget { + @override + _mainScreenState createState() => _mainScreenState(); +} + +class _mainScreenState extends State { + String verNumber; + int superCoolSecret = 0; + @override + void initState() { + super.initState(); + makeFolders(); + } + + @override + Widget build(BuildContext context) { + return Scaffold(body: _layout()); + } + + makeFolders() async { + final _self = await getApplicationDocumentsDirectory(); + final _selfPictures = Directory('${_self.path}/Pictures'); + if (!await _selfPictures.exists()) { + final _newFolder = await _selfPictures.create(recursive: true); + } + PackageInfo.fromPlatform().then((PackageInfo p) { + verNumber = p.version; + }); + } + + _layout() { + return Container( + padding: EdgeInsets.all(20), + child: Center( + child: SingleChildScrollView( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + InkWell( + child: SizedBox( + child: Column( + children: [ + RichText( + text: TextSpan( + style: TextStyle( + fontWeight: FontWeight.w100, + color: Colors.black, + fontSize: 100), + text: "ESMS")), + RichText( + text: TextSpan( + style: TextStyle( + fontWeight: FontWeight.w400, + color: Colors.black, + fontSize: 12), + text: "Eletronics Servicing Management System"), + ) + ], + )), + onTap: () { + setState(() { + if (superCoolSecret < 4) superCoolSecret++; + }); + }, + highlightColor: Colors.transparent, + splashColor: Colors.transparent, + onLongPress: () { + setState(() { + if (superCoolSecret >= 4) _goto(context, AboutScr()); + }); + }, + ), + Divider( + color: Colors.black38, + ), + FractionallySizedBox( + widthFactor: 0.7, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + BotaoCustom( + "Cadastrar Cliente", + onPressed: () => _goto(context, CreateClient()), + ), + BotaoCustom("Cadastrar Aparelho", + onPressed: () => _goto(context, CreateEquipment())), + BotaoCustom("Ver Aparelhos", + onPressed: () => _goto(context, listEquipmentMain())), + BotaoCustom("Ver Clientes", + onPressed: () => _goto(context, ListClients())), + BotaoCustom("Ver Reparos", + onPressed: () => _goto(context, ListRepairs())), + ], + ), + ), + ], + ), + ) + )); + } + + _goto(context, page) { + setState(() { + Navigator.of(context) + .push(new MaterialPageRoute(builder: (context) => page)); + }); + } +} diff --git a/lib/screens/aboutESMS.dart b/lib/screens/aboutESMS.dart new file mode 100644 index 0000000..26e06ba --- /dev/null +++ b/lib/screens/aboutESMS.dart @@ -0,0 +1,144 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; +import 'package:package_info_plus/package_info_plus.dart'; +import 'dart:io' show Platform; + +class AboutScr extends StatefulWidget { + @override + _AboutScrState createState() => _AboutScrState(); +} + +class _AboutScrState extends State { + PackageInfo p; + String os; + Future loaded; + + Timer stuck; + Future loadVals() async { + if(Platform.isAndroid) + os = "Android"; + else if(Platform.isIOS) + os = "IOS"; + os += ' ${Platform.operatingSystemVersion}'; + + await PackageInfo.fromPlatform().then((value) { + p = value; + }); + return true && p != null; + } + + _reload() { + stuck = Timer(Duration(seconds: 2), () { + loaded = loadVals(); + stuck.cancel(); + setState(() {}); + }); + } + + @override + void initState() { + super.initState(); + loaded = loadVals(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text("Sobre"), + ), + body: _layout(), + ); + } + + _layout() { + return Container( + padding: EdgeInsets.all(10), + child: FutureBuilder( + future: loaded, + builder: (context, snapshot) { + if (snapshot.connectionState == ConnectionState.waiting) + return Center( + child: CircularProgressIndicator(), + ); + else if (p != null) { + return Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + Expanded( + flex: 8, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + RichText( + text: TextSpan( + style: TextStyle( + fontWeight: FontWeight.w900, + color: Colors.redAccent[700], + fontSize: 12, + letterSpacing: 10), + text: "RELEASE ${p.version}",), + ), + RichText( + text: TextSpan( + style: TextStyle( + fontWeight: FontWeight.w100, + color: Colors.black, + fontSize: 100), + text: "ESMS"), + ), + RichText( + text: TextSpan( + style: TextStyle( + fontWeight: FontWeight.w400, + color: Colors.black, + fontSize: 12), + text: "Eletronics Servicing Management System"), + ), + Divider( + color: Colors.black38, + ), + RichText( + text: TextSpan( + style: TextStyle( + color: Colors.black, fontSize: 20), + text: + "Informações da Versão"), + ), + Container( + padding: EdgeInsets.all(30), + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Divider(color: Colors.transparent,), + Text("Versão: ${p.version}"), + Text("Número da Build: ${p.buildNumber}"), + Text("Nome da Package: ${p.packageName}"), + Text("Versão Dart: ${Platform.version.substring(0,Platform.version.lastIndexOf('(dev)'))}"), + Text("Edição ${os}") + ], + ), + ) + ], + ) + ), + Divider(color: Colors.transparent,), + Expanded( + flex: 1, + child: Text("Desenvolvido por F. Raszeja, 2021") + ) + ], + )); + } + if (snapshot.data == false) { + _reload(); + } + return Container( + child: Text("Oops!"), + ); + }), + ); + } +} diff --git a/lib/screens/alterClient.dart b/lib/screens/alterClient.dart new file mode 100644 index 0000000..5466b2a --- /dev/null +++ b/lib/screens/alterClient.dart @@ -0,0 +1,215 @@ +import 'dart:async'; + +import 'package:esms_project/client.dart'; +import 'package:esms_project/screens/listClients.dart'; +import 'package:esms_project/widgets/widget_button.dart'; +import 'package:esms_project/widgets/widget_input.dart'; +import 'package:flutter/material.dart'; + +import 'clientDetail.dart'; + +class alterClient extends StatefulWidget { + Client c; + + alterClient(this.c); + @override + _alterClientState createState() => _alterClientState(); +} + +class _alterClientState extends State { + Timer d; + final values = new List.generate( + 4, (_) => TextEditingController()); + final _formCli = GlobalKey(); + + @override + void initState() { + values[0].text = widget.c.name; + values[1].text = widget.c.telephone; + values[2].text = widget.c.cellular; + values[3].text = widget.c.observations; + super.initState(); + } + + @override + void setState(fn) { + if (mounted) { + super.setState(fn); + } + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text("Alterar Cliente"), + ), + body: _layout()); + } + + _layout() { + return Container( + padding: EdgeInsets.all(20), + height: double.infinity, + child: SingleChildScrollView( + child: Column( + children: [ + Form( + key: _formCli, + child: Column( + children: [ + InputValidado( + "Digite o nome do Cliente", + "Ex. João da Silva", + controller: values[0], + ), + InputTextosPhone( + "Digite um telefone", + "Ex. (15) 1234-5678", + controller: values[1], + ), + InputTextosPhone( + "Digite um celular", + "Ex. (15) 991234-5678", + controller: values[2], + ), + InputTextos( + "Observações:", + "Ex. Tem (15) 99123-4567 como outro número celular", + controller: values[3], + ), + ], + )), + Divider( + color: Colors.transparent, + ), + Botoes( + "Atualizar cliente", + onPressed: _updateClient, + ), + Botoes( + "Remover cliente", + onPressed: () { + _removeClient(); + }, + ) + ] + ) + )); + } + + _updateClient() { + setState(() { + if (_formCli.currentState.validate()) { + int temp = widget.c.id; + widget.c = new Client( + values[0].text, + values[1].text, + values[2].text, + values[3].text, + ); + widget.c.UpdateDB(temp); + int StuckCount = 0; + d = Timer(Duration(milliseconds: 300), () { + if (widget.c.status == 1) { + _showcontent(temp); + StuckCount = 0; + d.cancel(); + } + else + StuckCount++; + }); + if (StuckCount >= 2) + _displaySnackbar("Verifique os valores"); + } + }); + } + + _displaySnackbar(String text) { + setState(() { + final snackBar = + SnackBar(content: Text(text, style: TextStyle(fontSize: 16))); + ScaffoldMessenger.of(context).showSnackBar(snackBar); + }); + } + + void _showcontent(temp) { + setState(() { + showDialog( + context: context, barrierDismissible: false, // user must tap button! + + builder: (BuildContext context) { + return new AlertDialog( + title: new Text('Aviso'), + content: new SingleChildScrollView( + child: new ListBody( + children: [ + new Text('Cliente atualizado.'), + ], + ), + ), + actions: [ + new TextButton( + child: new Text('OK'), + onPressed: () { + Navigator.of(context).popUntil((route) => route.isFirst); + if(values[0].text == "CLIENTE_REMOVIDO") + Navigator.of(context).push(new MaterialPageRoute( + builder: (context) => ListClients())); + else { + Navigator.of(context).push(new MaterialPageRoute( + builder: (context) => ListClients())); + Navigator.of(context).push(new MaterialPageRoute( + builder: (context) => ClientDetail(temp))); + } + + }, + ), + ], + ); + }, + ); + }); + } + + _removeClient() { + setState(() { + showDialog( + context: context, barrierDismissible: false, // user must tap button! + + builder: (BuildContext context) { + return new AlertDialog( + title: new Text('Confirmação'), + content: new SingleChildScrollView( + child: new ListBody( + children: [ + new Text('Tem certeza que quer remover o cliente ${widget.c + .name}?'), + ], + ), + ), + actions: [ + new TextButton( + child: new Text('Sim'), + onPressed: () { + values[0].text = "CLIENTE_REMOVIDO"; + values[1].text = ""; + values[2].text = ""; + values[3].text = ""; + _updateClient(); + + }, + ), + new TextButton( + child: new Text('Não'), + onPressed: () { + + }, + ), + ], + ); + }, + ); + }); + } +} diff --git a/lib/screens/alterEquipment.dart b/lib/screens/alterEquipment.dart new file mode 100644 index 0000000..813df7d --- /dev/null +++ b/lib/screens/alterEquipment.dart @@ -0,0 +1,364 @@ +import 'dart:async'; +import 'dart:io'; +import 'package:esms_project/electronic.dart'; +import 'package:esms_project/screens/equipmentDetail.dart'; +import 'package:esms_project/widgets/widget_button.dart'; +import 'package:esms_project/widgets/widget_generate.dart'; +import 'package:esms_project/widgets/widget_input.dart'; +import 'package:flutter/material.dart'; +import 'package:image_picker/image_picker.dart'; +import 'package:intl/intl.dart'; +import 'package:path_provider/path_provider.dart'; + +class alterEquipment extends StatefulWidget { + Equipment e; + Repair r; + alterEquipment(this.e, {this.r}); + @override + _alterEquipmentState createState() => _alterEquipmentState(); +} + +class _alterEquipmentState extends State { + Timer d; + final values = new List.generate( + 6, (_) => TextEditingController()); + final _formEq = new GlobalKey(); + final _formRep = new GlobalKey(); + File _image; + + bool _writeRepair = false; + List imagens = []; + @override + void initState() { + imagens = widget.e.images; + values[0].text = widget.e.name; + values[1].text = widget.e.problem; + values[2].text = widget.e.observation; + values[3].text = DateFormat.yMd().format(widget.e.dateInput); + values[4].text = widget.e.dateExit == null + ? "" + : DateFormat.yMd().format(widget.e.dateExit); + if (widget.r != null) { + values[5].text = widget.r.repair == null ? "" : widget.r.repair; + _writeRepair = true; + } + super.initState(); + } + + @override + void setState(fn) { + if (mounted) { + super.setState(fn); + } + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text("Alterar Informações"), + ), + body: _layout()); + } + + _layout() { + return Container( + padding: EdgeInsets.all(20), + height: double.infinity, + child: SingleChildScrollView( + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + RichText( + text: TextSpan( + style: TextStyle( + color: Colors.black, + fontSize: 20, + fontStyle: FontStyle.normal, + fontWeight: FontWeight.w600), + text: "Preencha este formulário com informações do aparelho.", + ), + textAlign: TextAlign.center, + ), + Form( + key: _formEq, + child: Column( + children: [ + InputValidado( + "Nome do Aparelho", + "Ex.: Radio XYZ", + controller: values[0], + ), + InputValidado( + "Problema apresentado", + "Ex.: Tela quebrada", + controller: values[1], + ), + InputTextos( + "Observações", + "Ex.: Vem com cabos", + controller: values[2], + ), + InputData( + "Data de Entrada", + "Ex. " + DateFormat.yMd().format(DateTime.now()), + controller: values[3], + ), + InputDataNoValidate( + "Data de Saída", + "Ex. " + + DateFormat.yMd() + .format(DateTime.now().add(Duration(days: 30))), + controller: values[4], + ), + ], + )), + Divider( + color: Colors.transparent, + ), + RichText( + text: TextSpan( + style: TextStyle( + color: Colors.black, + fontSize: 20, + fontStyle: FontStyle.normal, + fontWeight: FontWeight.w600), + text: "Deseja registrar o reparo?", + ), + textAlign: TextAlign.center, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + Row( + children: [ + Radio( + groupValue: _writeRepair, + value: true, + onChanged: _onChangeRepair, + ), + Text("Sim", style: TextStyle(fontSize: 18)), + ], + ), + Row( + children: [ + Radio( + groupValue: _writeRepair, + value: false, + onChanged: _onChangeRepair, + ), + Text("Não", style: TextStyle(fontSize: 18)), + ], + ), + ], + ), + _Repair(), + Divider( + color: Colors.transparent, + ), + Botoes( + "Atualizar Aparelho", + onPressed: _update, + ), + if (imagens != null && imagens.length <= 10) + Botoes( + "Tire uma foto!", + onPressed: _snapPic, + ), + if (imagens[0].isNotEmpty) + Text("Você tirou " + imagens.length.toString() + " fotos."), + ], + ), + ), + ); + } + + bool _ValidateInputs() { + setState(() {}); + return widget.e != null && _formEq.currentState.validate(); + } + + bool _ValidateRepair() { + setState(() {}); + return _writeRepair && _formRep.currentState.validate(); + } + + _Repair() { + return _writeRepair + ? Container( + child: Form( + key: _formRep, + child: Column( + children: [ + InputValidado( + "Reparo realizado", + "Troca de peça X, Y, Z", + controller: values[5], + ) + ], + ), + ), + ) + : Container(); + } + + _onChangeRepair(bool value) { + setState(() { + _writeRepair = value; + }); + } + + Future _snapPic() async { + if (_ValidateInputs()) { + Directory dir = await getApplicationDocumentsDirectory(); + final imagem = await ImagePicker().getImage(source: ImageSource.camera); + + if (imagem != null) { + setState(() { + _image = File(imagem.path); + }); + final fileName = StringGenerator().getRandomString(10) + ".jpg"; + final savedImage = + await File(_image.path).copy('${dir.path}/Pictures/$fileName'); + + if (savedImage != null) { + if (imagens[0].isEmpty) + imagens[0] = fileName; + else + imagens.add(fileName); + _displaySnackbar("Foto adicionada com sucesso."); + } + } + } else { + _displaySnackbar("Verifique os campos."); + } + } + + _displaySnackbar(String text) { + setState(() { + final snackBar = + SnackBar(content: Text(text, style: TextStyle(fontSize: 16))); + ScaffoldMessenger.of(context).showSnackBar(snackBar); + }); + } + + _update() { + setState(() { + if(!_writeRepair && widget.r != null) { + _deleteRepair(widget.r.id); + } + else if(_writeRepair || widget.r == null){ + _updateSt2(); + } + }); + } + _updateSt2() + { + if (_ValidateInputs()) { + int tmp = widget.e.id; + int tmp2 = widget.e.client_id; + widget.e = new Equipment( + tmp2, + values[0].text, + values[1].text, + values[2].text, + DateFormat.yMd().parse(values[3].text), + ); + widget.e.id = tmp; + if (values[4].text.isNotEmpty) + widget.e.EquipmentLeave(DateFormat.yMd().parse(values[4].text)); + widget.e.images = imagens; + widget.e.UpdateDB(tmp); + if (_ValidateRepair()) { + if (widget.r == null) { + widget.r = new Repair(tmp, values[5].text); + widget.r.SaveToDB(); + } else { + int tmp3 = widget.r.id; + widget.r = new Repair(tmp, values[5].text); + widget.r.UpdateDB(tmp3); + } + } + int TryCount = 0; + d = Timer(Duration(milliseconds: 200), () { + if ((!_writeRepair && widget.e.status == 1) || (widget.r.status == 1 && widget.e.status == 1)) { + TryCount = 0; + _showcontent(tmp); + d.cancel(); + } else + TryCount++; + }); + if (TryCount >= 2) _displaySnackbar("Erro na operação."); + } + } + void _deleteRepair(temp) + { + setState(() { + showDialog( + context: context, barrierDismissible: false, // user must tap button! + + builder: (BuildContext context) { + return new AlertDialog( + title: new Text('Aviso'), + content: new SingleChildScrollView( + child: new ListBody( + children: [ + new Text('Deseja remover informações sobre reparo?'), + ], + ), + ), + actions: [ + new TextButton( + child: new Text('Sim'), + onPressed: () { + widget.r.RemoveDB(temp); + _updateSt2(); + Navigator.of(context, rootNavigator: true).pop('dialog'); + }, + ), + new TextButton( + child: new Text('Não'), + onPressed: () { + _updateSt2(); + Navigator.of(context, rootNavigator: true).pop('dialog'); + }, + ), + ], + ); + }, + ); + }); + } + + void _showcontent(temp) { + setState(() { + showDialog( + context: context, barrierDismissible: false, // user must tap button! + + builder: (BuildContext context) { + return new AlertDialog( + title: new Text('Aviso'), + content: new SingleChildScrollView( + child: new ListBody( + children: [ + new Text('Equipamento atualizado.'), + ], + ), + ), + actions: [ + new TextButton( + child: new Text('OK'), + onPressed: () { + int count = 0; + Navigator.of(context).popUntil((_) => count++ >= 2); + Navigator.of(context).pushReplacement(new MaterialPageRoute( + builder: (context) => EquipmentDetail(temp))); + }, + ), + ], + ); + }, + ); + }); + } +} diff --git a/lib/screens/clientDetail.dart b/lib/screens/clientDetail.dart new file mode 100644 index 0000000..e26e505 --- /dev/null +++ b/lib/screens/clientDetail.dart @@ -0,0 +1,200 @@ +import 'dart:async'; + +import 'package:esms_project/dbhandler.dart'; +import 'package:esms_project/client.dart'; +import 'package:esms_project/screens/alterClient.dart'; +import 'package:esms_project/widgets/widget_button.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:intl/intl.dart'; +import 'package:url_launcher/url_launcher.dart'; + +import 'listEquipmentByClient.dart'; + +class ClientDetail extends StatefulWidget { + final int id; + ClientDetail(this.id); + + @override + _ClientDetailState createState() => _ClientDetailState(); +} + +class _ClientDetailState extends State { + final dbHandler dbh = dbHandler.instance; + Future loaded; + Timer stuck; + Client cli; + + Future _loadvars() async { + Future>> tmp = dbh.queryByID("client", widget.id); + tmp.then((List> value) { + cli = Client.fromJson(value[0]); + }); + return true && cli != null; + } + + @override + void setState(fn) { + if(mounted) { + super.setState(fn); + } + } + + @override + void initState() { + super.initState(); + loaded = _loadvars(); + } + + _reload() { + stuck = Timer(Duration(seconds: 2), () { + loaded = _loadvars(); + stuck.cancel(); + setState(() {}); + }); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text("Detalhes do Cliente"), + ), + body: _layout(), + ); + } + + _layout() { + return Container( + padding: EdgeInsets.all(30), + child: FutureBuilder( + future: loaded, + builder: (BuildContext context, AsyncSnapshot snapshot) { + if (snapshot.connectionState == ConnectionState.done && + cli != null) { + return Column( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + Card( + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + ListTile( + leading: const Icon(Icons.account_circle), + title: RichText( + overflow: TextOverflow.ellipsis, + strutStyle: StrutStyle(fontSize: 16.0), + text: TextSpan( + style: TextStyle( + color: Colors.black, fontSize: 16), + text: cli.name)), + ), + ListTile( + leading: const Icon(Icons.phone), + title: RichText( + overflow: TextOverflow.ellipsis, + strutStyle: StrutStyle(fontSize: 12.0), + text: TextSpan( + style: TextStyle( + color: Colors.black, fontSize: 16), + text: "Telefone: ${cli.telephone}", + ), + ), + onTap: () => + _launchUrl("tel:${cli.telephone}")), + ListTile( + leading: Icon(Icons.phone_android), + title: RichText( + overflow: TextOverflow.ellipsis, + strutStyle: StrutStyle(fontSize: 12.0), + text: TextSpan( + style: TextStyle( + color: Colors.black, fontSize: 16), + text: "Celular: ${cli.cellular}")), + onTap: () => _launchUrl("tel:${cli.cellular}")), + ListTile( + leading: Icon(Icons.notes), + title: RichText( + overflow: TextOverflow.ellipsis, + strutStyle: StrutStyle(fontSize: 12.0), + text: TextSpan( + style: TextStyle( + color: Colors.black, fontSize: 16), + text: + "Observações: ${cli.observations}")), + onTap: () => _modal( + cli.observations, "Observações", Icons.notes), + ), + ]), + ), + Botoes( + "Alterar", + onPressed: _update, + ), + Botoes( + "Ver Aparelhos", + onPressed: () => _list(cli.id), + ), + ], + ); + } + if (snapshot.data == false) { + _reload(); + } + return Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [CircularProgressIndicator(), Text("Carregando.")], + ), + ); + })); + } + + _modal(String value, String type, IconData icon) { + return showDialog( + context: context, + builder: (_) => SimpleDialog( + contentPadding: EdgeInsets.all(20), + semanticLabel: type, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Icon(icon), + Text(type), + ], + ), + Divider(color: Colors.black38), + RichText( + strutStyle: StrutStyle(fontSize: 12.0), + text: TextSpan( + style: TextStyle(color: Colors.black, fontSize: 16), + text: value)), + Botoes( + "Fechar", + onPressed: () { + Navigator.of(context, rootNavigator: true).pop('dialog'); + }, + ) + ], + )); + } + + _launchUrl(String url) async { + await canLaunch(url) ? await launch(url) : print("Uh-oh!"); + } + + _update() { + Navigator.of(context) + .push(new MaterialPageRoute(builder: (context) => alterClient(cli))) + .whenComplete(_reload); + } + + _list(int id) { + setState(() { + Navigator.of(context) + .push(new MaterialPageRoute(builder: (context) => listEquipmentClient(id_client: widget.id,))) + .whenComplete(_loadvars); + }); + } +} diff --git a/lib/screens/createClient.dart b/lib/screens/createClient.dart new file mode 100644 index 0000000..7c91585 --- /dev/null +++ b/lib/screens/createClient.dart @@ -0,0 +1,103 @@ +import 'package:esms_project/client.dart'; +import 'package:esms_project/screens/listClients.dart'; +import 'package:esms_project/widgets/widget_button.dart'; +import 'package:esms_project/widgets/widget_input.dart'; +import 'package:flutter/material.dart'; +class CreateClient extends StatefulWidget { + @override + _CreateClientState createState() => _CreateClientState(); +} + +class _CreateClientState extends State { + final values = new List.generate( + 4, (_) => TextEditingController()); + Client c; + final _formCli = GlobalKey(); + + @override + void setState(fn) { + if(mounted) { + super.setState(fn); + } + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text("Adicionar Cliente"), + ), + body: _layout()); + } + _layout() { + return Container( + padding: EdgeInsets.all(20), + height: double.infinity, + child: SingleChildScrollView( + child: Column( + children: [ + Form( + key: _formCli, + child: Column( + children: [ + InputValidado( + "Digite o nome do Cliente", + "Ex. João da Silva", + controller: values[0], + ), + InputTextosPhone( + "Digite um telefone", + "Ex. (15) 1234-5678", + controller: values[1], + ), + InputTextosPhone( + "Digite um celular", + "Ex. (15) 991234-5678", + controller: values[2], + ), + InputTextos( + "Observações:", + "Ex. Tem (15) 99123-4567 como outro número celular", + controller: values[3], + ), + ], + )), + Divider( + color: Colors.transparent, + ), + Botoes( + "Cadastrar cliente", + onPressed: _addClient, + ) + ] + ) + )); + } + + _addClient() { + setState(() { + if (_formCli.currentState.validate()) { + c = new Client( + values[0].text, values[1].text, values[2].text, values[3].text); + c.SaveToDB(); + if (c.id != null || c.id != 0) { + _displaySnackbar("Cliente cadastrado."); + Navigator.pushReplacement( + context, MaterialPageRoute(builder: (context) => ListClients())); + } else { + _displaySnackbar("Erro no cadastro."); + } + } else { + _displaySnackbar("Verifique o cadastro!"); + } + }); + } + + _displaySnackbar(String text) { + setState(() { + final snackBar = + SnackBar(content: Text(text, style: TextStyle(fontSize: 16))); + ScaffoldMessenger.of(context).showSnackBar(snackBar); + }); + } +} diff --git a/lib/screens/createEquipment.dart b/lib/screens/createEquipment.dart new file mode 100644 index 0000000..be099f8 --- /dev/null +++ b/lib/screens/createEquipment.dart @@ -0,0 +1,360 @@ +import 'dart:io'; + +import 'package:esms_project/client.dart'; +import 'package:esms_project/dbhandler.dart'; +import 'package:esms_project/electronic.dart'; +import 'package:esms_project/mainScreen.dart'; +import 'package:esms_project/widgets/widget_button.dart'; +import 'package:esms_project/widgets/widget_generate.dart'; +import 'package:esms_project/widgets/widget_input.dart'; +import 'package:flutter/material.dart'; +import 'package:image_picker/image_picker.dart'; +import 'package:intl/intl.dart'; +import 'package:path_provider/path_provider.dart'; + +class CreateEquipment extends StatefulWidget { + Client c; + CreateEquipment({this.c}); + @override + _CreateEquipmentState createState() => _CreateEquipmentState(); +} + +class _CreateEquipmentState extends State { + final values = new List.generate( + 9, (_) => TextEditingController()); + List imagens = []; + List> clients; + Client c; + bool _client = true; + bool _justregistered = false; + File _image; + final _formEq = GlobalKey(); + final _formCli = GlobalKey(); + + @override + void setState(fn) { + if(mounted) { + super.setState(fn); + } + } + + @override + void initState() { + c = widget.c == null? null: widget.c; + if(c != null) + { + _client = true; + _justregistered = true; + values[3].text = c.name; + } + super.initState(); + } + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text("Adicionar Aparelho"), + ), + body: _layout()); + } + + _layout() { + return Container( + padding: EdgeInsets.all(20), + height: double.infinity, + child: SingleChildScrollView( + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + RichText( + text: TextSpan( + style: TextStyle( + color: Colors.black, + fontSize: 20, + fontStyle: FontStyle.normal, + fontWeight: FontWeight.w600), + text: "Preencha este formulário com informações do aparelho.", + ), + textAlign: TextAlign.center, + ), + Form( + key: _formEq, + child: Column( + children: [ + InputValidado( + "Nome do Aparelho", + "Ex.: Radio XYZ", + controller: values[0], + ), + InputValidado( + "Problema apresentado", + "Ex.: Tela quebrada", + controller: values[1], + ), + InputTextos( + "Observações", + "Ex.: Vem com cabos", + controller: values[2], + ), + InputData( + "Data de Entrada", + "Ex. " + DateFormat.yMd().format(DateTime.now()), + controller: values[8], + ) + ], + )), + Divider( + color: Colors.transparent, + ), + RichText( + text: TextSpan( + style: TextStyle( + color: Colors.black, + fontSize: 20, + fontStyle: FontStyle.normal, + fontWeight: FontWeight.w600), + text: "O cliente ja é cadastrado?", + ), + textAlign: TextAlign.center, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + Row( + children: [ + Radio( + groupValue: _client, + value: true, + onChanged: _onChangeClient, + ), + Text("Sim", style: TextStyle(fontSize: 18)), + ], + ), + Row( + children: [ + Radio( + groupValue: _client, + value: false, + onChanged: _onChangeClient, + ), + Text("Não", style: TextStyle(fontSize: 18)), + ], + ), + ], + ), + Divider( + color: Colors.transparent, + ), + _clientCheck(), + Divider( + color: Colors.transparent, + ), + if (_justregistered == true) + Column( + children: [ + Botoes( + "Cadastrar Aparelho", + onPressed: _addEquipment, + ), + if (imagens != null && imagens.length <= 10) + Botoes( + "Tire uma foto!", + onPressed: _snapPic, + ), + ], + ), + if (imagens != null && imagens.length > 0) + Text("Você tirou " + imagens.length.toString() + " fotos.") + ], + ), + )); + } + + _onChangeClient(bool value) { + setState(() { + _client = value; + }); + } + + Future _GetClient() async { + if (values[3] != null && values[3].text.isNotEmpty) { + clients = await dbHandler.instance.queryByName("client", values[3].text); + List> temp = List.empty(growable: true); + setState(() { + if (clients != null) { + for (int i = 0; i < clients.length; i++) { + if (clients[i]['name'] != 'CLIENTE_REMOVIDO') + temp.add(clients[i]); + } + clients = temp; + } + FocusScope.of(context).unfocus(); + }); + } + } + + _clientCheck() { + return _client + ? Column( + children: [ + Row( + children: [ + Expanded( + child: InputTextos( + "Buscar por nome", + "Ex. João da Silva", + controller: values[3], + )), + IconButton(onPressed: _GetClient, icon: Icon(Icons.search)) + ], + ), + if (clients != null) + for (int i = 0; i < clients.length; i++) + Column( + children: [ + Divider(), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Row(children: [ + Icon(Icons.account_circle_rounded), + Text( + " Cliente: " + clients[i]['name'].toString(), + style: TextStyle( + fontSize: 18, + color: Colors.black, + fontWeight: FontWeight.w300, + ), + ), + ]), + Botoes("Selecionar", onPressed: () => _loadCli(i)) + ], + ), + ], + ), + ], + ) + : Column( + children: [ + Form( + key: _formCli, + child: Column( + children: [ + InputValidado( + "Digite o nome do Cliente", + "Ex. João da Silva", + controller: values[4], + ), + InputTextosPhone( + "Digite um telefone", + "Ex. (15) 1234-5678", + controller: values[5], + ), + InputTextosPhone( + "Digite um celular", + "Ex. (15) 991234-5678", + controller: values[6], + ), + InputTextos( + "Observações:", + "Ex. Tem (15) 99123-4567 como outro número celular", + controller: values[7], + ), + ], + )), + Divider( + color: Colors.transparent, + ), + Botoes( + "Cadastrar cliente", + onPressed: _addClient, + ) + ], + ); + } + + _addClient() { + setState(() { + if (_formCli.currentState.validate()) { + _client = true; + c = new Client( + values[4].text, values[5].text, values[6].text, values[7].text); + c.SaveToDB(); + if (c.id != null || c.id != 0) { + values[3].text = values[4].text; + _displaySnackbar("Cliente cadastrado."); + _justregistered = true; + } else { + _displaySnackbar("Erro no cadastro."); + } + } else { + _displaySnackbar("Verifique o cadastro!"); + } + }); + } + + bool _ValidateInputs() { + setState(() {}); + return _formEq.currentState.validate() && c != null; + } + + Future _snapPic() async { + if (_ValidateInputs()) { + Directory dir = await getApplicationDocumentsDirectory(); + final imagem = await ImagePicker().getImage(source: ImageSource.camera); + + if (imagem != null) { + setState(() { + _image = File(imagem.path); + }); + + final fileName = StringGenerator().getRandomString(10) + ".jpg"; + final savedImage = await File(imagem.path).copy( + '${dir.path}/Pictures/$fileName'); + if(savedImage != null) { + imagens.add(fileName); + _displaySnackbar("Foto adicionada com sucesso."); + } + } + } + } + + _displaySnackbar(String text) { + setState(() { + final snackBar = + SnackBar(content: Text(text, style: TextStyle(fontSize: 16))); + ScaffoldMessenger.of(context).showSnackBar(snackBar); + }); + } + + _addEquipment() { + setState(() { + if (_formEq.currentState.validate()) { + Equipment e = new Equipment( + c.id, + values[0].text, + values[1].text, + values[2].text, + DateFormat.yMd().parse(values[8].text), + ); + e.AddImageAsRange(imagens); + + if (e.SaveToDB() == 1) { + _displaySnackbar("Erro no cadastro!"); + } else { + _displaySnackbar("Cadastrado com sucesso."); + Navigator.of(context).pushReplacement(new MaterialPageRoute(builder: (context) => mainScreen())); + } + } + }); + } + + _loadCli(int index) { + setState(() { + values[3].text = clients[index]['name'].toString(); + c = Client.fromJson(clients[index]); + clients = null; + _justregistered = true; + }); + } +} diff --git a/lib/screens/equipmentDetail.dart b/lib/screens/equipmentDetail.dart new file mode 100644 index 0000000..a1abe4f --- /dev/null +++ b/lib/screens/equipmentDetail.dart @@ -0,0 +1,288 @@ +import 'dart:async'; + +import 'package:esms_project/dbhandler.dart'; +import 'package:esms_project/electronic.dart'; +import 'package:esms_project/widgets/widget_button.dart'; +import 'package:esms_project/widgets/widget_caroussel.dart'; +import 'package:flutter/material.dart'; +import 'package:intl/intl.dart'; + +import 'alterEquipment.dart'; + +class EquipmentDetail extends StatefulWidget { + final int id; + EquipmentDetail(this.id); + + @override + _EquipmentDetailState createState() => _EquipmentDetailState(); +} + +class _EquipmentDetailState extends State { + final dbHandler dbh = dbHandler.instance; + Future loaded; + Timer stuck, d; + bool openProblem = false; + bool openObservation = false; + Equipment eq; + Repair r; + Future _loadvars() async { + dbh + .queryByID("equipment", widget.id) + .then((List> value) { + eq = Equipment.fromJson(value[0]); + }); + dbh + .queryByID("v_repair", widget.id) + .then((List> value) { + r = Repair.fromView(value[0]); + }); + + return true && eq != null; + } + + _reload() { + stuck = Timer(Duration(seconds: 2), () { + loaded = _loadvars(); + stuck.cancel(); + setState(() {}); + }); + } + + @override + void setState(fn) { + if (mounted) { + super.setState(fn); + } + } + + @override + void initState() { + super.initState(); + loaded = _loadvars(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text("Detalhes do Aparelho"), + ), + body: _layout(), + ); + } + + _layout() { + return Container( + margin: EdgeInsets.all(10), + child: FutureBuilder( + future: loaded, + builder: (context, snapshot) { + if (snapshot.connectionState == ConnectionState.done && + eq != null) { + return Column( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + Card( + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + ListTile( + title: RichText( + overflow: TextOverflow.ellipsis, + strutStyle: StrutStyle(fontSize: 16.0), + text: TextSpan( + style: TextStyle( + color: Colors.black, fontSize: 16), + text: "N°" + eq.id.toString())), + ), + RichText( + overflow: TextOverflow.ellipsis, + strutStyle: StrutStyle(fontSize: 16.0), + text: TextSpan( + style: TextStyle( + color: Colors.black, fontSize: 16), + text: eq.name)), + Divider(color: Colors.black38), + Column(children: [ + if (eq.images.length > 0) + eq.images[0].isNotEmpty + ? SizedBox( + height: 270, + child: Caroussel(eq.images)) + : SizedBox( + height: 170, + child: Center( + child: RichText( + strutStyle: + StrutStyle(fontSize: 30.0), + text: TextSpan( + style: TextStyle( + color: Colors.black26, + fontSize: 30, + fontWeight: + FontWeight.w300, + fontStyle: + FontStyle.italic), + text: "Sem Imagem")), + )), + ]), + Divider(color: Colors.black38), + ListTile( + leading: const Icon(Icons.warning), + title: RichText( + overflow: TextOverflow.ellipsis, + strutStyle: StrutStyle(fontSize: 12.0), + text: TextSpan( + style: TextStyle( + color: Colors.black, fontSize: 16), + text: "Problema : " + '${eq.problem}', + ), + ), + onTap: () => _modal('${eq.problem}', "Problema", + Icons.warning_amber_outlined), + ), + ListTile( + leading: Icon(Icons.info), + title: RichText( + overflow: TextOverflow.ellipsis, + strutStyle: StrutStyle(fontSize: 12.0), + text: TextSpan( + style: TextStyle( + color: Colors.black, fontSize: 16), + text: "Observações : " + + '${eq.observation}')), + onTap: () => _modal('${eq.observation}', + "Observações", Icons.info_outline), + ), + ListTile( + leading: Icon(Icons.calendar_today), + title: Text("Data de Entrada: " + + '${DateFormat.yMMMd().format(eq.dateInput)}'), + ), + _Eval(), + Divider(color: Colors.black38), + Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + Botoes( + "Alterar", + onPressed: _update, + ), + Botoes( + "Remover", + onPressed: _remove, + ) + ], + ), + Divider(color: Colors.transparent), + ]), + ), + ], + ); + } + if (snapshot.data == false) { + _reload(); + } + return Center( + child: CircularProgressIndicator(), + ); + })); + } + + _Eval() { + return eq.dateExit != null + ? ListTile( + leading: Icon(Icons.calendar_today_outlined), + title: Text("Data de Entrega: " + + '${DateFormat.yMMMd().format(eq.dateExit)}')) + : Container(width: 0, height: 0); + } + + _update() { + setState(() { + Navigator.of(context) + .push(new MaterialPageRoute( + builder: (context) => alterEquipment(eq, r: r))) + .whenComplete(_reload); + }); + } + + _remove() { + return showDialog( + context: context, + builder: (_) => SimpleDialog( + contentPadding: EdgeInsets.all(20), + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Icon(Icons.warning_amber_outlined), + Text("Confirmação de Ação") + ], + ), + Divider(color: Colors.black38), + RichText( + strutStyle: StrutStyle(fontSize: 12.0), + text: TextSpan( + style: TextStyle(color: Colors.black, fontSize: 16), + text: "Deseja realmente remover ${eq.name}?") + ), + Divider(color: Colors.transparent), + Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + Botoes("Sim", onPressed: (){ + eq.RemoveDB(eq.id); + if(r != null) + r.RemoveDB(r.id); + d = Timer(Duration(milliseconds: 200), () + { + if ((r != null && r.status == 1 && eq.status == 1) || + (r == null && eq.status == 1)) { + d.cancel(); + int count = 0; + Navigator.of(context).popUntil((_) => count++ >= 2); + } + }); + /**/ + },), + Botoes("Não", onPressed: (){ + Navigator.of(context, rootNavigator: true).pop('dialog'); + },) + ], + ) + ], + ) + ); + } + + _modal(String value, String type, IconData icon) { + return showDialog( + context: context, + builder: (_) => SimpleDialog( + contentPadding: EdgeInsets.all(20), + semanticLabel: type, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Icon(icon), + Text(type), + ], + ), + Divider(color: Colors.black38), + RichText( + strutStyle: StrutStyle(fontSize: 12.0), + text: TextSpan( + style: TextStyle(color: Colors.black, fontSize: 16), + text: value)), + Botoes( + "Fechar", + onPressed: () { + Navigator.of(context, rootNavigator: true).pop('dialog'); + }, + ) + ], + )); + } +} diff --git a/lib/screens/listClients.dart b/lib/screens/listClients.dart new file mode 100644 index 0000000..90909b5 --- /dev/null +++ b/lib/screens/listClients.dart @@ -0,0 +1,210 @@ +import 'package:esms_project/dbhandler.dart'; +import 'package:esms_project/screens/clientDetail.dart'; +import 'package:esms_project/screens/createClient.dart'; +import 'package:flutter/material.dart'; +import 'package:esms_project/widgets/widget_button.dart'; + +class ListClients extends StatefulWidget { + @override + _ListClientsState createState() => _ListClientsState(); +} + +class _ListClientsState extends State { + final dbHandler dbh = dbHandler.instance; + Future loaded; + List> cliList = List.empty(growable: true); + + Future _loadvars() async { + cliList = List.empty(growable: true); + dbh.queryOrdered("client", "ASC", "name").then((value) { + List> tmp = value; + for(int i = 0; i < tmp.length; i++) + { + if(tmp[i]['name'] != "CLIENTE_REMOVIDO") + { + cliList.add(tmp[i]); + } + } + setState(() { + return true && cliList != null; + }); + }); + return false; + } + + @override + void setState(fn) { + if(mounted) { + super.setState(fn); + } + } + + @override + void initState() { + super.initState(); + loaded = _loadvars(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text("Listagem de Clientes"), + actions: [ + IconButton( + icon: Icon(Icons.add_box_outlined), + onPressed: () { + setState(() { + Navigator.of(context) + .push(new MaterialPageRoute( + builder: (context) => CreateClient())) + .whenComplete(_loadvars); + }); + }, + ) + ], + ), + body: _body(), + ); + } + + _body() { + return Container( + child: FutureBuilder( + future: loaded, + builder: (context, snapshot) { + if (snapshot.connectionState == ConnectionState.waiting) + return Center( + child: CircularProgressIndicator(), + ); + else if (cliList != null && cliList.length != 0) { + return ListView.separated( + padding: const EdgeInsets.all(8), + itemCount: cliList.length, + itemBuilder: (BuildContext context, int index) { + return Container( + padding: const EdgeInsets.only(left: 10), + height: 90, + color: Colors.black12, + child: InkWell( + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + Row( + children: [ + RichText( + overflow: TextOverflow.ellipsis, + strutStyle: StrutStyle(fontSize: 18.0), + text: TextSpan( + style: TextStyle(color: Colors.black, fontSize: 18.0), + text: "Cliente: " + + '${cliList[index]['name']}')), + ], + ), + Row( + children: [ + RichText( + overflow: TextOverflow.ellipsis, + strutStyle: StrutStyle(fontSize: 18.0), + text: TextSpan( + style: TextStyle(color: Colors.black, fontSize: 18.0), + text: "Celular: " + + '${cliList[index]['cellular']}')) + ], + ) + ], + ), + onTap: () => + onPressWithArg(context, cliList[index]['id']), + )); + }, + separatorBuilder: (BuildContext context, int index) => + const Divider()); + } else { + return Container( + child: Center( + child: Column( + children: [ + Expanded( + flex: 2, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + RichText( + strutStyle: StrutStyle( + fontSize: 32.0, + fontWeight: FontWeight.w400, + fontStyle: FontStyle.italic), + text: TextSpan( + style: TextStyle( + fontSize: 32.0, + fontWeight: FontWeight.w400, + fontStyle: FontStyle.italic, + color: Colors.black26), + text: "Estou vazio!"), + ), + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + RichText( + strutStyle: StrutStyle( + fontSize: 16.0, + fontWeight: FontWeight.w400, + fontStyle: FontStyle.italic), + text: TextSpan( + style: TextStyle( + fontSize: 16.0, + fontWeight: FontWeight.w400, + fontStyle: FontStyle.italic, + color: Colors.black26), + text: + "Cadastre um cliente clicando no botão "), + ), + Icon( + Icons.add_box_outlined, + color: Colors.black26, + ), + ]), + RichText( + strutStyle: StrutStyle( + fontSize: 16.0, + fontWeight: FontWeight.w400, + fontStyle: FontStyle.italic), + text: TextSpan( + style: TextStyle( + fontSize: 16.0, + fontWeight: FontWeight.w400, + fontStyle: FontStyle.italic, + color: Colors.black26), + text: "\nOu tente recarregar a tela."), + ), + Botoes( + "Recarregar", + onPressed: () => _update(context), + ) + ], + ), + ) + ], + ))); + } + }, + ), + ); + } + + _update(BuildContext context) { + setState(() { + Navigator.pushReplacement( + context, MaterialPageRoute(builder: (context) => ListClients())); + }); + } + + onPressWithArg(context, int id) { + setState(() { + Navigator.of(context) + .push(new MaterialPageRoute(builder: (context) => ClientDetail(id))) + .whenComplete(_loadvars); + }); + } +} diff --git a/lib/screens/listEquipment.dart b/lib/screens/listEquipment.dart new file mode 100644 index 0000000..d4e0f10 --- /dev/null +++ b/lib/screens/listEquipment.dart @@ -0,0 +1,236 @@ +import 'package:esms_project/dbhandler.dart'; +import 'package:esms_project/screens/createEquipment.dart'; +import 'package:esms_project/screens/equipmentDetail.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:esms_project/electronic.dart'; +import 'package:esms_project/widgets/widget_button.dart'; +import 'package:intl/intl.dart'; + +class listEquipment extends StatefulWidget { + @override + _listEquipmentState createState() => _listEquipmentState(); +} + +class _listEquipmentState extends State { + final dbHandler dbh = dbHandler.instance; + Future loaded; + List> eqList; + + Future _loadvars() async { + dbh.queryAllEquipment().then((value) { + eqList = value; + setState(() { + return true && eqList != null; + }); + }); + return false; + } + + @override + void setState(fn) { + if(mounted) { + super.setState(fn); + } + } + + @override + void initState() { + super.initState(); + loaded = _loadvars(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text("Aparelhos para Conserto"), + actions: [ + IconButton( + onPressed: () => _addItem(context), + icon: Icon(Icons.add_box_outlined)) + ], + ), + body: _body(), + ); + } + + _body() { + return Container( + child: FutureBuilder( + future: loaded, + builder: (context, snapshot) { + if (snapshot.connectionState == ConnectionState.waiting) + return Center( + child: CircularProgressIndicator(), + ); + else if (eqList != null && eqList.length != 0) { + return ListView.separated( + padding: const EdgeInsets.all(8), + itemCount: eqList.length, + itemBuilder: (BuildContext context, int index) { + return Container( + padding: const EdgeInsets.only(left: 10), + height: 90, + color: Colors.black12, + child: InkWell( + child: Center( + child: Column( + mainAxisAlignment: + MainAxisAlignment.spaceEvenly, + mainAxisSize: MainAxisSize.max, + children: [ + Row( + children: [ + Expanded( + flex: 1, + child: RichText( + overflow: TextOverflow.ellipsis, + text: TextSpan( + style: TextStyle( + color: Colors.black, + fontSize: 18.0), + text: + "Aparelho: "+'${eqList[index]['equipment']}'))), + ], + ), + Row( + children: [ + Expanded( + flex: 1, + child: RichText( + overflow: TextOverflow.ellipsis, + strutStyle: + StrutStyle(fontSize: 16.0), + text: TextSpan( + style: TextStyle( + fontSize: 16.0, + color: Colors.black), + text: "Cliente: " + + '${eqList[index]['name']}'))), + Expanded( + flex: 1, + child: RichText( + overflow: TextOverflow.ellipsis, + strutStyle: + StrutStyle(fontSize: 16.0), + text: TextSpan( + style: TextStyle( + fontSize: 16.0, + color: Colors.black), + text: "Data: " + + '${DateFormat.yMd().format(DateTime.tryParse(eqList[index]['dateInput']))}'))), + ], + ), + ]), + ), + onTap: () => onPressWithArg( + context, + eqList[index]['id'], + ))); + }, + separatorBuilder: (BuildContext context, int index) => + const Divider()); + } else { + return Container( + child: Center( + child: Column( + children: [ + Expanded( + flex: 2, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + RichText( + strutStyle: StrutStyle( + fontSize: 32.0, + fontWeight: FontWeight.w400, + fontStyle: FontStyle.italic), + text: TextSpan( + style: TextStyle( + fontSize: 32.0, + fontWeight: FontWeight.w400, + fontStyle: FontStyle.italic, + color: Colors.black26), + text: "Estou vazio!"), + ), + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + RichText( + strutStyle: StrutStyle( + fontSize: 16.0, + fontWeight: FontWeight.w400, + fontStyle: FontStyle.italic), + text: TextSpan( + style: TextStyle( + fontSize: 16.0, + fontWeight: FontWeight.w400, + fontStyle: FontStyle.italic, + color: Colors.black26), + text: + "Cadastre um aparelho clicando no botão "), + ), + Icon( + Icons.add_box_outlined, + color: Colors.black26, + ), + ]), + RichText( + strutStyle: StrutStyle( + fontSize: 16.0, + fontWeight: FontWeight.w400, + fontStyle: FontStyle.italic), + text: TextSpan( + style: TextStyle( + fontSize: 16.0, + fontWeight: FontWeight.w400, + fontStyle: FontStyle.italic, + color: Colors.black26), + text: "\nOu tente recarregar a tela."), + ), + Botoes( + "Recarregar", + onPressed: () => _update(context), + ) + ], + ), + ) + ], + ))); + } + }, + ), + ); + } + + _update(ctx) { + setState(() { + Navigator.pushReplacement( + ctx, MaterialPageRoute(builder: (context) => listEquipment())); + }); + } + + // + void load(int arg) async { + Equipment t = new Equipment(0, "", "", "", DateTime.now()); + t = await t.LoadFromDB(arg); + } + + void onPressWithArg(ctx, int id) { + setState(() { + Navigator.of(ctx) + .push( + new MaterialPageRoute(builder: (context) => EquipmentDetail(id))) + .whenComplete(_loadvars); + }); + } + + _addItem(ctx) { + setState(() { + Navigator.of(ctx) + .push(new MaterialPageRoute(builder: (context) => CreateEquipment())) + .whenComplete(_loadvars); + }); + } +} diff --git a/lib/screens/listEquipmentByClient.dart b/lib/screens/listEquipmentByClient.dart new file mode 100644 index 0000000..0e6a3d5 --- /dev/null +++ b/lib/screens/listEquipmentByClient.dart @@ -0,0 +1,283 @@ +import 'dart:async'; + +import 'package:esms_project/client.dart'; +import 'package:esms_project/dbhandler.dart'; +import 'package:esms_project/screens/createEquipment.dart'; +import 'package:esms_project/screens/equipmentDetail.dart'; +import 'package:flutter/material.dart'; +import 'package:esms_project/electronic.dart'; +import 'package:esms_project/widgets/widget_button.dart'; +import 'package:intl/intl.dart'; + +class listEquipmentClient extends StatefulWidget { + int id_client; + String clientName; + listEquipmentClient({this.id_client,this.clientName}); + @override + _listEquipmentClientState createState() => _listEquipmentClientState(); +} + +class _listEquipmentClientState extends State { + final dbHandler dbh = dbHandler.instance; + Future loaded; + List> eqList; + Client c; + int count = 0; + Timer stuck; + Future _loadvars() async { + if(widget.id_client!=null) { + dbh.queryByID("client", widget.id_client).then((value) { + c = Client.fromJson(value[0]); + }); + widget.clientName = null; + dbh.queryEquipmentClient(widget.id_client).then((value) { + eqList = value; + }); + } + if(widget.clientName != null) + { + widget.id_client = null; + dbh.queryByName("v_equipment", widget.clientName).then((value) { + eqList = value; + }); + } + setState(() { + return true && eqList != null; + }); + } + + @override + void setState(fn) { + if(mounted) { + super.setState(fn); + } + } + + _reload() { + if(count < 2) + stuck = Timer(Duration(seconds: 1), () { + if(eqList == null) + loaded = _loadvars(); + stuck.cancel(); + count++; + setState(() {}); + }); + } + + @override + void initState() { + super.initState(); + loaded = _loadvars(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text("Resultados da Pesquisa"), + actions: [ + if(widget.id_client != null) + IconButton( + onPressed: () => _addItem(context), + icon: Icon(Icons.add_box_outlined)) + ], + ), + body: _body(), + ); + } + + _body() { + return Container( + child: FutureBuilder( + future: loaded, + builder: (context, snapshot) { + if (snapshot.connectionState == ConnectionState.waiting) + return Center( + child: CircularProgressIndicator(), + ); + else if (eqList != null && eqList.length > 0) { + return ListView.separated( + padding: const EdgeInsets.all(8), + itemCount: eqList.length, + itemBuilder: (BuildContext context, int index) { + return Container( + padding: const EdgeInsets.only(left: 10), + height: 90, + color: Colors.black12, + child: InkWell( + child: Center( + child: Column( + mainAxisAlignment: + MainAxisAlignment.spaceEvenly, + children: [ + Row( + children: [ + Expanded( + flex: 1, + child: RichText( + overflow: TextOverflow.ellipsis, + text: TextSpan( + style: TextStyle( + color: Colors.black, + fontSize: 18.0), + text: + '${eqList[index]['equipment']}'))), + Expanded( + flex: 1, + child: RichText( + overflow: TextOverflow.ellipsis, + strutStyle: + StrutStyle(fontSize: 18.0), + text: TextSpan( + style: TextStyle( + color: Colors.black, + fontSize: 18.0), + text: + '${eqList[index]['problem']}'))), + ], + ), + Row( + children: [ + Expanded( + flex: 1, + child: RichText( + overflow: TextOverflow.ellipsis, + strutStyle: + StrutStyle(fontSize: 16.0), + text: TextSpan( + style: TextStyle( + fontSize: 16.0, + color: Colors.black), + text: "Data: " + + '${DateFormat.yMd().format(DateTime.tryParse(eqList[index]['dateInput']))}'))), + Expanded( + flex: 1, + child: RichText( + overflow: TextOverflow.ellipsis, + strutStyle: + StrutStyle(fontSize: 16.0), + text: TextSpan( + style: TextStyle( + fontSize: 16.0, + color: Colors.black), + text: "Cliente: "+eqList[index]['name']) + ) + ) + ], + ), + ]), + ), + onTap: () => onPressWithArg( + context, + eqList[index]['id'], + ))); + }, + separatorBuilder: (BuildContext context, int index) => + const Divider()); + } + if (snapshot.data == null) { + _reload(); + } + return Container( + child: Center( + child: Column( + children: [ + Expanded( + flex: 2, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + RichText( + strutStyle: StrutStyle( + fontSize: 32.0, + fontWeight: FontWeight.w400, + fontStyle: FontStyle.italic), + text: TextSpan( + style: TextStyle( + fontSize: 32.0, + fontWeight: FontWeight.w400, + fontStyle: FontStyle.italic, + color: Colors.black26), + text: "Estou vazio!"), + ), + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + RichText( + strutStyle: StrutStyle( + fontSize: 16.0, + fontWeight: FontWeight.w400, + fontStyle: FontStyle.italic), + text: TextSpan( + style: TextStyle( + fontSize: 16.0, + fontWeight: FontWeight.w400, + fontStyle: FontStyle.italic, + color: Colors.black26), + text: + "Cadastre um aparelho clicando no botão "), + ), + Icon( + Icons.add_box_outlined, + color: Colors.black26, + ), + ]), + RichText( + strutStyle: StrutStyle( + fontSize: 16.0, + fontWeight: FontWeight.w400, + fontStyle: FontStyle.italic), + text: TextSpan( + style: TextStyle( + fontSize: 16.0, + fontWeight: FontWeight.w400, + fontStyle: FontStyle.italic, + color: Colors.black26), + text: "\nOu tente recarregar a tela."), + ), + Botoes( + "Recarregar", + onPressed: () => _update(context), + ) + ], + ), + ) + ], + ))); + } + ), + ); + } + + _update(ctx) { + setState(() { + Navigator.pushReplacement( + ctx, + MaterialPageRoute( + builder: (context) => listEquipmentClient(id_client: widget.id_client, clientName: widget.clientName,))); + }); + } + + // + void load(int arg) async { + Equipment t = new Equipment(0, "", "", "", DateTime.now()); + t = await t.LoadFromDB(arg); + } + + void onPressWithArg(ctx, int id) { + setState(() { + Navigator.of(ctx) + .push( + new MaterialPageRoute(builder: (context) => EquipmentDetail(id))) + .whenComplete(_loadvars); + }); + } + + _addItem(ctx) { + setState(() { + Navigator.of(ctx) + .push(new MaterialPageRoute(builder: (context) => CreateEquipment(c: c))) + .whenComplete(_loadvars); + }); + } +} diff --git a/lib/screens/listEquipmentByID.dart b/lib/screens/listEquipmentByID.dart new file mode 100644 index 0000000..16b6632 --- /dev/null +++ b/lib/screens/listEquipmentByID.dart @@ -0,0 +1,236 @@ +import 'package:esms_project/dbhandler.dart'; +import 'package:esms_project/screens/equipmentDetail.dart'; +import 'package:flutter/material.dart'; +import 'package:esms_project/electronic.dart'; +import 'package:esms_project/widgets/widget_button.dart'; +import 'package:intl/intl.dart'; + +class listEquipmentID extends StatefulWidget { + final int id; + + listEquipmentID(this.id); + @override + _listEquipmentIDState createState() => _listEquipmentIDState(); +} + +class _listEquipmentIDState extends State { + final dbHandler dbh = dbHandler.instance; + Future loaded; + List> eqList; + + Future _loadvars() async { + dbh.queryByID("v_equipment", widget.id).then((value) { + eqList = value; + setState(() { + return true && eqList != null; + }); + }); + return false; + } + + @override + void setState(fn) { + if(mounted) { + super.setState(fn); + } + } + + @override + void initState() { + super.initState(); + loaded = _loadvars(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text("Resultados da Pesquisa"), + ), + body: _body(), + ); + } + + _body() { + return Container( + child: FutureBuilder( + future: loaded, + builder: (context, snapshot) { + if (snapshot.connectionState == ConnectionState.waiting) + return Center( + child: CircularProgressIndicator(), + ); + else if (eqList != null && eqList.length != 0) { + return ListView.separated( + padding: const EdgeInsets.all(8), + itemCount: eqList.length, + itemBuilder: (BuildContext context, int index) { + return Container( + padding: const EdgeInsets.only(left: 10), + height: 90, + color: Colors.black12, + child: InkWell( + child: Center( + child: Column( + mainAxisAlignment: + MainAxisAlignment.spaceEvenly, + children: [ + Row( + children: [ + Expanded( + flex: 1, + child: RichText( + overflow: TextOverflow.ellipsis, + text: TextSpan( + style: TextStyle( + color: Colors.black, + fontSize: 18.0), + text: "Aparelho: " + + '${eqList[index]['equipment']}'))), + Expanded( + flex: 1, + child: RichText( + overflow: TextOverflow.ellipsis, + strutStyle: + StrutStyle(fontSize: 16.0), + text: TextSpan( + style: TextStyle( + fontSize: 16.0, + color: Colors.black), + text: "Cliente: " + + '${eqList[index]['name']}'))), + ], + ), + Row( + children: [ + Expanded( + flex: 1, + child: RichText( + overflow: TextOverflow.ellipsis, + strutStyle: + StrutStyle(fontSize: 16.0), + text: TextSpan( + style: TextStyle( + fontSize: 16.0, + color: Colors.black), + text: "Entrada: " + + '${DateFormat.yMd().format(DateTime.tryParse(eqList[index]['dateInput']))}'))), + if (eqList != null && DateTime.tryParse(eqList[index]['dateExit']) != null) + Expanded( + flex: 1, + child: RichText( + overflow: TextOverflow.ellipsis, + strutStyle: + StrutStyle(fontSize: 16.0), + text: TextSpan( + style: TextStyle( + fontSize: 16.0, + color: Colors.black), + text: "Saída: " + + '${DateFormat.yMd().format(DateTime.tryParse(eqList[index]['dateExit']))}'))) + ], + ), + ]), + ), + onTap: () => onPressWithArg( + context, + eqList[index]['id'], + ))); + }, + separatorBuilder: (BuildContext context, int index) => + const Divider()); + } else { + return Container( + child: Center( + child: Column( + children: [ + Expanded( + flex: 2, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + RichText( + strutStyle: StrutStyle( + fontSize: 32.0, + fontWeight: FontWeight.w400, + fontStyle: FontStyle.italic), + text: TextSpan( + style: TextStyle( + fontSize: 32.0, + fontWeight: FontWeight.w400, + fontStyle: FontStyle.italic, + color: Colors.black26), + text: "Estou vazio!"), + ), + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + RichText( + strutStyle: StrutStyle( + fontSize: 16.0, + fontWeight: FontWeight.w400, + fontStyle: FontStyle.italic), + text: TextSpan( + style: TextStyle( + fontSize: 16.0, + fontWeight: FontWeight.w400, + fontStyle: FontStyle.italic, + color: Colors.black26), + text: + "Cadastre um aparelho clicando no botão "), + ), + Icon( + Icons.add_box_outlined, + color: Colors.black26, + ), + ]), + RichText( + strutStyle: StrutStyle( + fontSize: 16.0, + fontWeight: FontWeight.w400, + fontStyle: FontStyle.italic), + text: TextSpan( + style: TextStyle( + fontSize: 16.0, + fontWeight: FontWeight.w400, + fontStyle: FontStyle.italic, + color: Colors.black26), + text: "\nOu tente recarregar a tela."), + ), + Botoes( + "Recarregar", + onPressed: () => _update(context), + ) + ], + ), + ) + ], + ))); + } + }, + ), + ); + } + + _update(ctx) { + setState(() { + Navigator.pushReplacement(ctx, + MaterialPageRoute(builder: (context) => listEquipmentID(widget.id))); + }); + } + + // + void load(int arg) async { + Equipment t = new Equipment(0, "", "", "", DateTime.now()); + t = await t.LoadFromDB(arg); + } + + void onPressWithArg(ctx, int id) { + setState(() { + Navigator.of(ctx) + .push( + new MaterialPageRoute(builder: (context) => EquipmentDetail(id))) + .whenComplete(_loadvars); + }); + } +} diff --git a/lib/screens/listEquipmentDelivered.dart b/lib/screens/listEquipmentDelivered.dart new file mode 100644 index 0000000..440bf12 --- /dev/null +++ b/lib/screens/listEquipmentDelivered.dart @@ -0,0 +1,228 @@ +import 'package:esms_project/dbhandler.dart'; +import 'package:esms_project/screens/equipmentDetail.dart'; +import 'package:flutter/material.dart'; +import 'package:esms_project/electronic.dart'; +import 'package:esms_project/widgets/widget_button.dart'; +import 'package:intl/intl.dart'; + +class listEquipmentDelivered extends StatefulWidget { + @override + _listEquipmentDeliveredState createState() => _listEquipmentDeliveredState(); +} + +class _listEquipmentDeliveredState extends State { + final dbHandler dbh = dbHandler.instance; + Future loaded; + List> eqList; + + Future _loadvars() async { + dbh.queryAllEquipmentDelivered().then((value) { + eqList = value; + setState(() { + return true && eqList != null; + }); + }); + return false; + } + + @override + void setState(fn) { + if(mounted) { + super.setState(fn); + } + } + + @override + void initState() { + super.initState(); + loaded = _loadvars(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text("Aparelhos Entregues"), + ), + body: _body(), + ); + } + + _body() { + return Container( + child: FutureBuilder( + future: loaded, + builder: (context, snapshot) { + if (snapshot.connectionState == ConnectionState.waiting) + return Center( + child: CircularProgressIndicator(), + ); + else if (eqList != null && eqList.length != 0) { + return ListView.separated( + padding: const EdgeInsets.all(8), + itemCount: eqList.length, + itemBuilder: (BuildContext context, int index) { + return Container( + padding: const EdgeInsets.only(left: 10), + height: 90, + color: Colors.black12, + child: InkWell( + child: Center( + child: Column( + mainAxisAlignment: + MainAxisAlignment.spaceEvenly, + children: [ + Row( + children: [ + Expanded( + flex: 1, + child: RichText( + overflow: TextOverflow.ellipsis, + text: TextSpan( + style: TextStyle( + color: Colors.black, + fontSize: 18.0), + text: + "Aparelho: "+'${eqList[index]['equipment']}'))), + Expanded( + flex: 1, + child: RichText( + overflow: TextOverflow.ellipsis, + strutStyle: + StrutStyle(fontSize: 16.0), + text: TextSpan( + style: TextStyle( + fontSize: 16.0, + color: Colors.black), + text: "Cliente: " + + '${eqList[index]['name']}'))), + ], + ), + Row( + children: [ + Expanded( + flex: 1, + child: RichText( + overflow: TextOverflow.ellipsis, + strutStyle: + StrutStyle(fontSize: 16.0), + text: TextSpan( + style: TextStyle( + fontSize: 16.0, + color: Colors.black), + text: "Entrada: " + + '${DateFormat.yMd().format(DateTime.tryParse(eqList[index]['dateInput']))}'))), + Expanded( + flex: 1, + child: RichText( + overflow: TextOverflow.ellipsis, + strutStyle: + StrutStyle(fontSize: 16.0), + text: TextSpan( + style: TextStyle( + fontSize: 16.0, + color: Colors.black), + text: "Entrega: " + + '${DateFormat.yMd().format(DateTime.tryParse(eqList[index]['dateExit']))}'))) + ], + ), + ]), + ), + onTap: () => onPressWithArg( + context, + eqList[index]['id'], + ))); + }, + separatorBuilder: (BuildContext context, int index) => + const Divider()); + } else { + return Container( + child: Center( + child: Column( + children: [ + Expanded( + flex: 2, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + RichText( + strutStyle: StrutStyle( + fontSize: 32.0, + fontWeight: FontWeight.w400, + fontStyle: FontStyle.italic), + text: TextSpan( + style: TextStyle( + fontSize: 32.0, + fontWeight: FontWeight.w400, + fontStyle: FontStyle.italic, + color: Colors.black26), + text: "Estou vazio!"), + ), + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + RichText( + strutStyle: StrutStyle( + fontSize: 16.0, + fontWeight: FontWeight.w400, + fontStyle: FontStyle.italic), + text: TextSpan( + style: TextStyle( + fontSize: 16.0, + fontWeight: FontWeight.w400, + fontStyle: FontStyle.italic, + color: Colors.black26), + text: + "Nenhum aparelho entregue até o momento."), + ), + ]), + RichText( + strutStyle: StrutStyle( + fontSize: 16.0, + fontWeight: FontWeight.w400, + fontStyle: FontStyle.italic), + text: TextSpan( + style: TextStyle( + fontSize: 16.0, + fontWeight: FontWeight.w400, + fontStyle: FontStyle.italic, + color: Colors.black26), + text: "\nTente recarregar a tela."), + ), + Botoes( + "Recarregar", + onPressed: () => _update(context), + ) + ], + ), + ) + ], + ))); + } + }, + ), + ); + } + + _update(ctx) { + setState(() { + Navigator.pushReplacement( + ctx, MaterialPageRoute(builder: (context) => listEquipmentDelivered())); + }); + } + + // + void load(int arg) async { + Equipment t = new Equipment(0, "", "", "", DateTime.now()); + t = await t.LoadFromDB(arg); + } + + void onPressWithArg(ctx, int id) { + setState(() { + Navigator.of(ctx) + .push( + new MaterialPageRoute(builder: (context) => EquipmentDetail(id))) + .whenComplete(_loadvars); + }); + } +} diff --git a/lib/screens/listRepairs.dart b/lib/screens/listRepairs.dart new file mode 100644 index 0000000..f7c964b --- /dev/null +++ b/lib/screens/listRepairs.dart @@ -0,0 +1,260 @@ +import 'dart:async'; + +import 'package:esms_project/dbhandler.dart'; +import 'package:esms_project/screens/equipmentDetail.dart'; +import 'package:esms_project/widgets/widget_button.dart'; +import 'package:esms_project/widgets/widget_input.dart'; +import 'package:flutter/material.dart'; + +import '../electronic.dart'; + +class ListRepairs extends StatefulWidget { + @override + _ListRepairsState createState() => _ListRepairsState(); +} + +class _ListRepairsState extends State { + final dbHandler dbh = dbHandler.instance; + Future loaded; + + List> repList; + Future _loadvars() async { + dbh.queryOrdered("v_repair", "ASC", "name").then((value) { + repList = value; + setState(() { + return true && repList != null; + }); + }); + return false; + } + @override + void setState(fn) { + if (mounted) { + super.setState(fn); + } + } + + @override + void initState() { + super.initState(); + loaded = _loadvars(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text("Exemplares de Consertos"), + actions: [ + IconButton(onPressed: (){ + showSearch(context: context, delegate: CustomSearch(type: 0, loadList: repList)); + }, icon: Icon(Icons.search)) + ], + ), + body: _body(), + ); + } + + _body() { + return Container( + child: FutureBuilder( + future: loaded, + builder: (context, snapshot) { + if (snapshot.connectionState == ConnectionState.waiting) + return Center( + child: CircularProgressIndicator(), + ); + else if (repList != null && repList.length != 0) { + return ListView.separated( + padding: const EdgeInsets.all(8), + itemCount: repList.length, + itemBuilder: (BuildContext context, int index) { + return Container( + padding: const EdgeInsets.only(left: 10), + height: 90, + color: Colors.black12, + child: InkWell( + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + Row( + children: [ + RichText( + overflow: TextOverflow.ellipsis, + strutStyle: StrutStyle(fontSize: 18.0), + text: TextSpan( + style: TextStyle( + color: Colors.black, + fontSize: 18.0), + text: "Aparelho: " + + '${repList[index]['name']}')), + ], + ), + Row( + children: [ + RichText( + overflow: TextOverflow.ellipsis, + strutStyle: StrutStyle(fontSize: 18.0), + text: TextSpan( + style: TextStyle( + color: Colors.black, + fontSize: 18.0), + text: "Reparo: " + + '${repList[index]['repair']}')) + ], + ) + ], + ), + onTap: () => onPressWithArg( + repList[index]['repair'],repList[index]['id'],repList[index]['repair_id']), + )); + }, + separatorBuilder: (BuildContext context, int index) => + const Divider()); + } else { + return Container( + child: Center( + child: Column( + children: [ + Expanded( + flex: 2, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + RichText( + strutStyle: StrutStyle( + fontSize: 32.0, + fontWeight: FontWeight.w400, + fontStyle: FontStyle.italic), + text: TextSpan( + style: TextStyle( + fontSize: 32.0, + fontWeight: FontWeight.w400, + fontStyle: FontStyle.italic, + color: Colors.black26), + text: "Nenhum reparo cadastrado."), + ), + RichText( + strutStyle: StrutStyle( + fontSize: 16.0, + fontWeight: FontWeight.w400, + fontStyle: FontStyle.italic), + text: TextSpan( + style: TextStyle( + fontSize: 16.0, + fontWeight: FontWeight.w400, + fontStyle: FontStyle.italic, + color: Colors.black26), + text: "\nTente recarregar a tela."), + ), + Botoes( + "Recarregar", + onPressed: () => _update(context), + ) + ], + ), + ) + ], + ))); + } + }, + ), + ); + } + + _update(BuildContext context) { + setState(() { + Navigator.of(context).popUntil((route) => route.isFirst); + Navigator.of(context).push(new MaterialPageRoute(builder: (context)=> ListRepairs())); + }); + } + + onPressWithArg(String rep, int id, int repid) { + setState(() { + _modalInput(rep, id, repid); + }); + } + + _modalInput(String repair, int eq, int rep) { + return showDialog( + context: context, + builder: (_) => SimpleDialog( + contentPadding: EdgeInsets.all(20), + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text("Detalhes do Reparo"), + IconButton( + iconSize: 20, + onPressed: () { + Navigator.of(context, rootNavigator: true) + .pop('dialog'); + }, + icon: Icon(Icons.close)) + ], + ), + Divider(color: Colors.black38), + RichText( + strutStyle: StrutStyle(fontSize: 16.0), + text: TextSpan( + style: TextStyle(color: Colors.black, fontSize: 20.0, fontWeight: FontWeight.w300), + text:repair)), + Divider(color: Colors.transparent), + Botoes( + "Ver Aparelho", + onPressed: () { + Navigator.of(context) + .push(new MaterialPageRoute(builder: (context) => EquipmentDetail(eq))) + .whenComplete(_loadvars); + }, + ), + Botoes( + "Remover Reparo", + onPressed: () { + _confirmDelete(rep); + }, + ) + ], + ) + ); + } + _confirmDelete(int id) + { + return showDialog( + context: context, + builder: (_) => SimpleDialog( + contentPadding: EdgeInsets.all(20), + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text("Deseja remover o reparo?"), + IconButton( + iconSize: 20, + onPressed: () { + Navigator.of(context, rootNavigator: true) + .pop('dialog'); + }, + icon: Icon(Icons.close)) + ], + ), + Divider(color: Colors.black38), + Row(mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + Botoes("Sim", onPressed: (){ + Repair r = new Repair(0,"temp"); + r.RemoveDB(id); + setState(() { + _update(context); + }); + },), Botoes("Não", onPressed: (){ + Navigator.of(context, rootNavigator: true) + .pop('dialog'); + }) + ],) + ] + ) + ); + } +} diff --git a/lib/widgets/button_styles.dart b/lib/widgets/button_styles.dart new file mode 100644 index 0000000..91b77fa --- /dev/null +++ b/lib/widgets/button_styles.dart @@ -0,0 +1,13 @@ +import 'package:flutter/material.dart'; + +class ButtonStyles { + + ButtonStyle btnS = ButtonStyle( + shape: MaterialStateProperty.all( + RoundedRectangleBorder( + borderRadius: BorderRadius.circular(10.0), + side: BorderSide(color: Colors.redAccent, width: 1.2))), + backgroundColor: MaterialStateProperty.all(Colors.redAccent[700]),); + TextStyle txS = TextStyle( + color: Colors.white, fontSize: 20, fontWeight: FontWeight.w400); +} diff --git a/lib/widgets/widget_button.dart b/lib/widgets/widget_button.dart new file mode 100644 index 0000000..5e413b1 --- /dev/null +++ b/lib/widgets/widget_button.dart @@ -0,0 +1,35 @@ +import 'package:flutter/material.dart'; + +import 'button_styles.dart'; +class Botoes extends StatelessWidget { + final String texto; + final Function onPressed; + Botoes(this.texto, {this.onPressed}); + @override + Widget build(BuildContext context) { + return ElevatedButton( + child:Text( + texto, + style: TextStyle( + fontSize: 20, + color: Colors.white, + ), + ), + onPressed: onPressed + ); + } +} + +class BotaoCustom extends StatelessWidget { + final String texto; + final Function onPressed; + BotaoCustom(this.texto, {this.onPressed}); + @override + Widget build(BuildContext context) { + return ElevatedButton( + style: ButtonStyles().btnS, + child:Text(texto, style: ButtonStyles().txS), + onPressed: onPressed + ); + } +} diff --git a/lib/widgets/widget_caroussel.dart b/lib/widgets/widget_caroussel.dart new file mode 100644 index 0000000..cef5535 --- /dev/null +++ b/lib/widgets/widget_caroussel.dart @@ -0,0 +1,80 @@ +import 'dart:io'; + +import 'package:flutter/material.dart'; +import 'package:http/http.dart'; +import 'package:path_provider/path_provider.dart'; +class Caroussel extends StatefulWidget { + List images; + String path; + List finalImg = List.empty(growable: true); + Caroussel(this.images); + @override + _CarousselState createState() => _CarousselState(); +} +class _CarousselState extends State { + Future loaded; + Future getPath() async{ + final directory = await getApplicationDocumentsDirectory().then((Directory value){ + widget.path = value.path; + }); + for (int i = 0; i < widget.images.length; i++) { + widget.finalImg.add(Image.file(File(widget.path+"/Pictures/"+widget.images[i].trimLeft()))); + } + return true && widget.path.isNotEmpty; + } + + @override + void initState() { + super.initState(); + loaded = getPath(); + } + + @override + void setState(fn) { + if(mounted) { + super.setState(fn); + } + } + + @override + Widget build(BuildContext context) { + return Container( + margin: EdgeInsets.all(10), + child: FutureBuilder( + future: loaded, + builder: (context, snapshot) { + if (snapshot.connectionState == ConnectionState.done && + widget.finalImg.length > 0) { + return + ListView.builder( + shrinkWrap: true, + physics: const ScrollPhysics(), + scrollDirection: Axis.horizontal, + itemCount: widget.finalImg.length, + itemBuilder: (BuildContext context, int index) + { + return Container( + margin: EdgeInsets.only(right:5), + child: widget.finalImg[index], + ); + }, + ); + } + return Center( + child: CircularProgressIndicator(), + ); + })); + } +} +/* +* +* Center( + child: ListView( + physics: const ScrollPhysics(), + scrollDirection: Axis.horizontal, + children: [ + for(int i = 0; i < widget.finalImg.length; i++) + widget.finalImg[i], + ], + ), + );*/ diff --git a/lib/widgets/widget_generate.dart b/lib/widgets/widget_generate.dart new file mode 100644 index 0000000..3eb7c00 --- /dev/null +++ b/lib/widgets/widget_generate.dart @@ -0,0 +1,9 @@ +import 'dart:math'; + +class StringGenerator{ + static const _chars = 'AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz1234567890'; + Random _rnd = Random(); + + String getRandomString(int length) => String.fromCharCodes(Iterable.generate( + length, (_) => _chars.codeUnitAt(_rnd.nextInt(_chars.length)))); +} \ No newline at end of file diff --git a/lib/widgets/widget_input.dart b/lib/widgets/widget_input.dart new file mode 100644 index 0000000..c301401 --- /dev/null +++ b/lib/widgets/widget_input.dart @@ -0,0 +1,441 @@ +import 'dart:async'; + +import 'package:esms_project/dbhandler.dart'; +import 'package:esms_project/screens/equipmentDetail.dart'; +import 'package:esms_project/widgets/widget_button.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:intl/intl.dart'; +class InputTextos extends StatelessWidget { + String rotulo, hint; + TextEditingController controller; + bool readonly; + InputTextos(this.rotulo,this.hint, {this.controller, this.readonly}); + + @override + Widget build(BuildContext context) { + return TextFormField( + readOnly: readonly == null ? false : readonly, + controller: controller, + style : TextStyle( + color: Colors.black, + backgroundColor: Colors.transparent + ), + decoration : InputDecoration( + labelText: rotulo, + hintText: hint + ) + ); + } +} + +class CustomSearch extends SearchDelegate{ + dbHandler dbh= dbHandler.instance; + List> loadList; + int type; + CustomSearch({this.type, this.loadList}); + @override + List buildActions(BuildContext context) { + return[ + IconButton(onPressed: (){ + query = ''; + }, icon: Icon(Icons.clear)) + ]; + } + @override + String get searchFieldLabel => "Pesquisar"; + + @override + ThemeData appBarTheme(BuildContext context) { + return ThemeData( + primaryColor: Colors.red, + inputDecorationTheme: InputDecorationTheme( + enabledBorder: UnderlineInputBorder( + borderSide: BorderSide(color: Colors.red[300]), + ), + focusedBorder: UnderlineInputBorder( + borderSide: BorderSide(color: Colors.white), + ), + border: UnderlineInputBorder( + borderSide: BorderSide(color: Colors.redAccent), + ), + hintStyle: TextStyle( + color: Colors.white, fontWeight: FontWeight.w400), + ), + textTheme: TextTheme(headline6: TextStyle( + color: Colors.white, fontWeight: FontWeight.w400),) + ); + } + + @override + Widget buildLeading(BuildContext context) { + return IconButton( + onPressed: (){ + close(context, null); + }, + icon: Icon(Icons.arrow_back) + ); + } + + @override + Widget buildResults(BuildContext context) { + List> searchList = List.empty(growable: true); + + if(query.length < 3) + { + return Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Center( + child: Text( + "Termo deve ser maior que 2 letras.", + ), + ) + ], + ); + } + + for(int i = 0; i < loadList.length; i++) + { + switch(type) + { + case 0: + { + if(loadList[i]['name'].toUpperCase().contains(query.toUpperCase())){ + searchList.add(loadList[i]); + } + break; + } + case 1: + { + if(loadList[i]['equipment'].toUpperCase().contains(query.toUpperCase())){ + searchList.add(loadList[i]); + } + break; + } + default: + break; + } + } + + if(searchList != null){ + return ListView.separated( + padding: const EdgeInsets.all(8), + itemCount: searchList.length, + itemBuilder: (BuildContext context, int index) { + return Container( + padding: const EdgeInsets.only(left: 10), + height: 90, + color: Colors.black12, + child: InkWell( + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + Row( + children: [ + RichText( + overflow: TextOverflow.ellipsis, + strutStyle: StrutStyle(fontSize: 18.0), + text: TextSpan( + style: TextStyle( + color: Colors.black, + fontSize: 18.0), + text: "Aparelho: " + + '${searchList[index]['name']}')), + ], + ), + Row( + children: [ + RichText( + overflow: TextOverflow.ellipsis, + strutStyle: StrutStyle(fontSize: 18.0), + text: TextSpan( + style: TextStyle( + color: Colors.black, + fontSize: 18.0), + text: "Reparo: " + + '${searchList[index]['repair']}')) + ], + ) + ], + ), + onTap: () => onPressWithArg( + searchList[index]['repair'],searchList[index]['id'],searchList[index]['repair_id'],context), + )); + }, + separatorBuilder: (BuildContext context, int index) => + const Divider()); + } + + return Container( + padding: EdgeInsets.only(left:10,right:10), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Center( + child: Text( + "Insira um termo de busca válido", + style: TextStyle( + fontSize: 26.0, + fontWeight: FontWeight.w400, + fontStyle: FontStyle.italic, + color: Colors.black26) + ), + ), + Center( + child: Text( + "(Ex. Aparelho XYZ, João da Silva)", + style: TextStyle( + fontSize: 24.0, + fontWeight: FontWeight.w400, + fontStyle: FontStyle.italic, + color: Colors.black26) + ), + ), + + ], + ) + ); + } + + @override + Widget buildSuggestions(BuildContext context) { + if(query.length < 3) + { + return Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Center( + child: Text( + "Termo deve ser maior que 2 letras.", + ), + ) + ], + ); + } + return Column(); + } + onPressWithArg(String rep, int id, int repid, context) { + _modalInput(rep, id, repid, context); + } + + _modalInput(String repair, int eq, int rep, context) { + return showDialog( + context: context, + builder: (_) => SimpleDialog( + contentPadding: EdgeInsets.all(20), + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text("Detalhes do Reparo"), + ], + ), + Divider(color: Colors.black38), + RichText( + strutStyle: StrutStyle(fontSize: 16.0), + text: TextSpan( + style: TextStyle(color: Colors.black, fontSize: 20.0, fontWeight: FontWeight.w300), + text:repair)), + Divider(color: Colors.transparent), + Botoes( + "Ver Aparelho", + onPressed: () { + Navigator.of(context) + .push(new MaterialPageRoute(builder: (context) => EquipmentDetail(eq))); + }, + ), + ], + ) + ); + } +} + +class InputData extends StatelessWidget { + String rotulo, hint; + TextEditingController controller; + InputData(this.rotulo,this.hint, {this.controller}); + + @override + Widget build(BuildContext context) { + return Row( + children: [ + Expanded( + child: TextFormField( + readOnly: true, + keyboardType: TextInputType.datetime, + validator: (value){ + try{ + DateFormat.yMd().parseStrict(value); + } + on FormatException catch (_) + { + return 'Valor inválido'; + } + }, + controller: controller, + style : TextStyle( + color: Colors.black, + backgroundColor: Colors.transparent + ), + decoration : InputDecoration( + labelText: rotulo, + hintText: hint + ) + ), + ), + IconButton(icon: Icon(Icons.calendar_today), onPressed: (){ + Future tmp = _showCalendar(context); + tmp.then((DateTime res){ + controller.text = DateFormat.yMd().format(res); + }); + }) + ], + ); + } + _showCalendar(context) + { + return showDatePicker( + context: context, + initialDate: DateTime.now(), firstDate: DateTime.now(), lastDate: DateTime(2050) + + ); + } +} + +class InputDataNoValidate extends StatelessWidget { + String rotulo, hint; + bool readonly; + TextEditingController controller; + InputDataNoValidate(this.rotulo,this.hint, {this.controller, this.readonly}); + + @override + Widget build(BuildContext context) { + return Row( + children: [ + Expanded( + child: TextFormField( + readOnly: readonly == null ? false : readonly, + keyboardType: TextInputType.datetime, + validator: (value) { + if (value.isNotEmpty) + { + try{ + DateFormat.yMd().parseStrict(value); + } + on FormatException catch (_) + { + return 'Valor inválido'; + } + } + }, + controller: controller, + style : TextStyle( + color: Colors.black, + backgroundColor: Colors.transparent + ), + decoration : InputDecoration( + labelText: rotulo, + hintText: hint + ) + ), + ), + IconButton(icon: Icon(Icons.calendar_today), onPressed: (){ + Future tmp = _showCalendar(context); + tmp.then((DateTime res){ + controller.text = DateFormat.yMd().format(res); + }); + }) + ], + ); + } + _showCalendar(context) + { + return showDatePicker( + context: context, + initialDate: DateTime.now(), firstDate: DateTime.now(), lastDate: DateTime(2050) + + ); + } +} + +class InputValidado extends StatelessWidget { + String rotulo, hint; + TextEditingController controller; + bool readonly; + InputValidado(this.rotulo,this.hint, {this.controller, this.readonly}); + + @override + Widget build(BuildContext context) { + return TextFormField( + validator: (value){ + if(value.isEmpty) + return 'Preencha o valor'; + }, + readOnly: readonly == null ? false : readonly, + controller: controller, + style : TextStyle( + color: Colors.black, + backgroundColor: Colors.transparent + ), + decoration : InputDecoration( + labelText: rotulo, + hintText: hint + ) + ); + } +} + +class InputNumber extends StatelessWidget { + String rotulo, hint; + TextEditingController controller; + bool readonly; + InputNumber(this.rotulo,this.hint, {this.controller, this.readonly}); + + @override + Widget build(BuildContext context) { + return TextFormField( + validator: (value){ + if(int.tryParse(value) == null) + return 'Valor inválido'; + }, + keyboardType: TextInputType.number, + readOnly: readonly == null ? false : readonly, + controller: controller, + style : TextStyle( + color: Colors.black, + backgroundColor: Colors.transparent + ), + decoration : InputDecoration( + labelText: rotulo, + hintText: hint + ) + ); + } +} + +class InputTextosPhone extends StatelessWidget { + String rotulo, hint; + TextEditingController controller; + + InputTextosPhone(this.rotulo,this.hint, {this.controller}); + + @override + Widget build(BuildContext context) { + return TextFormField( + inputFormatters: [ + FilteringTextInputFormatter.allow(RegExp(r'\+|\(|\)|\d|\s|\-')) + ], + keyboardType: TextInputType.phone, + controller: controller, + style : TextStyle( + color: Colors.black, + backgroundColor: Colors.transparent + ), + decoration : InputDecoration( + labelText: rotulo, + hintText: hint + ) + ); + } +} diff --git a/local.properties b/local.properties new file mode 100644 index 0000000..18ee7f5 --- /dev/null +++ b/local.properties @@ -0,0 +1,8 @@ +## This file must *NOT* be checked into Version Control Systems, +# as it contains information specific to your local configuration. +# +# Location of the SDK. This is only used by Gradle. +# For customization when using a Version Control System, please read the +# header note. +#Wed May 19 10:59:50 BRT 2021 +sdk.dir=D\:\\AndroidSDK diff --git a/pubspec.lock b/pubspec.lock new file mode 100644 index 0000000..155268e --- /dev/null +++ b/pubspec.lock @@ -0,0 +1,411 @@ +# Generated by pub +# See https://dart.dev/tools/pub/glossary#lockfile +packages: + async: + dependency: transitive + description: + name: async + url: "https://pub.dartlang.org" + source: hosted + version: "2.6.0" + boolean_selector: + dependency: transitive + description: + name: boolean_selector + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.0" + characters: + dependency: transitive + description: + name: characters + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.0" + charcode: + dependency: transitive + description: + name: charcode + url: "https://pub.dartlang.org" + source: hosted + version: "1.2.0" + clock: + dependency: transitive + description: + name: clock + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.0" + collection: + dependency: transitive + description: + name: collection + url: "https://pub.dartlang.org" + source: hosted + version: "1.15.0" + cupertino_icons: + dependency: "direct main" + description: + name: cupertino_icons + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.3" + fake_async: + dependency: transitive + description: + name: fake_async + url: "https://pub.dartlang.org" + source: hosted + version: "1.2.0" + ffi: + dependency: transitive + description: + name: ffi + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.2" + file: + dependency: transitive + description: + name: file + url: "https://pub.dartlang.org" + source: hosted + version: "6.1.1" + flutter: + dependency: "direct main" + description: flutter + source: sdk + version: "0.0.0" + flutter_plugin_android_lifecycle: + dependency: transitive + description: + name: flutter_plugin_android_lifecycle + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.2" + flutter_test: + dependency: "direct dev" + description: flutter + source: sdk + version: "0.0.0" + flutter_web_plugins: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" + http: + dependency: "direct main" + description: + name: http + url: "https://pub.dartlang.org" + source: hosted + version: "0.13.3" + http_parser: + dependency: transitive + description: + name: http_parser + url: "https://pub.dartlang.org" + source: hosted + version: "4.0.0" + image_picker: + dependency: "direct main" + description: + name: image_picker + url: "https://pub.dartlang.org" + source: hosted + version: "0.8.0+3" + image_picker_for_web: + dependency: transitive + description: + name: image_picker_for_web + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.0" + image_picker_platform_interface: + dependency: transitive + description: + name: image_picker_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.0" + intl: + dependency: "direct main" + description: + name: intl + url: "https://pub.dartlang.org" + source: hosted + version: "0.17.0" + js: + dependency: transitive + description: + name: js + url: "https://pub.dartlang.org" + source: hosted + version: "0.6.3" + matcher: + dependency: transitive + description: + name: matcher + url: "https://pub.dartlang.org" + source: hosted + version: "0.12.10" + meta: + dependency: transitive + description: + name: meta + url: "https://pub.dartlang.org" + source: hosted + version: "1.3.0" + package_info_plus: + dependency: "direct main" + description: + name: package_info_plus + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.2" + package_info_plus_linux: + dependency: transitive + description: + name: package_info_plus_linux + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.2" + package_info_plus_macos: + dependency: transitive + description: + name: package_info_plus_macos + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.1" + package_info_plus_platform_interface: + dependency: transitive + description: + name: package_info_plus_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.1" + package_info_plus_web: + dependency: transitive + description: + name: package_info_plus_web + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.2" + package_info_plus_windows: + dependency: transitive + description: + name: package_info_plus_windows + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.1" + path: + dependency: "direct main" + description: + name: path + url: "https://pub.dartlang.org" + source: hosted + version: "1.8.0" + path_provider: + dependency: "direct main" + description: + name: path_provider + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.2" + path_provider_linux: + dependency: transitive + description: + name: path_provider_linux + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.0" + path_provider_macos: + dependency: transitive + description: + name: path_provider_macos + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.0" + path_provider_platform_interface: + dependency: transitive + description: + name: path_provider_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.1" + path_provider_windows: + dependency: transitive + description: + name: path_provider_windows + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.1" + pedantic: + dependency: transitive + description: + name: pedantic + url: "https://pub.dartlang.org" + source: hosted + version: "1.11.0" + platform: + dependency: transitive + description: + name: platform + url: "https://pub.dartlang.org" + source: hosted + version: "3.0.0" + plugin_platform_interface: + dependency: transitive + description: + name: plugin_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.0" + process: + dependency: transitive + description: + name: process + url: "https://pub.dartlang.org" + source: hosted + version: "4.2.1" + sky_engine: + dependency: transitive + description: flutter + source: sdk + version: "0.0.99" + source_span: + dependency: transitive + description: + name: source_span + url: "https://pub.dartlang.org" + source: hosted + version: "1.8.1" + sqflite: + dependency: "direct main" + description: + name: sqflite + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.0+3" + sqflite_common: + dependency: transitive + description: + name: sqflite_common + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.0+2" + stack_trace: + dependency: transitive + description: + name: stack_trace + url: "https://pub.dartlang.org" + source: hosted + version: "1.10.0" + stream_channel: + dependency: transitive + description: + name: stream_channel + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.0" + string_scanner: + dependency: transitive + description: + name: string_scanner + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.0" + synchronized: + dependency: transitive + description: + name: synchronized + url: "https://pub.dartlang.org" + source: hosted + version: "3.0.0" + term_glyph: + dependency: transitive + description: + name: term_glyph + url: "https://pub.dartlang.org" + source: hosted + version: "1.2.0" + test_api: + dependency: transitive + description: + name: test_api + url: "https://pub.dartlang.org" + source: hosted + version: "0.3.0" + typed_data: + dependency: transitive + description: + name: typed_data + url: "https://pub.dartlang.org" + source: hosted + version: "1.3.0" + url_launcher: + dependency: "direct main" + description: + name: url_launcher + url: "https://pub.dartlang.org" + source: hosted + version: "6.0.6" + url_launcher_linux: + dependency: transitive + description: + name: url_launcher_linux + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.0" + url_launcher_macos: + dependency: transitive + description: + name: url_launcher_macos + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.0" + url_launcher_platform_interface: + dependency: transitive + description: + name: url_launcher_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.3" + url_launcher_web: + dependency: transitive + description: + name: url_launcher_web + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.1" + url_launcher_windows: + dependency: transitive + description: + name: url_launcher_windows + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.0" + vector_math: + dependency: transitive + description: + name: vector_math + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.0" + win32: + dependency: transitive + description: + name: win32 + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.5" + xdg_directories: + dependency: transitive + description: + name: xdg_directories + url: "https://pub.dartlang.org" + source: hosted + version: "0.2.0" +sdks: + dart: ">=2.13.0 <3.0.0" + flutter: ">=2.0.0" diff --git a/pubspec.yaml b/pubspec.yaml new file mode 100644 index 0000000..0676a5a --- /dev/null +++ b/pubspec.yaml @@ -0,0 +1,84 @@ +name: esms_project +description: Sistema de Registro e Ordem de Serviço + +# The following line prevents the package from being accidentally published to +# pub.dev using `pub publish`. This is preferred for private packages. +publish_to: 'none' # Remove this line if you wish to publish to pub.dev + +# The following defines the version and build number for your application. +# A version number is three numbers separated by dots, like 1.2.43 +# followed by an optional build number separated by a +. +# Both the version and the builder number may be overridden in flutter +# build by specifying --build-name and --build-number, respectively. +# In Android, build-name is used as versionName while build-number used as versionCode. +# Read more about Android versioning at https://developer.android.com/studio/publish/versioning +# In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion. +# Read more about iOS versioning at +# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html +version: 1.0.1+6 + +environment: + sdk: ">=2.7.0 <3.0.0" + +dependencies: + image_picker: ^0.8.0+3 + http: ^0.13.3 + path: ^1.8.0 + path_provider: ^2.0.1 + package_info_plus: ^1.0.2 + sqflite: ^2.0.0+3 + intl: ^0.17.0 + url_launcher: ^6.0.3 + flutter: + sdk: flutter + + + # The following adds the Cupertino Icons font to your application. + # Use with the CupertinoIcons class for iOS style icons. + cupertino_icons: ^1.0.2 + +dev_dependencies: + flutter_test: + sdk: flutter + +# For information on the generic Dart part of this file, see the +# following page: https://dart.dev/tools/pub/pubspec + +# The following section is specific to Flutter. +flutter: + + # The following line ensures that the Material Icons font is + # included with your application, so that you can use the icons in + # the material Icons class. + uses-material-design: true + + # To add assets to your application, add an assets section, like this: + # assets: + # - images/a_dot_burr.jpeg + # - images/a_dot_ham.jpeg + + # An image asset can refer to one or more resolution-specific "variants", see + # https://flutter.dev/assets-and-images/#resolution-aware. + + # For details regarding adding assets from package dependencies, see + # https://flutter.dev/assets-and-images/#from-packages + + # To add custom fonts to your application, add a fonts section here, + # in this "flutter" section. Each entry in this list should have a + # "family" key with the font family name, and a "fonts" key with a + # list giving the asset and other descriptors for the font. For + # example: + # fonts: + # - family: Schyler + # fonts: + # - asset: fonts/Schyler-Regular.ttf + # - asset: fonts/Schyler-Italic.ttf + # style: italic + # - family: Trajan Pro + # fonts: + # - asset: fonts/TrajanPro.ttf + # - asset: fonts/TrajanPro_Bold.ttf + # weight: 700 + # + # For details regarding fonts from package dependencies, + # see https://flutter.dev/custom-fonts/#from-packages diff --git a/web/favicon.png b/web/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..8aaa46ac1ae21512746f852a42ba87e4165dfdd1 GIT binary patch literal 917 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|I14-?iy0X7 zltGxWVyS%@P(fs7NJL45ua8x7ey(0(N`6wRUPW#JP&EUCO@$SZnVVXYs8ErclUHn2 zVXFjIVFhG^g!Ppaz)DK8ZIvQ?0~DO|i&7O#^-S~(l1AfjnEK zjFOT9D}DX)@^Za$W4-*MbbUihOG|wNBYh(yU7!lx;>x^|#0uTKVr7USFmqf|i<65o z3raHc^AtelCMM;Vme?vOfh>Xph&xL%(-1c06+^uR^q@XSM&D4+Kp$>4P^%3{)XKjo zGZknv$b36P8?Z_gF{nK@`XI}Z90TzwSQO}0J1!f2c(B=V`5aP@1P1a|PZ!4!3&Gl8 zTYqUsf!gYFyJnXpu0!n&N*SYAX-%d(5gVjrHJWqXQshj@!Zm{!01WsQrH~9=kTxW#6SvuapgMqt>$=j#%eyGrQzr zP{L-3gsMA^$I1&gsBAEL+vxi1*Igl=8#8`5?A-T5=z-sk46WA1IUT)AIZHx1rdUrf zVJrJn<74DDw`j)Ki#gt}mIT-Q`XRa2-jQXQoI%w`nb|XblvzK${ZzlV)m-XcwC(od z71_OEC5Bt9GEXosOXaPTYOia#R4ID2TiU~`zVMl08TV_C%DnU4^+HE>9(CE4D6?Fz oujB08i7adh9xk7*FX66dWH6F5TM;?E2b5PlUHx3vIVCg!0Dx9vYXATM literal 0 HcmV?d00001 diff --git a/web/icons/Icon-192.png b/web/icons/Icon-192.png new file mode 100644 index 0000000000000000000000000000000000000000..b749bfef07473333cf1dd31e9eed89862a5d52aa GIT binary patch literal 5292 zcmZ`-2T+sGz6~)*FVZ`aW+(v>MIm&M-g^@e2u-B-DoB?qO+b1Tq<5uCCv>ESfRum& zp%X;f!~1{tzL__3=gjVJ=j=J>+nMj%ncXj1Q(b|Ckbw{Y0FWpt%4y%$uD=Z*c-x~o zE;IoE;xa#7Ll5nj-e4CuXB&G*IM~D21rCP$*xLXAK8rIMCSHuSu%bL&S3)8YI~vyp@KBu9Ph7R_pvKQ@xv>NQ`dZp(u{Z8K3yOB zn7-AR+d2JkW)KiGx0hosml;+eCXp6+w%@STjFY*CJ?udJ64&{BCbuebcuH;}(($@@ znNlgBA@ZXB)mcl9nbX#F!f_5Z=W>0kh|UVWnf!At4V*LQP%*gPdCXd6P@J4Td;!Ur z<2ZLmwr(NG`u#gDEMP19UcSzRTL@HsK+PnIXbVBT@oHm53DZr?~V(0{rsalAfwgo zEh=GviaqkF;}F_5-yA!1u3!gxaR&Mj)hLuj5Q-N-@Lra{%<4ONja8pycD90&>yMB` zchhd>0CsH`^|&TstH-8+R`CfoWqmTTF_0?zDOY`E`b)cVi!$4xA@oO;SyOjJyP^_j zx^@Gdf+w|FW@DMdOi8=4+LJl$#@R&&=UM`)G!y%6ZzQLoSL%*KE8IO0~&5XYR9 z&N)?goEiWA(YoRfT{06&D6Yuu@Qt&XVbuW@COb;>SP9~aRc+z`m`80pB2o%`#{xD@ zI3RAlukL5L>px6b?QW1Ac_0>ew%NM!XB2(H+1Y3AJC?C?O`GGs`331Nd4ZvG~bMo{lh~GeL zSL|tT*fF-HXxXYtfu5z+T5Mx9OdP7J4g%@oeC2FaWO1D{=NvL|DNZ}GO?O3`+H*SI z=grGv=7dL{+oY0eJFGO!Qe(e2F?CHW(i!!XkGo2tUvsQ)I9ev`H&=;`N%Z{L zO?vV%rDv$y(@1Yj@xfr7Kzr<~0{^T8wM80xf7IGQF_S-2c0)0D6b0~yD7BsCy+(zL z#N~%&e4iAwi4F$&dI7x6cE|B{f@lY5epaDh=2-(4N05VO~A zQT3hanGy_&p+7Fb^I#ewGsjyCEUmSCaP6JDB*=_()FgQ(-pZ28-{qx~2foO4%pM9e z*_63RT8XjgiaWY|*xydf;8MKLd{HnfZ2kM%iq}fstImB-K6A79B~YoPVa@tYN@T_$ zea+9)<%?=Fl!kd(Y!G(-o}ko28hg2!MR-o5BEa_72uj7Mrc&{lRh3u2%Y=Xk9^-qa zBPWaD=2qcuJ&@Tf6ue&)4_V*45=zWk@Z}Q?f5)*z)-+E|-yC4fs5CE6L_PH3=zI8p z*Z3!it{1e5_^(sF*v=0{`U9C741&lub89gdhKp|Y8CeC{_{wYK-LSbp{h)b~9^j!s z7e?Y{Z3pZv0J)(VL=g>l;<}xk=T*O5YR|hg0eg4u98f2IrA-MY+StQIuK-(*J6TRR z|IM(%uI~?`wsfyO6Tgmsy1b3a)j6M&-jgUjVg+mP*oTKdHg?5E`!r`7AE_#?Fc)&a z08KCq>Gc=ne{PCbRvs6gVW|tKdcE1#7C4e`M|j$C5EYZ~Y=jUtc zj`+?p4ba3uy7><7wIokM79jPza``{Lx0)zGWg;FW1^NKY+GpEi=rHJ+fVRGfXO zPHV52k?jxei_!YYAw1HIz}y8ZMwdZqU%ESwMn7~t zdI5%B;U7RF=jzRz^NuY9nM)&<%M>x>0(e$GpU9th%rHiZsIT>_qp%V~ILlyt^V`=d z!1+DX@ah?RnB$X!0xpTA0}lN@9V-ePx>wQ?-xrJr^qDlw?#O(RsXeAvM%}rg0NT#t z!CsT;-vB=B87ShG`GwO;OEbeL;a}LIu=&@9cb~Rsx(ZPNQ!NT7H{@j0e(DiLea>QD zPmpe90gEKHEZ8oQ@6%E7k-Ptn#z)b9NbD@_GTxEhbS+}Bb74WUaRy{w;E|MgDAvHw zL)ycgM7mB?XVh^OzbC?LKFMotw3r@i&VdUV%^Efdib)3@soX%vWCbnOyt@Y4swW925@bt45y0HY3YI~BnnzZYrinFy;L?2D3BAL`UQ zEj))+f>H7~g8*VuWQ83EtGcx`hun$QvuurSMg3l4IP8Fe`#C|N6mbYJ=n;+}EQm;< z!!N=5j1aAr_uEnnzrEV%_E|JpTb#1p1*}5!Ce!R@d$EtMR~%9# zd;h8=QGT)KMW2IKu_fA_>p_und#-;Q)p%%l0XZOXQicfX8M~7?8}@U^ihu;mizj)t zgV7wk%n-UOb z#!P5q?Ex+*Kx@*p`o$q8FWL*E^$&1*!gpv?Za$YO~{BHeGY*5%4HXUKa_A~~^d z=E*gf6&+LFF^`j4$T~dR)%{I)T?>@Ma?D!gi9I^HqvjPc3-v~=qpX1Mne@*rzT&Xw zQ9DXsSV@PqpEJO-g4A&L{F&;K6W60D!_vs?Vx!?w27XbEuJJP&);)^+VF1nHqHBWu z^>kI$M9yfOY8~|hZ9WB!q-9u&mKhEcRjlf2nm_@s;0D#c|@ED7NZE% zzR;>P5B{o4fzlfsn3CkBK&`OSb-YNrqx@N#4CK!>bQ(V(D#9|l!e9(%sz~PYk@8zt zPN9oK78&-IL_F zhsk1$6p;GqFbtB^ZHHP+cjMvA0(LqlskbdYE_rda>gvQLTiqOQ1~*7lg%z*&p`Ry& zRcG^DbbPj_jOKHTr8uk^15Boj6>hA2S-QY(W-6!FIq8h$<>MI>PYYRenQDBamO#Fv zAH5&ImqKBDn0v5kb|8i0wFhUBJTpT!rB-`zK)^SNnRmLraZcPYK7b{I@+}wXVdW-{Ps17qdRA3JatEd?rPV z4@}(DAMf5EqXCr4-B+~H1P#;t@O}B)tIJ(W6$LrK&0plTmnPpb1TKn3?f?Kk``?D+ zQ!MFqOX7JbsXfQrz`-M@hq7xlfNz;_B{^wbpG8des56x(Q)H)5eLeDwCrVR}hzr~= zM{yXR6IM?kXxauLza#@#u?Y|o;904HCqF<8yT~~c-xyRc0-vxofnxG^(x%>bj5r}N zyFT+xnn-?B`ohA>{+ZZQem=*Xpqz{=j8i2TAC#x-m;;mo{{sLB_z(UoAqD=A#*juZ zCv=J~i*O8;F}A^Wf#+zx;~3B{57xtoxC&j^ie^?**T`WT2OPRtC`xj~+3Kprn=rVM zVJ|h5ux%S{dO}!mq93}P+h36mZ5aZg1-?vhL$ke1d52qIiXSE(llCr5i=QUS?LIjc zV$4q=-)aaR4wsrQv}^shL5u%6;`uiSEs<1nG^?$kl$^6DL z43CjY`M*p}ew}}3rXc7Xck@k41jx}c;NgEIhKZ*jsBRZUP-x2cm;F1<5$jefl|ppO zmZd%%?gMJ^g9=RZ^#8Mf5aWNVhjAS^|DQO+q$)oeob_&ZLFL(zur$)); zU19yRm)z<4&4-M}7!9+^Wl}Uk?`S$#V2%pQ*SIH5KI-mn%i;Z7-)m$mN9CnI$G7?# zo`zVrUwoSL&_dJ92YhX5TKqaRkfPgC4=Q&=K+;_aDs&OU0&{WFH}kKX6uNQC6%oUH z2DZa1s3%Vtk|bglbxep-w)PbFG!J17`<$g8lVhqD2w;Z0zGsh-r zxZ13G$G<48leNqR!DCVt9)@}(zMI5w6Wo=N zpP1*3DI;~h2WDWgcKn*f!+ORD)f$DZFwgKBafEZmeXQMAsq9sxP9A)7zOYnkHT9JU zRA`umgmP9d6=PHmFIgx=0$(sjb>+0CHG)K@cPG{IxaJ&Ueo8)0RWgV9+gO7+Bl1(F z7!BslJ2MP*PWJ;x)QXbR$6jEr5q3 z(3}F@YO_P1NyTdEXRLU6fp?9V2-S=E+YaeLL{Y)W%6`k7$(EW8EZSA*(+;e5@jgD^I zaJQ2|oCM1n!A&-8`;#RDcZyk*+RPkn_r8?Ak@agHiSp*qFNX)&i21HE?yuZ;-C<3C zwJGd1lx5UzViP7sZJ&|LqH*mryb}y|%AOw+v)yc`qM)03qyyrqhX?ub`Cjwx2PrR! z)_z>5*!*$x1=Qa-0uE7jy0z`>|Ni#X+uV|%_81F7)b+nf%iz=`fF4g5UfHS_?PHbr zB;0$bK@=di?f`dS(j{l3-tSCfp~zUuva+=EWxJcRfp(<$@vd(GigM&~vaYZ0c#BTs z3ijkxMl=vw5AS&DcXQ%eeKt!uKvh2l3W?&3=dBHU=Gz?O!40S&&~ei2vg**c$o;i89~6DVns zG>9a*`k5)NI9|?W!@9>rzJ;9EJ=YlJTx1r1BA?H`LWijk(rTax9(OAu;q4_wTj-yj z1%W4GW&K4T=uEGb+E!>W0SD_C0RR91 literal 0 HcmV?d00001 diff --git a/web/icons/Icon-512.png b/web/icons/Icon-512.png new file mode 100644 index 0000000000000000000000000000000000000000..88cfd48dff1169879ba46840804b412fe02fefd6 GIT binary patch literal 8252 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 literal 0 HcmV?d00001 diff --git a/web/index.html b/web/index.html new file mode 100644 index 0000000..8642323 --- /dev/null +++ b/web/index.html @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + esms_project + + + + + + + diff --git a/web/manifest.json b/web/manifest.json new file mode 100644 index 0000000..4d5f985 --- /dev/null +++ b/web/manifest.json @@ -0,0 +1,23 @@ +{ + "name": "esms_project", + "short_name": "esms_project", + "start_url": ".", + "display": "standalone", + "background_color": "#0175C2", + "theme_color": "#0175C2", + "description": "Sistema de Registro e Ordem de Serviço", + "orientation": "portrait-primary", + "prefer_related_applications": false, + "icons": [ + { + "src": "icons/Icon-192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "icons/Icon-512.png", + "sizes": "512x512", + "type": "image/png" + } + ] +}