| @@ -1,87 +1,43 @@ | |||
| # ---> Android | |||
| # Built application files | |||
| *.apk | |||
| *.aar | |||
| *.ap_ | |||
| *.aab | |||
| # Files for the ART/Dalvik VM | |||
| *.dex | |||
| # Java class files | |||
| # Miscellaneous | |||
| *.class | |||
| # Generated files | |||
| bin/ | |||
| gen/ | |||
| out/ | |||
| # Uncomment the following line in case you need and you don't have the release build type files in your app | |||
| # release/ | |||
| # Gradle files | |||
| .gradle/ | |||
| build/ | |||
| # Local configuration file (sdk path, etc) | |||
| local.properties | |||
| # Proguard folder generated by Eclipse | |||
| proguard/ | |||
| # Log Files | |||
| *.log | |||
| # Android Studio Navigation editor temp files | |||
| .navigation/ | |||
| # Android Studio captures folder | |||
| captures/ | |||
| # IntelliJ | |||
| *.pyc | |||
| *.swp | |||
| .DS_Store | |||
| .atom/ | |||
| .buildlog/ | |||
| .history | |||
| .svn/ | |||
| # IntelliJ related | |||
| *.iml | |||
| .idea/workspace.xml | |||
| .idea/tasks.xml | |||
| .idea/gradle.xml | |||
| .idea/assetWizardSettings.xml | |||
| .idea/dictionaries | |||
| .idea/libraries | |||
| # Android Studio 3 in .gitignore file. | |||
| .idea/caches | |||
| .idea/modules.xml | |||
| # Comment next line if keeping position of elements in Navigation Editor is relevant for you | |||
| .idea/navEditor.xml | |||
| # Keystore files | |||
| # Uncomment the following lines if you do not want to check your keystore files in. | |||
| #*.jks | |||
| #*.keystore | |||
| # External native build folder generated in Android Studio 2.2 and later | |||
| .externalNativeBuild | |||
| .cxx/ | |||
| # Google Services (e.g. APIs or Firebase) | |||
| # google-services.json | |||
| # Freeline | |||
| freeline.py | |||
| freeline/ | |||
| freeline_project_description.json | |||
| # fastlane | |||
| fastlane/report.xml | |||
| fastlane/Preview.html | |||
| fastlane/screenshots | |||
| fastlane/test_output | |||
| fastlane/readme.md | |||
| # Version control | |||
| vcs.xml | |||
| # lint | |||
| lint/intermediates/ | |||
| lint/generated/ | |||
| lint/outputs/ | |||
| lint/tmp/ | |||
| # lint/reports/ | |||
| *.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/ | |||
| .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 | |||
| # Exceptions to above rules. | |||
| !/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages | |||
| @@ -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: b041144f833e05cf463b8887fa12efdec9493488 | |||
| channel: stable | |||
| project_type: app | |||
| @@ -1,3 +1,16 @@ | |||
| # Asset-App | |||
| # assetstock | |||
| Flutter app for Asset Management | |||
| Application to check assets | |||
| ## Getting Started | |||
| This project is a starting point for a Flutter application. | |||
| A few resources to get you started if this is your first Flutter project: | |||
| - [Lab: Write your first Flutter app](https://flutter.dev/docs/get-started/codelab) | |||
| - [Cookbook: Useful Flutter samples](https://flutter.dev/docs/cookbook) | |||
| For help getting started with Flutter, view our | |||
| [online documentation](https://flutter.dev/docs), which offers tutorials, | |||
| samples, guidance on mobile development, and a full API reference. | |||
| @@ -0,0 +1,7 @@ | |||
| gradle-wrapper.jar | |||
| /.gradle | |||
| /captures/ | |||
| /gradlew | |||
| /gradlew.bat | |||
| /local.properties | |||
| GeneratedPluginRegistrant.java | |||
| @@ -0,0 +1,63 @@ | |||
| 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 28 | |||
| sourceSets { | |||
| main.java.srcDirs += 'src/main/kotlin' | |||
| } | |||
| lintOptions { | |||
| disable 'InvalidPackage' | |||
| } | |||
| defaultConfig { | |||
| // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). | |||
| applicationId "com.example.assetstock" | |||
| minSdkVersion 18 | |||
| targetSdkVersion 28 | |||
| 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" | |||
| } | |||
| @@ -0,0 +1,7 @@ | |||
| <manifest xmlns:android="http://schemas.android.com/apk/res/android" | |||
| package="com.example.assetstock"> | |||
| <!-- Flutter needs it to communicate with the running application | |||
| to allow setting breakpoints, to provide hot reload, etc. | |||
| --> | |||
| <uses-permission android:name="android.permission.INTERNET"/> | |||
| </manifest> | |||
| @@ -0,0 +1,48 @@ | |||
| <manifest xmlns:android="http://schemas.android.com/apk/res/android" | |||
| package="com.example.assetstock"> | |||
| <!-- io.flutter.app.FlutterApplication is an android.app.Application that | |||
| calls FlutterMain.startInitialization(this); in its onCreate method. | |||
| In most cases you can leave this as-is, but you if you want to provide | |||
| additional functionality it is fine to subclass or reimplement | |||
| FlutterApplication and put your custom class here. --> | |||
| <uses-permission android:name="android.permission.INTERNET" /> | |||
| <application | |||
| android:name="io.flutter.app.FlutterApplication" | |||
| android:label="assetstock" | |||
| android:icon="@mipmap/ic_launcher"> | |||
| <activity | |||
| android:name=".MainActivity" | |||
| android:launchMode="singleTop" | |||
| android:theme="@style/LaunchTheme" | |||
| android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode" | |||
| android:hardwareAccelerated="true" | |||
| android:windowSoftInputMode="adjustResize"> | |||
| <!-- Specifies an Android theme to apply to this Activity as soon as | |||
| the Android process has started. This theme is visible to the user | |||
| while the Flutter UI initializes. After that, this theme continues | |||
| to determine the Window background behind the Flutter UI. --> | |||
| <meta-data | |||
| android:name="io.flutter.embedding.android.NormalTheme" | |||
| android:resource="@style/NormalTheme" | |||
| /> | |||
| <!-- Displays an Android View that continues showing the launch screen | |||
| Drawable until Flutter paints its first frame, then this splash | |||
| screen fades out. A splash screen is useful to avoid any visual | |||
| gap between the end of Android's launch screen and the painting of | |||
| Flutter's first frame. --> | |||
| <meta-data | |||
| android:name="io.flutter.embedding.android.SplashScreenDrawable" | |||
| android:resource="@drawable/launch_background" | |||
| /> | |||
| <intent-filter> | |||
| <action android:name="android.intent.action.MAIN"/> | |||
| <category android:name="android.intent.category.LAUNCHER"/> | |||
| </intent-filter> | |||
| </activity> | |||
| <!-- Don't delete the meta-data below. | |||
| This is used by the Flutter tool to generate GeneratedPluginRegistrant.java --> | |||
| <meta-data | |||
| android:name="flutterEmbedding" | |||
| android:value="2" /> | |||
| </application> | |||
| </manifest> | |||
| @@ -0,0 +1,6 @@ | |||
| package com.example.assetstock | |||
| import io.flutter.embedding.android.FlutterActivity | |||
| class MainActivity: FlutterActivity() { | |||
| } | |||
| @@ -0,0 +1,12 @@ | |||
| <?xml version="1.0" encoding="utf-8"?> | |||
| <!-- Modify this file to customize your launch splash screen --> | |||
| <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> | |||
| <item android:drawable="@android:color/white" /> | |||
| <!-- You can insert your own image assets here --> | |||
| <!-- <item> | |||
| <bitmap | |||
| android:gravity="center" | |||
| android:src="@mipmap/launch_image" /> | |||
| </item> --> | |||
| </layer-list> | |||
| @@ -0,0 +1,18 @@ | |||
| <?xml version="1.0" encoding="utf-8"?> | |||
| <resources> | |||
| <!-- Theme applied to the Android Window while the process is starting --> | |||
| <style name="LaunchTheme" parent="@android:style/Theme.Black.NoTitleBar"> | |||
| <!-- Show a splash screen on the activity. Automatically removed when | |||
| Flutter draws its first frame --> | |||
| <item name="android:windowBackground">@drawable/launch_background</item> | |||
| </style> | |||
| <!-- Theme applied to the Android Window as soon as the process has started. | |||
| This theme determines the color of the Android Window while your | |||
| Flutter UI initializes, as well as behind your Flutter UI while its | |||
| running. | |||
| This Theme is only used starting with V2 of Flutter's Android embedding. --> | |||
| <style name="NormalTheme" parent="@android:style/Theme.Black.NoTitleBar"> | |||
| <item name="android:windowBackground">@android:color/white</item> | |||
| </style> | |||
| </resources> | |||
| @@ -0,0 +1,7 @@ | |||
| <manifest xmlns:android="http://schemas.android.com/apk/res/android" | |||
| package="com.example.assetstock"> | |||
| <!-- Flutter needs it to communicate with the running application | |||
| to allow setting breakpoints, to provide hot reload, etc. | |||
| --> | |||
| <uses-permission android:name="android.permission.INTERNET"/> | |||
| </manifest> | |||
| @@ -0,0 +1,31 @@ | |||
| buildscript { | |||
| ext.kotlin_version = '1.3.50' | |||
| repositories { | |||
| google() | |||
| jcenter() | |||
| } | |||
| dependencies { | |||
| classpath 'com.android.tools.build:gradle:3.5.0' | |||
| classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" | |||
| } | |||
| } | |||
| allprojects { | |||
| repositories { | |||
| google() | |||
| jcenter() | |||
| } | |||
| } | |||
| rootProject.buildDir = '../build' | |||
| subprojects { | |||
| project.buildDir = "${rootProject.buildDir}/${project.name}" | |||
| } | |||
| subprojects { | |||
| project.evaluationDependsOn(':app') | |||
| } | |||
| task clean(type: Delete) { | |||
| delete rootProject.buildDir | |||
| } | |||
| @@ -0,0 +1,4 @@ | |||
| org.gradle.jvmargs=-Xmx1536M | |||
| android.enableR8=true | |||
| android.useAndroidX=true | |||
| android.enableJetifier=true | |||
| @@ -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-5.6.2-all.zip | |||
| @@ -0,0 +1,15 @@ | |||
| // Copyright 2014 The Flutter Authors. All rights reserved. | |||
| // Use of this source code is governed by a BSD-style license that can be | |||
| // found in the LICENSE file. | |||
| 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" | |||
| @@ -0,0 +1 @@ | |||
| include ':app' | |||
| @@ -0,0 +1,32 @@ | |||
| *.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/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 | |||
| @@ -0,0 +1,26 @@ | |||
| <?xml version="1.0" encoding="UTF-8"?> | |||
| <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> | |||
| <plist version="1.0"> | |||
| <dict> | |||
| <key>CFBundleDevelopmentRegion</key> | |||
| <string>$(DEVELOPMENT_LANGUAGE)</string> | |||
| <key>CFBundleExecutable</key> | |||
| <string>App</string> | |||
| <key>CFBundleIdentifier</key> | |||
| <string>io.flutter.flutter.app</string> | |||
| <key>CFBundleInfoDictionaryVersion</key> | |||
| <string>6.0</string> | |||
| <key>CFBundleName</key> | |||
| <string>App</string> | |||
| <key>CFBundlePackageType</key> | |||
| <string>FMWK</string> | |||
| <key>CFBundleShortVersionString</key> | |||
| <string>1.0</string> | |||
| <key>CFBundleSignature</key> | |||
| <string>????</string> | |||
| <key>CFBundleVersion</key> | |||
| <string>1.0</string> | |||
| <key>MinimumOSVersion</key> | |||
| <string>8.0</string> | |||
| </dict> | |||
| </plist> | |||
| @@ -0,0 +1 @@ | |||
| #include "Generated.xcconfig" | |||
| @@ -0,0 +1 @@ | |||
| #include "Generated.xcconfig" | |||
| @@ -0,0 +1,506 @@ | |||
| // !$*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 */; }; | |||
| 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; | |||
| 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 = "<group>"; }; | |||
| 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = "<group>"; }; | |||
| 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = "<group>"; }; | |||
| 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = "<group>"; }; | |||
| 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; }; | |||
| 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = "<group>"; }; | |||
| 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = "<group>"; }; | |||
| 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = "<group>"; }; | |||
| 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; | |||
| 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; }; | |||
| 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; }; | |||
| 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; }; | |||
| 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; }; | |||
| /* 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 = "<group>"; | |||
| }; | |||
| 97C146E51CF9000F007C117D = { | |||
| isa = PBXGroup; | |||
| children = ( | |||
| 9740EEB11CF90186004384FC /* Flutter */, | |||
| 97C146F01CF9000F007C117D /* Runner */, | |||
| 97C146EF1CF9000F007C117D /* Products */, | |||
| ); | |||
| sourceTree = "<group>"; | |||
| }; | |||
| 97C146EF1CF9000F007C117D /* Products */ = { | |||
| isa = PBXGroup; | |||
| children = ( | |||
| 97C146EE1CF9000F007C117D /* Runner.app */, | |||
| ); | |||
| name = Products; | |||
| sourceTree = "<group>"; | |||
| }; | |||
| 97C146F01CF9000F007C117D /* Runner */ = { | |||
| isa = PBXGroup; | |||
| children = ( | |||
| 97C146FA1CF9000F007C117D /* Main.storyboard */, | |||
| 97C146FD1CF9000F007C117D /* Assets.xcassets */, | |||
| 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, | |||
| 97C147021CF9000F007C117D /* Info.plist */, | |||
| 97C146F11CF9000F007C117D /* Supporting Files */, | |||
| 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, | |||
| 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, | |||
| 74858FAE1ED2DC5600515810 /* AppDelegate.swift */, | |||
| 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */, | |||
| ); | |||
| path = Runner; | |||
| sourceTree = "<group>"; | |||
| }; | |||
| 97C146F11CF9000F007C117D /* Supporting Files */ = { | |||
| isa = PBXGroup; | |||
| children = ( | |||
| ); | |||
| name = "Supporting Files"; | |||
| sourceTree = "<group>"; | |||
| }; | |||
| /* 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; | |||
| LastSwiftMigration = 1100; | |||
| }; | |||
| }; | |||
| }; | |||
| 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 = ( | |||
| 74858FAF1ED2DC5600515810 /* AppDelegate.swift 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 = "<group>"; | |||
| }; | |||
| 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = { | |||
| isa = PBXVariantGroup; | |||
| children = ( | |||
| 97C147001CF9000F007C117D /* Base */, | |||
| ); | |||
| name = LaunchScreen.storyboard; | |||
| sourceTree = "<group>"; | |||
| }; | |||
| /* End PBXVariantGroup section */ | |||
| /* Begin XCBuildConfiguration section */ | |||
| 249021D3217E4FDB00AE95B9 /* Profile */ = { | |||
| isa = XCBuildConfiguration; | |||
| baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; | |||
| 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 = 8.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; | |||
| CLANG_ENABLE_MODULES = YES; | |||
| CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; | |||
| ENABLE_BITCODE = NO; | |||
| FRAMEWORK_SEARCH_PATHS = ( | |||
| "$(inherited)", | |||
| "$(PROJECT_DIR)/Flutter", | |||
| ); | |||
| INFOPLIST_FILE = Runner/Info.plist; | |||
| LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; | |||
| LIBRARY_SEARCH_PATHS = ( | |||
| "$(inherited)", | |||
| "$(PROJECT_DIR)/Flutter", | |||
| ); | |||
| PRODUCT_BUNDLE_IDENTIFIER = com.example.assetstock; | |||
| PRODUCT_NAME = "$(TARGET_NAME)"; | |||
| SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; | |||
| SWIFT_VERSION = 5.0; | |||
| VERSIONING_SYSTEM = "apple-generic"; | |||
| }; | |||
| name = Profile; | |||
| }; | |||
| 97C147031CF9000F007C117D /* Debug */ = { | |||
| isa = XCBuildConfiguration; | |||
| baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; | |||
| 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 = 8.0; | |||
| MTL_ENABLE_DEBUG_INFO = YES; | |||
| ONLY_ACTIVE_ARCH = YES; | |||
| SDKROOT = iphoneos; | |||
| TARGETED_DEVICE_FAMILY = "1,2"; | |||
| }; | |||
| name = Debug; | |||
| }; | |||
| 97C147041CF9000F007C117D /* Release */ = { | |||
| isa = XCBuildConfiguration; | |||
| baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; | |||
| 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 = 8.0; | |||
| MTL_ENABLE_DEBUG_INFO = NO; | |||
| SDKROOT = iphoneos; | |||
| SUPPORTED_PLATFORMS = iphoneos; | |||
| SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; | |||
| TARGETED_DEVICE_FAMILY = "1,2"; | |||
| VALIDATE_PRODUCT = YES; | |||
| }; | |||
| name = Release; | |||
| }; | |||
| 97C147061CF9000F007C117D /* Debug */ = { | |||
| isa = XCBuildConfiguration; | |||
| baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; | |||
| buildSettings = { | |||
| ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; | |||
| CLANG_ENABLE_MODULES = YES; | |||
| CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; | |||
| ENABLE_BITCODE = NO; | |||
| FRAMEWORK_SEARCH_PATHS = ( | |||
| "$(inherited)", | |||
| "$(PROJECT_DIR)/Flutter", | |||
| ); | |||
| INFOPLIST_FILE = Runner/Info.plist; | |||
| LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; | |||
| LIBRARY_SEARCH_PATHS = ( | |||
| "$(inherited)", | |||
| "$(PROJECT_DIR)/Flutter", | |||
| ); | |||
| PRODUCT_BUNDLE_IDENTIFIER = com.example.assetstock; | |||
| PRODUCT_NAME = "$(TARGET_NAME)"; | |||
| SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; | |||
| SWIFT_OPTIMIZATION_LEVEL = "-Onone"; | |||
| SWIFT_VERSION = 5.0; | |||
| VERSIONING_SYSTEM = "apple-generic"; | |||
| }; | |||
| name = Debug; | |||
| }; | |||
| 97C147071CF9000F007C117D /* Release */ = { | |||
| isa = XCBuildConfiguration; | |||
| baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; | |||
| buildSettings = { | |||
| ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; | |||
| CLANG_ENABLE_MODULES = YES; | |||
| CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; | |||
| ENABLE_BITCODE = NO; | |||
| FRAMEWORK_SEARCH_PATHS = ( | |||
| "$(inherited)", | |||
| "$(PROJECT_DIR)/Flutter", | |||
| ); | |||
| INFOPLIST_FILE = Runner/Info.plist; | |||
| LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; | |||
| LIBRARY_SEARCH_PATHS = ( | |||
| "$(inherited)", | |||
| "$(PROJECT_DIR)/Flutter", | |||
| ); | |||
| PRODUCT_BUNDLE_IDENTIFIER = com.example.assetstock; | |||
| PRODUCT_NAME = "$(TARGET_NAME)"; | |||
| SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; | |||
| SWIFT_VERSION = 5.0; | |||
| 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 */; | |||
| } | |||
| @@ -0,0 +1,7 @@ | |||
| <?xml version="1.0" encoding="UTF-8"?> | |||
| <Workspace | |||
| version = "1.0"> | |||
| <FileRef | |||
| location = "group:Runner.xcodeproj"> | |||
| </FileRef> | |||
| </Workspace> | |||
| @@ -0,0 +1,8 @@ | |||
| <?xml version="1.0" encoding="UTF-8"?> | |||
| <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> | |||
| <plist version="1.0"> | |||
| <dict> | |||
| <key>IDEDidComputeMac32BitWarning</key> | |||
| <true/> | |||
| </dict> | |||
| </plist> | |||
| @@ -0,0 +1,8 @@ | |||
| <?xml version="1.0" encoding="UTF-8"?> | |||
| <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> | |||
| <plist version="1.0"> | |||
| <dict> | |||
| <key>PreviewsEnabled</key> | |||
| <false/> | |||
| </dict> | |||
| </plist> | |||
| @@ -0,0 +1,91 @@ | |||
| <?xml version="1.0" encoding="UTF-8"?> | |||
| <Scheme | |||
| LastUpgradeVersion = "1020" | |||
| version = "1.3"> | |||
| <BuildAction | |||
| parallelizeBuildables = "YES" | |||
| buildImplicitDependencies = "YES"> | |||
| <BuildActionEntries> | |||
| <BuildActionEntry | |||
| buildForTesting = "YES" | |||
| buildForRunning = "YES" | |||
| buildForProfiling = "YES" | |||
| buildForArchiving = "YES" | |||
| buildForAnalyzing = "YES"> | |||
| <BuildableReference | |||
| BuildableIdentifier = "primary" | |||
| BlueprintIdentifier = "97C146ED1CF9000F007C117D" | |||
| BuildableName = "Runner.app" | |||
| BlueprintName = "Runner" | |||
| ReferencedContainer = "container:Runner.xcodeproj"> | |||
| </BuildableReference> | |||
| </BuildActionEntry> | |||
| </BuildActionEntries> | |||
| </BuildAction> | |||
| <TestAction | |||
| buildConfiguration = "Debug" | |||
| selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" | |||
| selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" | |||
| shouldUseLaunchSchemeArgsEnv = "YES"> | |||
| <Testables> | |||
| </Testables> | |||
| <MacroExpansion> | |||
| <BuildableReference | |||
| BuildableIdentifier = "primary" | |||
| BlueprintIdentifier = "97C146ED1CF9000F007C117D" | |||
| BuildableName = "Runner.app" | |||
| BlueprintName = "Runner" | |||
| ReferencedContainer = "container:Runner.xcodeproj"> | |||
| </BuildableReference> | |||
| </MacroExpansion> | |||
| <AdditionalOptions> | |||
| </AdditionalOptions> | |||
| </TestAction> | |||
| <LaunchAction | |||
| buildConfiguration = "Debug" | |||
| selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" | |||
| selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" | |||
| launchStyle = "0" | |||
| useCustomWorkingDirectory = "NO" | |||
| ignoresPersistentStateOnLaunch = "NO" | |||
| debugDocumentVersioning = "YES" | |||
| debugServiceExtension = "internal" | |||
| allowLocationSimulation = "YES"> | |||
| <BuildableProductRunnable | |||
| runnableDebuggingMode = "0"> | |||
| <BuildableReference | |||
| BuildableIdentifier = "primary" | |||
| BlueprintIdentifier = "97C146ED1CF9000F007C117D" | |||
| BuildableName = "Runner.app" | |||
| BlueprintName = "Runner" | |||
| ReferencedContainer = "container:Runner.xcodeproj"> | |||
| </BuildableReference> | |||
| </BuildableProductRunnable> | |||
| <AdditionalOptions> | |||
| </AdditionalOptions> | |||
| </LaunchAction> | |||
| <ProfileAction | |||
| buildConfiguration = "Profile" | |||
| shouldUseLaunchSchemeArgsEnv = "YES" | |||
| savedToolIdentifier = "" | |||
| useCustomWorkingDirectory = "NO" | |||
| debugDocumentVersioning = "YES"> | |||
| <BuildableProductRunnable | |||
| runnableDebuggingMode = "0"> | |||
| <BuildableReference | |||
| BuildableIdentifier = "primary" | |||
| BlueprintIdentifier = "97C146ED1CF9000F007C117D" | |||
| BuildableName = "Runner.app" | |||
| BlueprintName = "Runner" | |||
| ReferencedContainer = "container:Runner.xcodeproj"> | |||
| </BuildableReference> | |||
| </BuildableProductRunnable> | |||
| </ProfileAction> | |||
| <AnalyzeAction | |||
| buildConfiguration = "Debug"> | |||
| </AnalyzeAction> | |||
| <ArchiveAction | |||
| buildConfiguration = "Release" | |||
| revealArchiveInOrganizer = "YES"> | |||
| </ArchiveAction> | |||
| </Scheme> | |||
| @@ -0,0 +1,7 @@ | |||
| <?xml version="1.0" encoding="UTF-8"?> | |||
| <Workspace | |||
| version = "1.0"> | |||
| <FileRef | |||
| location = "group:Runner.xcodeproj"> | |||
| </FileRef> | |||
| </Workspace> | |||
| @@ -0,0 +1,8 @@ | |||
| <?xml version="1.0" encoding="UTF-8"?> | |||
| <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> | |||
| <plist version="1.0"> | |||
| <dict> | |||
| <key>IDEDidComputeMac32BitWarning</key> | |||
| <true/> | |||
| </dict> | |||
| </plist> | |||
| @@ -0,0 +1,8 @@ | |||
| <?xml version="1.0" encoding="UTF-8"?> | |||
| <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> | |||
| <plist version="1.0"> | |||
| <dict> | |||
| <key>PreviewsEnabled</key> | |||
| <false/> | |||
| </dict> | |||
| </plist> | |||
| @@ -0,0 +1,13 @@ | |||
| import UIKit | |||
| import Flutter | |||
| @UIApplicationMain | |||
| @objc class AppDelegate: FlutterAppDelegate { | |||
| override func application( | |||
| _ application: UIApplication, | |||
| didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? | |||
| ) -> Bool { | |||
| GeneratedPluginRegistrant.register(with: self) | |||
| return super.application(application, didFinishLaunchingWithOptions: launchOptions) | |||
| } | |||
| } | |||
| @@ -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" | |||
| } | |||
| } | |||
| @@ -0,0 +1,23 @@ | |||
| { | |||
| "images" : [ | |||
| { | |||
| "idiom" : "universal", | |||
| "filename" : "LaunchImage.png", | |||
| "scale" : "1x" | |||
| }, | |||
| { | |||
| "idiom" : "universal", | |||
| "filename" : "LaunchImage@2x.png", | |||
| "scale" : "2x" | |||
| }, | |||
| { | |||
| "idiom" : "universal", | |||
| "filename" : "LaunchImage@3x.png", | |||
| "scale" : "3x" | |||
| } | |||
| ], | |||
| "info" : { | |||
| "version" : 1, | |||
| "author" : "xcode" | |||
| } | |||
| } | |||
| @@ -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. | |||
| @@ -0,0 +1,37 @@ | |||
| <?xml version="1.0" encoding="UTF-8" standalone="no"?> | |||
| <document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="12121" systemVersion="16G29" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" colorMatched="YES" initialViewController="01J-lp-oVM"> | |||
| <dependencies> | |||
| <deployment identifier="iOS"/> | |||
| <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="12089"/> | |||
| </dependencies> | |||
| <scenes> | |||
| <!--View Controller--> | |||
| <scene sceneID="EHf-IW-A2E"> | |||
| <objects> | |||
| <viewController id="01J-lp-oVM" sceneMemberID="viewController"> | |||
| <layoutGuides> | |||
| <viewControllerLayoutGuide type="top" id="Ydg-fD-yQy"/> | |||
| <viewControllerLayoutGuide type="bottom" id="xbc-2k-c8Z"/> | |||
| </layoutGuides> | |||
| <view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3"> | |||
| <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> | |||
| <subviews> | |||
| <imageView opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" image="LaunchImage" translatesAutoresizingMaskIntoConstraints="NO" id="YRO-k0-Ey4"> | |||
| </imageView> | |||
| </subviews> | |||
| <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> | |||
| <constraints> | |||
| <constraint firstItem="YRO-k0-Ey4" firstAttribute="centerX" secondItem="Ze5-6b-2t3" secondAttribute="centerX" id="1a2-6s-vTC"/> | |||
| <constraint firstItem="YRO-k0-Ey4" firstAttribute="centerY" secondItem="Ze5-6b-2t3" secondAttribute="centerY" id="4X2-HB-R7a"/> | |||
| </constraints> | |||
| </view> | |||
| </viewController> | |||
| <placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/> | |||
| </objects> | |||
| <point key="canvasLocation" x="53" y="375"/> | |||
| </scene> | |||
| </scenes> | |||
| <resources> | |||
| <image name="LaunchImage" width="168" height="185"/> | |||
| </resources> | |||
| </document> | |||
| @@ -0,0 +1,26 @@ | |||
| <?xml version="1.0" encoding="UTF-8" standalone="no"?> | |||
| <document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="10117" systemVersion="15F34" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" initialViewController="BYZ-38-t0r"> | |||
| <dependencies> | |||
| <deployment identifier="iOS"/> | |||
| <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="10085"/> | |||
| </dependencies> | |||
| <scenes> | |||
| <!--Flutter View Controller--> | |||
| <scene sceneID="tne-QT-ifu"> | |||
| <objects> | |||
| <viewController id="BYZ-38-t0r" customClass="FlutterViewController" sceneMemberID="viewController"> | |||
| <layoutGuides> | |||
| <viewControllerLayoutGuide type="top" id="y3c-jy-aDJ"/> | |||
| <viewControllerLayoutGuide type="bottom" id="wfy-db-euE"/> | |||
| </layoutGuides> | |||
| <view key="view" contentMode="scaleToFill" id="8bC-Xf-vdC"> | |||
| <rect key="frame" x="0.0" y="0.0" width="600" height="600"/> | |||
| <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> | |||
| <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/> | |||
| </view> | |||
| </viewController> | |||
| <placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/> | |||
| </objects> | |||
| </scene> | |||
| </scenes> | |||
| </document> | |||
| @@ -0,0 +1,45 @@ | |||
| <?xml version="1.0" encoding="UTF-8"?> | |||
| <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> | |||
| <plist version="1.0"> | |||
| <dict> | |||
| <key>CFBundleDevelopmentRegion</key> | |||
| <string>$(DEVELOPMENT_LANGUAGE)</string> | |||
| <key>CFBundleExecutable</key> | |||
| <string>$(EXECUTABLE_NAME)</string> | |||
| <key>CFBundleIdentifier</key> | |||
| <string>$(PRODUCT_BUNDLE_IDENTIFIER)</string> | |||
| <key>CFBundleInfoDictionaryVersion</key> | |||
| <string>6.0</string> | |||
| <key>CFBundleName</key> | |||
| <string>assetstock</string> | |||
| <key>CFBundlePackageType</key> | |||
| <string>APPL</string> | |||
| <key>CFBundleShortVersionString</key> | |||
| <string>$(FLUTTER_BUILD_NAME)</string> | |||
| <key>CFBundleSignature</key> | |||
| <string>????</string> | |||
| <key>CFBundleVersion</key> | |||
| <string>$(FLUTTER_BUILD_NUMBER)</string> | |||
| <key>LSRequiresIPhoneOS</key> | |||
| <true/> | |||
| <key>UILaunchStoryboardName</key> | |||
| <string>LaunchScreen</string> | |||
| <key>UIMainStoryboardFile</key> | |||
| <string>Main</string> | |||
| <key>UISupportedInterfaceOrientations</key> | |||
| <array> | |||
| <string>UIInterfaceOrientationPortrait</string> | |||
| <string>UIInterfaceOrientationLandscapeLeft</string> | |||
| <string>UIInterfaceOrientationLandscapeRight</string> | |||
| </array> | |||
| <key>UISupportedInterfaceOrientations~ipad</key> | |||
| <array> | |||
| <string>UIInterfaceOrientationPortrait</string> | |||
| <string>UIInterfaceOrientationPortraitUpsideDown</string> | |||
| <string>UIInterfaceOrientationLandscapeLeft</string> | |||
| <string>UIInterfaceOrientationLandscapeRight</string> | |||
| </array> | |||
| <key>UIViewControllerBasedStatusBarAppearance</key> | |||
| <false/> | |||
| </dict> | |||
| </plist> | |||
| @@ -0,0 +1 @@ | |||
| #import "GeneratedPluginRegistrant.h" | |||
| @@ -0,0 +1,571 @@ | |||
| import 'dart:io'; | |||
| import 'util/photo_viewer.dart'; | |||
| import 'package:assetstock/util/dbHandler.dart'; | |||
| import 'package:flutter/material.dart'; | |||
| import 'package:image_picker/image_picker.dart'; | |||
| import 'main.dart'; | |||
| import 'util/Models.dart'; | |||
| class AssetDetails extends StatefulWidget { | |||
| // AssetDetails({Key key}) : super(key: key); | |||
| int no; | |||
| List<String>lokasi; | |||
| AssetDetails({this.no,this.lokasi}); | |||
| @override | |||
| _AssetDetailsState createState() => _AssetDetailsState(); | |||
| } | |||
| class _AssetDetailsState extends State<AssetDetails> with TickerProviderStateMixin { | |||
| final barCode = new TextEditingController(); | |||
| final prefixCode = new TextEditingController(); | |||
| final qty = new TextEditingController(); | |||
| final ket = new TextEditingController(); | |||
| TabController _controller; | |||
| int _currentIndex; | |||
| Asset _asset = new Asset(); | |||
| final focusNode = new FocusNode(); | |||
| bool isAppend = false; | |||
| loadAsset()async{ | |||
| var blob = await DBHelper.database.getBlobbyNo(widget.no); | |||
| if(blob!=null){ | |||
| var result = await DBHelper.database.searchbyTagNumber(blob.tag_number.toUpperCase()); | |||
| if(result['DATA']!=null) { | |||
| result['DATA'].blob = blob.blob; | |||
| result['DATA'].no = widget.no; | |||
| result['DATA'].keterangan = blob.keterangan; | |||
| } | |||
| else util.showToast('Alert', 'Asset data not found'); | |||
| String tag_number = result['DATA'].tag_number; | |||
| int separator = tag_number.lastIndexOf('/')+1; | |||
| setState(() { | |||
| _asset = result['DATA']; | |||
| prefixCode.text = tag_number.substring(0,separator); | |||
| barCode.text = tag_number.substring(separator); | |||
| ket.text = result['DATA'].keterangan; | |||
| }); | |||
| } | |||
| else{ | |||
| util.showToast('Alert', 'Asset data not found'); | |||
| } | |||
| } | |||
| @override | |||
| void initState() { | |||
| // TODO: implement initState | |||
| super.initState(); | |||
| qty.text='1'; | |||
| _controller = new TabController(length: 1, vsync: this); | |||
| _controller.addListener(() { | |||
| setState(() { | |||
| _currentIndex = _controller.index; | |||
| }); | |||
| }); | |||
| if(widget.no!=null){ | |||
| loadAsset(); | |||
| } | |||
| } | |||
| findAsset(query,{silent=false})async{ | |||
| var result = await DBHelper.database.searchbyTagNumber(query.toUpperCase()); | |||
| if(result['DATA']!=null){ | |||
| if(result['EXIST']){ | |||
| if(widget.no==null){ | |||
| setState(() { | |||
| isAppend=false; | |||
| barCode.text = ''; | |||
| ket.text = ''; | |||
| _asset = new Asset(); | |||
| }); | |||
| FocusScope.of(context).requestFocus(focusNode); | |||
| } | |||
| else{ | |||
| String tag_number = _asset.tag_number; | |||
| int separator = tag_number.lastIndexOf('/')+1; | |||
| setState(() { | |||
| prefixCode.text = tag_number.substring(0,separator); | |||
| barCode.text = tag_number.substring(separator); | |||
| }); | |||
| } | |||
| if(!silent)util.showToast('Alert', 'Asset data already inserted'); | |||
| } | |||
| else{ | |||
| var image; | |||
| if(_asset.blob!=null)image=_asset.blob; | |||
| setState(() { | |||
| isAppend=false; | |||
| _asset = result['DATA']; | |||
| if(image!=null)_asset.blob = image; | |||
| _asset.no = widget.no; | |||
| }); | |||
| } | |||
| } | |||
| else{ | |||
| var image; | |||
| if(_asset.blob!=null)image=_asset.blob; | |||
| setState(() { | |||
| // barCode.text = ''; | |||
| isAppend=true; | |||
| // ket.text = ''; | |||
| _asset = new Asset(); | |||
| if(image!=null)_asset.blob = image; | |||
| _asset.tag_number = query.toUpperCase(); | |||
| _asset.no = widget.no; | |||
| }); | |||
| // FocusScope.of(context).requestFocus(focusNode); | |||
| if(!silent)util.showToast('Alert', 'Asset data not found'); | |||
| } | |||
| } | |||
| @override | |||
| Widget build(BuildContext context) { | |||
| return Scaffold( | |||
| resizeToAvoidBottomPadding: true, | |||
| body: Container( | |||
| padding: EdgeInsets.only(top: 20,bottom: 50), | |||
| color: Colors.grey.withOpacity(0.3), | |||
| child: Column( | |||
| children: <Widget>[ | |||
| Expanded( | |||
| flex: 5, | |||
| child: Column( | |||
| children: <Widget>[ | |||
| Expanded( | |||
| flex:18, | |||
| child: TabBarView( | |||
| controller: _controller, | |||
| children: <Widget>[ | |||
| Padding( | |||
| padding: EdgeInsets.only(top:20,left: 20,right: 20), | |||
| child: Stack( | |||
| children: <Widget>[ | |||
| Container(color: Colors.grey,), | |||
| Positioned.fill(child: InkWell(onTap: ()async{ | |||
| var image = await picker.getImage(source: ImageSource.camera,imageQuality: 60,maxWidth: 600); | |||
| if(image!=null){ | |||
| _asset.blob = await image.readAsBytes(); | |||
| setState(() { | |||
| }); | |||
| print(File(image.path).lengthSync()/1024); | |||
| File(image.path).deleteSync(); | |||
| } | |||
| },child: Container( | |||
| decoration: BoxDecoration( | |||
| image: (_asset!=null&&_asset.blob!=null)?DecorationImage( | |||
| image: MemoryImage(_asset.blob), | |||
| fit: BoxFit.fitWidth | |||
| ):null | |||
| ), | |||
| child: (_asset!=null&&_asset.blob!=null)?null:Icon(Icons.camera_alt,size: 200,color: Colors.white,)))) | |||
| ], | |||
| ), | |||
| ), | |||
| // Padding( | |||
| // padding: EdgeInsets.only(top:20,left: 20,right: 20), | |||
| // child: Stack( | |||
| // children: <Widget>[ | |||
| // Container(color: Colors.grey,), | |||
| // Positioned.fill(child: InkWell(onTap: ()async{ | |||
| // await picker.getImage(source: ImageSource.camera); | |||
| // },child: Container(child: Icon(Icons.camera_alt,size: 200,color: Colors.white,)))) | |||
| // ], | |||
| // ), | |||
| // ), | |||
| ], | |||
| ), | |||
| ), | |||
| Expanded( | |||
| flex:1, | |||
| child: | |||
| Container( | |||
| // color: Colors.grey, | |||
| // child: TabBar( | |||
| // indicatorColor: Colors.blueGrey, | |||
| // controller: _controller, | |||
| // labelColor: Colors.blueGrey, | |||
| // labelStyle: TextStyle( | |||
| // fontSize: 17, | |||
| // fontWeight: FontWeight.bold | |||
| // ), | |||
| // unselectedLabelStyle: TextStyle( | |||
| // fontSize: 16 | |||
| // ), | |||
| // indicatorSize: TabBarIndicatorSize.label, | |||
| // tabs: <Widget>[ | |||
| // Tab( | |||
| // text: 'Asset', | |||
| // ), | |||
| // Tab( | |||
| // text: 'Barcode', | |||
| // ), | |||
| // ], | |||
| // ), | |||
| ) | |||
| ), | |||
| ], | |||
| ), | |||
| ), | |||
| Expanded( | |||
| flex: 5, | |||
| child: Container( | |||
| color: Colors.white, | |||
| padding: EdgeInsets.all(20), | |||
| child: SingleChildScrollView( | |||
| scrollDirection: Axis.vertical, | |||
| child: Column( | |||
| mainAxisAlignment: MainAxisAlignment.start, | |||
| children: <Widget>[ | |||
| (_asset.tag_number!=null)?Container( | |||
| alignment: Alignment.centerRight, | |||
| child: InkWell( | |||
| onTap: ()async { | |||
| var result = await DBHelper.database.getRefBlob(_asset.tag_number); | |||
| if(result!=null){ | |||
| if(result.blob!=null) Navigator.push(context, MaterialPageRoute(builder: (context) => PhotoViewer(result.blob,))); | |||
| else util.showToast('ALERT', "No Archived Images yet"); | |||
| } | |||
| else util.showToast('ALERT', "No Archived Images yet"); | |||
| //showPhoto | |||
| }, | |||
| child: Padding( | |||
| padding: const EdgeInsets.all(4.0), | |||
| child: Text('Archived images',style: TextStyle(color: Colors.indigo, decoration: TextDecoration.underline,),), | |||
| ), | |||
| ), | |||
| ):Container(), | |||
| (_asset.tag_number!=null)?SizedBox(height: 5,):Container(), | |||
| Row( | |||
| children: <Widget>[ | |||
| Expanded( | |||
| flex:3, | |||
| child: Container( | |||
| child: TextField( | |||
| controller: prefixCode, | |||
| autofocus: (widget.no==null), | |||
| onSubmitted: (value)async{ | |||
| String query = value.replaceAll('*', ''); | |||
| query = query.substring(0,query.lastIndexOf('/')+1); | |||
| setState(() { | |||
| prefixCode.text = query; | |||
| }); | |||
| if(prefixCode.text!=''&&barCode.text!='')await findAsset(prefixCode.text+barCode.text); | |||
| else FocusScope.of(context).requestFocus(focusNode); | |||
| }, | |||
| decoration: InputDecoration( | |||
| hintText: "Prefix code", | |||
| alignLabelWithHint: true, | |||
| ), | |||
| ), | |||
| ), | |||
| ), | |||
| SizedBox(width: 10,), | |||
| Expanded( | |||
| flex:3, | |||
| child: Container( | |||
| child: TextField( | |||
| controller: barCode, | |||
| focusNode: focusNode, | |||
| autofocus: (widget.no==null), | |||
| onSubmitted: (value)async{ | |||
| String query = value.replaceAll('*', ''); | |||
| if(prefixCode.text!=''){ | |||
| query = query.replaceAll(prefixCode.text.toUpperCase(), ''); | |||
| } | |||
| else{ | |||
| if(query.contains('/'))query = query.substring(query.lastIndexOf('/')); | |||
| util.showToast('ALERT', 'Please fill the prefix first'); | |||
| } | |||
| setState(() { | |||
| barCode.text = query; | |||
| }); | |||
| if(prefixCode.text!=''&&barCode.text!='')await findAsset(prefixCode.text+barCode.text); | |||
| }, | |||
| decoration: InputDecoration( | |||
| hintText: "Suffix / Barcode", | |||
| alignLabelWithHint: true, | |||
| suffixIcon: InkWell(onTap: ()async{ | |||
| if(prefixCode.text!=''){ | |||
| var scan = await util.scan(); | |||
| if(scan['STATUS']==1){ | |||
| String query = scan['DATA']; | |||
| // print("$query != ${prefixCode.text.toUpperCase()}"); | |||
| setState(() { | |||
| query = query.trim().replaceAll(prefixCode.text.toUpperCase(), ''); | |||
| barCode.text = query; | |||
| }); | |||
| if(prefixCode.text!=''&&barCode.text!='')await findAsset(prefixCode.text+barCode.text); | |||
| } | |||
| } | |||
| else util.showToast('ALERT', 'Please fill the prefix first'); | |||
| },child: Icon(Icons.center_focus_strong)) | |||
| ), | |||
| ), | |||
| ), | |||
| ), | |||
| Expanded(flex: 1, | |||
| child: Container( | |||
| alignment: Alignment.centerRight, | |||
| child: Text('Qty :'), | |||
| ),), | |||
| Expanded( | |||
| flex:2, | |||
| child: Container( | |||
| child: TextField( | |||
| enabled: false, | |||
| keyboardType: TextInputType.number, | |||
| decoration: InputDecoration( | |||
| contentPadding: EdgeInsets.all(8) | |||
| ), | |||
| controller: qty, | |||
| ), | |||
| ), | |||
| ), | |||
| ], | |||
| ), | |||
| SizedBox(height: 5,), | |||
| Container( | |||
| alignment: Alignment.centerLeft, | |||
| height: 50, | |||
| child: Row( | |||
| children: <Widget>[ | |||
| Expanded( | |||
| flex : 3, | |||
| child: Text('Note ',style: TextStyle(fontSize: 16),), | |||
| ), | |||
| Expanded( | |||
| flex : 1, | |||
| child: Text(':',style: TextStyle(fontSize: 16),), | |||
| ), | |||
| Expanded( | |||
| flex : 7, | |||
| child: TextField( | |||
| controller: ket, | |||
| decoration: InputDecoration( | |||
| hintText: "Insert Note here", | |||
| ), | |||
| ), | |||
| ), | |||
| ], | |||
| ), | |||
| ), | |||
| SizedBox(height: 5,), | |||
| Container( | |||
| alignment: Alignment.centerLeft, | |||
| height: 50, | |||
| child: Row( | |||
| children: <Widget>[ | |||
| Expanded( | |||
| flex : 3, | |||
| child: Text('Asset No ',style: TextStyle(fontSize: 16),), | |||
| ), | |||
| Expanded( | |||
| flex : 1, | |||
| child: Text(':',style: TextStyle(fontSize: 16),), | |||
| ), | |||
| Expanded( | |||
| flex : 7, | |||
| child: Text((_asset.asset_no??'-')=='null'?'-':_asset.asset_no??'-',style: TextStyle(fontSize: 16),), | |||
| ), | |||
| ], | |||
| ), | |||
| ), | |||
| SizedBox(height: 5,), | |||
| Container( | |||
| alignment: Alignment.centerLeft, | |||
| height: 50, | |||
| child: Row( | |||
| children: <Widget>[ | |||
| Expanded( | |||
| flex : 3, | |||
| child: Text('Asset Desc ',style: TextStyle(fontSize: 16),), | |||
| ), | |||
| Expanded( | |||
| flex : 1, | |||
| child: Text(':',style: TextStyle(fontSize: 16),), | |||
| ), | |||
| Expanded( | |||
| flex : 7, | |||
| child: Text(_asset.asset_desc??'-',style: TextStyle(fontSize: 16),), | |||
| ), | |||
| ], | |||
| ), | |||
| ), | |||
| SizedBox(height: 5,), | |||
| Container( | |||
| alignment: Alignment.centerLeft, | |||
| height: 50, | |||
| child: Row( | |||
| children: <Widget>[ | |||
| Expanded( | |||
| flex : 3, | |||
| child: Text('PIC ',style: TextStyle(fontSize: 16),), | |||
| ), | |||
| Expanded( | |||
| flex : 1, | |||
| child: Text(':',style: TextStyle(fontSize: 16),), | |||
| ), | |||
| Expanded( | |||
| flex : 7, | |||
| child: Text(_asset.pic??'-',style: TextStyle(fontSize: 16),), | |||
| ), | |||
| ], | |||
| ), | |||
| ), | |||
| SizedBox(height: 5,), | |||
| Container( | |||
| alignment: Alignment.centerLeft, | |||
| height: 50, | |||
| child: Row( | |||
| children: <Widget>[ | |||
| Expanded( | |||
| flex : 3, | |||
| child: Text('Lantai ',style: TextStyle(fontSize: 16),), | |||
| ), | |||
| Expanded( | |||
| flex : 1, | |||
| child: Text(':',style: TextStyle(fontSize: 16),), | |||
| ), | |||
| Expanded( | |||
| flex : 7, | |||
| child: Text(_asset.lantai??'-',style: TextStyle(fontSize: 16),), | |||
| ), | |||
| ], | |||
| ), | |||
| ), | |||
| SizedBox(height: 5,), | |||
| Container( | |||
| alignment: Alignment.centerLeft, | |||
| height: 50, | |||
| child: Row( | |||
| children: <Widget>[ | |||
| Expanded( | |||
| flex : 3, | |||
| child: Text('Ruang ',style: TextStyle(fontSize: 16),), | |||
| ), | |||
| Expanded( | |||
| flex : 1, | |||
| child: Text(':',style: TextStyle(fontSize: 16),), | |||
| ), | |||
| Expanded( | |||
| flex : 7, | |||
| child: Text(_asset.ruangan??'-',style: TextStyle(fontSize: 16),), | |||
| ), | |||
| ], | |||
| ), | |||
| ), | |||
| // SizedBox(height: 5,), | |||
| // Container( | |||
| // alignment: Alignment.centerLeft, | |||
| // height: 50, | |||
| // child: Row( | |||
| // children: <Widget>[ | |||
| // Expanded( | |||
| // flex : 3, | |||
| // child: Text('Gedung ',style: TextStyle(fontSize: 16),), | |||
| // ), | |||
| // Expanded( | |||
| // flex : 1, | |||
| // child: Text(':',style: TextStyle(fontSize: 16),), | |||
| // ), | |||
| // Expanded( | |||
| // flex : 7, | |||
| // child: Text(_asset.gedung??'-',style: TextStyle(fontSize: 16),), | |||
| // ), | |||
| // ], | |||
| // ), | |||
| // ), | |||
| ], | |||
| ), | |||
| ), | |||
| ), | |||
| ), | |||
| ], | |||
| ), | |||
| ), | |||
| bottomSheet: Container( | |||
| height: 50, | |||
| // color: Colors.grey.withOpacity(0.3), | |||
| child: Row( | |||
| children: <Widget>[ | |||
| Expanded( | |||
| flex: 5, | |||
| child: FlatButton( | |||
| onPressed: ()async{ | |||
| if(barCode.text!=''&&prefixCode.text!='')await findAsset(prefixCode.text+barCode.text,silent: true); | |||
| else _asset.tag_number = null; | |||
| if(_asset.tag_number!=null&&_asset.blob!=null){ | |||
| _asset.keterangan = ket.text; | |||
| bool upsertReady = !isAppend; | |||
| if(isAppend){ | |||
| upsertReady = await showDialog(context: context,builder: (context)=>WillPopScope( | |||
| onWillPop: ()async{ | |||
| Navigator.pop(context,false); | |||
| return false; | |||
| }, | |||
| child: AlertDialog( | |||
| title: Text('Append New Asset'), | |||
| content: Text('${(widget.no==null)?'Insert':'Update'} brand new asset?'), | |||
| actions: <Widget>[ | |||
| FlatButton( | |||
| onPressed: ()async{ | |||
| Navigator.pop(context,true); | |||
| }, | |||
| child: Text('Save'), | |||
| ), | |||
| FlatButton( | |||
| onPressed: ()async{ | |||
| Navigator.pop(context,false); | |||
| }, | |||
| child: Text('Cancel'), | |||
| ) | |||
| ], | |||
| ), | |||
| )); | |||
| } | |||
| if(upsertReady){ | |||
| if(widget.no==null){ | |||
| var insert = await DBHelper.database.insertAsset(_asset); | |||
| if(insert!=null){ | |||
| util.showToast("SUCCESS", 'Asset Inserted'); | |||
| await DBHelper.database.closeDb(); | |||
| setState(() { | |||
| barCode.text = ''; | |||
| ket.text = ''; | |||
| _asset = new Asset(); | |||
| }); | |||
| FocusScope.of(context).requestFocus(focusNode); | |||
| } | |||
| } | |||
| else{ | |||
| var update = await DBHelper.database.updateAsset(_asset); | |||
| if(update!=null){ | |||
| util.showToast("SUCCESS", 'Asset Updated'); | |||
| await DBHelper.database.closeDb(); | |||
| Navigator.pop(context); | |||
| } | |||
| } | |||
| } | |||
| } | |||
| else{ | |||
| util.showToast('ERROR', 'Please complete the asset data'); | |||
| } | |||
| }, | |||
| color: Colors.green, | |||
| child: Container(alignment: Alignment.center,height: 50, | |||
| child: Text('Save')), | |||
| ), | |||
| ), | |||
| Expanded( | |||
| flex: 5, | |||
| child: FlatButton( | |||
| onPressed: (){ | |||
| Navigator.pop(context); | |||
| }, | |||
| color: Colors.red, | |||
| child: Container(alignment: Alignment.center,height:50,child: Text('Cancel')), | |||
| ), | |||
| ), | |||
| ], | |||
| ), | |||
| ), | |||
| ); | |||
| } | |||
| } | |||
| @@ -0,0 +1,253 @@ | |||
| import 'package:assetstock/util/dbHandler.dart'; | |||
| import 'package:flutter/cupertino.dart'; | |||
| import 'package:flutter/material.dart'; | |||
| import 'util/prefsKey.dart'; | |||
| import 'main.dart'; | |||
| import 'util/Models.dart'; | |||
| import 'package:matrix_gesture_detector/matrix_gesture_detector.dart'; | |||
| class AssetLogs extends StatefulWidget { | |||
| AssetLogs({Key key}) : super(key: key); | |||
| @override | |||
| _AssetLogsState createState() => _AssetLogsState(); | |||
| } | |||
| class _AssetLogsState extends State<AssetLogs> { | |||
| List<Asset> nonAuditedAsset = []; | |||
| double widthtb = 900; | |||
| double scale=1; | |||
| final searchCon = TextEditingController(); | |||
| final scaleCon = TextEditingController(); | |||
| String search = ''; | |||
| fetchData()async{ | |||
| var dbName = await DBHelper.database.getDbName(); | |||
| // result. | |||
| var result = await util.JsonDataPostRaw({"dbName" : dbName , "redirect" : "FALSE" , "auditedData" : "FALSE"}, "${prefs.getString(keyClass.hostAddress)??"http://172.16.4.144:3000"}/admin/data/dbDetail"); | |||
| if(result['STATUS']!='ERROR'){ | |||
| var arrayList = result['DATA']['nonAuditedData']; | |||
| nonAuditedAsset.clear(); | |||
| for(int i = 0 ; i <arrayList.length ; i++){ | |||
| // print(arrayList[i]); | |||
| nonAuditedAsset.add(Asset.fromJson(arrayList[i])); | |||
| } | |||
| setState(() { | |||
| }); | |||
| } | |||
| else{ | |||
| util.showToast('ALERT', "Can't reach the server."); | |||
| Navigator.pop(context); | |||
| } | |||
| } | |||
| @override | |||
| void initState() { | |||
| fetchData(); | |||
| scaleCon.text = scale.toStringAsFixed(2); | |||
| super.initState(); | |||
| } | |||
| @override | |||
| Widget build(BuildContext context) { | |||
| return Scaffold( | |||
| resizeToAvoidBottomPadding: false, | |||
| body: Container( | |||
| padding: EdgeInsets.only(top: 10), | |||
| color: Colors.grey.withOpacity(0.3), | |||
| child: Column( | |||
| children: [ | |||
| Expanded( | |||
| flex: 2, | |||
| child: Container( | |||
| alignment: Alignment.bottomCenter, | |||
| padding: const EdgeInsets.all(8.0), | |||
| child: Container( | |||
| decoration: BoxDecoration( | |||
| color: Colors.white, | |||
| borderRadius: BorderRadius.circular(20), | |||
| ), | |||
| // padding: EdgeInsets.all(8), | |||
| child: TextField( | |||
| controller: searchCon, | |||
| onSubmitted: (value)async{ | |||
| setState(() { | |||
| search = value; | |||
| // searchCon.text = value; | |||
| }); | |||
| // await loadAsset(loading: true); | |||
| }, | |||
| decoration: InputDecoration( | |||
| border: InputBorder.none, | |||
| focusedBorder: InputBorder.none, | |||
| enabledBorder: InputBorder.none, | |||
| errorBorder: InputBorder.none, | |||
| disabledBorder: InputBorder.none, | |||
| suffixIcon: InkWell( | |||
| onTap: ()async{ | |||
| var result = await util.scan(); | |||
| if(result['STATUS']==1){ | |||
| searchCon.text = result['DATA']; | |||
| search = searchCon.text; | |||
| // await loadAsset(); | |||
| setState(() { | |||
| }); | |||
| } | |||
| }, | |||
| child: Icon(Icons.center_focus_strong,color: Colors.blueGrey,)), | |||
| contentPadding: EdgeInsets.only(left: 10,right: 10,top: 15,bottom: 15), | |||
| hintText: "Search Tag Number" | |||
| ), | |||
| ), | |||
| ), | |||
| ), | |||
| ), | |||
| Expanded( | |||
| flex:1, | |||
| child: Padding( | |||
| padding: EdgeInsets.all(5), | |||
| child: Row( | |||
| children: [ | |||
| Expanded( | |||
| flex:7, | |||
| child: Container( | |||
| alignment: Alignment.centerLeft, | |||
| child: Text('Non-Audited Asset : ${nonAuditedAsset.length} asset(s)'), | |||
| ), | |||
| ), | |||
| Expanded( | |||
| flex: 1, | |||
| child: Container( | |||
| child: Text('Scale : ') | |||
| ), | |||
| ), | |||
| Expanded( | |||
| flex: 1, | |||
| child: Container(padding: EdgeInsets.only(bottom: 5.0),child: TextField( | |||
| controller: scaleCon, | |||
| keyboardType: TextInputType.number, | |||
| onSubmitted: (value){ | |||
| try{ | |||
| scale = double.parse(value); | |||
| if(scale>=1.00&&scale<=3.00){ | |||
| setState(() { | |||
| widthtb = 900 *scale; | |||
| }); | |||
| } | |||
| else{ | |||
| util.showToast('ERROR', 'Scale must be between 1.00 - 3.00'); | |||
| } | |||
| } | |||
| catch(e){ | |||
| util.showToast('ERROR', 'Scale must be between 1.00 - 3.00'); | |||
| } | |||
| }, | |||
| ))), | |||
| ], | |||
| ), | |||
| ), | |||
| ), | |||
| Expanded( | |||
| flex:18, | |||
| child: Container( | |||
| color: Colors.white, | |||
| child: ListView( | |||
| scrollDirection: Axis.horizontal, | |||
| children: [ | |||
| Container( | |||
| child: Column( | |||
| children: [ | |||
| Container( | |||
| decoration: BoxDecoration( | |||
| border: Border.all(width: 1.0) | |||
| ), | |||
| width: widthtb, | |||
| child: Row( | |||
| children: [ | |||
| Container(padding: EdgeInsets.only(left: 5.0),width: widthtb*0.035,child: Text('No',style: TextStyle(fontWeight: FontWeight.bold),)), | |||
| Container(width: widthtb*0.09,child: Text('Tag Number',style: TextStyle(fontWeight: FontWeight.bold))), | |||
| Container(width: widthtb*0.24,child: Text('Asset Desc',style: TextStyle(fontWeight: FontWeight.bold))), | |||
| Container(width: widthtb*0.24,child: Text('PIC',style: TextStyle(fontWeight: FontWeight.bold))), | |||
| Container(width: widthtb*0.13,child: Text('Gedung',style: TextStyle(fontWeight: FontWeight.bold))), | |||
| Container(width: widthtb*0.125,child: Text('Lantai',style: TextStyle(fontWeight: FontWeight.bold))), | |||
| Container(width: widthtb*0.13,child: Text('Ruang',style: TextStyle(fontWeight: FontWeight.bold))), | |||
| ], | |||
| ), | |||
| ), | |||
| Expanded( | |||
| child: MatrixGestureDetector( | |||
| onMatrixUpdate: (m,t,s,r){ | |||
| scale = MatrixGestureDetector.decomposeToValues(m).scale+1; | |||
| if(scale>3)scale=3; | |||
| setState(() { | |||
| scaleCon.text = scale.toStringAsFixed(2); | |||
| widthtb = 900 *scale; | |||
| // scaleheighttb = 0.04*scale; | |||
| }); | |||
| }, | |||
| child: Container( | |||
| decoration: BoxDecoration( | |||
| border: Border.all(width: 1.0) | |||
| ), | |||
| width: widthtb, | |||
| child: ListView.builder( | |||
| padding: EdgeInsets.all(0.0), | |||
| itemCount: nonAuditedAsset.length, | |||
| itemBuilder: (context,index){ | |||
| Asset idxAsset = nonAuditedAsset[index]; | |||
| if(search!=''){ | |||
| if(idxAsset.tag_number.toUpperCase().contains(search.toUpperCase())) return Container( | |||
| decoration: BoxDecoration( | |||
| border: Border(bottom: BorderSide(width: 0.8)) | |||
| ), | |||
| child: Row( | |||
| children: [ | |||
| Container(padding: EdgeInsets.only(left: 5.0),width: widthtb*0.035,child: Text('${index+1}')), | |||
| Container(width: widthtb*0.09,child: Text(idxAsset.tag_number)), | |||
| Container(width: widthtb*0.24,child: Text(idxAsset.asset_desc)), | |||
| Container(width: widthtb*0.24,child: Text(idxAsset.pic)), | |||
| Container(width: widthtb*0.13,child: Text(idxAsset.gedung)), | |||
| Container(width: widthtb*0.125,child: Text(idxAsset.lantai)), | |||
| Container(width: widthtb*0.13,child: Text(idxAsset.ruangan)), | |||
| ], | |||
| ), | |||
| ); | |||
| else return Container(); | |||
| } | |||
| else{ | |||
| return Container( | |||
| decoration: BoxDecoration( | |||
| border: Border(bottom: BorderSide(width: 0.8)) | |||
| ), | |||
| child: Row( | |||
| children: [ | |||
| Container(padding: EdgeInsets.only(left: 5.0),width: widthtb*0.035,child: Text('${index+1}')), | |||
| Container(width: widthtb*0.09,child: Text(idxAsset.tag_number)), | |||
| Container(width: widthtb*0.24,child: Text(idxAsset.asset_desc)), | |||
| Container(width: widthtb*0.24,child: Text(idxAsset.pic)), | |||
| Container(width: widthtb*0.13,child: Text(idxAsset.gedung)), | |||
| Container(width: widthtb*0.125,child: Text(idxAsset.lantai)), | |||
| Container(width: widthtb*0.13,child: Text(idxAsset.ruangan)), | |||
| ], | |||
| ), | |||
| ); | |||
| } | |||
| }), | |||
| ), | |||
| ), | |||
| ), | |||
| ], | |||
| ), | |||
| ), | |||
| ], | |||
| ), | |||
| ) | |||
| ), | |||
| ], | |||
| ), | |||
| ), | |||
| ); | |||
| } | |||
| } | |||
| @@ -0,0 +1,506 @@ | |||
| import 'dart:async'; | |||
| import 'dart:convert'; | |||
| import 'dart:io'; | |||
| import 'package:assetstock/util/download_Upload_Handler.dart'; | |||
| import 'package:path/path.dart'; | |||
| import 'package:flutter/cupertino.dart'; | |||
| import 'package:flutter/material.dart'; | |||
| import 'package:path_provider/path_provider.dart'; | |||
| import 'main.dart'; | |||
| import 'util/prefsKey.dart'; | |||
| import 'util/dbHandler.dart'; | |||
| class Home extends StatefulWidget { | |||
| Home({Key key}) : super(key: key); | |||
| @override | |||
| _HomeState createState() => _HomeState(); | |||
| } | |||
| class _HomeState extends State<Home> { | |||
| List<Widget> Menus = []; | |||
| final hostAddress = new TextEditingController(); | |||
| StreamSubscription _dlulStream; | |||
| double progress,progressDL; | |||
| loadMenu()async{ | |||
| Menus.add(Padding( | |||
| padding: const EdgeInsets.all(8.0), | |||
| child: Container( | |||
| decoration: BoxDecoration( | |||
| color: Colors.white, | |||
| borderRadius: BorderRadius.circular(5) | |||
| ), | |||
| child: Text('Get Data'), | |||
| ), | |||
| )); | |||
| setState(() { | |||
| }); | |||
| } | |||
| @override | |||
| void initState() { | |||
| // TODO: implement initState | |||
| super.initState(); | |||
| WidgetsBinding.instance.addPostFrameCallback((_) async { | |||
| // await loadMenu(); | |||
| }); | |||
| } | |||
| clearData(context)async{ | |||
| String errMsg; | |||
| Directory documentsDirectory = await getApplicationDocumentsDirectory(); | |||
| String path = join(documentsDirectory.path, "assets.db"); | |||
| File db = File(path); | |||
| if(db.existsSync()){ | |||
| bool result = await showDialog(context: context,builder: (context)=>WillPopScope( | |||
| onWillPop: ()async{ | |||
| Navigator.pop(context,false); | |||
| return false; | |||
| }, | |||
| child: AlertDialog( | |||
| title: Text('Clear Data ?'), | |||
| content: Text('Proceed to clear any remaining units data on this device?'), | |||
| actions: <Widget>[ | |||
| FlatButton( | |||
| child: Text('Proceed'), | |||
| onPressed: ()async{ | |||
| util.showLoading(context); | |||
| await Future.sync(()async{ | |||
| await prefs.remove(keyClass.dbName); | |||
| // await prefs.setString(keyClass.lastDownload, null); | |||
| // await prefs.setString(keyClass.lastUpload, null); | |||
| // await prefs.setString(keyClass.targetProccess, null); | |||
| setState(() { | |||
| // lastUpload = ''; | |||
| // lastDownload = ''; | |||
| // timeString = ''; | |||
| }); | |||
| // var result = await DBHelper.database.deleteAll(); | |||
| // if(result!=null) { | |||
| // if(result!=null){ | |||
| try{ | |||
| await DBHelper.database.closeDb(); | |||
| db.deleteSync(); | |||
| } | |||
| catch(e){ | |||
| print(e); | |||
| util.showToast('ERROR','Failed to delete database file'); | |||
| } | |||
| // } | |||
| // else{ | |||
| // errMsg = 'Failed to clear unit data'; | |||
| // } | |||
| // } | |||
| // else{ | |||
| // errMsg = 'Failed to clear unit data'; | |||
| // } | |||
| }); | |||
| Navigator.pop(context); | |||
| Navigator.pop(context,true); | |||
| util.showToast(errMsg==null?"SUCCESS":"ERROR",errMsg??'Data Cleared'); | |||
| }, | |||
| ), | |||
| FlatButton( | |||
| child: Text('Cancel'), | |||
| onPressed: (){Navigator.pop(context,false);}, | |||
| ) | |||
| ], | |||
| ), | |||
| )); | |||
| return result; | |||
| } | |||
| else return true; | |||
| } | |||
| @override | |||
| Widget build(BuildContext context) { | |||
| return Scaffold( | |||
| floatingActionButton: Padding( | |||
| padding: const EdgeInsets.only(bottom:45.0), | |||
| child: FloatingActionButton( | |||
| onPressed: ()async{ | |||
| Directory documentsDirectory = await getApplicationDocumentsDirectory(); | |||
| String path = join(documentsDirectory.path, "assets.db"); | |||
| File db = File(path); | |||
| if(db.existsSync()){ | |||
| Navigator.pushNamed(context, '/logs'); | |||
| } | |||
| else{ | |||
| util.showToast("ALERT", 'Get data Master first'); | |||
| } | |||
| }, | |||
| child: Icon(Icons.description,size: 30,), | |||
| ), | |||
| ), | |||
| body: Container( | |||
| color: Colors.grey.withOpacity(0.3), | |||
| child: | |||
| // (Menus.length==0)?Container(alignment: Alignment.center, | |||
| // child: Text('Empty', | |||
| // style: TextStyle(fontSize: 20,color: Colors.black38,fontWeight: FontWeight.bold),),) | |||
| // : | |||
| Column( | |||
| children: <Widget>[ | |||
| Expanded( | |||
| flex: 1, | |||
| child: Container( | |||
| padding: const EdgeInsets.only(left: 10,top:10,right: 5), | |||
| alignment: Alignment.bottomCenter, | |||
| child: Row( | |||
| mainAxisAlignment: MainAxisAlignment.spaceBetween, | |||
| children: <Widget>[ | |||
| Row( | |||
| children: <Widget>[ | |||
| Icon(Icons.dashboard,color: Colors.blueGrey,size: 20,), | |||
| SizedBox(width: 5,), | |||
| Text('Menu') | |||
| ], | |||
| ), | |||
| PopupMenuButton( | |||
| itemBuilder: (context)=>[ | |||
| PopupMenuItem( | |||
| value: "changeAddress", | |||
| child: Row( | |||
| children: <Widget>[ | |||
| Icon(Icons.network_wifi,color: Colors.blueGrey,), | |||
| SizedBox(width: 10,), | |||
| Text('Change Host Address',style: TextStyle(color: Colors.blueGrey,fontWeight: FontWeight.w500),) | |||
| ], | |||
| ), | |||
| ) | |||
| ], | |||
| onSelected: (value)async{ | |||
| if(value == "changeAddress"){ | |||
| hostAddress.text = prefs.getString(keyClass.hostAddress)??'https://asset.thamringroup.web.id'; | |||
| await showDialog(context: context,builder: (context)=>AlertDialog( | |||
| title: Text('Set IP Address'), | |||
| content: TextField( | |||
| controller: hostAddress, | |||
| onSubmitted: (value){ | |||
| prefs.setString(keyClass.hostAddress,(value=='')?'https://asset.thamringroup.web.id':value); | |||
| Navigator.pop(context); | |||
| }, | |||
| ), | |||
| actions: <Widget>[ | |||
| FlatButton( | |||
| child: Text('OK'), | |||
| onPressed: (){ | |||
| prefs.setString(keyClass.hostAddress,(hostAddress.text=='')?'https://asset.thamringroup.web.id':hostAddress.text); | |||
| Navigator.pop(context); | |||
| }, | |||
| ) | |||
| ], | |||
| )); | |||
| setState(() { | |||
| }); | |||
| } | |||
| }, | |||
| child: Padding( | |||
| padding: const EdgeInsets.all(8.0), | |||
| child: Icon(Icons.clear_all,color: Colors.blueGrey,size: 20,), | |||
| ), | |||
| ), | |||
| ], | |||
| ), | |||
| ), | |||
| ), | |||
| Flexible( | |||
| flex: 10, | |||
| child: Container( | |||
| alignment: Alignment.topCenter, | |||
| child: GridView.count( | |||
| padding: EdgeInsets.all(0), | |||
| crossAxisCount: 2, | |||
| children: [ | |||
| InkWell( | |||
| onTap: ()async{ | |||
| // await Future.delayed(Duration(milliseconds: 300)); | |||
| String Address = prefs.getString(keyClass.hostAddress); | |||
| util.showLoading(context,dissmissable: false); | |||
| var result = await util.JsonDataPostRaw({}, "${Address??"https://asset.thamringroup.web.id"}/admin/getDbList"); | |||
| Navigator.pop(context); | |||
| if(result['STATUS']==1){ | |||
| bool isClear = await clearData(context); | |||
| if(isClear??false){ | |||
| String selected = result['DATA'][0]; | |||
| bool res =await showDialog(context: context,builder: (context)=>StatefulBuilder( | |||
| builder: (context,setState)=>AlertDialog( | |||
| title: Text('Pick Database'), | |||
| content: DropdownButtonFormField( | |||
| onChanged: (value){ | |||
| setState(() { | |||
| selected = value; | |||
| }); | |||
| }, | |||
| value: selected, | |||
| items: new List<DropdownMenuItem<dynamic>>.from(result['DATA'].map((value){ | |||
| String showText = value; | |||
| if(showText.length>30) showText = showText.substring(0,30); | |||
| return DropdownMenuItem( | |||
| child: Text(showText), | |||
| value: value, | |||
| ); | |||
| })), | |||
| ), | |||
| actions: <Widget>[ | |||
| FlatButton( | |||
| onPressed: ()async{ | |||
| Navigator.pop(context,true); | |||
| }, | |||
| child: Text('Get'), | |||
| ), | |||
| FlatButton( | |||
| onPressed: ()async{ | |||
| Navigator.pop(context,false); | |||
| }, | |||
| child: Text('Cancel'), | |||
| ) | |||
| ], | |||
| ), | |||
| )); | |||
| if(res??false){ | |||
| // util.showLoading(context,dissmissable: false); | |||
| await prefs.setString(keyClass.dbName,selected); | |||
| file_Trans_Handler trans = new file_Trans_Handler(); | |||
| await trans.downloadFile("assets.db", "${Address??"https://asset.thamringroup.web.id"}/admin/downloadDb/$selected"); | |||
| _dlulStream = trans.progress.listen((value)async { | |||
| setState(() { | |||
| progressDL = (value!=-1.0)?value:null; | |||
| }); | |||
| if(value!=null&&value >= 1.0) { | |||
| _dlulStream.cancel(); | |||
| progressDL = null; | |||
| // setState(() { | |||
| // lastDownload = DateTime.now().toIso8601String(); | |||
| // }); | |||
| // await prefs.setString(keyClass.lastDownload, lastDownload); | |||
| // await DBHelper.database.insertUpdateValue(new valueTab(name: 'TGL_START',value: DateFormat('dd-MM-yyyy HH:mm:ss').format(DateTime.parse(lastDownload)))); | |||
| // await DBHelper.database.insertUpdateValue(new valueTab(name: 'TGL_STOCK_TAKING',value: DateFormat('dd-MM-yyyy').format(DateTime.parse(lastDownload)))); | |||
| // await DBHelper.database.closeDb(); | |||
| // var allUnits = await DBHelper.database.getAllAsset(); | |||
| // print('${allUnits.length} Units'); | |||
| util.showToast('ALERT','Data Downloaded'); | |||
| } | |||
| if(value==-1.0){ | |||
| util.showToast('ALERT','Data Error ${trans.error}'); | |||
| } | |||
| }); | |||
| // Navigator.pop(context); | |||
| setState(() { | |||
| }); | |||
| } | |||
| } | |||
| } | |||
| else{ | |||
| await util.showToast("ERROR",result['ERROR']); | |||
| } | |||
| }, | |||
| child: Padding( | |||
| padding: const EdgeInsets.only(left: 10,top:10,right: 5), | |||
| child: Container( | |||
| decoration: BoxDecoration( | |||
| color: Colors.white, | |||
| borderRadius: BorderRadius.circular(10) | |||
| ), | |||
| child: Column( | |||
| mainAxisAlignment: MainAxisAlignment.center, | |||
| children: <Widget>[ | |||
| Expanded( | |||
| flex: 4, | |||
| child: Container(alignment: Alignment.center,child: (progressDL==null)?Icon(Icons.add_to_home_screen,size: 100,color: Colors.blueGrey,):Stack( | |||
| children: <Widget>[ | |||
| Container(width: 100,height: 100,child: CircularProgressIndicator(backgroundColor: Color(0xFFB4B4B4),valueColor:new AlwaysStoppedAnimation<Color>(Colors.blueGrey),value: progressDL,)), | |||
| Container(width: 100,height: 100,alignment: Alignment.center,child: Text("${(progressDL*100).floor().toString()}%",style: TextStyle(color: Colors.blueGrey,fontWeight: FontWeight.bold,fontSize: 25),),) | |||
| ], | |||
| )), | |||
| ), | |||
| Flexible( | |||
| flex: 2, | |||
| child: Text('Get Data Master',style: TextStyle(color: Colors.blueGrey,fontSize: 18,fontWeight: FontWeight.bold),), | |||
| ), | |||
| ], | |||
| ), | |||
| ), | |||
| ), | |||
| ), | |||
| Padding( | |||
| padding: const EdgeInsets.only(left: 5,top:10,right: 10), | |||
| child: Material( | |||
| color: Colors.white, | |||
| child: InkWell( | |||
| onTap: ()async{ | |||
| await Future.delayed(Duration(milliseconds: 300)); | |||
| Directory documentsDirectory = await getApplicationDocumentsDirectory(); | |||
| String path = join(documentsDirectory.path, "assets.db"); | |||
| File db = File(path); | |||
| if(db.existsSync())Navigator.pushNamed(context, '/stocking'); | |||
| else{ | |||
| util.showToast('Alert', 'Please download data master first'); | |||
| } | |||
| }, | |||
| child: Container( | |||
| decoration: BoxDecoration( | |||
| borderRadius: BorderRadius.circular(10) | |||
| ), | |||
| child: Column( | |||
| mainAxisAlignment: MainAxisAlignment.center, | |||
| children: <Widget>[ | |||
| Expanded( | |||
| flex: 4, | |||
| child: Container(alignment: Alignment.center,child: Icon(Icons.aspect_ratio,size: 100,color: Colors.blueGrey,)), | |||
| ), | |||
| Flexible( | |||
| flex: 2, | |||
| child: Text('Start Stocking',style: TextStyle(color: Colors.blueGrey,fontSize: 18,fontWeight: FontWeight.bold),), | |||
| ), | |||
| ], | |||
| ), | |||
| ), | |||
| ), | |||
| ), | |||
| ), | |||
| InkWell( | |||
| onTap: ()async{ | |||
| final file = File( | |||
| "${(await getApplicationDocumentsDirectory()).path}/assets.db"); | |||
| if(file.existsSync()){ | |||
| TextEditingController sendingUser = new TextEditingController(); | |||
| sendingUser.text = prefs.getString(keyClass.user)??''; | |||
| bool isUserDefined = await showDialog(context: context, | |||
| barrierDismissible: false, | |||
| builder: (context)=>AlertDialog( | |||
| title: Text('Sender'), | |||
| content: TextField( | |||
| controller: sendingUser, | |||
| ), | |||
| actions: [ | |||
| FlatButton( | |||
| child: Text('Send'), | |||
| onPressed: ()async{ | |||
| if(sendingUser.text!='') Navigator.pop(context,true); | |||
| else Navigator.pop(context,false); | |||
| }, | |||
| ) | |||
| ], | |||
| )); | |||
| if(isUserDefined??false){ | |||
| prefs.setString(keyClass.user, sendingUser.text); | |||
| util.showToast("ALERT",'Preparing Data'); | |||
| await DBHelper.database.closeDb(); | |||
| file_Trans_Handler trans = new file_Trans_Handler(); | |||
| util.showToast("ALERT",'Sending Data'); | |||
| setState(() { | |||
| progress = 0; | |||
| }); | |||
| trans.uploadFile("assets.db", "${prefs.getString(keyClass.hostAddress)??"https://asset.thamringroup.web.id"}/admin/uploadSqliteDb",sendingUser.text,context); | |||
| _dlulStream = trans.progress.listen((value) async { | |||
| setState(() { | |||
| progress = (value!=-1.0)?value:null; | |||
| }); | |||
| if(value!=null&&value >= 1.0) { | |||
| if(trans.error==''&&trans.isFinish){ | |||
| _dlulStream.cancel(); | |||
| progress = null; | |||
| util.showToast("SUCCESS",(trans.success!='')?trans.success:'Data uploaded'); | |||
| } | |||
| } | |||
| if(value==-1.0&&trans.isFinish){ | |||
| _dlulStream.cancel(); | |||
| progress = null; | |||
| util.showToast("ERROR",'Data upload error. ${trans.error}'); | |||
| } | |||
| }); | |||
| } | |||
| else util.showToast("ALERT",'Sending user not filled'); | |||
| } | |||
| else{ | |||
| util.showToast("ALERT",'No database file found'); | |||
| } | |||
| }, | |||
| child: Padding( | |||
| padding: const EdgeInsets.only(left: 10,top:10,right: 5), | |||
| child: Container( | |||
| decoration: BoxDecoration( | |||
| color: Colors.white, | |||
| borderRadius: BorderRadius.circular(10) | |||
| ), | |||
| child: Column( | |||
| mainAxisAlignment: MainAxisAlignment.center, | |||
| children: <Widget>[ | |||
| Expanded( | |||
| flex: 4, | |||
| child: Container(alignment: Alignment.center,child: (progress==null)?Icon(Icons.send,size: 100,color: Colors.blueGrey,):Stack( | |||
| children: <Widget>[ | |||
| Container(width: 100,height: 100,child: CircularProgressIndicator(backgroundColor: Color(0xFFB4B4B4),valueColor:new AlwaysStoppedAnimation<Color>(Colors.blueGrey),value: progress,)), | |||
| Container(width: 100,height: 100,alignment: Alignment.center,child: Text("${(progress*100).floor().toString()}%",style: TextStyle(color: Colors.blueGrey,fontWeight: FontWeight.bold,fontSize: 25),),) | |||
| ], | |||
| )), | |||
| ), | |||
| Flexible( | |||
| flex: 2, | |||
| child: Text('Send Data',style: TextStyle(color: Colors.blueGrey,fontSize: 18,fontWeight: FontWeight.bold),), | |||
| ), | |||
| ], | |||
| ), | |||
| ), | |||
| ), | |||
| ), | |||
| InkWell( | |||
| onTap: ()async{ | |||
| Directory documentsDirectory = await getApplicationDocumentsDirectory(); | |||
| String path = join(documentsDirectory.path, "assets.db"); | |||
| File db = File(path); | |||
| if(db.existsSync()) await clearData(context); | |||
| else util.showToast('Alert', 'No database file found'); | |||
| }, | |||
| child: Padding( | |||
| padding: const EdgeInsets.only(left: 5,top:10,right: 10), | |||
| child: Container( | |||
| decoration: BoxDecoration( | |||
| color: Colors.white, | |||
| borderRadius: BorderRadius.circular(10) | |||
| ), | |||
| child: Column( | |||
| mainAxisAlignment: MainAxisAlignment.center, | |||
| children: <Widget>[ | |||
| Expanded( | |||
| flex: 4, | |||
| child: Container(alignment: Alignment.center,child: Icon(Icons.delete,size: 100,color: Colors.blueGrey,)), | |||
| ), | |||
| Flexible( | |||
| flex: 2, | |||
| child: Text('Clear Data',style: TextStyle(color: Colors.blueGrey,fontSize: 18,fontWeight: FontWeight.bold),), | |||
| ), | |||
| ], | |||
| ), | |||
| ), | |||
| ), | |||
| ), | |||
| ], | |||
| ), | |||
| ), | |||
| ), | |||
| Flexible( | |||
| flex: 1, | |||
| child: Container( | |||
| padding: EdgeInsets.all(8), | |||
| alignment: Alignment.bottomRight, | |||
| child: Column( | |||
| crossAxisAlignment: CrossAxisAlignment.end, | |||
| mainAxisAlignment: MainAxisAlignment.end, | |||
| children: <Widget>[ | |||
| Text((prefs.getString(keyClass.dbName)!=null)?"Master Data : ${prefs.getString(keyClass.dbName)}":'',style: TextStyle(color: Colors.blueGrey),), | |||
| Text('Connected to ${prefs.getString(keyClass.hostAddress)??'https://asset.thamringroup.web.id'}',style: TextStyle(color: Colors.blueGrey),), | |||
| ], | |||
| ), | |||
| ), | |||
| ), | |||
| ], | |||
| ), | |||
| ), | |||
| ); | |||
| } | |||
| } | |||
| @@ -0,0 +1,46 @@ | |||
| import 'package:flutter/material.dart'; | |||
| import 'package:flutter/services.dart'; | |||
| import 'home.dart'; | |||
| import 'stocking.dart'; | |||
| import 'asset_logs.dart'; | |||
| import 'package:image_picker/image_picker.dart'; | |||
| import 'asset_details.dart'; | |||
| import 'util/utils.dart'; | |||
| import 'package:shared_preferences/shared_preferences.dart'; | |||
| import 'package:fluttertoast/fluttertoast.dart'; | |||
| final picker = ImagePicker(); | |||
| Util util = new Util(); | |||
| SharedPreferences prefs; | |||
| void main()async { | |||
| WidgetsFlutterBinding.ensureInitialized(); | |||
| prefs = await SharedPreferences.getInstance(); | |||
| SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]) | |||
| .then((_) { | |||
| runApp(new MyApp()); | |||
| }); | |||
| } | |||
| class MyApp extends StatelessWidget { | |||
| // This widget is the root of your application. | |||
| @override | |||
| Widget build(BuildContext context) { | |||
| return MaterialApp( | |||
| debugShowCheckedModeBanner: false, | |||
| debugShowMaterialGrid: false, | |||
| title: 'AssetStocks', | |||
| theme: ThemeData( | |||
| primarySwatch: Colors.blue, | |||
| visualDensity: VisualDensity.adaptivePlatformDensity, | |||
| ), | |||
| home: Home(), | |||
| routes: { | |||
| '/home': (context) => new Home(), | |||
| '/stocking': (context) => new Stocking(), | |||
| '/details': (context) => new AssetDetails(), | |||
| '/logs' : (context) => new AssetLogs(), | |||
| }, | |||
| ); | |||
| } | |||
| } | |||
| @@ -0,0 +1,959 @@ | |||
| import 'package:flutter/cupertino.dart'; | |||
| import 'package:flutter/material.dart'; | |||
| import 'main.dart'; | |||
| import 'util/Models.dart'; | |||
| import 'util/dbHandler.dart'; | |||
| import 'asset_details.dart'; | |||
| class Stocking extends StatefulWidget { | |||
| Stocking({Key key}) : super(key: key); | |||
| @override | |||
| _StockingState createState() => _StockingState(); | |||
| } | |||
| class _StockingState extends State<Stocking> with TickerProviderStateMixin { | |||
| final searchCon = new TextEditingController(); | |||
| String search = ''; | |||
| TabController _tabController; | |||
| List<Asset> refAsset = []; | |||
| List<Asset> insertAsset = []; | |||
| bool isLoading = false; | |||
| List<String> lokasi = []; | |||
| List<String> ruangan = []; | |||
| String _currentloc='All'; | |||
| String _currentruang='All'; | |||
| loadAsset({loading=false})async{ | |||
| if(loading) { | |||
| setState(() { | |||
| isLoading = true; | |||
| }); | |||
| } | |||
| var result = (search=='')?await DBHelper.database.getAllAsset():await DBHelper.database.filterAllAsset(search.toUpperCase()); | |||
| if(result!=null){ | |||
| if(_currentloc!='All') result.removeWhere((element) => (element.lantai!=_currentloc)); | |||
| if(_currentruang!='All') result.removeWhere((element) => (element.ruangan!=_currentruang)); | |||
| setState(() { | |||
| refAsset = result; | |||
| }); | |||
| // print(result.length); | |||
| } | |||
| result = (search=='')?await DBHelper.database.getAllInsertAsset():await DBHelper.database.filterAllInsertAsset(search.toUpperCase()); | |||
| if(result!=null){ | |||
| print(result.length); | |||
| if(_currentloc!='All'){ | |||
| if(_currentloc!='Appended'){ | |||
| result.removeWhere((element) => (element.lantai!=_currentloc)); | |||
| } | |||
| else{ | |||
| result.removeWhere((element) => (element.asset_desc!='')); | |||
| } | |||
| } | |||
| if(_currentruang!='All') result.removeWhere((element) => (element.ruangan!=_currentruang)); | |||
| setState(() { | |||
| insertAsset = result.reversed.toList(); | |||
| }); | |||
| } | |||
| if(lokasi.length==0){ | |||
| var results = await DBHelper.database.getAllLocation(); | |||
| if(results!=null){ | |||
| lokasi.clear(); | |||
| lokasi = new List<String>.from(results.map((item)=>item.lantai)); | |||
| lokasi.add('Appended'); | |||
| lokasi.add('All'); | |||
| } | |||
| } | |||
| ruangan.clear(); | |||
| var results = (_currentloc=='All')?await DBHelper.database.getAllRuangan():await DBHelper.database.getLantaiRuangan(_currentloc); | |||
| setState(() { | |||
| if(results!=null){ | |||
| ruangan = new List<String>.from(results.map((item)=>item.ruangan)); | |||
| ruangan.add('All'); | |||
| } | |||
| }); | |||
| if(loading) { | |||
| setState(() { | |||
| isLoading = false; | |||
| }); | |||
| } | |||
| } | |||
| @override | |||
| void initState() { | |||
| // TODO: implement initState | |||
| super.initState(); | |||
| _tabController = new TabController(length: 2, vsync: this); | |||
| loadAsset(loading: true); | |||
| } | |||
| @override | |||
| Widget build(BuildContext context) { | |||
| return Scaffold( | |||
| resizeToAvoidBottomPadding: false, | |||
| body: Stack( | |||
| children: <Widget>[ | |||
| Container( | |||
| padding: EdgeInsets.only(top: 10), | |||
| color: Colors.grey.withOpacity(0.3), | |||
| child: Column( | |||
| children: <Widget>[ | |||
| Expanded( | |||
| flex: 2, | |||
| child: Container( | |||
| alignment: Alignment.bottomCenter, | |||
| padding: const EdgeInsets.all(8.0), | |||
| child: Container( | |||
| decoration: BoxDecoration( | |||
| color: Colors.white, | |||
| borderRadius: BorderRadius.circular(20), | |||
| ), | |||
| // padding: EdgeInsets.all(8), | |||
| child: TextField( | |||
| controller: searchCon, | |||
| onSubmitted: (value)async{ | |||
| setState(() { | |||
| search = value; | |||
| // searchCon.text = value; | |||
| }); | |||
| await loadAsset(loading: true); | |||
| }, | |||
| decoration: InputDecoration( | |||
| border: InputBorder.none, | |||
| focusedBorder: InputBorder.none, | |||
| enabledBorder: InputBorder.none, | |||
| errorBorder: InputBorder.none, | |||
| disabledBorder: InputBorder.none, | |||
| suffixIcon: InkWell( | |||
| onTap: ()async{ | |||
| var result = await util.scan(); | |||
| if(result['STATUS']==1){ | |||
| searchCon.text = result['DATA']; | |||
| search = searchCon.text; | |||
| await loadAsset(); | |||
| setState(() { | |||
| }); | |||
| } | |||
| }, | |||
| child: Icon(Icons.center_focus_strong,color: Colors.blueGrey,)), | |||
| contentPadding: EdgeInsets.only(left: 10,right: 10,top: 15,bottom: 15), | |||
| hintText: "Search Tag Number" | |||
| ), | |||
| ), | |||
| ), | |||
| ), | |||
| ), | |||
| Expanded( | |||
| flex: 1, | |||
| child: Container( | |||
| alignment: Alignment.bottomCenter, | |||
| padding: const EdgeInsets.all(8.0), | |||
| child: Container( | |||
| // padding: EdgeInsets.all(8), | |||
| child: Row( | |||
| children: [ | |||
| Container( | |||
| child: Text("Lantai : ",style: TextStyle(fontSize: 16),), | |||
| ), | |||
| Container( | |||
| width: 100, | |||
| child: DropdownButtonFormField( | |||
| decoration: InputDecoration.collapsed(hintText: null), | |||
| value: _currentloc, | |||
| items: new List<DropdownMenuItem<String>>.from(lokasi.reversed.map((value){ | |||
| return DropdownMenuItem( | |||
| child: Text(value), | |||
| value: value, | |||
| ); | |||
| })), | |||
| onChanged: (value){ | |||
| if(_currentloc!= value){ | |||
| setState(() { | |||
| _currentruang = 'All'; | |||
| _currentloc=value; | |||
| }); | |||
| loadAsset(loading: true); | |||
| } | |||
| }, | |||
| ), | |||
| ), | |||
| Container( | |||
| child: Text("Ruang : ",style: TextStyle(fontSize: 16)), | |||
| ), | |||
| Expanded( | |||
| child: DropdownButtonFormField( | |||
| decoration: InputDecoration.collapsed(hintText: null), | |||
| value: _currentruang, | |||
| items: new List<DropdownMenuItem<String>>.from(ruangan.reversed.map((value){ | |||
| String _string = value; | |||
| if(_string.length>18) _string = _string.substring(0,18); | |||
| return DropdownMenuItem( | |||
| child: Text(_string), | |||
| value: value, | |||
| ); | |||
| })), | |||
| onChanged: (value){ | |||
| setState(() { | |||
| _currentruang=value; | |||
| }); | |||
| loadAsset(loading: true); | |||
| }, | |||
| ), | |||
| ), | |||
| ], | |||
| ), | |||
| ), | |||
| ), | |||
| ), | |||
| Expanded( | |||
| flex:16, | |||
| child: Column( | |||
| children: <Widget>[ | |||
| Flexible( | |||
| flex: 1, | |||
| child: Stack( | |||
| children: <Widget>[ | |||
| Positioned.fill(child: Row( | |||
| children: <Widget>[ | |||
| Expanded( | |||
| flex:1, | |||
| child: Container( | |||
| alignment: Alignment.center, | |||
| child:(insertAsset.length==0)?null:Row( | |||
| mainAxisSize: MainAxisSize.min, | |||
| children: <Widget>[ | |||
| Padding( | |||
| padding: const EdgeInsets.all(10.0), | |||
| child: Text('Completed ',style: TextStyle(fontSize: 18,color: Colors.transparent),), | |||
| ), | |||
| Container(padding: EdgeInsets.all(8), | |||
| decoration: BoxDecoration( | |||
| shape: BoxShape.circle, | |||
| color: Colors.green, | |||
| ), | |||
| child: Text('${insertAsset.length}',style: TextStyle(color: Colors.white,fontSize: 14/(insertAsset.length.toString().length/10+1)),)), | |||
| ], | |||
| ) | |||
| ), | |||
| ), | |||
| Expanded( | |||
| flex:1, | |||
| child: Container( | |||
| alignment: Alignment.center, | |||
| child:(refAsset.length==0)?null:Row( | |||
| mainAxisSize: MainAxisSize.min, | |||
| children: <Widget>[ | |||
| Padding( | |||
| padding: const EdgeInsets.all(10.0), | |||
| child: Text('InProgress ',style: TextStyle(fontSize: 18,color: Colors.transparent),), | |||
| ), | |||
| Container(padding: EdgeInsets.all(8), | |||
| decoration: BoxDecoration( | |||
| shape: BoxShape.circle, | |||
| color: Colors.red, | |||
| ), | |||
| child: Text('${refAsset.length-insertAsset.where((element) => (element.asset_desc!='')).length}',style: TextStyle(color: Colors.white,fontSize: 14/((refAsset.length-insertAsset.length).toString().length/10+1)),)), | |||
| ], | |||
| ) | |||
| ), | |||
| ), | |||
| ], | |||
| ),), | |||
| TabBar( | |||
| labelColor: Colors.blueGrey, | |||
| labelStyle: TextStyle(fontSize: 16,fontWeight: FontWeight.bold), | |||
| unselectedLabelStyle: TextStyle(fontSize: 15), | |||
| controller: _tabController, | |||
| tabs: <Widget>[ | |||
| Tab( | |||
| text: 'Completed', | |||
| ), | |||
| Tab( | |||
| text: 'inProgress', | |||
| ), | |||
| ], | |||
| ), | |||
| ], | |||
| ), | |||
| ), | |||
| Expanded( | |||
| flex: 12, | |||
| child: TabBarView( | |||
| controller: _tabController, | |||
| children: <Widget>[ | |||
| (insertAsset.length==0)?Center(child: Text('No Asset Data',style: TextStyle(color: Colors.grey,fontSize: 16,fontWeight: FontWeight.bold),),): | |||
| Scrollbar( | |||
| isAlwaysShown: false, | |||
| child: ListView.builder( | |||
| padding: EdgeInsets.all(0), | |||
| itemCount: insertAsset.length, | |||
| itemBuilder: (context,index){ | |||
| return InkWell( | |||
| onTap: ()async{ | |||
| await Navigator.push(context, MaterialPageRoute(builder: (context) => new AssetDetails(no:insertAsset[index].no,lokasi: lokasi,))); | |||
| // await Navigator.pushNamed(context, "/details"); | |||
| await loadAsset(); | |||
| }, | |||
| child: Padding( | |||
| padding: const EdgeInsets.only(bottom: 8,left: 8,right: 8), | |||
| child: Container( | |||
| decoration: BoxDecoration( | |||
| color: Colors.white, | |||
| borderRadius: BorderRadius.circular(5) | |||
| ), | |||
| height: 100, | |||
| child: Row( | |||
| children: <Widget>[ | |||
| Container(height: 100,width: 100,decoration:BoxDecoration( | |||
| image:insertAsset[index].blob==null?null: DecorationImage( | |||
| image: MemoryImage(insertAsset[index].blob,), | |||
| fit: BoxFit.cover | |||
| ), | |||
| color:Colors.grey, | |||
| borderRadius: BorderRadius.only(topLeft: Radius.circular(5),bottomLeft: Radius.circular(5)) | |||
| ),child:insertAsset[index].blob==null?Icon(Icons.image):null,), | |||
| Expanded( | |||
| flex: 7, | |||
| child: Container(padding: EdgeInsets.all(5), | |||
| height: 180, | |||
| child: Column( | |||
| mainAxisAlignment: MainAxisAlignment.spaceAround, | |||
| children: <Widget>[ | |||
| Row( | |||
| children: <Widget>[ | |||
| Expanded(flex:3,child: Text("Tag Number",style: TextStyle(fontSize: 14,),)), | |||
| Expanded(flex:1,child: Text(":",style: TextStyle(fontSize: 16,))), | |||
| Expanded(flex: 6,child: Text(insertAsset[index].tag_number,style: TextStyle(color: (insertAsset[index].asset_desc!='')?Colors.black:Colors.red,fontSize: 16,fontWeight: FontWeight.bold))), | |||
| Expanded(flex: 1,child: InkWell(onTap: ()async{ | |||
| await showDialog(context: context, | |||
| barrierDismissible: true, | |||
| builder: (context)=>AlertDialog( | |||
| title: Text('Delete Asset?'), | |||
| content: Text("Delete this asset (${insertAsset[index].tag_number})?"), | |||
| actions: [ | |||
| FlatButton( | |||
| child: Text('Delete'), | |||
| onPressed: ()async{ | |||
| var res = await DBHelper.database.deleteInsertAsset(insertAsset[index].no); | |||
| if(res!=null){ | |||
| setState(() { | |||
| insertAsset.removeAt(index); | |||
| }); | |||
| util.showToast('SUCCESS', 'Deleted'); | |||
| } | |||
| else{ | |||
| util.showToast('ERROR', 'Delete failed'); | |||
| } | |||
| Navigator.pop(context); | |||
| }, | |||
| ) | |||
| ], | |||
| )); | |||
| },child: Container(alignment: Alignment.centerRight,child: Icon(Icons.cancel,color: Colors.red,),)),), | |||
| ], | |||
| ), | |||
| Row( | |||
| children: <Widget>[ | |||
| Expanded(flex:3,child: Container(height: 16,child: Text("Asset Desc",style: TextStyle(fontSize: 14,),))), | |||
| Expanded(flex:1,child: Container(height: 16,child: Text(":",style: TextStyle(fontSize: 16,)))), | |||
| Expanded(flex: 7,child: SingleChildScrollView(scrollDirection: Axis.horizontal,child: Container(height: 16,child: Text(insertAsset[index].asset_desc,style: TextStyle(fontSize: 16,fontWeight: FontWeight.bold))))) | |||
| ], | |||
| ), | |||
| Row( | |||
| children: <Widget>[ | |||
| Expanded(flex:3,child: Container(height: 16,child: Text("Lokasi",style: TextStyle(fontSize: 14,),))), | |||
| Expanded(flex:1,child: Container(height: 16,child: Text(":",style: TextStyle(fontSize: 16,)))), | |||
| Expanded(flex: 7,child: SingleChildScrollView(scrollDirection: Axis.horizontal,child: Container(height: 16,child: Text(insertAsset[index].lantai,style: TextStyle(fontSize: 16,fontWeight: FontWeight.bold))))) | |||
| ], | |||
| ), | |||
| Row( | |||
| children: <Widget>[ | |||
| Expanded(flex:3,child: Container(height: 16,child: Text("Ruang",style: TextStyle(fontSize: 14,),))), | |||
| Expanded(flex:1,child: Container(height: 16,child: Text(":",style: TextStyle(fontSize: 16,)))), | |||
| Expanded(flex: 7,child: SingleChildScrollView(scrollDirection: Axis.horizontal,child: Container(height: 16,child: Text(insertAsset[index].ruangan,style: TextStyle(fontSize: 16,fontWeight: FontWeight.bold))))) | |||
| ], | |||
| ), | |||
| Row( | |||
| children: <Widget>[ | |||
| Expanded(flex:3,child: Container(height: 16,child: Text("Keterangan",style: TextStyle(fontSize: 14,),))), | |||
| Expanded(flex:1,child: Container(height: 16,child: Text(":",style: TextStyle(fontSize: 16,)))), | |||
| Expanded(flex: 7,child: SingleChildScrollView(scrollDirection: Axis.horizontal,child: Container(height: 16,child: Text(insertAsset[index].keterangan,style: TextStyle(fontSize: 16,fontWeight: FontWeight.bold))))) | |||
| ], | |||
| ), | |||
| ], | |||
| ),), | |||
| ) | |||
| ], | |||
| ), | |||
| ), | |||
| ), | |||
| ); | |||
| // String keyString = insertAsset[index].tag_number+insertAsset[index].asset_desc+insertAsset[index].ruangan+insertAsset[index].lantai+insertAsset[index].ruangan; | |||
| // if(search=='') return InkWell( | |||
| // onTap: ()async{ | |||
| // await Navigator.push(context, MaterialPageRoute(builder: (context) => new AssetDetails(tagNumber: insertAsset[index].tag_number,))); | |||
| //// await Navigator.pushNamed(context, "/details"); | |||
| // await loadAsset(); | |||
| // }, | |||
| // child: Padding( | |||
| // padding: const EdgeInsets.only(bottom: 8,left: 8,right: 8), | |||
| // child: Container( | |||
| // decoration: BoxDecoration( | |||
| // color: Colors.white, | |||
| // borderRadius: BorderRadius.circular(5) | |||
| // ), | |||
| // height: 100, | |||
| // child: Row( | |||
| // children: <Widget>[ | |||
| // Container(height: 100,width: 100,decoration:BoxDecoration( | |||
| // image:insertAsset[index].blob==null?null: DecorationImage( | |||
| // image: MemoryImage(insertAsset[index].blob,), | |||
| // fit: BoxFit.cover | |||
| // ), | |||
| // color:Colors.grey, | |||
| // borderRadius: BorderRadius.only(topLeft: Radius.circular(5),bottomLeft: Radius.circular(5)) | |||
| // ),child:insertAsset[index].blob==null?Icon(Icons.image):null,), | |||
| // Expanded( | |||
| // flex: 7, | |||
| // child: Container(padding: EdgeInsets.all(5), | |||
| // height: 180, | |||
| // child: Column( | |||
| // mainAxisAlignment: MainAxisAlignment.spaceAround, | |||
| // children: <Widget>[ | |||
| // Row( | |||
| // children: <Widget>[ | |||
| // Expanded(flex:3,child: Text("Tag Number",style: TextStyle(fontSize: 14,),)), | |||
| // Expanded(flex:1,child: Text(":",style: TextStyle(fontSize: 16,))), | |||
| // Expanded(flex: 7,child: Text(insertAsset[index].tag_number,style: TextStyle(fontSize: 16,fontWeight: FontWeight.bold))) | |||
| // ], | |||
| // ), | |||
| // Row( | |||
| // children: <Widget>[ | |||
| // Expanded(flex:3,child: Container(height: 16,child: Text("Asset Desc",style: TextStyle(fontSize: 14,),))), | |||
| // Expanded(flex:1,child: Container(height: 16,child: Text(":",style: TextStyle(fontSize: 16,)))), | |||
| // Expanded(flex: 7,child: SingleChildScrollView(scrollDirection: Axis.horizontal,child: Container(height: 16,child: Text(insertAsset[index].asset_desc,style: TextStyle(fontSize: 16,fontWeight: FontWeight.bold))))) | |||
| // ], | |||
| // ), | |||
| // Row( | |||
| // children: <Widget>[ | |||
| // Expanded(flex:3,child: Container(height: 16,child: Text("Ruang",style: TextStyle(fontSize: 14,),))), | |||
| // Expanded(flex:1,child: Container(height: 16,child: Text(":",style: TextStyle(fontSize: 16,)))), | |||
| // Expanded(flex: 7,child: SingleChildScrollView(scrollDirection: Axis.horizontal,child: Container(height: 16,child: Text(insertAsset[index].ruangan+' '+insertAsset[index].lantai,style: TextStyle(fontSize: 16,fontWeight: FontWeight.bold))))) | |||
| // ], | |||
| // ), | |||
| // Row( | |||
| // children: <Widget>[ | |||
| // Expanded(flex:3,child: Container(height: 16,child: Text("Gedung",style: TextStyle(fontSize: 14,),))), | |||
| // Expanded(flex:1,child: Container(height: 16,child: Text(":",style: TextStyle(fontSize: 16,)))), | |||
| // Expanded(flex: 7,child: SingleChildScrollView(scrollDirection: Axis.horizontal,child: Container(height: 16,child: Text(insertAsset[index].gedung,style: TextStyle(fontSize: 16,fontWeight: FontWeight.bold))))) | |||
| // ], | |||
| // ), | |||
| // ], | |||
| // ),), | |||
| // ) | |||
| // ], | |||
| // ), | |||
| // ), | |||
| // ), | |||
| // ); | |||
| // else{ | |||
| // if(keyString.toUpperCase().contains(search.toUpperCase())) return InkWell( | |||
| // onTap: ()async{ | |||
| // await Navigator.push(context, MaterialPageRoute(builder: (context) => new AssetDetails(tagNumber: insertAsset[index].tag_number,))); | |||
| //// await Navigator.pushNamed(context, "/details"); | |||
| // await loadAsset(); | |||
| // }, | |||
| // child: Padding( | |||
| // padding: const EdgeInsets.only(bottom: 8,left: 8,right: 8), | |||
| // child: Container( | |||
| // decoration: BoxDecoration( | |||
| // color: Colors.white, | |||
| // borderRadius: BorderRadius.circular(5) | |||
| // ), | |||
| // height: 100, | |||
| // child: Row( | |||
| // children: <Widget>[ | |||
| // Container(height: 100,width: 100,decoration:BoxDecoration( | |||
| // image:insertAsset[index].blob==null?null: DecorationImage( | |||
| // image: MemoryImage(insertAsset[index].blob,), | |||
| // fit: BoxFit.cover | |||
| // ), | |||
| // color:Colors.grey, | |||
| // borderRadius: BorderRadius.only(topLeft: Radius.circular(5),bottomLeft: Radius.circular(5)) | |||
| // ),child:insertAsset[index].blob==null?Icon(Icons.image):null,), | |||
| // Expanded( | |||
| // flex: 7, | |||
| // child: Container(padding: EdgeInsets.all(5), | |||
| // height: 180, | |||
| // child: Column( | |||
| // mainAxisAlignment: MainAxisAlignment.spaceAround, | |||
| // children: <Widget>[ | |||
| // Row( | |||
| // children: <Widget>[ | |||
| // Expanded(flex:3,child: Text("Tag Number",style: TextStyle(fontSize: 14,),)), | |||
| // Expanded(flex:1,child: Text(":",style: TextStyle(fontSize: 16,))), | |||
| // Expanded(flex: 7,child: Text(insertAsset[index].tag_number,style: TextStyle(fontSize: 16,fontWeight: FontWeight.bold))) | |||
| // ], | |||
| // ), | |||
| // Row( | |||
| // children: <Widget>[ | |||
| // Expanded(flex:3,child: Container(height: 16,child: Text("Asset Desc",style: TextStyle(fontSize: 14,),))), | |||
| // Expanded(flex:1,child: Container(height: 16,child: Text(":",style: TextStyle(fontSize: 16,)))), | |||
| // Expanded(flex: 7,child: SingleChildScrollView(scrollDirection: Axis.horizontal,child: Container(height: 16,child: Text(insertAsset[index].asset_desc,style: TextStyle(fontSize: 16,fontWeight: FontWeight.bold))))) | |||
| // ], | |||
| // ), | |||
| // Row( | |||
| // children: <Widget>[ | |||
| // Expanded(flex:3,child: Container(height: 16,child: Text("Ruang",style: TextStyle(fontSize: 14,),))), | |||
| // Expanded(flex:1,child: Container(height: 16,child: Text(":",style: TextStyle(fontSize: 16,)))), | |||
| // Expanded(flex: 7,child: SingleChildScrollView(scrollDirection: Axis.horizontal,child: Container(height: 16,child: Text(insertAsset[index].ruangan+' '+insertAsset[index].lantai,style: TextStyle(fontSize: 16,fontWeight: FontWeight.bold))))) | |||
| // ], | |||
| // ), | |||
| // Row( | |||
| // children: <Widget>[ | |||
| // Expanded(flex:3,child: Container(height: 16,child: Text("Gedung",style: TextStyle(fontSize: 14,),))), | |||
| // Expanded(flex:1,child: Container(height: 16,child: Text(":",style: TextStyle(fontSize: 16,)))), | |||
| // Expanded(flex: 7,child: SingleChildScrollView(scrollDirection: Axis.horizontal,child: Container(height: 16,child: Text(insertAsset[index].gedung,style: TextStyle(fontSize: 16,fontWeight: FontWeight.bold))))) | |||
| // ], | |||
| // ), | |||
| // ], | |||
| // ),), | |||
| // ) | |||
| // ], | |||
| // ), | |||
| // ), | |||
| // ), | |||
| // ); | |||
| // else return Container(); | |||
| // } | |||
| } | |||
| ), | |||
| ), | |||
| Scrollbar( | |||
| isAlwaysShown: false, | |||
| child: ListView.builder( | |||
| padding: EdgeInsets.all(0), | |||
| itemCount: refAsset.length, | |||
| itemBuilder: (context,index){ | |||
| return Opacity( | |||
| opacity: (refAsset[index].flag=='TRUE')?0.5:1, | |||
| child: Padding( | |||
| padding: const EdgeInsets.only(bottom: 8,left: 8,right: 8), | |||
| child: Container( | |||
| decoration: BoxDecoration( | |||
| color: Colors.white, | |||
| borderRadius: BorderRadius.circular(5) | |||
| ), | |||
| height: 100, | |||
| child: Row( | |||
| children: <Widget>[ | |||
| // Container(height: 100,width: 100,decoration:BoxDecoration( | |||
| // image:refAsset[index].blob==null?null: DecorationImage( | |||
| // image: MemoryImage(refAsset[index].blob,), | |||
| // fit: BoxFit.cover | |||
| // ), | |||
| // color:Colors.grey, | |||
| // borderRadius: BorderRadius.only(topLeft: Radius.circular(5),bottomLeft: Radius.circular(5)) | |||
| // ),child:Icon(Icons.image,color: (refAsset[index].blob==null)?Colors.black:Colors.transparent,),), | |||
| Expanded( | |||
| flex: 7, | |||
| child: Container(padding: EdgeInsets.all(5), | |||
| height: 180, | |||
| child: Column( | |||
| mainAxisAlignment: MainAxisAlignment.spaceAround, | |||
| children: <Widget>[ | |||
| Row( | |||
| children: <Widget>[ | |||
| Expanded(flex:3,child: Text("Tag Number",style: TextStyle(fontSize: 14,),)), | |||
| Expanded(flex:1,child: Text(":",style: TextStyle(fontSize: 16,))), | |||
| Expanded(flex: 7,child: Text(refAsset[index].tag_number,style: TextStyle(fontSize: 16,fontWeight: FontWeight.bold,color: Colors.black))) | |||
| ], | |||
| ), | |||
| Row( | |||
| children: <Widget>[ | |||
| Expanded(flex:3,child: Container(height: 16,child: Text("Asset Desc",style: TextStyle(fontSize: 14,),))), | |||
| Expanded(flex:1,child: Container(height: 16,child: Text(":",style: TextStyle(fontSize: 16,)))), | |||
| Expanded(flex: 7,child: SingleChildScrollView(scrollDirection: Axis.horizontal,child: Container(height: 16,child: Text(refAsset[index].asset_desc,style: TextStyle(fontSize: 16,color: Colors.black,fontWeight: FontWeight.bold))))) | |||
| ], | |||
| ), | |||
| Row( | |||
| children: <Widget>[ | |||
| Expanded(flex:3,child: Container(height: 16,child: Text("Ruang",style: TextStyle(fontSize: 14,),))), | |||
| Expanded(flex:1,child: Container(height: 16,child: Text(":",style: TextStyle(fontSize: 16,)))), | |||
| Expanded(flex: 7,child: SingleChildScrollView(scrollDirection: Axis.horizontal,child: Container(height: 16,child: Text(refAsset[index].ruangan,style: TextStyle(fontSize: 16,color: Colors.black,fontWeight: FontWeight.bold))))) | |||
| ], | |||
| ), | |||
| Row( | |||
| children: <Widget>[ | |||
| Expanded(flex:3,child: Container(height: 16,child: Text("Lantai",style: TextStyle(fontSize: 14,),))), | |||
| Expanded(flex:1,child: Container(height: 16,child: Text(":",style: TextStyle(fontSize: 16,)))), | |||
| Expanded(flex: 7,child: SingleChildScrollView(scrollDirection: Axis.horizontal,child: Container(height: 16,child: Text(refAsset[index].lantai,style: TextStyle(fontSize: 16,color: Colors.black,fontWeight: FontWeight.bold))))) | |||
| ], | |||
| ), | |||
| ], | |||
| ),), | |||
| ) | |||
| ], | |||
| ), | |||
| ), | |||
| ), | |||
| ); | |||
| // String keyString = refAsset[index].tag_number+refAsset[index].asset_desc+refAsset[index].ruangan+refAsset[index].lantai+refAsset[index].ruangan; | |||
| // if(search=='') return Opacity( | |||
| // opacity: (refAsset[index].flag=='TRUE')?0.5:1, | |||
| // child: Padding( | |||
| // padding: const EdgeInsets.only(bottom: 8,left: 8,right: 8), | |||
| // child: Container( | |||
| // decoration: BoxDecoration( | |||
| // color: Colors.white, | |||
| // borderRadius: BorderRadius.circular(5) | |||
| // ), | |||
| // height: 100, | |||
| // child: Row( | |||
| // children: <Widget>[ | |||
| // Container(height: 100,width: 100,decoration:BoxDecoration( | |||
| // image:refAsset[index].blob==null?null: DecorationImage( | |||
| // image: MemoryImage(refAsset[index].blob,), | |||
| // fit: BoxFit.cover | |||
| // ), | |||
| // color:Colors.grey, | |||
| // borderRadius: BorderRadius.only(topLeft: Radius.circular(5),bottomLeft: Radius.circular(5)) | |||
| // ),child:Icon(Icons.image),), | |||
| // Expanded( | |||
| // flex: 7, | |||
| // child: Container(padding: EdgeInsets.all(5), | |||
| // height: 180, | |||
| // child: Column( | |||
| // mainAxisAlignment: MainAxisAlignment.spaceAround, | |||
| // children: <Widget>[ | |||
| // Row( | |||
| // children: <Widget>[ | |||
| // Expanded(flex:3,child: Text("Tag Number",style: TextStyle(fontSize: 14,),)), | |||
| // Expanded(flex:1,child: Text(":",style: TextStyle(fontSize: 16,))), | |||
| // Expanded(flex: 7,child: Text(refAsset[index].tag_number,style: TextStyle(fontSize: 16,fontWeight: FontWeight.bold,color: Colors.black))) | |||
| // ], | |||
| // ), | |||
| // Row( | |||
| // children: <Widget>[ | |||
| // Expanded(flex:3,child: Container(height: 16,child: Text("Asset Desc",style: TextStyle(fontSize: 14,),))), | |||
| // Expanded(flex:1,child: Container(height: 16,child: Text(":",style: TextStyle(fontSize: 16,)))), | |||
| // Expanded(flex: 7,child: SingleChildScrollView(scrollDirection: Axis.horizontal,child: Container(height: 16,child: Text(refAsset[index].asset_desc,style: TextStyle(fontSize: 16,color: Colors.black,fontWeight: FontWeight.bold))))) | |||
| // ], | |||
| // ), | |||
| // Row( | |||
| // children: <Widget>[ | |||
| // Expanded(flex:3,child: Container(height: 16,child: Text("Ruang",style: TextStyle(fontSize: 14,),))), | |||
| // Expanded(flex:1,child: Container(height: 16,child: Text(":",style: TextStyle(fontSize: 16,)))), | |||
| // Expanded(flex: 7,child: SingleChildScrollView(scrollDirection: Axis.horizontal,child: Container(height: 16,child: Text(refAsset[index].ruangan+' '+refAsset[index].lantai,style: TextStyle(fontSize: 16,color: Colors.black,fontWeight: FontWeight.bold))))) | |||
| // ], | |||
| // ), | |||
| // Row( | |||
| // children: <Widget>[ | |||
| // Expanded(flex:3,child: Container(height: 16,child: Text("Gedung",style: TextStyle(fontSize: 14,),))), | |||
| // Expanded(flex:1,child: Container(height: 16,child: Text(":",style: TextStyle(fontSize: 16,)))), | |||
| // Expanded(flex: 7,child: SingleChildScrollView(scrollDirection: Axis.horizontal,child: Container(height: 16,child: Text(refAsset[index].gedung,style: TextStyle(fontSize: 16,color: Colors.black,fontWeight: FontWeight.bold))))) | |||
| // ], | |||
| // ), | |||
| // ], | |||
| // ),), | |||
| // ) | |||
| // ], | |||
| // ), | |||
| // ), | |||
| // ), | |||
| // ); | |||
| // else{ | |||
| // if(keyString.toUpperCase().contains(search.toUpperCase())) return Opacity( | |||
| // opacity: (refAsset[index].flag=='TRUE')?0.5:1, | |||
| // child: Padding( | |||
| // padding: const EdgeInsets.only(bottom: 8,left: 8,right: 8), | |||
| // child: Container( | |||
| // decoration: BoxDecoration( | |||
| // color: Colors.white, | |||
| // borderRadius: BorderRadius.circular(5) | |||
| // ), | |||
| // height: 100, | |||
| // child: Row( | |||
| // children: <Widget>[ | |||
| // Container(height: 100,width: 100,decoration:BoxDecoration( | |||
| // image:refAsset[index].blob==null?null: DecorationImage( | |||
| // image: MemoryImage(refAsset[index].blob,), | |||
| // fit: BoxFit.cover | |||
| // ), | |||
| // color:Colors.grey, | |||
| // borderRadius: BorderRadius.only(topLeft: Radius.circular(5),bottomLeft: Radius.circular(5)) | |||
| // ),child:Icon(Icons.image),), | |||
| // Expanded( | |||
| // flex: 7, | |||
| // child: Container(padding: EdgeInsets.all(5), | |||
| // height: 180, | |||
| // child: Column( | |||
| // mainAxisAlignment: MainAxisAlignment.spaceAround, | |||
| // children: <Widget>[ | |||
| // Row( | |||
| // children: <Widget>[ | |||
| // Expanded(flex:3,child: Text("Tag Number",style: TextStyle(fontSize: 14,),)), | |||
| // Expanded(flex:1,child: Text(":",style: TextStyle(fontSize: 16,))), | |||
| // Expanded(flex: 7,child: Text(refAsset[index].tag_number,style: TextStyle(fontSize: 16,fontWeight: FontWeight.bold,color: Colors.black))) | |||
| // ], | |||
| // ), | |||
| // Row( | |||
| // children: <Widget>[ | |||
| // Expanded(flex:3,child: Container(height: 16,child: Text("Asset Desc",style: TextStyle(fontSize: 14,),))), | |||
| // Expanded(flex:1,child: Container(height: 16,child: Text(":",style: TextStyle(fontSize: 16,)))), | |||
| // Expanded(flex: 7,child: SingleChildScrollView(scrollDirection: Axis.horizontal,child: Container(height: 16,child: Text(refAsset[index].asset_desc,style: TextStyle(fontSize: 16,color: Colors.black,fontWeight: FontWeight.bold))))) | |||
| // ], | |||
| // ), | |||
| // Row( | |||
| // children: <Widget>[ | |||
| // Expanded(flex:3,child: Container(height: 16,child: Text("Ruang",style: TextStyle(fontSize: 14,),))), | |||
| // Expanded(flex:1,child: Container(height: 16,child: Text(":",style: TextStyle(fontSize: 16,)))), | |||
| // Expanded(flex: 7,child: SingleChildScrollView(scrollDirection: Axis.horizontal,child: Container(height: 16,child: Text(refAsset[index].ruangan+' '+refAsset[index].lantai,style: TextStyle(fontSize: 16,color: Colors.black,fontWeight: FontWeight.bold))))) | |||
| // ], | |||
| // ), | |||
| // Row( | |||
| // children: <Widget>[ | |||
| // Expanded(flex:3,child: Container(height: 16,child: Text("Gedung",style: TextStyle(fontSize: 14,),))), | |||
| // Expanded(flex:1,child: Container(height: 16,child: Text(":",style: TextStyle(fontSize: 16,)))), | |||
| // Expanded(flex: 7,child: SingleChildScrollView(scrollDirection: Axis.horizontal,child: Container(height: 16,child: Text(refAsset[index].gedung,style: TextStyle(fontSize: 16,color: Colors.black,fontWeight: FontWeight.bold))))) | |||
| // ], | |||
| // ), | |||
| // ], | |||
| // ),), | |||
| // ) | |||
| // ], | |||
| // ), | |||
| // ), | |||
| // ), | |||
| // ); | |||
| // else return Container(); | |||
| // } | |||
| } | |||
| ), | |||
| ), | |||
| // ListView( | |||
| // padding: EdgeInsets.all(0), | |||
| // children: <Widget>[ | |||
| // Padding( | |||
| // padding: const EdgeInsets.only(bottom: 8,left: 8,right: 8), | |||
| // child: Container( | |||
| // decoration: BoxDecoration( | |||
| // color: Colors.white, | |||
| // borderRadius: BorderRadius.circular(5) | |||
| // ), | |||
| // height: 100, | |||
| // child: Row( | |||
| // children: <Widget>[ | |||
| // Container(height: 100,width: 100,decoration:BoxDecoration( | |||
| // color:Colors.red, | |||
| // borderRadius: BorderRadius.only(topLeft: Radius.circular(5),bottomLeft: Radius.circular(5)) | |||
| // ),child:Icon(Icons.image),), | |||
| // Expanded( | |||
| // flex: 7, | |||
| // child: Container(padding: EdgeInsets.all(5), | |||
| // child: Column( | |||
| // mainAxisAlignment: MainAxisAlignment.spaceAround, | |||
| // children: <Widget>[ | |||
| // Row( | |||
| // children: <Widget>[ | |||
| // Expanded(flex:2,child: Text("Kode",style: TextStyle(fontSize: 14,),)), | |||
| // Expanded(flex:1,child: Text(":",style: TextStyle(fontSize: 16,))), | |||
| // Expanded(flex: 7,child: Text("aaaa",style: TextStyle(fontSize: 16,fontWeight: FontWeight.bold))) | |||
| // ], | |||
| // ), | |||
| // Row( | |||
| // children: <Widget>[ | |||
| // Expanded(flex:2,child: Text("Nama",style: TextStyle(fontSize: 14,),)), | |||
| // Expanded(flex:1,child: Text(":",style: TextStyle(fontSize: 16,))), | |||
| // Expanded(flex: 7,child: Text("aaaa",style: TextStyle(fontSize: 16,fontWeight: FontWeight.bold))) | |||
| // ], | |||
| // ), | |||
| // Row( | |||
| // children: <Widget>[ | |||
| // Expanded(flex:2,child: Text("Ruang",style: TextStyle(fontSize: 14,),)), | |||
| // Expanded(flex:1,child: Text(":",style: TextStyle(fontSize: 16,))), | |||
| // Expanded(flex: 7,child: Text("aaaa",style: TextStyle(fontSize: 16,fontWeight: FontWeight.bold))) | |||
| // ], | |||
| // ), | |||
| // ], | |||
| // ),), | |||
| // ) | |||
| // ], | |||
| // ), | |||
| // ), | |||
| // ), | |||
| // Padding( | |||
| // padding: const EdgeInsets.only(bottom: 8,left: 8,right: 8), | |||
| // child: Container( | |||
| // decoration: BoxDecoration( | |||
| // color: Colors.white, | |||
| // borderRadius: BorderRadius.circular(5) | |||
| // ), | |||
| // height: 100, | |||
| // child: Row( | |||
| // children: <Widget>[ | |||
| // Container(height: 100,width: 100,decoration:BoxDecoration( | |||
| // color:Colors.red, | |||
| // borderRadius: BorderRadius.only(topLeft: Radius.circular(5),bottomLeft: Radius.circular(5)) | |||
| // ),child:Icon(Icons.image),), | |||
| // Expanded( | |||
| // flex: 7, | |||
| // child: Container(padding: EdgeInsets.all(5), | |||
| // child: Column( | |||
| // mainAxisAlignment: MainAxisAlignment.spaceAround, | |||
| // children: <Widget>[ | |||
| // Row( | |||
| // children: <Widget>[ | |||
| // Expanded(flex:2,child: Text("Kode",style: TextStyle(fontSize: 14,),)), | |||
| // Expanded(flex:1,child: Text(":",style: TextStyle(fontSize: 16,))), | |||
| // Expanded(flex: 7,child: Text("aaaa",style: TextStyle(fontSize: 16,fontWeight: FontWeight.bold))) | |||
| // ], | |||
| // ), | |||
| // Row( | |||
| // children: <Widget>[ | |||
| // Expanded(flex:2,child: Text("Nama",style: TextStyle(fontSize: 14,),)), | |||
| // Expanded(flex:1,child: Text(":",style: TextStyle(fontSize: 16,))), | |||
| // Expanded(flex: 7,child: Text("aaaa",style: TextStyle(fontSize: 16,fontWeight: FontWeight.bold))) | |||
| // ], | |||
| // ), | |||
| // Row( | |||
| // children: <Widget>[ | |||
| // Expanded(flex:2,child: Text("Ruang",style: TextStyle(fontSize: 14,),)), | |||
| // Expanded(flex:1,child: Text(":",style: TextStyle(fontSize: 16,))), | |||
| // Expanded(flex: 7,child: Text("aaaa",style: TextStyle(fontSize: 16,fontWeight: FontWeight.bold))) | |||
| // ], | |||
| // ), | |||
| // ], | |||
| // ),), | |||
| // ) | |||
| // ], | |||
| // ), | |||
| // ), | |||
| // ), | |||
| // Padding( | |||
| // padding: const EdgeInsets.only(bottom: 8,left: 8,right: 8), | |||
| // child: Container( | |||
| // decoration: BoxDecoration( | |||
| // color: Colors.white, | |||
| // borderRadius: BorderRadius.circular(5) | |||
| // ), | |||
| // height: 100, | |||
| // child: Row( | |||
| // children: <Widget>[ | |||
| // Container(height: 100,width: 100,decoration:BoxDecoration( | |||
| // color:Colors.red, | |||
| // borderRadius: BorderRadius.only(topLeft: Radius.circular(5),bottomLeft: Radius.circular(5)) | |||
| // ),child:Icon(Icons.image),), | |||
| // Expanded( | |||
| // flex: 7, | |||
| // child: Container(padding: EdgeInsets.all(5), | |||
| // child: Column( | |||
| // mainAxisAlignment: MainAxisAlignment.spaceAround, | |||
| // children: <Widget>[ | |||
| // Row( | |||
| // children: <Widget>[ | |||
| // Expanded(flex:2,child: Text("Kode",style: TextStyle(fontSize: 14,),)), | |||
| // Expanded(flex:1,child: Text(":",style: TextStyle(fontSize: 16,))), | |||
| // Expanded(flex: 7,child: Text("aaaa",style: TextStyle(fontSize: 16,fontWeight: FontWeight.bold))) | |||
| // ], | |||
| // ), | |||
| // Row( | |||
| // children: <Widget>[ | |||
| // Expanded(flex:2,child: Text("Nama",style: TextStyle(fontSize: 14,),)), | |||
| // Expanded(flex:1,child: Text(":",style: TextStyle(fontSize: 16,))), | |||
| // Expanded(flex: 7,child: Text("aaaa",style: TextStyle(fontSize: 16,fontWeight: FontWeight.bold))) | |||
| // ], | |||
| // ), | |||
| // Row( | |||
| // children: <Widget>[ | |||
| // Expanded(flex:2,child: Text("Ruang",style: TextStyle(fontSize: 14,),)), | |||
| // Expanded(flex:1,child: Text(":",style: TextStyle(fontSize: 16,))), | |||
| // Expanded(flex: 7,child: Text("aaaa",style: TextStyle(fontSize: 16,fontWeight: FontWeight.bold))) | |||
| // ], | |||
| // ), | |||
| // ], | |||
| // ),), | |||
| // ) | |||
| // ], | |||
| // ), | |||
| // ), | |||
| // ), | |||
| // Padding( | |||
| // padding: const EdgeInsets.only(bottom: 8,left: 8,right: 8), | |||
| // child: Container( | |||
| // decoration: BoxDecoration( | |||
| // color: Colors.white, | |||
| // borderRadius: BorderRadius.circular(5) | |||
| // ), | |||
| // height: 100, | |||
| // child: Row( | |||
| // children: <Widget>[ | |||
| // Container(height: 100,width: 100,decoration:BoxDecoration( | |||
| // color:Colors.red, | |||
| // borderRadius: BorderRadius.only(topLeft: Radius.circular(5),bottomLeft: Radius.circular(5)) | |||
| // ),child:Icon(Icons.image),), | |||
| // Expanded( | |||
| // flex: 7, | |||
| // child: Container(padding: EdgeInsets.all(5), | |||
| // child: Column( | |||
| // mainAxisAlignment: MainAxisAlignment.spaceAround, | |||
| // children: <Widget>[ | |||
| // Row( | |||
| // children: <Widget>[ | |||
| // Expanded(flex:2,child: Text("Kode",style: TextStyle(fontSize: 14,),)), | |||
| // Expanded(flex:1,child: Text(":",style: TextStyle(fontSize: 16,))), | |||
| // Expanded(flex: 7,child: Text("aaaa",style: TextStyle(fontSize: 16,fontWeight: FontWeight.bold))) | |||
| // ], | |||
| // ), | |||
| // Row( | |||
| // children: <Widget>[ | |||
| // Expanded(flex:2,child: Text("Nama",style: TextStyle(fontSize: 14,),)), | |||
| // Expanded(flex:1,child: Text(":",style: TextStyle(fontSize: 16,))), | |||
| // Expanded(flex: 7,child: Text("aaaa",style: TextStyle(fontSize: 16,fontWeight: FontWeight.bold))) | |||
| // ], | |||
| // ), | |||
| // Row( | |||
| // children: <Widget>[ | |||
| // Expanded(flex:2,child: Text("Ruang",style: TextStyle(fontSize: 14,),)), | |||
| // Expanded(flex:1,child: Text(":",style: TextStyle(fontSize: 16,))), | |||
| // Expanded(flex: 7,child: Text("aaaa",style: TextStyle(fontSize: 16,fontWeight: FontWeight.bold))) | |||
| // ], | |||
| // ), | |||
| // ], | |||
| // ),), | |||
| // ) | |||
| // ], | |||
| // ), | |||
| // ), | |||
| // ), | |||
| // ], | |||
| // ), | |||
| ], | |||
| ), | |||
| ), | |||
| ], | |||
| ), | |||
| ), | |||
| ], | |||
| ), | |||
| ), | |||
| Container( | |||
| alignment: Alignment.center, | |||
| child: (isLoading)?CircularProgressIndicator():null, | |||
| ) | |||
| ], | |||
| ), | |||
| floatingActionButton: FloatingActionButton( | |||
| onPressed: ()async{ | |||
| await Navigator.push(context, MaterialPageRoute(builder: (context) => new AssetDetails(lokasi: lokasi,))); | |||
| await loadAsset(); | |||
| }, | |||
| backgroundColor: Colors.blueGrey, | |||
| child: Icon(Icons.add), | |||
| ), | |||
| ); | |||
| } | |||
| } | |||
| @@ -0,0 +1,70 @@ | |||
| import 'prefsKey.dart'; | |||
| class Asset{ | |||
| String tag_number; | |||
| var blob; | |||
| String asset_no; | |||
| String asset_desc; | |||
| String pic; | |||
| String gedung; | |||
| String lantai; | |||
| String ruangan; | |||
| String flag; | |||
| int no; | |||
| String keterangan; | |||
| Asset({ | |||
| this.tag_number, | |||
| this.blob, | |||
| this.asset_no, | |||
| this.asset_desc, | |||
| this.pic, | |||
| this.gedung, | |||
| this.lantai, | |||
| this.ruangan, | |||
| this.flag, | |||
| this.no, | |||
| this.keterangan, | |||
| }); | |||
| factory Asset.fromJson(Map<String, dynamic> json) { | |||
| return new Asset( | |||
| tag_number: json[columnName.tag_number]??'', | |||
| blob: json[columnName.blob]??null, | |||
| asset_no: json[columnName.asset_number]??'', | |||
| asset_desc: json[columnName.asset_desc]??'', | |||
| pic: json[columnName.pic]??'', | |||
| gedung : json[columnName.gedung]??'', | |||
| lantai: json[columnName.lantai]??'', | |||
| ruangan: json[columnName.ruang]??'', | |||
| flag: json[columnName.flag]??'', | |||
| no: json [columnName.no]??0, | |||
| keterangan: json[columnName.keterangan]??'', | |||
| );} | |||
| Map<String, dynamic> toJson() => { | |||
| columnName.tag_number: tag_number, | |||
| columnName.blob: blob, | |||
| columnName.asset_number : asset_no, | |||
| columnName.asset_desc : asset_desc, | |||
| columnName.pic: pic, | |||
| columnName.gedung: gedung, | |||
| columnName.lantai :lantai, | |||
| columnName.ruang :ruangan, | |||
| columnName.flag :flag, | |||
| columnName.no :no, | |||
| columnName.keterangan :keterangan, | |||
| }; | |||
| } | |||
| class Count{ | |||
| int count; | |||
| Count({ | |||
| this.count | |||
| }); | |||
| factory Count.fromJson(Map<String, dynamic> json) { | |||
| return new Count( | |||
| count: json['Count']??'', | |||
| );} | |||
| } | |||
| @@ -0,0 +1,249 @@ | |||
| import 'package:assetstock/util/Models.dart'; | |||
| import 'package:sqflite/sqflite.dart'; | |||
| import 'package:path_provider/path_provider.dart'; | |||
| import 'prefsKey.dart'; | |||
| import 'dart:io'; | |||
| import 'dart:async'; | |||
| import 'package:path/path.dart'; | |||
| class DBHelper{ | |||
| DBHelper._(); | |||
| static final DBHelper database = DBHelper._(); | |||
| Database _db; | |||
| Future<Database> get db async { | |||
| if (_db != null) return _db; | |||
| _db = await initDb(); | |||
| return _db; | |||
| } | |||
| initDb() async { | |||
| Directory documentsDirectory = await getApplicationDocumentsDirectory(); | |||
| String path = join(documentsDirectory.path, "assets.db"); | |||
| var theDb = await openDatabase(path, version: 1,onCreate: _onCreate); | |||
| return theDb; | |||
| } | |||
| closeDb() async { | |||
| if(_db!=null){ | |||
| final database = await db; | |||
| await database.close(); | |||
| _db = null; | |||
| } | |||
| } | |||
| void _onCreate(Database db, int version) async { | |||
| Directory documentsDirectory = await getApplicationDocumentsDirectory(); | |||
| String path = join(documentsDirectory.path, "assets.db"); | |||
| File file = File(path); | |||
| print('Database created, ${file.lengthSync()}'); | |||
| } | |||
| insertAsset(Asset newAsset) async{ | |||
| try{ | |||
| final database = await db; | |||
| await database.rawInsert("Insert into ${tableName.insert} (${columnName.tag_number},${columnName.blob},${columnName.keterangan}) VALUES(?,?,?)", [newAsset.tag_number,newAsset.blob,newAsset.keterangan]); | |||
| await database.rawQuery("UPDATE ${tableName.ref} SET ${columnName.flag} = 'TRUE' WHERE ${columnName.tag_number} = '${newAsset.tag_number}'"); | |||
| return true; | |||
| } | |||
| catch(e){ | |||
| print(e); | |||
| return null; | |||
| } | |||
| } | |||
| updateAsset(Asset newAsset) async{ | |||
| try{ | |||
| final database = await db; | |||
| await database.rawUpdate("Update ${tableName.insert} SET ${columnName.blob} = ?, ${columnName.tag_number} = ?, ${columnName.keterangan} = ? WHERE ${columnName.no} = ?", [newAsset.blob,newAsset.tag_number,newAsset.keterangan,newAsset.no]); | |||
| return true; | |||
| } | |||
| catch(e){ | |||
| print(e); | |||
| return null; | |||
| } | |||
| } | |||
| getBlobbyNo(no) async{ | |||
| try{ | |||
| final database = await db; | |||
| var res = await database.query(tableName.insert,where: "${columnName.no} = ?",whereArgs: [no]); | |||
| // var a = await database.rawQuery("select length(${columnName.blob}) / 1024 from ${tableName.insert} where ${columnName.no} = $no"); | |||
| // print(a); | |||
| return res.isNotEmpty ? Asset.fromJson(res.first): null; | |||
| } | |||
| catch(e){ | |||
| print(e); | |||
| return null; | |||
| } | |||
| } | |||
| getRefBlob(tagNumber)async{ | |||
| try{ | |||
| final database = await db; | |||
| var res = await database.query(tableName.ref,where: "${columnName.tag_number} = ?",whereArgs: [tagNumber]); | |||
| // var a = await database.rawQuery("select length(${columnName.blob}) / 1024 from ${tableName.insert} where ${columnName.no} = $no"); | |||
| // print(a); | |||
| return res.isNotEmpty ? Asset.fromJson(res.first): null; | |||
| } | |||
| catch(e){ | |||
| print(e); | |||
| return null; | |||
| } | |||
| } | |||
| searchbyTagNumber(tagNumber) async{ | |||
| try{ | |||
| final database = await db; | |||
| var exist = await database.query(tableName.insert,where: "${columnName.tag_number} = ?",whereArgs: [tagNumber]); | |||
| var res = await database.query(tableName.ref,where: "${columnName.tag_number} = ?",whereArgs: [tagNumber]); | |||
| if(res.isEmpty&&exist.isNotEmpty){ | |||
| var appendAsset = new Asset(); | |||
| appendAsset.tag_number=tagNumber; | |||
| return {"EXIST":exist.isNotEmpty?true:false,"DATA":appendAsset}; | |||
| } | |||
| else return {"EXIST":exist.isNotEmpty?true:false,"DATA":res.isNotEmpty ? Asset.fromJson(res.first): null}; | |||
| } | |||
| catch(e){ | |||
| print(e); | |||
| return null; | |||
| } | |||
| } | |||
| getAllLocation() async{ | |||
| try{ | |||
| final database = await db; | |||
| var res = await database.rawQuery("SELECT Distinct UPPER(${columnName.lantai}) ${columnName.lantai} from ${tableName.ref} ORDER BY UPPER(${columnName.lantai})"); | |||
| List<Asset> list = | |||
| res.isNotEmpty ? res.map((c) => Asset.fromJson(c)).toList().reversed.toList() : []; | |||
| return list; | |||
| } | |||
| catch(e){ | |||
| print(e); | |||
| return null; | |||
| } | |||
| } | |||
| getAllRuangan() async{ | |||
| try{ | |||
| final database = await db; | |||
| var res = await database.rawQuery("SELECT Distinct UPPER(${columnName.ruang}) ${columnName.ruang} from ${tableName.ref} ORDER BY UPPER(${columnName.ruang})"); | |||
| List<Asset> list = | |||
| res.isNotEmpty ? res.map((c) => Asset.fromJson(c)).toList().reversed.toList() : []; | |||
| return list; | |||
| } | |||
| catch(e){ | |||
| print(e); | |||
| return null; | |||
| } | |||
| } | |||
| getLantaiRuangan(lantai) async{ | |||
| try{ | |||
| final database = await db; | |||
| var res = await database.rawQuery("SELECT Distinct UPPER(${columnName.ruang}) ${columnName.ruang} from ${tableName.ref} WHERE UPPER(${columnName.lantai}) = UPPER('$lantai') ORDER BY UPPER(${columnName.ruang})"); | |||
| List<Asset> list = | |||
| res.isNotEmpty ? res.map((c) => Asset.fromJson(c)).toList().reversed.toList() : []; | |||
| return list; | |||
| } | |||
| catch(e){ | |||
| print(e); | |||
| return null; | |||
| } | |||
| } | |||
| getAllAsset() async { | |||
| try{ | |||
| final database = await db; | |||
| var res = await database.rawQuery("SELECT a.${columnName.tag_number}, a.${columnName.asset_desc}, a.${columnName.ruang}, a.${columnName.lantai}, a.${columnName.gedung}, a.${columnName.flag}, b.${columnName.blob} from ${tableName.ref} a LEFT JOIN ${tableName.insert} b on a.${columnName.tag_number} = b.${columnName.tag_number} ORDER BY a.${columnName.flag},a.${columnName.ruang}"); | |||
| List<Asset> list = | |||
| res.isNotEmpty ? res.map((c) => Asset.fromJson(c)).toList() : []; | |||
| return list; | |||
| } | |||
| catch(e){ | |||
| print(e); | |||
| return null; | |||
| } | |||
| } | |||
| filterAllAsset(search) async { | |||
| try{ | |||
| final database = await db; | |||
| var res = await database.rawQuery("SELECT * FROM (SELECT a.${columnName.tag_number}, a.${columnName.asset_desc}, a.${columnName.ruang}, a.${columnName.lantai}, a.${columnName.gedung}, a.${columnName.flag}, b.${columnName.blob} from ${tableName.ref} a LEFT JOIN ${tableName.insert} b on a.${columnName.tag_number} = b.${columnName.tag_number}) WHERE UPPER(${columnName.tag_number}) Like '%$search%' ORDER BY ${columnName.flag},${columnName.ruang}"); | |||
| List<Asset> list = | |||
| res.isNotEmpty ? res.map((c) => Asset.fromJson(c)).toList() : []; | |||
| return list; | |||
| } | |||
| catch(e){ | |||
| print(e); | |||
| return null; | |||
| } | |||
| } | |||
| getAllInsertAsset() async { | |||
| try{ | |||
| final database = await db; | |||
| // var res = await database.rawQuery("SELECT a.*, b.${columnName.asset_desc}, b.${columnName.gedung}, b.${columnName.lantai}, b.${columnName.ruang} FROM ${tableName.insert} a, ${tableName.ref} b WHERE a.${columnName.tag_number} = b.${columnName.tag_number}"); | |||
| var res = await database.rawQuery("select a.*, b.${columnName.asset_desc}, b.${columnName.gedung}, b.${columnName.lantai}, b.${columnName.ruang} from ${tableName.insert} a LEFT JOIN ${tableName.ref} b ON a.${columnName.tag_number} = b.${columnName.tag_number}"); | |||
| List<Asset> list = | |||
| res.isNotEmpty ? res.map((c) => Asset.fromJson(c)).toList() : []; | |||
| return list; | |||
| } | |||
| catch(e){ | |||
| print(e); | |||
| return null; | |||
| } | |||
| } | |||
| deleteInsertAsset(no) async{ | |||
| try{ | |||
| final database = await db; | |||
| // await database.rawUpdate("Update ${tableName.insert} SET ${columnName.blob} = ?, ${columnName.tag_number} = ?, ${columnName.keterangan} = ? WHERE ${columnName.no} = ?", [newAsset.blob,newAsset.tag_number,newAsset.keterangan,newAsset.no]); | |||
| await database.delete(tableName.insert,where: "${columnName.no} = ?",whereArgs: [no]); | |||
| return true; | |||
| } | |||
| catch(e){ | |||
| print(e); | |||
| return null; | |||
| } | |||
| } | |||
| filterAllInsertAsset(search) async { | |||
| try{ | |||
| final database = await db; | |||
| // var res = await database.rawQuery("SELECT * FROM (SELECT a.${columnName.no},a.${columnName.keterangan},a.${columnName.tag_number},a.${columnName.blob}, b.${columnName.asset_desc}, b.${columnName.gedung}, b.${columnName.lantai}, b.${columnName.ruang} FROM ${tableName.insert} a, ${tableName.ref} b WHERE a.${columnName.tag_number} = b.${columnName.tag_number}) WHERE UPPER(${columnName.tag_number}) Like '%$search%'"); | |||
| var res = await database.rawQuery("SELECT * FROM (select a.*, b.${columnName.asset_desc}, b.${columnName.gedung}, b.${columnName.lantai}, b.${columnName.ruang} from ${tableName.insert} a LEFT JOIN ${tableName.ref} b ON a.${columnName.tag_number} = b.${columnName.tag_number}) WHERE UPPER(${columnName.tag_number}) Like '%$search%'"); | |||
| List<Asset> list = | |||
| res.isNotEmpty ? res.map((c) => Asset.fromJson(c)).toList() : []; | |||
| return list; | |||
| } | |||
| catch(e){ | |||
| print(e); | |||
| return null; | |||
| } | |||
| } | |||
| countRows(tableName)async{ | |||
| try{ | |||
| final database = await db; | |||
| var res = await database.rawQuery("SELECT Count(*) Count FROM $tableName"); | |||
| return res.isEmpty?0:Count.fromJson(res.first).count; | |||
| } | |||
| catch(e){ | |||
| print(e); | |||
| return null; | |||
| } | |||
| } | |||
| getDbName()async{ | |||
| try{ | |||
| final database = await db; | |||
| var res = await database.rawQuery("SELECT ${columnName.value} FROM ${tableName.key} where ${columnName.key} = 'DB_MASTER_NAME'"); | |||
| return res.isEmpty?null:res.first[columnName.value]; | |||
| } | |||
| catch(e){ | |||
| print(e); | |||
| return null; | |||
| } | |||
| } | |||
| } | |||
| @@ -0,0 +1,168 @@ | |||
| import 'dart:async'; | |||
| import 'dart:convert'; | |||
| import 'dart:io'; | |||
| import 'dart:typed_data'; | |||
| import 'package:assetstock/util/prefsKey.dart'; | |||
| import 'package:flutter/cupertino.dart'; | |||
| import 'package:path_provider/path_provider.dart'; | |||
| import 'package:http/http.dart'; | |||
| import 'package:path/path.dart'; | |||
| import 'package:async/async.dart'; | |||
| import 'dart:io'; | |||
| import 'utils.dart'; | |||
| class file_Trans_Handler { | |||
| // double _progress = 0; | |||
| Util util = new Util(); | |||
| String _path = ''; | |||
| StreamSubscription dlulStream; | |||
| String _error = ''; | |||
| String _success = ''; | |||
| bool _finish = false; | |||
| get isFinish => _finish; | |||
| get path => _path; | |||
| get error => _error; | |||
| get success => _success; | |||
| StreamController _progress = new StreamController<double>(); | |||
| Stream<double> get progress =>_progress.stream; | |||
| var client = new Client(); | |||
| downloadFile(String fileName,String link) async { | |||
| StreamedResponse _response; | |||
| List<int> _bytes = []; | |||
| int _total = 0; | |||
| print('Start Download'); | |||
| _progress.add(null); | |||
| try { | |||
| Request req = new Request('GET', Uri.parse(link)); | |||
| // req.headers = ''; | |||
| _response = await client.send(req).timeout( | |||
| Duration(seconds: 20)); | |||
| // _response = await client.get('$link',headers: 'application/json') | |||
| _total = _response.contentLength; | |||
| print('${_total / 1024} KB'); | |||
| dlulStream = _response.stream.listen((value) { | |||
| _bytes.addAll(value); | |||
| _progress.add(((_bytes.length / _total))); | |||
| }) | |||
| ..onDone(() async { | |||
| _progress.add(0.0); | |||
| print('Finish Download'); | |||
| final file = File( | |||
| "${(await getApplicationDocumentsDirectory()).path}/$fileName"); | |||
| await file.writeAsBytes(_bytes); | |||
| _path = file.path; | |||
| }) | |||
| ..onError((e) async { | |||
| print('Error Download, $e'); | |||
| _progress.add(-1.0); | |||
| _error = e.toString(); | |||
| }); | |||
| } | |||
| catch(e){ | |||
| print('Error Download, $e'); | |||
| _progress.add(-1.0); | |||
| _error = e.toString(); | |||
| } | |||
| } | |||
| uploadFile(String fileName,String link,String user,context) async{ | |||
| StreamedResponse _response; | |||
| int _total; | |||
| List<int> _bytes = []; | |||
| _finish = false; | |||
| final file = File( | |||
| "${(await getApplicationDocumentsDirectory()).path}/$fileName"); | |||
| _total = file.lengthSync(); | |||
| print(_total/1024); | |||
| try{ | |||
| var request = MultipartRequest('POST', Uri.parse(link)); | |||
| request.files.add(await MultipartFile.fromPath('sqliteDb', file.path)); | |||
| request.fields[keyClass.user] = user; | |||
| // _response = await client.send(request).timeout(Duration(seconds: 8)); | |||
| print(["sadasdasda",await util.checkinternet()]); | |||
| if(await util.checkinternet()){ | |||
| util.showLoading(context,dissmissable: false,onwillpop: ()async{return false;}); | |||
| _response = await client.send(request); | |||
| print("MASIH JALAN"); | |||
| if(_response.statusCode==200){ | |||
| _error = '';_success = ''; | |||
| dlulStream = _response.stream.listen((value) { | |||
| _bytes.addAll(value); | |||
| _progress.add((_bytes.length / _total)); | |||
| try{ | |||
| var result = jsonDecode(utf8.decode(value)); | |||
| if(result['STATUS']==0) { | |||
| _error = result['DATA']; | |||
| _finish = true; | |||
| } | |||
| else if(result['STATUS']==1){ | |||
| _error = ''; | |||
| _success = result['DATA']; | |||
| _finish = true; | |||
| } | |||
| }catch(e){ | |||
| } | |||
| }) | |||
| ..onDone(()async { | |||
| Navigator.pop(context); | |||
| client?.close(); | |||
| _finish = true; | |||
| print("sdasdasdsd $_error"); | |||
| if(_error!=''){ | |||
| _progress.add(-1.0); | |||
| print('Error Upload, $_error'); | |||
| } | |||
| else{ | |||
| _progress.add(1.0); | |||
| print('Finish Upload'); | |||
| print('done'); | |||
| } | |||
| }) | |||
| ..onError((e){ | |||
| Navigator.pop(context); | |||
| client?.close(); | |||
| print('Error Upload, $e'); | |||
| _progress.add(-1.0); | |||
| _error = e.toString(); | |||
| }); | |||
| } | |||
| else{ | |||
| Navigator.pop(context); | |||
| client?.close(); | |||
| var resBody = await _response.stream.bytesToString(); | |||
| _progress.add(-1.0); | |||
| _finish = true; | |||
| _error = resBody; | |||
| } | |||
| } | |||
| else{ | |||
| client?.close(); | |||
| _progress.add(-1.0); | |||
| _finish = true; | |||
| _error = "Check Internet Connection"; | |||
| } | |||
| } | |||
| // on TimeoutException{ | |||
| // client?.close(); | |||
| // print(['error timed out']); | |||
| // Navigator.pop(context); | |||
| // _progress.add(-1.0); | |||
| // _finish = true; | |||
| // _error = "Request timed out. Please check connection"; | |||
| // } | |||
| catch(e){ | |||
| client?.close(); | |||
| print(['error',e]); | |||
| _finish = true; | |||
| _progress.add(-1.0); | |||
| _error = e.toString(); | |||
| } | |||
| } | |||
| cancel()async{ | |||
| client?.close(); | |||
| await dlulStream?.cancel(); | |||
| _progress?.close(); | |||
| } | |||
| } | |||
| @@ -0,0 +1,32 @@ | |||
| import 'dart:typed_data'; | |||
| import 'package:flutter/cupertino.dart'; | |||
| import 'package:flutter/material.dart'; | |||
| import 'package:photo_view/photo_view.dart'; | |||
| import 'utils.dart'; | |||
| class PhotoViewer extends StatefulWidget { | |||
| Uint8List byte; | |||
| PhotoViewer(this.byte); | |||
| // PhotoViewer({Key key}) : super(key: key); | |||
| @override | |||
| _PhotoViewerState createState() => _PhotoViewerState(); | |||
| } | |||
| class _PhotoViewerState extends State<PhotoViewer> { | |||
| Util util = new Util(); | |||
| @override | |||
| Widget build(BuildContext context) { | |||
| return Column( | |||
| children: <Widget>[ | |||
| Flexible( | |||
| flex: 8, | |||
| child: Container( | |||
| child: PhotoView( | |||
| imageProvider: MemoryImage(widget.byte), | |||
| ), | |||
| ), | |||
| ), | |||
| ], | |||
| ); | |||
| } | |||
| } | |||
| @@ -0,0 +1,29 @@ | |||
| class keyClass{ | |||
| static String hostAddress = "HOST_ADDRESS"; | |||
| static String dbName = "dbName"; | |||
| static String user ="user"; | |||
| } | |||
| class tableName{ | |||
| static String insert = "insertTable"; | |||
| static String ref = "refTable"; | |||
| static String key = "settingTable"; | |||
| } | |||
| class columnName{ | |||
| static String jumlah = "JUMLAH"; | |||
| static String blob = "BLOB_DATA"; | |||
| static String asset_number = 'ASSET_NUMBER'; | |||
| static String tag_number = 'TAG_NUMBER'; | |||
| static String asset_desc = "ASSET_DESCRIPTION"; | |||
| static String pic = 'PIC'; | |||
| static String gedung = 'GEDUNG'; | |||
| static String lantai = 'LANTAI'; | |||
| static String ruang = 'RUANGAN'; | |||
| static String flag = 'FLAG_INSERTED'; | |||
| static String no = 'NO'; | |||
| static String location = 'LOCATION'; | |||
| static String keterangan = 'KETERANGAN'; | |||
| static String value = "VALUE"; | |||
| static String key = "ID"; | |||
| } | |||
| @@ -0,0 +1,84 @@ | |||
| import 'dart:async'; | |||
| import 'dart:convert'; | |||
| import 'dart:io'; | |||
| import 'package:flutter/material.dart'; | |||
| import 'package:http/http.dart' as http; | |||
| import 'package:barcode_scan/barcode_scan.dart'; | |||
| import 'package:fluttertoast/fluttertoast.dart'; | |||
| import '../main.dart'; | |||
| class Util{ | |||
| scan()async{ | |||
| String BarcodeText =''; | |||
| try{ | |||
| ScanResult result = await BarcodeScanner.scan(); | |||
| BarcodeText = result.rawContent; | |||
| return {'STATUS':1,'DATA':BarcodeText}; | |||
| } | |||
| catch(e){ | |||
| return {'STATUS':0,'DATA':e}; | |||
| } | |||
| } | |||
| JsonDataPostRaw(Map jsonData, String url,{timeout:false}) async{ | |||
| const JsonDecoder decoder = const JsonDecoder(); | |||
| try { | |||
| var response; | |||
| if (timeout) | |||
| response = await http.post( | |||
| '$url', headers: {'Content-type': 'application/json'}, | |||
| body: json.encode(jsonData)).timeout( | |||
| const Duration(seconds: 10)); | |||
| else | |||
| response = await http.post( | |||
| '$url', headers: {'Content-type': 'application/json'}, | |||
| body: json.encode(jsonData)); | |||
| final Map data = decoder.convert(response.body); | |||
| return data; | |||
| } on TimeoutException catch(e){ | |||
| return {"STATUS":"ERROR","ERROR":"Request Timeout"}; | |||
| } | |||
| on Exception catch(exception){ | |||
| print(url); | |||
| // Toast("Not Connected to Server", Colors.red); | |||
| return {"STATUS":"ERROR","ERROR":"Not Connected to Server. $exception"}; | |||
| } | |||
| } | |||
| showToast(type,text)async{ | |||
| await Fluttertoast.cancel(); | |||
| Fluttertoast.showToast( | |||
| msg: "$text", | |||
| toastLength: Toast.LENGTH_SHORT, | |||
| gravity: ToastGravity.BOTTOM, | |||
| timeInSecForIosWeb: 1, | |||
| backgroundColor: (type=='ERROR')?Colors.red:(type=='SUCCESS')?Colors.green:Colors.black38, | |||
| textColor: Colors.white, | |||
| fontSize: 16.0 | |||
| ); | |||
| } | |||
| showLoading(context,{dissmissable=false,onwillpop}){ | |||
| showDialog( | |||
| context: context, | |||
| builder: (BuildContext context) { | |||
| return WillPopScope( | |||
| onWillPop: onwillpop??()async{return true;}, | |||
| child: new Center( | |||
| child: new CircularProgressIndicator(), | |||
| ), | |||
| ); | |||
| }, | |||
| barrierDismissible: dissmissable, | |||
| ); | |||
| } | |||
| checkinternet()async{ | |||
| try { | |||
| var result = await InternetAddress.lookup('google.com').timeout(Duration(seconds: 3),onTimeout: (){return null;}); | |||
| if (result!=null && result.isNotEmpty && result[0].rawAddress.isNotEmpty) { | |||
| return true; | |||
| } | |||
| else return false; | |||
| } on SocketException catch (_) { | |||
| return false; | |||
| } | |||
| } | |||
| } | |||
| @@ -0,0 +1,362 @@ | |||
| # 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.4.2" | |||
| barcode_scan: | |||
| dependency: "direct main" | |||
| description: | |||
| name: barcode_scan | |||
| url: "https://pub.dartlang.org" | |||
| source: hosted | |||
| version: "3.0.1" | |||
| boolean_selector: | |||
| dependency: transitive | |||
| description: | |||
| name: boolean_selector | |||
| url: "https://pub.dartlang.org" | |||
| source: hosted | |||
| version: "2.0.0" | |||
| characters: | |||
| dependency: transitive | |||
| description: | |||
| name: characters | |||
| url: "https://pub.dartlang.org" | |||
| source: hosted | |||
| version: "1.0.0" | |||
| charcode: | |||
| dependency: transitive | |||
| description: | |||
| name: charcode | |||
| url: "https://pub.dartlang.org" | |||
| source: hosted | |||
| version: "1.1.3" | |||
| clock: | |||
| dependency: transitive | |||
| description: | |||
| name: clock | |||
| url: "https://pub.dartlang.org" | |||
| source: hosted | |||
| version: "1.0.1" | |||
| collection: | |||
| dependency: transitive | |||
| description: | |||
| name: collection | |||
| url: "https://pub.dartlang.org" | |||
| source: hosted | |||
| version: "1.14.13" | |||
| cupertino_icons: | |||
| dependency: "direct main" | |||
| description: | |||
| name: cupertino_icons | |||
| url: "https://pub.dartlang.org" | |||
| source: hosted | |||
| version: "0.1.3" | |||
| fake_async: | |||
| dependency: transitive | |||
| description: | |||
| name: fake_async | |||
| url: "https://pub.dartlang.org" | |||
| source: hosted | |||
| version: "1.1.0" | |||
| file: | |||
| dependency: transitive | |||
| description: | |||
| name: file | |||
| url: "https://pub.dartlang.org" | |||
| source: hosted | |||
| version: "5.2.1" | |||
| fixnum: | |||
| dependency: transitive | |||
| description: | |||
| name: fixnum | |||
| url: "https://pub.dartlang.org" | |||
| source: hosted | |||
| version: "0.10.11" | |||
| 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: "1.0.8" | |||
| 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" | |||
| fluttertoast: | |||
| dependency: "direct main" | |||
| description: | |||
| name: fluttertoast | |||
| url: "https://pub.dartlang.org" | |||
| source: hosted | |||
| version: "4.0.1" | |||
| http: | |||
| dependency: transitive | |||
| description: | |||
| name: http | |||
| url: "https://pub.dartlang.org" | |||
| source: hosted | |||
| version: "0.12.1" | |||
| http_parser: | |||
| dependency: transitive | |||
| description: | |||
| name: http_parser | |||
| url: "https://pub.dartlang.org" | |||
| source: hosted | |||
| version: "3.1.4" | |||
| image_picker: | |||
| dependency: "direct main" | |||
| description: | |||
| name: image_picker | |||
| url: "https://pub.dartlang.org" | |||
| source: hosted | |||
| version: "0.6.7+2" | |||
| image_picker_platform_interface: | |||
| dependency: transitive | |||
| description: | |||
| name: image_picker_platform_interface | |||
| url: "https://pub.dartlang.org" | |||
| source: hosted | |||
| version: "1.1.0" | |||
| intl: | |||
| dependency: transitive | |||
| description: | |||
| name: intl | |||
| url: "https://pub.dartlang.org" | |||
| source: hosted | |||
| version: "0.16.1" | |||
| matcher: | |||
| dependency: transitive | |||
| description: | |||
| name: matcher | |||
| url: "https://pub.dartlang.org" | |||
| source: hosted | |||
| version: "0.12.8" | |||
| matrix_gesture_detector: | |||
| dependency: "direct main" | |||
| description: | |||
| name: matrix_gesture_detector | |||
| url: "https://pub.dartlang.org" | |||
| source: hosted | |||
| version: "0.1.0" | |||
| meta: | |||
| dependency: transitive | |||
| description: | |||
| name: meta | |||
| url: "https://pub.dartlang.org" | |||
| source: hosted | |||
| version: "1.1.8" | |||
| path: | |||
| dependency: transitive | |||
| description: | |||
| name: path | |||
| url: "https://pub.dartlang.org" | |||
| source: hosted | |||
| version: "1.7.0" | |||
| path_provider: | |||
| dependency: "direct main" | |||
| description: | |||
| name: path_provider | |||
| url: "https://pub.dartlang.org" | |||
| source: hosted | |||
| version: "1.6.11" | |||
| path_provider_linux: | |||
| dependency: transitive | |||
| description: | |||
| name: path_provider_linux | |||
| url: "https://pub.dartlang.org" | |||
| source: hosted | |||
| version: "0.0.1+1" | |||
| path_provider_macos: | |||
| dependency: transitive | |||
| description: | |||
| name: path_provider_macos | |||
| url: "https://pub.dartlang.org" | |||
| source: hosted | |||
| version: "0.0.4+3" | |||
| path_provider_platform_interface: | |||
| dependency: transitive | |||
| description: | |||
| name: path_provider_platform_interface | |||
| url: "https://pub.dartlang.org" | |||
| source: hosted | |||
| version: "1.0.2" | |||
| pedantic: | |||
| dependency: transitive | |||
| description: | |||
| name: pedantic | |||
| url: "https://pub.dartlang.org" | |||
| source: hosted | |||
| version: "1.9.0" | |||
| photo_view: | |||
| dependency: "direct main" | |||
| description: | |||
| name: photo_view | |||
| url: "https://pub.dartlang.org" | |||
| source: hosted | |||
| version: "0.9.2" | |||
| platform: | |||
| dependency: transitive | |||
| description: | |||
| name: platform | |||
| url: "https://pub.dartlang.org" | |||
| source: hosted | |||
| version: "2.2.1" | |||
| plugin_platform_interface: | |||
| dependency: transitive | |||
| description: | |||
| name: plugin_platform_interface | |||
| url: "https://pub.dartlang.org" | |||
| source: hosted | |||
| version: "1.0.2" | |||
| process: | |||
| dependency: transitive | |||
| description: | |||
| name: process | |||
| url: "https://pub.dartlang.org" | |||
| source: hosted | |||
| version: "3.0.13" | |||
| protobuf: | |||
| dependency: transitive | |||
| description: | |||
| name: protobuf | |||
| url: "https://pub.dartlang.org" | |||
| source: hosted | |||
| version: "1.0.1" | |||
| shared_preferences: | |||
| dependency: "direct main" | |||
| description: | |||
| name: shared_preferences | |||
| url: "https://pub.dartlang.org" | |||
| source: hosted | |||
| version: "0.5.7+3" | |||
| shared_preferences_macos: | |||
| dependency: transitive | |||
| description: | |||
| name: shared_preferences_macos | |||
| url: "https://pub.dartlang.org" | |||
| source: hosted | |||
| version: "0.0.1+10" | |||
| shared_preferences_platform_interface: | |||
| dependency: transitive | |||
| description: | |||
| name: shared_preferences_platform_interface | |||
| url: "https://pub.dartlang.org" | |||
| source: hosted | |||
| version: "1.0.4" | |||
| shared_preferences_web: | |||
| dependency: transitive | |||
| description: | |||
| name: shared_preferences_web | |||
| url: "https://pub.dartlang.org" | |||
| source: hosted | |||
| version: "0.1.2+7" | |||
| 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.7.0" | |||
| sqflite: | |||
| dependency: "direct main" | |||
| description: | |||
| name: sqflite | |||
| url: "https://pub.dartlang.org" | |||
| source: hosted | |||
| version: "1.3.1" | |||
| sqflite_common: | |||
| dependency: transitive | |||
| description: | |||
| name: sqflite_common | |||
| url: "https://pub.dartlang.org" | |||
| source: hosted | |||
| version: "1.0.2+1" | |||
| stack_trace: | |||
| dependency: transitive | |||
| description: | |||
| name: stack_trace | |||
| url: "https://pub.dartlang.org" | |||
| source: hosted | |||
| version: "1.9.5" | |||
| stream_channel: | |||
| dependency: transitive | |||
| description: | |||
| name: stream_channel | |||
| url: "https://pub.dartlang.org" | |||
| source: hosted | |||
| version: "2.0.0" | |||
| string_scanner: | |||
| dependency: transitive | |||
| description: | |||
| name: string_scanner | |||
| url: "https://pub.dartlang.org" | |||
| source: hosted | |||
| version: "1.0.5" | |||
| synchronized: | |||
| dependency: transitive | |||
| description: | |||
| name: synchronized | |||
| url: "https://pub.dartlang.org" | |||
| source: hosted | |||
| version: "2.2.0+1" | |||
| term_glyph: | |||
| dependency: transitive | |||
| description: | |||
| name: term_glyph | |||
| url: "https://pub.dartlang.org" | |||
| source: hosted | |||
| version: "1.1.0" | |||
| test_api: | |||
| dependency: transitive | |||
| description: | |||
| name: test_api | |||
| url: "https://pub.dartlang.org" | |||
| source: hosted | |||
| version: "0.2.17" | |||
| typed_data: | |||
| dependency: transitive | |||
| description: | |||
| name: typed_data | |||
| url: "https://pub.dartlang.org" | |||
| source: hosted | |||
| version: "1.2.0" | |||
| vector_math: | |||
| dependency: transitive | |||
| description: | |||
| name: vector_math | |||
| url: "https://pub.dartlang.org" | |||
| source: hosted | |||
| version: "2.0.8" | |||
| xdg_directories: | |||
| dependency: transitive | |||
| description: | |||
| name: xdg_directories | |||
| url: "https://pub.dartlang.org" | |||
| source: hosted | |||
| version: "0.1.0" | |||
| sdks: | |||
| dart: ">=2.9.0-14.0.dev <3.0.0" | |||
| flutter: ">=1.12.13+hotfix.5 <2.0.0" | |||
| @@ -0,0 +1,81 @@ | |||
| name: assetstock | |||
| description: Application to check assets | |||
| # 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.4+5 | |||
| environment: | |||
| sdk: ">=2.7.0 <3.0.0" | |||
| dependencies: | |||
| flutter: | |||
| sdk: flutter | |||
| image_picker: | |||
| barcode_scan: | |||
| path_provider: | |||
| shared_preferences: | |||
| fluttertoast: | |||
| photo_view: | |||
| sqflite: | |||
| matrix_gesture_detector: | |||
| # The following adds the Cupertino Icons font to your application. | |||
| # Use with the CupertinoIcons class for iOS style icons. | |||
| cupertino_icons: ^0.1.3 | |||
| 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 | |||
| @@ -0,0 +1,30 @@ | |||
| // This is a basic Flutter widget test. | |||
| // | |||
| // To perform an interaction with a widget in your test, use the WidgetTester | |||
| // utility that Flutter provides. For example, you can send tap and scroll | |||
| // gestures. You can also use WidgetTester to find child widgets in the widget | |||
| // tree, read text, and verify that the values of widget properties are correct. | |||
| import 'package:flutter/material.dart'; | |||
| import 'package:flutter_test/flutter_test.dart'; | |||
| import 'package:assetstock/main.dart'; | |||
| void main() { | |||
| testWidgets('Counter increments smoke test', (WidgetTester tester) async { | |||
| // Build our app and trigger a frame. | |||
| await tester.pumpWidget(MyApp()); | |||
| // Verify that our counter starts at 0. | |||
| expect(find.text('0'), findsOneWidget); | |||
| expect(find.text('1'), findsNothing); | |||
| // Tap the '+' icon and trigger a frame. | |||
| await tester.tap(find.byIcon(Icons.add)); | |||
| await tester.pump(); | |||
| // Verify that our counter has incremented. | |||
| expect(find.text('0'), findsNothing); | |||
| expect(find.text('1'), findsOneWidget); | |||
| }); | |||
| } | |||