ソースを参照

update 1 change password , app icon , and somethings else

master
amin 1年前
コミット
052c1e1b46
76個のファイルの変更805行の追加403行の削除
  1. バイナリ
      android/app/src/main/res/mipmap-hdpi/ic_launcher.png
  2. バイナリ
      android/app/src/main/res/mipmap-mdpi/ic_launcher.png
  3. バイナリ
      android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
  4. バイナリ
      android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
  5. バイナリ
      android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
  6. バイナリ
      assets/fonts/Font.ttf
  7. バイナリ
      assets/images/001.jpg
  8. バイナリ
      assets/images/001.png
  9. バイナリ
      assets/images/D2.png
  10. バイナリ
      ios/Runner/Assets.xcassets/AppIcon.appiconset/100.png
  11. バイナリ
      ios/Runner/Assets.xcassets/AppIcon.appiconset/1024.png
  12. バイナリ
      ios/Runner/Assets.xcassets/AppIcon.appiconset/114.png
  13. バイナリ
      ios/Runner/Assets.xcassets/AppIcon.appiconset/120.png
  14. バイナリ
      ios/Runner/Assets.xcassets/AppIcon.appiconset/144.png
  15. バイナリ
      ios/Runner/Assets.xcassets/AppIcon.appiconset/152.png
  16. バイナリ
      ios/Runner/Assets.xcassets/AppIcon.appiconset/167.png
  17. バイナリ
      ios/Runner/Assets.xcassets/AppIcon.appiconset/180.png
  18. バイナリ
      ios/Runner/Assets.xcassets/AppIcon.appiconset/20.png
  19. バイナリ
      ios/Runner/Assets.xcassets/AppIcon.appiconset/29.png
  20. バイナリ
      ios/Runner/Assets.xcassets/AppIcon.appiconset/40.png
  21. バイナリ
      ios/Runner/Assets.xcassets/AppIcon.appiconset/50.png
  22. バイナリ
      ios/Runner/Assets.xcassets/AppIcon.appiconset/57.png
  23. バイナリ
      ios/Runner/Assets.xcassets/AppIcon.appiconset/58.png
  24. バイナリ
      ios/Runner/Assets.xcassets/AppIcon.appiconset/60.png
  25. バイナリ
      ios/Runner/Assets.xcassets/AppIcon.appiconset/72.png
  26. バイナリ
      ios/Runner/Assets.xcassets/AppIcon.appiconset/76.png
  27. バイナリ
      ios/Runner/Assets.xcassets/AppIcon.appiconset/80.png
  28. バイナリ
      ios/Runner/Assets.xcassets/AppIcon.appiconset/87.png
  29. +1
    -1
      ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
  30. バイナリ
      ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png
  31. バイナリ
      ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png
  32. バイナリ
      ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png
  33. バイナリ
      ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png
  34. バイナリ
      ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png
  35. バイナリ
      ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png
  36. バイナリ
      ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png
  37. バイナリ
      ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png
  38. バイナリ
      ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png
  39. バイナリ
      ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png
  40. バイナリ
      ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png
  41. バイナリ
      ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png
  42. バイナリ
      ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png
  43. バイナリ
      ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png
  44. バイナリ
      ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png
  45. バイナリ
      ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png
  46. バイナリ
      ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png
  47. バイナリ
      ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png
  48. バイナリ
      ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png
  49. バイナリ
      ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png
  50. バイナリ
      ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png
  51. +0
    -23
      ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json
  52. バイナリ
      ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png
  53. バイナリ
      ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png
  54. バイナリ
      ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png
  55. +0
    -5
      ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md
  56. +75
    -62
      lib/drawer_navigation_bar.dart
  57. +4
    -1
      lib/l10n/app_en.arb
  58. +5
    -1
      lib/l10n/app_fa.arb
  59. +1
    -1
      lib/main.dart
  60. +182
    -124
      lib/models/home/home_models.dart
  61. +9
    -3
      lib/screens/aboutUs/screen.dart
  62. +165
    -0
      lib/screens/change_pass/screen.dart
  63. +112
    -24
      lib/screens/home/screen.dart
  64. +34
    -1
      lib/screens/home/state.dart
  65. +5
    -3
      lib/screens/meeting/screen.dart
  66. +10
    -8
      lib/screens/meeting_summary/screen.dart
  67. +131
    -122
      lib/screens/private_meeting/screen.dart
  68. +10
    -8
      lib/screens/private_meeting_summary/screen.dart
  69. +6
    -4
      lib/screens/report/screen.dart
  70. +34
    -0
      lib/services/home/home.dart
  71. +1
    -1
      lib/utils/hive/local_user.dart
  72. +1
    -1
      lib/utils/hive/user_local_db.dart
  73. +11
    -0
      lib/utils/tools/tools.dart
  74. +4
    -4
      lib/widgets/card_meeting.dart
  75. +3
    -5
      lib/widgets/custom_appbar.dart
  76. +1
    -1
      lib/widgets/custom_background.dart

バイナリ
android/app/src/main/res/mipmap-hdpi/ic_launcher.png ファイルの表示

変更前 変更後
幅: 72  |  高さ: 72  |  サイズ: 6.1 KiB 幅: 72  |  高さ: 72  |  サイズ: 5.9 KiB

バイナリ
android/app/src/main/res/mipmap-mdpi/ic_launcher.png ファイルの表示

変更前 変更後
幅: 48  |  高さ: 48  |  サイズ: 3.3 KiB 幅: 48  |  高さ: 48  |  サイズ: 3.2 KiB

バイナリ
android/app/src/main/res/mipmap-xhdpi/ic_launcher.png ファイルの表示

変更前 変更後
幅: 96  |  高さ: 96  |  サイズ: 9.2 KiB 幅: 96  |  高さ: 96  |  サイズ: 8.9 KiB

バイナリ
android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png ファイルの表示

変更前 変更後
幅: 144  |  高さ: 144  |  サイズ: 16 KiB 幅: 144  |  高さ: 144  |  サイズ: 15 KiB

バイナリ
android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png ファイルの表示

変更前 変更後
幅: 192  |  高さ: 192  |  サイズ: 23 KiB 幅: 192  |  高さ: 192  |  サイズ: 22 KiB

バイナリ
assets/fonts/Font.ttf ファイルの表示


バイナリ
assets/images/001.jpg ファイルの表示

変更前 変更後
幅: 1080  |  高さ: 1920  |  サイズ: 448 KiB

バイナリ
assets/images/001.png ファイルの表示

変更前 変更後
幅: 1080  |  高さ: 1920  |  サイズ: 299 KiB

バイナリ
assets/images/D2.png ファイルの表示

変更前 変更後
幅: 787  |  高さ: 787  |  サイズ: 246 KiB

バイナリ
ios/Runner/Assets.xcassets/AppIcon.appiconset/100.png ファイルの表示

変更前 変更後
幅: 100  |  高さ: 100  |  サイズ: 9.9 KiB

バイナリ
ios/Runner/Assets.xcassets/AppIcon.appiconset/1024.png ファイルの表示

変更前 変更後
幅: 1024  |  高さ: 1024  |  サイズ: 253 KiB

バイナリ
ios/Runner/Assets.xcassets/AppIcon.appiconset/114.png ファイルの表示

変更前 変更後
幅: 114  |  高さ: 114  |  サイズ: 12 KiB

