| @@ -1,87 +1,43 @@ | |||||
| # ---> Android | |||||
| # Built application files | |||||
| *.apk | |||||
| *.aar | |||||
| *.ap_ | |||||
| *.aab | |||||
| # Files for the ART/Dalvik VM | |||||
| *.dex | |||||
| # Java class files | |||||
| # Miscellaneous | |||||
| *.class | *.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 | *.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 | *.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); | |||||
| }); | |||||
| } | |||||