バイナリ
ios/Runner/Assets.xcassets/AppIcon.appiconset/120.png ファイルの表示

変更前 変更後
幅: 120  |  高さ: 120  |  サイズ: 12 KiB

バイナリ
ios/Runner/Assets.xcassets/AppIcon.appiconset/144.png ファイルの表示

変更前 変更後
幅: 144  |  高さ: 144  |  サイズ: 16 KiB

バイナリ
ios/Runner/Assets.xcassets/AppIcon.appiconset/152.png ファイルの表示

変更前 変更後
幅: 152  |  高さ: 152  |  サイズ: 17 KiB

バイナリ
ios/Runner/Assets.xcassets/AppIcon.appiconset/167.png ファイルの表示

変更前 変更後
幅: 167  |  高さ: 167  |  サイズ: 19 KiB

バイナリ
ios/Runner/Assets.xcassets/AppIcon.appiconset/180.png ファイルの表示

変更前 変更後
幅: 180  |  高さ: 180  |  サイズ: 21 KiB

バイナリ
ios/Runner/Assets.xcassets/AppIcon.appiconset/20.png ファイルの表示

変更前 変更後
幅: 20  |  高さ: 20  |  サイズ: 1.0 KiB

バイナリ
ios/Runner/Assets.xcassets/AppIcon.appiconset/29.png ファイルの表示

変更前 変更後
幅: 29  |  高さ: 29  |  サイズ: 1.8 KiB

バイナリ
ios/Runner/Assets.xcassets/AppIcon.appiconset/40.png ファイルの表示

変更前 変更後
幅: 40  |  高さ: 40  |  サイズ: 2.8 KiB

バイナリ
ios/Runner/Assets.xcassets/AppIcon.appiconset/50.png ファイルの表示

変更前 変更後
幅: 50  |  高さ: 50  |  サイズ: 3.9 KiB

バイナリ
ios/Runner/Assets.xcassets/AppIcon.appiconset/57.png ファイルの表示

変更前 変更後
幅: 57  |  高さ: 57  |  サイズ: 4.6 KiB

バイナリ
ios/Runner/Assets.xcassets/AppIcon.appiconset/58.png ファイルの表示

変更前 変更後
幅: 58  |  高さ: 58  |  サイズ: 4.7 KiB

バイナリ
ios/Runner/Assets.xcassets/AppIcon.appiconset/60.png ファイルの表示

変更前 変更後
幅: 60  |  高さ: 60  |  サイズ: 5.0 KiB

バイナリ
ios/Runner/Assets.xcassets/AppIcon.appiconset/72.png ファイルの表示

変更前 変更後
幅: 72  |  高さ: 72  |  サイズ: 6.3 KiB

バイナリ
ios/Runner/Assets.xcassets/AppIcon.appiconset/76.png ファイルの表示

変更前 変更後
幅: 76  |  高さ: 76  |  サイズ: 6.8 KiB

バイナリ
ios/Runner/Assets.xcassets/AppIcon.appiconset/80.png ファイルの表示

変更前 変更後
幅: 80  |  高さ: 80  |  サイズ: 7.4 KiB

バイナリ
ios/Runner/Assets.xcassets/AppIcon.appiconset/87.png ファイルの表示

変更前 変更後
幅: 87  |  高さ: 87  |  サイズ: 8.2 KiB

+ 1
- 1
ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json ファイルの表示

@@ -1 +1 @@
{"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":"57x57","idiom":"iphone","filename":"Icon-App-57x57@1x.png","scale":"1x"},{"size":"57x57","idiom":"iphone","filename":"Icon-App-57x57@2x.png","scale":"2x"},{"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":"50x50","idiom":"ipad","filename":"Icon-App-50x50@1x.png","scale":"1x"},{"size":"50x50","idiom":"ipad","filename":"Icon-App-50x50@2x.png","scale":"2x"},{"size":"72x72","idiom":"ipad","filename":"Icon-App-72x72@1x.png","scale":"1x"},{"size":"72x72","idiom":"ipad","filename":"Icon-App-72x72@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"}}
{"images":[{"size":"60x60","expected-size":"180","filename":"180.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"3x"},{"size":"40x40","expected-size":"80","filename":"80.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"40x40","expected-size":"120","filename":"120.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"3x"},{"size":"60x60","expected-size":"120","filename":"120.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"57x57","expected-size":"57","filename":"57.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"1x"},{"size":"29x29","expected-size":"58","filename":"58.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"29x29","expected-size":"29","filename":"29.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"1x"},{"size":"29x29","expected-size":"87","filename":"87.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"3x"},{"size":"57x57","expected-size":"114","filename":"114.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"20x20","expected-size":"40","filename":"40.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"20x20","expected-size":"60","filename":"60.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"3x"},{"size":"1024x1024","filename":"1024.png","expected-size":"1024","idiom":"ios-marketing","folder":"Assets.xcassets/AppIcon.appiconset/","scale":"1x"},{"size":"40x40","expected-size":"80","filename":"80.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"72x72","expected-size":"72","filename":"72.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"76x76","expected-size":"152","filename":"152.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"50x50","expected-size":"100","filename":"100.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"29x29","expected-size":"58","filename":"58.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"76x76","expected-size":"76","filename":"76.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"29x29","expected-size":"29","filename":"29.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"50x50","expected-size":"50","filename":"50.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"72x72","expected-size":"144","filename":"144.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"40x40","expected-size":"40","filename":"40.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"83.5x83.5","expected-size":"167","filename":"167.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"20x20","expected-size":"20","filename":"20.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"20x20","expected-size":"40","filename":"40.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"}]}

バイナリ
ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png ファイルの表示

変更前 変更後
幅: 1024  |  高さ: 1024  |  サイズ: 233 KiB

バイナリ
ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png ファイルの表示

変更前 変更後
幅: 20  |  高さ: 20  |  サイズ: 593 B

バイナリ
ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png ファイルの表示

変更前 変更後
幅: 40  |  高さ: 40  |  サイズ: 1.6 KiB

バイナリ
ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png ファイルの表示

変更前 変更後
幅: 60  |  高さ: 60  |  サイズ: 2.8 KiB

バイナリ
ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png ファイルの表示

変更前 変更後
幅: 29  |  高さ: 29  |  サイズ: 1.0 KiB

バイナリ
ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png ファイルの表示

変更前 変更後
幅: 58  |  高さ: 58  |  サイズ: 2.7 KiB

バイナリ
ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png ファイルの表示

変更前 変更後
幅: 87  |  高さ: 87  |  サイズ: 5.0 KiB

バイナリ
ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png ファイルの表示

変更前 変更後
幅: 40  |  高さ: 40  |  サイズ: 1.6 KiB

バイナリ
ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png ファイルの表示

変更前 変更後
幅: 80  |  高さ: 80  |  サイズ: 4.4 KiB

バイナリ
ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png ファイルの表示

変更前 変更後
幅: 120  |  高さ: 120  |  サイズ: 8.4 KiB

バイナリ
ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png ファイルの表示

変更前 変更後
幅: 50  |  高さ: 50  |  サイズ: 2.2 KiB

バイナリ
ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png ファイルの表示

変更前 変更後
幅: 100  |  高さ: 100  |  サイズ: 6.3 KiB

バイナリ
ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png ファイルの表示

変更前 変更後
幅: 57  |  高さ: 57  |  サイズ: 2.6 KiB

バイナリ
ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png ファイルの表示

変更前 変更後
幅: 114  |  高さ: 114  |  サイズ: 7.7 KiB

バイナリ
ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png ファイルの表示

変更前 変更後
幅: 120  |  高さ: 120  |  サイズ: 8.4 KiB

バイナリ
ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png ファイルの表示

変更前 変更後
幅: 180  |  高さ: 180  |  サイズ: 16 KiB

バイナリ
ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png ファイルの表示

変更前 変更後
幅: 72  |  高さ: 72  |  サイズ: 3.7 KiB

バイナリ
ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png ファイルの表示

変更前 変更後
幅: 144  |  高さ: 144  |  サイズ: 11 KiB

バイナリ
ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png ファイルの表示

変更前 変更後
幅: 76  |  高さ: 76  |  サイズ: 4.1 KiB

バイナリ
ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png ファイルの表示

変更前 変更後
幅: 152  |  高さ: 152  |  サイズ: 12 KiB

バイナリ
ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png ファイルの表示

変更前 変更後
幅: 167  |  高さ: 167  |  サイズ: 14 KiB

+ 0
- 23
ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json ファイルの表示

@@ -1,23 +0,0 @@
{
"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"
}
}

バイナリ
ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png ファイルの表示

変更前 変更後
幅: 1  |  高さ: 1  |  サイズ: 68 B

バイナリ
ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png ファイルの表示

変更前 変更後
幅: 1  |  高さ: 1  |  サイズ: 68 B

バイナリ
ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png ファイルの表示

変更前 変更後
幅: 1  |  高さ: 1  |  サイズ: 68 B

+ 0
- 5
ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md ファイルの表示

@@ -1,5 +0,0 @@
# 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.

+ 75
- 62
lib/drawer_navigation_bar.dart ファイルの表示

@@ -8,6 +8,7 @@ import 'package:provider/provider.dart';
import 'package:qadirneyriz/config/config.dart';
import 'package:qadirneyriz/screens/aboutUs/screen.dart';
import 'package:qadirneyriz/screens/auth/state/state.dart';
import 'package:qadirneyriz/screens/change_pass/screen.dart';
import 'package:qadirneyriz/screens/home/screen.dart';
import 'package:qadirneyriz/screens/home/state.dart';
import 'package:qadirneyriz/screens/meeting/screen.dart';
@@ -45,6 +46,7 @@ class _CustomDrawerNavigationState extends State<CustomDrawerNavigation> {
const MeetingsScreen(),
const PrivateMeetingsScreen(),
const ReportScreen(),
const ChangePassScreen(),
const AboutUsScreen()
// Add more screens here
];
@@ -66,49 +68,56 @@ class _CustomDrawerNavigationState extends State<CustomDrawerNavigation> {
builder: (context, value, child) {
return Drawer(
backgroundColor: config.ui.backGroundColor,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Padding(
padding: const EdgeInsets.only(left: 16.0, top: 40),
child: Image.asset(
'assets/images/iconinappbar.png', // مسیر لوگوی شما
height: 60,
child: SingleChildScrollView(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Padding(
padding: const EdgeInsets.symmetric(
horizontal: 10, vertical: 35),
child: Image.asset(
'assets/images/D2.png', // مسیر لوگوی شما
height: 60,
),
),
),
if (userRole == 0 || userRole == 2)
Row(
children: [
Expanded(
child: Consumer<HomeState>(
builder: (context, value, child) {
return NewSessionButton(
title: AppLocalizations.of(context)!.newmeeting,
icon: Icons.person_outlined,
onPressed: () async {
await context.pushNamed('meetingadd');
value.getTodayMeetings();
if (userRole == 0 || userRole == 2)
Padding(
padding: const EdgeInsets.symmetric(horizontal: 5),
child: Row(
children: [
Expanded(
child: Consumer<HomeState>(
builder: (context, value, child) {
return NewSessionButton(
title:
AppLocalizations.of(context)!.newmeeting,
icon: Icons.person_outlined,
onPressed: () async {
await context.pushNamed('meetingadd');
value.getTodayMeetings();
},
);
},
);
},
),
),
Expanded(
child: NewSessionButton(
title:
AppLocalizations.of(context)!.newprivatemeeting,
icon: Icons.people_outlined,
onPressed: () {
context.pushNamed('privatemeetingadd');
},
),
),
),
Expanded(
child: NewSessionButton(
title: AppLocalizations.of(context)!
.newprivatemeeting,
icon: Icons.people_outlined,
onPressed: () {
context.pushNamed('privatemeetingadd');
},
),
),
],
),
],
),
Expanded(
child: Padding(
),
Padding(
padding: const EdgeInsets.symmetric(vertical: 50),
child: ListView(
shrinkWrap: true,
physics: const NeverScrollableScrollPhysics(),
padding: EdgeInsets.zero,
children: <Widget>[
_buildDrawerItem(
@@ -131,40 +140,44 @@ class _CustomDrawerNavigationState extends State<CustomDrawerNavigation> {
text: AppLocalizations.of(context)!.reports,
index: 3,
),
_buildDrawerItem(
icon: FontAwesomeIcons.person,
text: AppLocalizations.of(context)!.profile,
index: 4,
),
_buildDrawerItem(
icon: FontAwesomeIcons.info,
text: AppLocalizations.of(context)!.aboutus,
index: 4,
index: 5,
),
],
),
),
),
Padding(
padding: const EdgeInsets.all(8.0),
child: Container(
decoration: BoxDecoration(
color: config.ui.secendGreen.withOpacity(.1),
borderRadius: BorderRadius.circular(10),
),
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
_buildLanguageButton('fa', 'فارسی', () {
value.setLocale('fa');
}),
_buildLanguageButton('en', 'English', () {
value.setLocale('en');
}),
],
Padding(
padding: const EdgeInsets.all(8.0),
child: Container(
decoration: BoxDecoration(
color: config.ui.secendGreen.withOpacity(.1),
borderRadius: BorderRadius.circular(10),
),
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
_buildLanguageButton('fa', 'فارسی', () {
value.setLocale('fa');
}),
_buildLanguageButton('en', 'English', () {
value.setLocale('en');
}),
],
),
),
),
),
),
const Divider(),
],
],
),
),
);
},


+ 4
- 1
lib/l10n/app_en.arb ファイルの表示

@@ -20,7 +20,6 @@
"meetings": "Meetings",
"events": "Appointments",
"exit": "Exit",
"appname": "Foolad Ghadir Neyriz",
"nomeetingfortoday": "No meeting is scheduled for today.",
"todaymeetings": "Today's Meetings",
"empty": "No data available.",
@@ -118,5 +117,9 @@
"files":"Files",
"acceptoperetion":"Accept Operetion",
"areusuretodeletfile": "Are you sure you want to delete this file?",
"changepass":"Change Password",
"profile":"User Account", "doyouredit":"You must make at least one change",
"changename":"Change Username",
"newpass":"Your New Password",
"textaboutus":"The Mizban meeting and appointment management software has been designed and developed with the aim of facilitating and optimizing the processes of organizing organizational and personal meetings under the leadership of Dr. Mohsen Mostafapour. This innovative and user-centric software serves as an efficient tool to enhance coordination and realize the motto **The Codeword of Empathy** within the esteemed **Foulad Ghadir Neyriz** organization. The Mizban project was initiated and launched with the invaluable support and backing of the esteemed CEO, Dr. Mohsen Mostafapour, representing a significant step forward in the organization's path toward growth and excellence."
}

+ 5
- 1
lib/l10n/app_fa.arb ファイルの表示

@@ -20,7 +20,6 @@
"meetings":"جلسات",
"events":"ملاقات ها",
"exit":"خروج",
"appname":"فولاد غدیر نی ریز",
"nomeetingfortoday":"برای امروز جلسه ایی تعریف نشده است.",
"todaymeetings":"جلسه های امروز",
"empty":"داده ایی وجود ندارد.",
@@ -115,6 +114,11 @@
"accepted":"تایید شده",
"files":"فایل ها",
"acceptoperetion":"تایید عملیات",
"changepass":"تغییر رمزعبور",
"profile":"حساب کاربری",
"doyouredit":"باید حداقل یکی از تغییرات را انجام دهید!",
"changename":"تغییر نام کاربری",
"newpass":"رمزعبور جدید شما",
"areusuretodeletfile":"آیا اطمینان دارید که میخواهید این فایل را حذف کنید؟",
"textaboutus":"نرم‌افزار مدیریت جلسات و ملاقات‌های “میزبان” با هدف تسهیل و بهینه‌سازی فرآیندهای برگزاری جلسات سازمانی و شخصی جناب آقای دکتر محسن مصطفی پور طراحی و توسعه یافته تا ابزاری کارآمد و نوآورانه برای تحقق بیشتر اسم رمز همدلی در مجموعه معظم فولاد غدیر نی ریز باشد . این نرم افزار با حمایت ، همت و پشتیبانی بی‌دریغ مدیریت محترم عامل ( دکتر محسن مصطفی پور ) ایجاد ، توسعه و راه اندازی شده است."
}

+ 1
- 1
lib/main.dart ファイルの表示

@@ -84,8 +84,8 @@ class _MyAppState extends State<MyApp> {
],
locale: Locale(value.language),
supportedLocales: const [
Locale('fa'), // Persian
Locale('en'), // English
Locale('fa'), // Persian
],
);
},


+ 182
- 124
lib/models/home/home_models.dart ファイルの表示

@@ -1,79 +1,105 @@
import 'dart:convert';

class TodayMeetingModel {
List<Meeting>? meetings;
String? note;

TodayMeetingModel({
this.meetings,
this.note,
});

factory TodayMeetingModel.fromRawJson(String str) => TodayMeetingModel.fromJson(json.decode(str));

String toRawJson() => json.encode(toJson());

factory TodayMeetingModel.fromJson(Map<String, dynamic> json) => TodayMeetingModel(
meetings: json["meetings"] == null ? [] : List<Meeting>.from(json["meetings"]!.map((x) => Meeting.fromJson(x))),
List<Meeting>? meetings;
List<Meeting>? privateMeetings;
String? note;

TodayMeetingModel({
this.meetings,
this.privateMeetings,
this.note,
});

factory TodayMeetingModel.fromRawJson(String str) =>
TodayMeetingModel.fromJson(json.decode(str));

String toRawJson() => json.encode(toJson());

factory TodayMeetingModel.fromJson(Map<String, dynamic> json) =>
TodayMeetingModel(
meetings: json["meetings"] == null
? []
: List<Meeting>.from(
json["meetings"]!.map((x) => Meeting.fromJson(x))),
privateMeetings: json["private_meetings"] == null
? []
: List<Meeting>.from(
json["private_meetings"]!.map((x) => Meeting.fromJson(x))),
note: json["note"],
);

Map<String, dynamic> toJson() => {
"meetings": meetings == null ? [] : List<dynamic>.from(meetings!.map((x) => x.toJson())),
);

Map<String, dynamic> toJson() => {
"meetings": meetings == null
? []
: List<dynamic>.from(meetings!.map((x) => x.toJson())),
"private_meetings": privateMeetings == null
? []
: List<dynamic>.from(privateMeetings!.map((x) => x.toJson())),
"note": note,
};
};
}

class Meeting {
int? id;
int? locationsId;
int? subjectId;
int? managerId;
int? ownerId;
String? azHour;
String? taHour;
dynamic description;
int? status;
int? accepted;
DateTime? dateMeeting;
DateTime? endDate;
DateTime? createdAt;
DateTime? updatedAt;
String? dateJalali;
String? statusTxt;
String? az;
String? ta;
Location? location;
Subject? subject;

Meeting({
this.id,
this.locationsId,
this.subjectId,
this.managerId,
this.ownerId,
this.azHour,
this.taHour,
this.description,
this.status,
this.accepted,
this.dateMeeting,
this.endDate,
this.createdAt,
this.updatedAt,
this.dateJalali,
this.statusTxt,
this.az,
this.ta,
this.location,
this.subject,
});

factory Meeting.fromRawJson(String str) => Meeting.fromJson(json.decode(str));

String toRawJson() => json.encode(toJson());

factory Meeting.fromJson(Map<String, dynamic> json) => Meeting(
int? id;
int? locationsId;
int? subjectId;
int? managerId;
int? ownerId;
String? azHour;
String? taHour;
dynamic description;
int? status;
int? accepted;
DateTime? dateMeeting;
DateTime? endDate;
DateTime? createdAt;
DateTime? updatedAt;
String? dateJalali;
String? statusTxt;
String? az;
String? ta;
List<dynamic>? minutes;
Location? location;
Subject? subject;
String? visitName;
String? visitMobile;
String? visitRole;
String? visitCompany;

Meeting({
this.id,
this.locationsId,
this.subjectId,
this.managerId,
this.ownerId,
this.azHour,
this.taHour,
this.description,
this.status,
this.accepted,
this.dateMeeting,
this.endDate,
this.createdAt,
this.updatedAt,
this.dateJalali,
this.statusTxt,
this.az,
this.ta,
this.minutes,
this.location,
this.subject,
this.visitName,
this.visitMobile,
this.visitRole,
this.visitCompany,
});

factory Meeting.fromRawJson(String str) => Meeting.fromJson(json.decode(str));

String toRawJson() => json.encode(toJson());

factory Meeting.fromJson(Map<String, dynamic> json) => Meeting(
id: json["id"],
locationsId: json["locations_id"],
subjectId: json["subject_id"],
@@ -84,19 +110,36 @@ class Meeting {
description: json["description"],
status: json["status"],
accepted: json["accepted"],
dateMeeting: json["date_meeting"] == null ? null : DateTime.parse(json["date_meeting"]),
endDate: json["end_date"] == null ? null : DateTime.parse(json["end_date"]),
createdAt: json["created_at"] == null ? null : DateTime.parse(json["created_at"]),
updatedAt: json["updated_at"] == null ? null : DateTime.parse(json["updated_at"]),
dateMeeting: json["date_meeting"] == null
? null
: DateTime.parse(json["date_meeting"]),
endDate:
json["end_date"] == null ? null : DateTime.parse(json["end_date"]),
createdAt: json["created_at"] == null
? null
: DateTime.parse(json["created_at"]),
updatedAt: json["updated_at"] == null
? null
: DateTime.parse(json["updated_at"]),
dateJalali: json["date_jalali"],
statusTxt: json["status_txt"],
az: json["az"],
ta: json["ta"],
location: json["location"] == null ? null : Location.fromJson(json["location"]),
subject: json["subject"] == null ? null : Subject.fromJson(json["subject"]),
);

Map<String, dynamic> toJson() => {
minutes: json["minutes"] == null
? []
: List<dynamic>.from(json["minutes"]!.map((x) => x)),
location: json["location"] == null
? null
: Location.fromJson(json["location"]),
subject:
json["subject"] == null ? null : Subject.fromJson(json["subject"]),
visitName: json["visit_name"],
visitMobile: json["visit_mobile"],
visitRole: json["visit_role"],
visitCompany: json["visit_company"],
);

Map<String, dynamic> toJson() => {
"id": id,
"locations_id": locationsId,
"subject_id": subjectId,
@@ -115,79 +158,94 @@ class Meeting {
"status_txt": statusTxt,
"az": az,
"ta": ta,
"minutes":
minutes == null ? [] : List<dynamic>.from(minutes!.map((x) => x)),
"location": location?.toJson(),
"subject": subject?.toJson(),
};
"visit_name": visitName,
"visit_mobile": visitMobile,
"visit_role": visitRole,
"visit_company": visitCompany,
};
}

class Location {
int? id;
String? address;
String? addressEn;
DateTime? createdAt;
DateTime? updatedAt;

Location({
this.id,
this.address,
this.addressEn,
this.createdAt,
this.updatedAt,
});

factory Location.fromRawJson(String str) => Location.fromJson(json.decode(str));

String toRawJson() => json.encode(toJson());

factory Location.fromJson(Map<String, dynamic> json) => Location(
int? id;
String? address;
String? addressEn;
DateTime? createdAt;
DateTime? updatedAt;

Location({
this.id,
this.address,
this.addressEn,
this.createdAt,
this.updatedAt,
});

factory Location.fromRawJson(String str) =>
Location.fromJson(json.decode(str));

String toRawJson() => json.encode(toJson());

factory Location.fromJson(Map<String, dynamic> json) => Location(
id: json["id"],
address: json["address"],
addressEn: json["address_en"],
createdAt: json["created_at"] == null ? null : DateTime.parse(json["created_at"]),
updatedAt: json["updated_at"] == null ? null : DateTime.parse(json["updated_at"]),
);

Map<String, dynamic> toJson() => {
createdAt: json["created_at"] == null
? null
: DateTime.parse(json["created_at"]),
updatedAt: json["updated_at"] == null
? null
: DateTime.parse(json["updated_at"]),
);

Map<String, dynamic> toJson() => {
"id": id,
"address": address,
"address_en": addressEn,
"created_at": createdAt?.toIso8601String(),
"updated_at": updatedAt?.toIso8601String(),
};
};
}

class Subject {
int? id;
dynamic subject;
dynamic subjectEn;
DateTime? createdAt;
DateTime? updatedAt;
int? id;
String? subject;
dynamic subjectEn;
DateTime? createdAt;
DateTime? updatedAt;

Subject({
this.id,
this.subject,
this.subjectEn,
this.createdAt,
this.updatedAt,
});
Subject({
this.id,
this.subject,
this.subjectEn,
this.createdAt,
this.updatedAt,
});

factory Subject.fromRawJson(String str) => Subject.fromJson(json.decode(str));
factory Subject.fromRawJson(String str) => Subject.fromJson(json.decode(str));

String toRawJson() => json.encode(toJson());
String toRawJson() => json.encode(toJson());

factory Subject.fromJson(Map<String, dynamic> json) => Subject(
factory Subject.fromJson(Map<String, dynamic> json) => Subject(
id: json["id"],
subject: json["subject"],
subjectEn: json["subject_en"],
createdAt: json["created_at"] == null ? null : DateTime.parse(json["created_at"]),
updatedAt: json["updated_at"] == null ? null : DateTime.parse(json["updated_at"]),
);

Map<String, dynamic> toJson() => {
createdAt: json["created_at"] == null
? null
: DateTime.parse(json["created_at"]),
updatedAt: json["updated_at"] == null
? null
: DateTime.parse(json["updated_at"]),
);

Map<String, dynamic> toJson() => {
"id": id,
"subject": subject,
"subject_en": subjectEn,
"created_at": createdAt?.toIso8601String(),
"updated_at": updatedAt?.toIso8601String(),
};
};
}

+ 9
- 3
lib/screens/aboutUs/screen.dart ファイルの表示

@@ -29,14 +29,20 @@ class AboutUsScreen extends StatelessWidget {
Column(
children: [
Image.asset(
'assets/images/logoaboutus.png',
width: 100,
height: 100,
'assets/images/D2.png',
width: 80,
height: 80,
),
SizedBox(
height: 8,
),
Text(
'نسخه 1.0.0',
style: TextStyle(fontSize: 12),
),
SizedBox(
height: 10,
)
],
)
],


+ 165
- 0
lib/screens/change_pass/screen.dart ファイルの表示

@@ -0,0 +1,165 @@
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:qadirneyriz/config/config.dart';
import 'package:qadirneyriz/screens/home/state.dart';
import 'package:qadirneyriz/setting/setting.dart';
import 'package:qadirneyriz/utils/enums/status.dart';
import 'package:qadirneyriz/utils/tools/tools.dart';
import 'package:qadirneyriz/widgets/custom_appbar.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:qadirneyriz/widgets/custom_button.dart';
import 'package:qadirneyriz/widgets/custom_textfield.dart';

class ChangePassScreen extends StatefulWidget {
const ChangePassScreen({super.key});

@override
State<ChangePassScreen> createState() => _ChangePassScreenState();
}

class _ChangePassScreenState extends State<ChangePassScreen> {
TextEditingController nameController = TextEditingController();
TextEditingController passController = TextEditingController();
@override
Widget build(BuildContext context) {
final phone = setting.userLocalDb.getUser().mobile ?? '';
final name = setting.userLocalDb.getUser().name ?? '';
return Consumer<HomeState>(
builder: (context, value, child) {
return CustomScrollView(
slivers: <Widget>[
CustomAppbar(
title: AppLocalizations.of(context)!.profile,
),
SliverToBoxAdapter(
child: Container(
decoration: BoxDecoration(
color: config.ui.secendGreen,
boxShadow: [
BoxShadow(
color: config.ui.mainGray.withOpacity(.2),
spreadRadius: 10,
offset: const Offset(0, 5),
blurRadius: 8)
],
borderRadius: BorderRadius.only(
bottomLeft: Radius.circular(50),
bottomRight: Radius.circular(50))),
child: Padding(
padding: const EdgeInsets.all(30.0),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Container(
decoration: BoxDecoration(
color: Colors.white.withOpacity(.2),
shape: BoxShape.circle),
child: Padding(
padding: const EdgeInsets.all(20.0),
child: Icon(
Icons.person,
size: 50,
color: Colors.white,
),
),
),
SizedBox(
height: 10,
),
Text(
name,
style: TextStyle(
fontSize: 16,
color: Colors.white,
fontWeight: FontWeight.bold),
),
SizedBox(
height: 2,
),
Text(
phone,
style: TextStyle(
fontSize: 16,
color: Colors.white,
fontWeight: FontWeight.bold),
),
],
),
),
),
),
SliverToBoxAdapter(
child: Padding(
padding: const EdgeInsets.symmetric(vertical: 70),
child: Column(
children: [
CustomTextField(
label: AppLocalizations.of(context)!.changename,
hintText: name,
textEditingController: nameController,
textInputType: TextInputType.visiblePassword),
CustomTextField(
label: AppLocalizations.of(context)!.changepass,
hintText: AppLocalizations.of(context)!.newpass,
isPass: true,
textEditingController: passController,
textInputType: TextInputType.visiblePassword),
SizedBox(
height: 60,
),
chnagePassMethod(value)
],
),
),
)
],
);
},
);
}

Widget chnagePassMethod(HomeState state) {
switch (state.statusEditProfile) {
case Status.loading:
return CustomButton(
hieght: 50, text: AppLocalizations.of(context)!.loading);

default:
return CustomButton(
hieght: 50,
text: AppLocalizations.of(context)!.submit,
onPressed: () async {
if (nameController.text == '' && passController.text == '') {
Tools.showCustomSnackBar(
text: AppLocalizations.of(context)!.doyouredit,
isError: true,
context,
);
} else {
final status = await state.editProfile(
name: nameController.text, pass: passController.text);

if (status == Status.ready) {
Tools.showCustomSnackBar(
text: AppLocalizations.of(context)!.editdone,
isError: false,
context,
);
setState(() {});
} else {
Tools.showCustomSnackBar(
text: state.errorsEditProfile == null
? state.messageEditProfile ??
AppLocalizations.of(context)!.haserror
: Tools.combineErrorMessages(
state.errorsEditProfile ?? {}),
isError: true,
context,
);
}
}
},
);
}
}
}

+ 112
- 24
lib/screens/home/screen.dart ファイルの表示

@@ -38,9 +38,10 @@ class _HomeScreenState extends State<HomeScreen> {
@override
Widget build(BuildContext context) {
DateTime now = DateTime.now();
String dateMiladi = DateFormat('yyyy-MM-dd').format(now);
String dateJalali =
'${setting.timeNow.day} ${Tools.getMonthName(setting.timeNow.month)} ${setting.timeNow.year}'; // فرمت کردن تاریخ
String dateMiladi =
Tools.convertToPersianDigits(DateFormat('yyyy-MM-dd').format(now));
String dateJalali = Tools.convertToPersianDigits(
'${setting.timeNow.day} ${Tools.getMonthName(setting.timeNow.month)} ${setting.timeNow.year}');

return Consumer<HomeState>(
builder: (context, value, child) {
@@ -102,31 +103,118 @@ class _HomeScreenState extends State<HomeScreen> {
SliverToBoxAdapter(
child: SizedBox(
height: 170,
child: value.todayMeetingsModel!.meetings!.isNotEmpty
child: value.todayMeetingsModel!.meetings!.isNotEmpty ||
value.todayMeetingsModel!.privateMeetings!
.isNotEmpty
? ListView.builder(
scrollDirection: Axis.horizontal,
shrinkWrap: true,
itemCount:
value.todayMeetingsModel!.meetings!.length,
value.todayMeetingsModel!.meetings!.length +
value.todayMeetingsModel!.privateMeetings!
.length,
itemBuilder: (BuildContext context, int index) {
final items =
value.todayMeetingsModel!.meetings![index];
return Padding(
padding:
const EdgeInsets.only(right: 5, left: 1),
child: CustomCardMeeting(
status: items.accepted ?? 0,
titel: items.subject != null
? items.subject!.subject ?? ''
: '',
fromTime: items.azHour ?? '',
toTime: items.taHour ?? "",
location: items.location != null
? items.location!.address ?? ''
: '',
date: items.dateJalali ?? '',
cardId: items.id ?? 0,
),
);
// ترکیب دو لیست
final meetingsLength =
value.todayMeetingsModel!.meetings!.length;

if (index < meetingsLength) {
// آیتم از لیست `meetings`
final meeting = value
.todayMeetingsModel!.meetings![index];
return Padding(
padding: const EdgeInsets.only(
right: 5, left: 1),
child: Stack(
children: [
CustomCardMeeting(
status: meeting.accepted ?? 0,
titel: meeting.subject != null
? meeting.subject!.subject ?? ''
: '',
fromTime: meeting.azHour ?? '',
toTime: meeting.taHour ?? "",
location: meeting.location != null
? meeting.location!.address ?? ''
: '',
date: meeting.dateJalali ?? '',
cardId: meeting.id ?? 0,
),
Positioned(
child: Container(
decoration: BoxDecoration(
borderRadius:
BorderRadius.circular(10),
color: Colors.green),
child: Padding(
padding:
const EdgeInsets.all(5.0),
child: Text(
AppLocalizations.of(context)!
.meetings,
style: TextStyle(
fontSize: 12,
color: Colors.white),
),
)),
left: 30,
top: 20,
),
],
),
);
} else {
// آیتم از لیست `privateMeetings`
final privateMeeting = value
.todayMeetingsModel!
.privateMeetings![index - meetingsLength];
return Padding(
padding: const EdgeInsets.only(
right: 5, left: 1),
child: Stack(
children: [
CustomCardMeeting(
cardId: privateMeeting.id ?? -1,
titel: privateMeeting.subject != null
? privateMeeting
.subject!.subject ??
''
: '',
location:
privateMeeting.location != null
? privateMeeting
.location!.address ??
''
: '',
status: privateMeeting.accepted ?? 0,
fromTime: "${privateMeeting.azHour}",
date: privateMeeting.dateJalali ?? '',
toTime: privateMeeting.taHour ?? '',
),
Positioned(
child: Container(
decoration: BoxDecoration(
borderRadius:
BorderRadius.circular(10),
color: Colors.green),
child: Padding(
padding:
const EdgeInsets.all(5.0),
child: Text(
AppLocalizations.of(context)!
.privatemeeting,
style: TextStyle(
fontSize: 12,
color: Colors.white),
),
)),
left: 30,
top: 20,
),
],
),
);
}
},
)
: Center(


+ 34
- 1
lib/screens/home/state.dart ファイルの表示

@@ -46,7 +46,6 @@ class HomeState extends ChangeNotifier {
return todayMettingsStatus;
}

// log out
// log out
Status statusLogOut = Status.empty;
String? messageLogOut;
@@ -80,4 +79,38 @@ class HomeState extends ChangeNotifier {
// print(statusLogOut);
return statusLogOut;
}

// edit profile
Status statusEditProfile = Status.empty;
String? messageEditProfile;
Map? errorsEditProfile;

Future<Status> editProfile({String? name, String? pass}) async {
statusEditProfile = Status.loading;
notifyListeners();
try {
final result = await homeApi.editProfile(name: name, password: pass);
if (result == null) {
statusEditProfile = Status.error;
} else {
if (result.isOk) {
statusEditProfile = Status.ready;
messageEditProfile = result.message;
} else if (result.isOk == false) {
errorsEditProfile = result.errors;
messageEditProfile = result.message;
statusEditProfile = Status.error;
} else {
statusEditProfile = Status.error;
}
}
notifyListeners();
} catch (e) {
statusEditProfile = Status.error;
// print(e);
}
notifyListeners();
print(statusEditProfile);
return statusEditProfile;
}
}

+ 5
- 3
lib/screens/meeting/screen.dart ファイルの表示

@@ -67,9 +67,11 @@ class _MeetingsScreenState extends State<MeetingsScreen> {
@override
Widget build(BuildContext context) {
DateTime now = DateTime.now();
String dateMiladi = DateFormat('yyyy-MM-dd').format(now);
String dateJalali =
'${setting.timeNow.day} ${Tools.getMonthName(setting.timeNow.month)} ${setting.timeNow.year}'; // فرمت کردن تاریخ
String dateMiladi =
Tools.convertToPersianDigits(DateFormat('yyyy-MM-dd').format(now));
String dateJalali = Tools.convertToPersianDigits(
'${setting.timeNow.day} ${Tools.getMonthName(setting.timeNow.month)} ${setting.timeNow.year}');
// فرمت کردن تاریخ
return Consumer<MeetingsState>(
builder: (context, value, child) {
return RefreshIndicator(


+ 10
- 8
lib/screens/meeting_summary/screen.dart ファイルの表示

@@ -298,14 +298,16 @@ class _MeetingSummaryScreenState extends State<MeetingSummaryScreen> {
isError: true,
context,
);
} else if (state.selectedFiles == null) {
// call add new subject
Tools.showCustomSnackBar(
text: AppLocalizations.of(context)!.enterfile,
isError: true,
context,
);
} else {
}
// else if (state.selectedFiles == null) {
// // call add new subject
// Tools.showCustomSnackBar(
// text: AppLocalizations.of(context)!.enterfile,
// isError: true,
// context,
// );
// }
else {
final status = await state.addMinuteMeeting(
id: widget.meetingItem.id ?? -1,
description: _textControllerDescription.text,


+ 131
- 122
lib/screens/private_meeting/screen.dart ファイルの表示

@@ -64,9 +64,11 @@ class _PrivateMeetingsScreenState extends State<PrivateMeetingsScreen> {
@override
Widget build(BuildContext context) {
DateTime now = DateTime.now();
String dateMiladi = DateFormat('yyyy-MM-dd').format(now);
String dateJalali =
'${setting.timeNow.day} ${Tools.getMonthName(setting.timeNow.month)} ${setting.timeNow.year}';
String dateMiladi =
Tools.convertToPersianDigits(DateFormat('yyyy-MM-dd').format(now));
String dateJalali = Tools.convertToPersianDigits(
'${setting.timeNow.day} ${Tools.getMonthName(setting.timeNow.month)} ${setting.timeNow.year}');

return Consumer<PrivateMeetingsState>(
builder: (context, value, child) {
return RefreshIndicator(
@@ -286,147 +288,154 @@ class PrivateMeetingWidget extends StatelessWidget {
final String subject;
final String location;
final int status;
final bool hasMoreButton;
final void Function()? onAcceptButton;
final void Function()? onCancelButton;
final void Function(String)? onSelectedMoreButton;

final List<PopupMenuEntry<String>> Function(BuildContext)?
itemBuilderMoreButton;
const PrivateMeetingWidget({
Key? key,
required this.date,
required this.time,
required this.subject,
required this.location,
required this.status,
this.onAcceptButton,
this.onCancelButton,
this.onSelectedMoreButton,
this.itemBuilderMoreButton,
}) : super(key: key);
const PrivateMeetingWidget(
{Key? key,
required this.date,
required this.time,
required this.subject,
required this.location,
required this.status,
this.hasMoreButton = true,
this.onAcceptButton,
this.onCancelButton,
this.onSelectedMoreButton,
this.itemBuilderMoreButton,
th})
: super(key: key);

@override
Widget build(BuildContext context) {
return Padding(
padding: const EdgeInsets.symmetric(horizontal: 15, vertical: 15),
child: Column(
crossAxisAlignment: CrossAxisAlignment.end,
children: [
Padding(
padding: const EdgeInsets.symmetric(horizontal: 10),
child: Text(
this.date,
style: TextStyle(fontSize: 12),
child: Container(
width: 500,
height: 190,
child: Column(
crossAxisAlignment: CrossAxisAlignment.end,
children: [
Padding(
padding: const EdgeInsets.symmetric(horizontal: 10),
child: Text(
this.date,
style: TextStyle(fontSize: 12),
),
),
),
Divider(),
SizedBox(
height: 5,
),
Container(
decoration: BoxDecoration(
boxShadow: [
BoxShadow(
color: config.ui.mainGray.withOpacity(.1),
spreadRadius: .1,
offset: const Offset(0, 2),
blurRadius: 6)
],
color: const Color(0xffF4F9F6),
borderRadius: BorderRadius.circular(10)),
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 15, vertical: 10),
child: Column(
children: [
Row(
children: [
Text(this.time),
SizedBox(
width: 15,
),
Container(
width: 3,
height: 45,
decoration: BoxDecoration(
color: Colors.green,
Divider(),
SizedBox(
height: 5,
),
Container(
decoration: BoxDecoration(
boxShadow: [
BoxShadow(
color: config.ui.mainGray.withOpacity(.1),
spreadRadius: .1,
offset: const Offset(0, 2),
blurRadius: 6)
],
color: const Color(0xffF4F9F6),
borderRadius: BorderRadius.circular(10)),
child: Padding(
padding:
const EdgeInsets.symmetric(horizontal: 15, vertical: 10),
child: Column(
children: [
Row(
children: [
Text(this.time),
SizedBox(
width: 15,
),
),
SizedBox(
width: 5,
),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
Container(
width: 3,
height: 45,
decoration: BoxDecoration(
color: Colors.green,
),
),
SizedBox(
width: 5,
),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
this.subject,
),
SizedBox(
height: 5,
),
Text(
this.location,
style: TextStyle(
fontSize: 12, color: Color(0xff9AA8C7)),
),
],
),
),
if (hasMoreButton) _moreButton(context)
],
),
if (this.status == 0)
Padding(
padding: const EdgeInsets.only(top: 15),
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(
this.subject,
CustomButton(
hieght: 30,
text: AppLocalizations.of(context)!.accept,
borderRadius: 5,
color: Color(0xff00A848),
fontSize: 12,
onPressed: this.onAcceptButton,
),
SizedBox(
height: 5,
width: 7,
),
CustomButton(
hieght: 30,
text: AppLocalizations.of(context)!.cancel,
color: Colors.red,
textColor: Colors.white,
fontSize: 12,
borderRadius: 5,
onPressed: this.onCancelButton,
),
Text(
this.location,
style: TextStyle(
fontSize: 12, color: Color(0xff9AA8C7)),
SizedBox(
width: 90,
),
],
),
),
_moreButton(context)
],
),
if (this.status == 0)
Padding(
padding: const EdgeInsets.only(top: 15),
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
CustomButton(
hieght: 30,
text: AppLocalizations.of(context)!.accept,
borderRadius: 5,
color: Color(0xff00A848),
fontSize: 12,
onPressed: this.onAcceptButton,
),
SizedBox(
width: 7,
),
CustomButton(
hieght: 30,
text: AppLocalizations.of(context)!.cancel,
color: Colors.red,
textColor: Colors.white,
fontSize: 12,
borderRadius: 5,
onPressed: this.onCancelButton,
),
SizedBox(
width: 90,
),
],
),
),
if (this.status == 1 || this.status == 2)
Padding(
padding: const EdgeInsets.only(top: 10),
child: Row(
children: [
SizedBox(
width: 60,
),
PrivateMeetingLabel(
status: this.status,
),
],
),
)
],
if (this.status == 1 || this.status == 2)
Padding(
padding: const EdgeInsets.only(top: 10),
child: Row(
children: [
SizedBox(
width: 60,
),
PrivateMeetingLabel(
status: this.status,
),
],
),
)
],
),
),
),
)
],
)
],
),
),
);
}


+ 10
- 8
lib/screens/private_meeting_summary/screen.dart ファイルの表示

@@ -310,14 +310,16 @@ class _PrivateMeetingSummaryScreenState
isError: true,
context,
);
} else if (state.selectedFiles == null) {
// call add new subject
Tools.showCustomSnackBar(
text: AppLocalizations.of(context)!.enterfile,
isError: true,
context,
);
} else {
}
// else if (state.selectedFiles == null) {
// // call add new subject
// Tools.showCustomSnackBar(
// text: AppLocalizations.of(context)!.enterfile,
// isError: true,
// context,
// );
// }
else {
final status = await state.addMinuteMeeting(
id: widget.itemInPrivateMeeting.id ?? -1,
description: _textControllerDescription.text,


+ 6
- 4
lib/screens/report/screen.dart ファイルの表示

@@ -30,9 +30,11 @@ class _ReportScreenState extends State<ReportScreen> {
@override
Widget build(BuildContext context) {
DateTime now = DateTime.now();
String dateMiladi = DateFormat('yyyy-MM-dd').format(now);
String dateJalali =
'${setting.timeNow.day} ${Tools.getMonthName(setting.timeNow.month)} ${setting.timeNow.year}'; // فرمت کردن تاریخ
String dateMiladi =
Tools.convertToPersianDigits(DateFormat('yyyy-MM-dd').format(now));
String dateJalali = Tools.convertToPersianDigits(
'${setting.timeNow.day} ${Tools.getMonthName(setting.timeNow.month)} ${setting.timeNow.year}');
// فرمت کردن تاریخ
return CustomScrollView(
slivers: <Widget>[
const CustomAppbar(),
@@ -271,7 +273,7 @@ class _FiltersItemInReportState extends State<FiltersItemInReport> {
Divider(),
if (setting.userLocalDb.getUser().role != 1)
SizedBox(
height: 250,
height: 300,
child: ListView.builder(
physics: NeverScrollableScrollPhysics(),
shrinkWrap: true,


+ 34
- 0
lib/services/home/home.dart ファイルの表示

@@ -52,4 +52,38 @@ class HomeApi {
}
return const Result(isOk: false);
}

// edit profile

Future<Result?> editProfile({String? name, String? password}) async {
try {
Map<String, String> headers = {"Accept": "application/json"};

String dataToken = setting.userLocalDb.getUser().token!;
if (dataToken != '') {
headers['Authorization'] = "Bearer $dataToken";
}

final res = await Dio().post("${config.network.baseUrl}edit-profile",
options: Options(
headers: headers,
),
queryParameters: {'name': name, 'password': password});

if (res.statusCode == 200 || res.statusCode == 201) {
if (name != null) {
setting.userLocalDb.saveUserField('name', name);
}
return const Result(isOk: true);
}
} on DioException catch (e) {
// print(e);
// print(e.response!.data);
return Result(
isOk: false,
errors: e.response!.data['errors'],
message: e.response!.data['message']);
}
return const Result(isOk: false);
}
}

+ 1
- 1
lib/utils/hive/local_user.dart ファイルの表示

@@ -14,5 +14,5 @@ class LocalUser {
this.mobile,
this.access,
this.role,
this.language = 'fa'});
this.language = 'en'});
}

+ 1
- 1
lib/utils/hive/user_local_db.dart ファイルの表示

@@ -39,7 +39,7 @@ class UserLocalDb {
String mobile = box!.get('mobile', defaultValue: '');
int role = box!.get('role', defaultValue: 0);
List access = box!.get('access', defaultValue: []);
String language = box!.get('language', defaultValue: 'fa');
String language = box!.get('language', defaultValue: 'en');

return LocalUser(
name: name,


+ 11
- 0
lib/utils/tools/tools.dart ファイルの表示

@@ -117,4 +117,15 @@ class Tools {
String formattedMinute = minute < 10 ? '0$minute' : '$minute';
return '$formattedHour:$formattedMinute';
}

static String convertToPersianDigits(String input) {
const englishDigits = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'];
const persianDigits = ['۰', '۱', '۲', '۳', '۴', '۵', '۶', '۷', '۸', '۹'];

for (int i = 0; i < englishDigits.length; i++) {
input = input.replaceAll(englishDigits[i], persianDigits[i]);
}

return input;
}
}

+ 4
- 4
lib/widgets/card_meeting.dart ファイルの表示

@@ -73,7 +73,7 @@ class CustomCardMeeting extends StatelessWidget {
child: Text(
titel,
maxLines: 1,
style: const TextStyle(fontSize: 14),
style: const TextStyle(fontSize: 13),
overflow: TextOverflow.ellipsis,
),
)
@@ -96,7 +96,7 @@ class CustomCardMeeting extends StatelessWidget {
child: Text(
location,
maxLines: 1,
style: const TextStyle(fontSize: 14),
style: const TextStyle(fontSize: 13),
overflow: TextOverflow.ellipsis,
),
),
@@ -119,7 +119,7 @@ class CustomCardMeeting extends StatelessWidget {
child: Text(
date,
maxLines: 1,
style: const TextStyle(fontSize: 14),
style: const TextStyle(fontSize: 13),
overflow: TextOverflow.ellipsis,
),
),
@@ -143,7 +143,7 @@ class CustomCardMeeting extends StatelessWidget {
Text(
'$fromTime ${AppLocalizations.of(context)!.to} $toTime',
maxLines: 1,
style: const TextStyle(fontSize: 14),
style: const TextStyle(fontSize: 13),
overflow: TextOverflow.ellipsis,
),
],


+ 3
- 5
lib/widgets/custom_appbar.dart ファイルの表示

@@ -14,17 +14,15 @@ class CustomAppbar extends StatelessWidget {
children: [
const SizedBox(),
Text(
this.title == null
? AppLocalizations.of(context)!.appname
: this.title ?? '',
this.title == null ? '' : this.title ?? '',
style: const TextStyle(
fontSize: 12,
color: Colors.black,
),
),
Image.asset(
'assets/images/iconinappbar.png', // مسیر لوگو رو اینجا قرار بده
height: 60,
'assets/images/D2.png', // مسیر لوگو رو اینجا قرار بده
height: 40,
),
],
),


+ 1
- 1
lib/widgets/custom_background.dart ファイルの表示

@@ -12,7 +12,7 @@ class CustomBackground extends StatelessWidget {
height: double.infinity,
decoration: BoxDecoration(
image: DecorationImage(
image: AssetImage('assets/images/001.jpg'), // اصلاح شده
image: AssetImage('assets/images/001.png'), // اصلاح شده
fit: BoxFit.cover, // تصویر را به صورت تمام صفحه تطبیق می‌دهد
colorFilter: opacity != null
? ColorFilter.mode(


読み込み中…
キャンセル
保存